spearkit 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/embeds.ts","../src/lock.ts","../src/safe-fetch.ts","../src/format.ts","../src/cache.ts","../src/config.ts","../src/guards.ts","../src/context.ts","../src/cooldown.ts","../src/context-menus.ts","../src/prefix-args.ts","../src/pagination.ts","../src/confirm.ts","../src/logger.ts","../src/env.ts","../src/scheduler.ts","../src/prefix.ts","../src/usage.ts","../src/commands/options.ts","../src/commands/context.ts","../src/commands/command.ts","../src/commands/registry.ts","../src/events.ts","../src/components/customId.ts","../src/components/context.ts","../src/components/registry.ts","../src/components/builders.ts","../src/components/row.ts","../src/loader.ts","../src/client.ts","../src/plugin.ts"],"names":["resetAt","guard","PermissionsBitField","command","MessageFlags","resolveLabels","button","ButtonStyle","clientEmbeds","row","ActionRowBuilder","ButtonBuilder","ComponentType","readFileSync","task","timer","combineGuards","event","mkdir","dirname","appendFile","readFile","modal","resolveOptions","baseJSON","ApplicationCommandType","InteractionContextType","ApplicationCommandOptionType","actorOf","toError","join","Routes"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Preset embeds — `error`, `success`, `info`, `warn` — with consistent colors\n * and icons so every reply in your bot looks the same. The client owns one as\n * `client.embeds` and the context preset methods (`ctx.success(...)` etc.) use\n * it; you can also call `embeds.error(...)` directly to build an embed for\n * `channel.send({ embeds: [...] })`.\n */\nimport {\n EmbedBuilder,\n type APIEmbedAuthor,\n type APIEmbedField,\n type APIEmbedFooter,\n} from \"discord.js\";\n\n/** Color in `0xRRGGBB` form for each preset level. */\nexport interface EmbedColors {\n error: number;\n success: number;\n info: number;\n warn: number;\n}\n\n/** Icon glyph prepended to the description of each preset. Pass `\"\"` to drop. */\nexport interface EmbedIcons {\n error: string;\n success: string;\n info: string;\n warn: string;\n}\n\n/** Construction options for {@link Embeds}. Missing fields fall back to defaults. */\nexport interface EmbedsOptions {\n /** Per-level color overrides. */\n colors?: Partial<EmbedColors>;\n /** Per-level icon overrides; pass `\"\"` to drop the prefix for a level. */\n icons?: Partial<EmbedIcons>;\n}\n\n/** Shape accepted by every preset: a plain string or a structured body. */\nexport type EmbedPresetInput =\n | string\n | {\n title?: string;\n description?: string;\n fields?: readonly APIEmbedField[];\n footer?: APIEmbedFooter;\n author?: APIEmbedAuthor;\n url?: string;\n timestamp?: Date | number | string;\n thumbnail?: { url: string };\n image?: { url: string };\n };\n\n/** One of the four built-in preset levels. */\nexport type EmbedLevel = \"error\" | \"success\" | \"info\" | \"warn\";\n\n/** Discord-ish defaults: red / green / blue / yellow + ⛔ ✅ ℹ️ ⚠️. */\nexport const DEFAULT_EMBED_COLORS: EmbedColors = {\n error: 0xf04a47,\n success: 0x43b582,\n info: 0x3498db,\n warn: 0xf9a825,\n};\n\n/** Default icons: warning / check / info / triangle. */\nexport const DEFAULT_EMBED_ICONS: EmbedIcons = {\n error: \"⛔\",\n success: \"✅\",\n info: \"ℹ️\",\n warn: \"⚠️\",\n};\n\n/**\n * Builds preset embeds with consistent colors and icons.\n *\n * @example\n * ```ts\n * const embeds = new Embeds({ colors: { success: 0x00ff88 } });\n * await channel.send({ embeds: [embeds.success(\"Saved.\")] });\n * ```\n */\nexport class Embeds {\n /** The resolved colors for every preset. */\n readonly colors: EmbedColors;\n /** The resolved icons for every preset. */\n readonly icons: EmbedIcons;\n\n constructor(options: EmbedsOptions = {}) {\n this.colors = { ...DEFAULT_EMBED_COLORS, ...options.colors };\n this.icons = { ...DEFAULT_EMBED_ICONS, ...options.icons };\n }\n\n /** Red preset — something went wrong. */\n error(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"error\", input);\n }\n\n /** Green preset — something succeeded. */\n success(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"success\", input);\n }\n\n /** Blue preset — neutral information. */\n info(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"info\", input);\n }\n\n /** Yellow preset — caution. */\n warn(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"warn\", input);\n }\n\n /** Build an embed at a chosen level. */\n build(level: EmbedLevel, input: EmbedPresetInput): EmbedBuilder {\n const builder = new EmbedBuilder().setColor(this.colors[level]);\n const icon = this.icons[level];\n const prefix = icon.length > 0 ? `${icon} ` : \"\";\n if (typeof input === \"string\") {\n builder.setDescription(`${prefix}${input}`);\n return builder;\n }\n if (input.title !== undefined) builder.setTitle(input.title);\n if (input.description !== undefined) {\n builder.setDescription(`${prefix}${input.description}`);\n }\n if (input.fields !== undefined) builder.addFields(...input.fields);\n if (input.footer !== undefined) builder.setFooter(input.footer);\n if (input.author !== undefined) builder.setAuthor(input.author);\n if (input.url !== undefined) builder.setURL(input.url);\n if (input.timestamp !== undefined) {\n builder.setTimestamp(\n input.timestamp instanceof Date ? input.timestamp : new Date(input.timestamp),\n );\n }\n if (input.thumbnail !== undefined) builder.setThumbnail(input.thumbnail.url);\n if (input.image !== undefined) builder.setImage(input.image.url);\n return builder;\n }\n}\n\n/** The shared default factory — used by contexts when the client has none. */\nexport const defaultEmbeds = new Embeds();\n","/**\n * Keyed in-memory async lock (mutex) with TTL.\n *\n * Prevents two handlers from mutating the same resource concurrently — e.g.\n * the same ticket id being claimed twice, or a user opening a ticket while\n * another button click is still creating one. Hold leases are auto-expired so\n * a forgotten `release()` cannot deadlock the process forever.\n */\n\n/** Construction options for {@link KeyedLock}. */\nexport interface KeyedLockOptions {\n /** Maximum lifetime (ms) of a held lock before it auto-expires. Default `60_000`. */\n ttl?: number;\n /** Sweep interval (ms) for expired-but-not-released locks. `0` disables sweeping. */\n sweep?: number;\n}\n\ninterface LeaseEntry {\n createdAt: number;\n ttl: number;\n}\n\n/** Release a previously-acquired lease. Idempotent — safe to call multiple times. */\nexport type LockRelease = () => void;\n\n/**\n * Acquire, release and run-while-locked operations keyed on an arbitrary string.\n *\n * @example\n * ```ts\n * const locks = new KeyedLock();\n * const result = await locks.run(`ticket:${id}:claim`, async () => {\n * // …mutate ticket atomically…\n * return \"ok\";\n * }, { onBusy: () => \"busy\" });\n * ```\n */\nexport class KeyedLock {\n private readonly entries = new Map<string, LeaseEntry>();\n private readonly defaultTtl: number;\n private readonly sweepTimer?: ReturnType<typeof setInterval>;\n\n constructor(options: KeyedLockOptions = {}) {\n this.defaultTtl = options.ttl ?? 60_000;\n const sweep = options.sweep ?? 15_000;\n if (sweep > 0) {\n this.sweepTimer = setInterval(() => this.sweep(), sweep);\n if (typeof this.sweepTimer.unref === \"function\") this.sweepTimer.unref();\n }\n }\n\n /** Try to acquire `key`. Returns a release function, or `null` if already held. */\n tryAcquire(key: string, ttl: number = this.defaultTtl): LockRelease | null {\n const existing = this.entries.get(key);\n if (existing !== undefined && Date.now() - existing.createdAt < existing.ttl) {\n return null;\n }\n this.entries.set(key, { createdAt: Date.now(), ttl });\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.entries.delete(key);\n };\n }\n\n /** Whether `key` is currently held and not expired. */\n isHeld(key: string): boolean {\n const entry = this.entries.get(key);\n return entry !== undefined && Date.now() - entry.createdAt < entry.ttl;\n }\n\n /**\n * Run `fn` while holding `key`. If the key is already held, calls `onBusy`\n * (or returns `undefined`) without ever calling `fn`. Always releases on\n * return or throw.\n */\n async run<T>(\n key: string,\n fn: () => Promise<T> | T,\n options: { ttl?: number; onBusy?: () => Promise<T> | T } = {},\n ): Promise<T | undefined> {\n const release = this.tryAcquire(key, options.ttl ?? this.defaultTtl);\n if (release === null) {\n return options.onBusy !== undefined ? await options.onBusy() : undefined;\n }\n try {\n return await fn();\n } finally {\n release();\n }\n }\n\n /** Number of currently-tracked leases (including expired-but-unswept). */\n get size(): number {\n return this.entries.size;\n }\n\n /** Drop all known leases and stop the sweep timer. */\n dispose(): void {\n this.entries.clear();\n if (this.sweepTimer !== undefined) clearInterval(this.sweepTimer);\n }\n\n /** Manually remove a single key without running anything. */\n forget(key: string): boolean {\n return this.entries.delete(key);\n }\n\n private sweep(): void {\n const now = Date.now();\n for (const [key, entry] of this.entries.entries()) {\n if (now - entry.createdAt > entry.ttl) this.entries.delete(key);\n }\n }\n}\n","/**\n * Cache-first, timeout-bounded fetch helpers that resolve to `T | null` instead\n * of throwing. They replace the `.catch(() => null)` pattern repeated 30+ times\n * in production bots (member/channel/message/user/guild/role lookups that may\n * 404, rate-limit, or block startup if awaited indefinitely).\n */\nimport type {\n Channel,\n Client,\n Guild,\n GuildMember,\n Message,\n MessageManager,\n Role,\n User,\n} from \"discord.js\";\n\n/** Shared options for every safe-fetch helper. */\nexport interface SafeFetchOptions {\n /** Use the cache when present and not `force`. Default `true`. */\n cache?: boolean;\n /** Bypass the cache and force a REST hit. Default `false`. */\n force?: boolean;\n /** Resolve to `null` if Discord takes longer than this (ms). Default `5000`. */\n timeoutMs?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5000;\n\nasync function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T | null> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timeout = new Promise<null>((resolve) => {\n timer = setTimeout(() => resolve(null), ms);\n });\n return await Promise.race([promise.catch(() => null), timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n\n/** Resolve a guild member with a cache-hit fast path. Returns `null` on failure. */\nexport async function fetchMember(\n guild: Guild | null | undefined,\n userId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<GuildMember | null> {\n if (guild == null || userId == null || userId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = guild.members.cache.get(userId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n guild.members.fetch({ user: userId, force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a channel by id from the client. Returns `null` on failure. */\nexport async function fetchChannel(\n client: Client | null | undefined,\n channelId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Channel | null> {\n if (client == null || channelId == null || channelId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = client.channels.cache.get(channelId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n client.channels.fetch(channelId, { force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a message id in a given channel's messages manager. */\nexport async function fetchMessage(\n messages: MessageManager | null | undefined,\n messageId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Message | null> {\n if (messages == null || messageId == null || messageId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = messages.cache.get(messageId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n messages.fetch({ message: messageId, force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a user by id from the client. Returns `null` on failure. */\nexport async function fetchUser(\n client: Client | null | undefined,\n userId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<User | null> {\n if (client == null || userId == null || userId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = client.users.cache.get(userId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n client.users.fetch(userId, { force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a guild by id from the client. Returns `null` on failure. */\nexport async function fetchGuild(\n client: Client | null | undefined,\n guildId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Guild | null> {\n if (client == null || guildId == null || guildId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = client.guilds.cache.get(guildId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n client.guilds.fetch({ guild: guildId, force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a role id from a guild's roles manager. Returns `null` on failure. */\nexport async function fetchRole(\n guild: Guild | null | undefined,\n roleId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Role | null> {\n if (guild == null || roleId == null || roleId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = guild.roles.cache.get(roleId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n guild.roles.fetch(roleId, { force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/**\n * Wrap an arbitrary best-effort operation so a failure resolves to `null`\n * instead of throwing. Useful for sends/deletes whose outcome is non-critical.\n *\n * @example\n * ```ts\n * await safeTry(() => message.delete());\n * ```\n */\nexport async function safeTry<T>(op: () => Promise<T> | T): Promise<T | null> {\n try {\n return await op();\n } catch {\n return null;\n }\n}\n\n/** Time-bound an arbitrary promise; resolves to `null` on timeout or rejection. */\nexport async function withSafeTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n): Promise<T | null> {\n return withTimeout(promise, timeoutMs);\n}\n\n/** Cache-first, timeout-bounded fetch helpers grouped for ergonomic imports. */\nexport const safeFetch = {\n member: fetchMember,\n channel: fetchChannel,\n message: fetchMessage,\n user: fetchUser,\n guild: fetchGuild,\n role: fetchRole,\n try: safeTry,\n} as const;\n","/**\n * Locale-aware duration formatter, duration parser and Discord timestamp\n * helpers. Replaces the dozens of inline `Math.floor(s/86400)`/`X gün Y saat`\n * and `<t:${secs}:R>` snippets in production bots, including the duplicate\n * `formatTimeInTurkish`-style helpers duplicated across many bot command files.\n */\n\n/** Discord timestamp style: `t/T/d/D/f/F/R`. */\nexport type DiscordTimestampStyle = \"t\" | \"T\" | \"d\" | \"D\" | \"f\" | \"F\" | \"R\";\n\ntype DurationUnit = \"week\" | \"day\" | \"hour\" | \"minute\" | \"second\";\n\ninterface UnitLabels {\n week: [string, string];\n day: [string, string];\n hour: [string, string];\n minute: [string, string];\n second: [string, string];\n separator: string;\n zero: string;\n}\n\nconst EN: UnitLabels = {\n week: [\"week\", \"weeks\"],\n day: [\"day\", \"days\"],\n hour: [\"hour\", \"hours\"],\n minute: [\"minute\", \"minutes\"],\n second: [\"second\", \"seconds\"],\n separator: \" \",\n zero: \"0 seconds\",\n};\n\nconst TR: UnitLabels = {\n week: [\"hafta\", \"hafta\"],\n day: [\"gün\", \"gün\"],\n hour: [\"saat\", \"saat\"],\n minute: [\"dakika\", \"dakika\"],\n second: [\"saniye\", \"saniye\"],\n separator: \" \",\n zero: \"0 saniye\",\n};\n\nconst LABELS: Record<string, UnitLabels> = {\n en: EN,\n \"en-US\": EN,\n \"en-GB\": EN,\n tr: TR,\n \"tr-TR\": TR,\n};\n\nconst UNIT_MS: Record<DurationUnit, number> = {\n week: 7 * 86_400_000,\n day: 86_400_000,\n hour: 3_600_000,\n minute: 60_000,\n second: 1000,\n};\n\nconst UNIT_ORDER: DurationUnit[] = [\"week\", \"day\", \"hour\", \"minute\", \"second\"];\n\n/** Options for {@link formatDuration}. */\nexport interface FormatDurationOptions {\n /** Locale label set: `\"en\"`, `\"en-US\"`, `\"tr\"`, `\"tr-TR\"`, or a custom set. */\n locale?: string | UnitLabels;\n /** How many non-zero units to keep. Default `2`. Pass `Infinity` to keep all. */\n largest?: number;\n /** Subset of units to consider (in order: week → second). */\n units?: readonly DurationUnit[];\n}\n\nfunction resolveLabels(locale: FormatDurationOptions[\"locale\"]): UnitLabels {\n if (typeof locale === \"object\" && locale !== null) return locale;\n if (locale === undefined) return EN;\n return LABELS[locale] ?? LABELS[locale.split(\"-\")[0] ?? \"\"] ?? EN;\n}\n\n/**\n * Format a millisecond duration into human-readable text.\n *\n * @example\n * ```ts\n * formatDuration(3_725_000); // \"1 hour 2 minutes\"\n * formatDuration(3_725_000, { locale: \"tr\" }); // \"1 saat 2 dakika\"\n * formatDuration(86_400_000 * 9, { largest: 3 }); // \"1 week 2 days\"\n * ```\n */\nexport function formatDuration(ms: number, options: FormatDurationOptions = {}): string {\n const labels = resolveLabels(options.locale);\n if (!Number.isFinite(ms) || ms <= 0) return labels.zero;\n const limit = options.largest ?? 2;\n const units = options.units ?? UNIT_ORDER;\n const parts: string[] = [];\n let remaining = Math.floor(ms);\n for (const unit of units) {\n if (parts.length >= limit) break;\n const size = UNIT_MS[unit];\n if (remaining < size) continue;\n const value = Math.floor(remaining / size);\n remaining -= value * size;\n const word = value === 1 ? labels[unit][0] : labels[unit][1];\n parts.push(`${value} ${word}`);\n }\n return parts.length > 0 ? parts.join(labels.separator) : labels.zero;\n}\n\nconst DURATION_PATTERN = /(\\d+(?:\\.\\d+)?)\\s*(milliseconds|millisecond|seconds|minutes|saniye|dakika|minute|second|weeks|hours|hafta|saat|week|hour|days|day|gün|gun|min|sec|ms|wk|hr|dk|m|s|h|d|w)/gi;\nconst SHORT_TO_MS: Record<string, number> = {\n ms: 1,\n millisecond: 1,\n milliseconds: 1,\n s: 1000,\n sec: 1000,\n second: 1000,\n seconds: 1000,\n saniye: 1000,\n m: 60_000,\n min: 60_000,\n minute: 60_000,\n minutes: 60_000,\n dakika: 60_000,\n dk: 60_000,\n h: 3_600_000,\n hr: 3_600_000,\n hour: 3_600_000,\n hours: 3_600_000,\n saat: 3_600_000,\n d: 86_400_000,\n day: 86_400_000,\n days: 86_400_000,\n gün: 86_400_000,\n gun: 86_400_000,\n w: 604_800_000,\n wk: 604_800_000,\n week: 604_800_000,\n weeks: 604_800_000,\n hafta: 604_800_000,\n};\n\n/**\n * Parse a human duration like `\"1h30m\"`, `\"2 days\"`, `\"1 saat 30 dakika\"` or\n * `\"5000ms\"` into milliseconds. Returns `null` if nothing parseable was found.\n *\n * @example\n * ```ts\n * parseDuration(\"1h30m\"); // 5_400_000\n * parseDuration(\"1 saat\"); // 3_600_000\n * parseDuration(\"oops\"); // null\n * ```\n */\nexport function parseDuration(input: string): number | null {\n const trimmed = input.trim().toLowerCase();\n if (trimmed.length === 0) return null;\n DURATION_PATTERN.lastIndex = 0;\n let total = 0;\n let matched = false;\n for (;;) {\n const match = DURATION_PATTERN.exec(trimmed);\n if (match === null) break;\n matched = true;\n const value = Number(match[1]);\n const unit = match[2] ?? \"\";\n const ms = SHORT_TO_MS[unit];\n if (ms !== undefined && Number.isFinite(value)) total += value * ms;\n }\n return matched ? total : null;\n}\n\nfunction toEpochSeconds(date: Date | number): number {\n return Math.floor((date instanceof Date ? date.getTime() : date) / 1000);\n}\n\n/**\n * Render a Discord-flavoured timestamp tag (`<t:1234:R>`).\n *\n * Styles: `t` short time, `T` long time, `d` short date, `D` long date,\n * `f` short date/time (default), `F` long date/time, `R` relative.\n *\n * @example\n * ```ts\n * discordTimestamp(date); // <t:1234:f>\n * discordTimestamp(date, \"R\"); // <t:1234:R>\n * discordTimestamp(Date.now() + 60_000, \"R\"); // <t:..:R>\n * ```\n */\nexport function discordTimestamp(date: Date | number, style: DiscordTimestampStyle = \"f\"): string {\n return `<t:${toEpochSeconds(date)}:${style}>`;\n}\n\n/** Short-hand for the relative Discord timestamp (`R` style). */\nexport function relativeTimestamp(date: Date | number): string {\n return discordTimestamp(date, \"R\");\n}\n","/**\n * Pluggable cache abstraction with TTL, counters and rate-limit primitives.\n *\n * The {@link CacheStore} interface lets you swap a {@link MemoryCache} for any\n * external backend (Redis, Memcached, your DB) without changing call sites —\n * production bots commonly start with memory and graduate to Redis as load\n * grows. Counters and fixed-window rate limits live on the same surface so the\n * three patterns repeated in real bots (TTL cache, daily counter, per-user\n * rate limit) share one API.\n */\n\n/** Result of a fixed-window {@link CacheStore.rateLimit} hit. */\nexport interface RateLimitResult {\n /** `true` if this hit was within the window's budget. */\n allowed: boolean;\n /** Remaining hits in the current window (`0` once `allowed` is false). */\n remaining: number;\n /** Epoch ms at which the current window resets. */\n resetAt: number;\n}\n\n/** Options accepted by every write helper. */\nexport interface CacheSetOptions {\n /** Time-to-live in milliseconds. `undefined` means never expire. */\n ttl?: number;\n}\n\n/** A swappable cache backend. All operations are async to allow remote stores. */\nexport interface CacheStore {\n /** Read a previously set value, or `undefined` if missing/expired. */\n get<T = unknown>(key: string): Promise<T | undefined>;\n /** Write a value, optionally with a TTL in ms. */\n set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void>;\n /** Remove a key. Resolves to `true` if it existed. */\n delete(key: string): Promise<boolean>;\n /** Whether a non-expired key is present. */\n has(key: string): Promise<boolean>;\n /** Atomically increment a numeric counter. Returns the new value. */\n increment(key: string, delta?: number, options?: CacheSetOptions): Promise<number>;\n /** Fixed-window rate limit hit. Atomic per key. */\n rateLimit(key: string, options: { limit: number; windowMs: number }): Promise<RateLimitResult>;\n /** Drop every entry. */\n clear(): Promise<void>;\n}\n\ninterface Entry<T> {\n value: T;\n expiresAt?: number;\n}\n\n/** In-memory implementation of {@link CacheStore}. Lazy TTL expiration. */\nexport class MemoryCache implements CacheStore {\n private readonly store = new Map<string, Entry<unknown>>();\n\n /** Total number of stored (possibly expired) entries — primarily for tests. */\n get size(): number {\n return this.store.size;\n }\n\n async get<T = unknown>(key: string): Promise<T | undefined> {\n const entry = this.store.get(key);\n if (entry === undefined) return undefined;\n if (entry.expiresAt !== undefined && entry.expiresAt <= Date.now()) {\n this.store.delete(key);\n return undefined;\n }\n return entry.value as T;\n }\n\n async set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void> {\n const ttl = options?.ttl;\n this.store.set(key, {\n value,\n expiresAt: ttl !== undefined && ttl > 0 ? Date.now() + ttl : undefined,\n });\n }\n\n async delete(key: string): Promise<boolean> {\n return this.store.delete(key);\n }\n\n async has(key: string): Promise<boolean> {\n return (await this.get(key)) !== undefined;\n }\n\n async increment(key: string, delta: number = 1, options?: CacheSetOptions): Promise<number> {\n const current = (await this.get<number>(key)) ?? 0;\n const next = current + delta;\n const existing = this.store.get(key);\n // Preserve an existing expiry unless caller overrides it.\n const ttl = options?.ttl;\n if (ttl !== undefined && ttl > 0) {\n await this.set(key, next, { ttl });\n } else if (existing?.expiresAt !== undefined) {\n this.store.set(key, { value: next, expiresAt: existing.expiresAt });\n } else {\n await this.set(key, next);\n }\n return next;\n }\n\n async rateLimit(key: string, options: { limit: number; windowMs: number }): Promise<RateLimitResult> {\n const now = Date.now();\n const bucketKey = `__rl__:${key}`;\n const entry = this.store.get(bucketKey) as Entry<number> | undefined;\n const expired = entry === undefined || entry.expiresAt === undefined || entry.expiresAt <= now;\n if (expired) {\n const resetAt = now + options.windowMs;\n this.store.set(bucketKey, { value: 1, expiresAt: resetAt });\n return { allowed: true, remaining: Math.max(0, options.limit - 1), resetAt };\n }\n const count = entry.value;\n const resetAt = entry.expiresAt ?? now;\n if (count >= options.limit) {\n return { allowed: false, remaining: 0, resetAt };\n }\n this.store.set(bucketKey, { value: count + 1, expiresAt: resetAt });\n return { allowed: true, remaining: Math.max(0, options.limit - count - 1), resetAt };\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n}\n\n/** Convenience factory: returns a default in-memory {@link CacheStore}. */\nexport function createCache(): CacheStore {\n return new MemoryCache();\n}\n","/**\n * Tiny, dependency-free typed config loader for JSON files.\n *\n * Pass a `parser` to support JSON5 / YAML / TOML without dragging those\n * packages into spearkit, and a `schema` to validate (zod, valibot, custom) so\n * a typo in your config blows up at startup instead of at the first user\n * interaction. Pairs naturally with `lookup()` for typed role/channel maps.\n */\nimport { readFile, readFileSync } from \"node:fs\";\nimport { promisify } from \"node:util\";\n\nconst readFileAsync = promisify(readFile);\n\n/** Options accepted by {@link loadConfig} / {@link loadConfigAsync}. */\nexport interface LoadConfigOptions<T> {\n /** Absolute or cwd-relative path to the config file. */\n file: string;\n /** Custom parser. Default `JSON.parse`. Pass `JSON5.parse` (etc.) for other formats. */\n parser?: (text: string) => unknown;\n /** Validation function — receives the parsed value, returns the typed config. */\n schema?: (value: unknown) => T;\n /** File encoding. Default `\"utf8\"`. */\n encoding?: BufferEncoding;\n}\n\n/** Synchronously read + parse + (optionally) validate a config file. */\nexport function loadConfig<T = unknown>(options: LoadConfigOptions<T>): T {\n const text = readFileSync(options.file, options.encoding ?? \"utf8\");\n const parser = options.parser ?? JSON.parse;\n const parsed = parser(text);\n return options.schema !== undefined ? options.schema(parsed) : (parsed as T);\n}\n\n/** Asynchronous variant of {@link loadConfig}. */\nexport async function loadConfigAsync<T = unknown>(options: LoadConfigOptions<T>): Promise<T> {\n const text = await readFileAsync(options.file, options.encoding ?? \"utf8\");\n const parser = options.parser ?? JSON.parse;\n const parsed = parser(text);\n return options.schema !== undefined ? options.schema(parsed) : (parsed as T);\n}\n\n/**\n * Build a typed lookup over a `Record<key, value>` table. Throws on missing\n * keys so config typos surface at startup, not at use.\n *\n * @example\n * ```ts\n * const roles = lookup(config.roles, \"role\");\n * const modId = roles(\"moderator\"); // string; throws if \"moderator\" is absent\n * ```\n */\nexport function lookup<K extends string, V>(\n table: Readonly<Record<K, V>>,\n resourceName: string = \"key\",\n): (key: K) => V {\n return (key) => {\n const value = table[key];\n if (value === undefined) {\n throw new Error(`spearkit: ${resourceName} \"${String(key)}\" not found in config`);\n }\n return value;\n };\n}\n\n/** Build a non-throwing lookup that returns `undefined` for missing keys. */\nexport function lookupOptional<K extends string, V>(\n table: Readonly<Record<K, V>>,\n): (key: K) => V | undefined {\n return (key) => table[key];\n}\n","/**\n * Declarative preconditions (\"guards\") that run before a command, component\n * or prefix-command handler. Replaces the role/permission/guild-only/owner\n * checks repeated 127+ times across production bots — `member.roles.cache.some(...)`,\n * `member.permissions.has(...)`, `if (!message.guild) return`, ownership and\n * target-hierarchy checks — with a composable predicate pipeline.\n *\n * Attach guards on a command (`command({ guards: [...] })`), on a component\n * (`button({ guards: [...] })`), on a prefix command, or once on the client\n * for everything (`new SpearClient({ guards: [...] })`). On denial, spearkit\n * replies with an ephemeral error embed and skips the handler.\n */\nimport {\n PermissionsBitField,\n type APIInteractionGuildMember,\n type Awaitable,\n type Client,\n type Guild,\n type GuildMember,\n type PermissionResolvable,\n type User,\n} from \"discord.js\";\n\n/**\n * Minimal context a guard reads. Every spearkit handler (slash/prefix/component\n * /modal) already exposes these — guards work uniformly across all of them.\n */\nexport interface GuardContext {\n readonly client: Client;\n readonly user: User;\n readonly member: GuildMember | APIInteractionGuildMember | null;\n readonly guild: Guild | null;\n readonly guildId: string | null;\n readonly channelId: string | null;\n}\n\n/** A guard's outcome. `true` = pass; `false`/`{ allowed: false, reason? }` = deny. */\nexport type GuardResult = boolean | { allowed: false; reason?: string };\n\n/** A precondition evaluated before a handler runs. */\nexport type Guard<TCtx extends GuardContext = GuardContext> = (ctx: TCtx) => Awaitable<GuardResult>;\n\n/** Sugar: build a denial result with an explanation. */\nexport function denied(reason?: string): GuardResult {\n return { allowed: false, reason };\n}\n\n/** The resolved outcome of running a list of guards. */\nexport type RunGuardsResult = { allowed: true } | { allowed: false; reason: string | undefined };\n\n/** Run guards in order, short-circuiting on the first denial. */\nexport async function runGuards<TCtx extends GuardContext>(\n ctx: TCtx,\n guards: readonly Guard<TCtx>[] | undefined,\n): Promise<RunGuardsResult> {\n if (guards === undefined || guards.length === 0) return { allowed: true };\n for (const guard of guards) {\n const result = await guard(ctx);\n if (result === true) continue;\n if (result === false) return { allowed: false, reason: undefined };\n if (result.allowed === false) return { allowed: false, reason: result.reason };\n }\n return { allowed: true };\n}\n\n// --- built-in predicates --------------------------------------------------\n\n/** Require the interaction/message to come from inside a guild. */\nexport function guildOnly(reason: string = \"This can only be used in a server.\"): Guard {\n return (ctx) => (ctx.guildId !== null ? true : denied(reason));\n}\n\n/** Require the interaction/message to come from a DM. */\nexport function dmOnly(reason: string = \"This can only be used in DMs.\"): Guard {\n return (ctx) => (ctx.guildId === null ? true : denied(reason));\n}\n\nfunction memberRoleIds(member: GuildMember | APIInteractionGuildMember | null): string[] {\n if (member === null) return [];\n const roles = member.roles;\n if (Array.isArray(roles)) return roles;\n return [...roles.cache.keys()];\n}\n\nfunction memberPermissionsBitField(\n member: GuildMember | APIInteractionGuildMember | null,\n): PermissionsBitField | null {\n if (member === null) return null;\n const perms = member.permissions;\n if (perms instanceof PermissionsBitField) return perms;\n if (typeof perms === \"string\") return new PermissionsBitField(BigInt(perms));\n return null;\n}\n\n/** Require the invoking member to hold ANY of these role ids. */\nexport function requireAnyRole(\n roleIds: readonly string[],\n reason: string = \"You don't have permission to use this.\",\n): Guard {\n const set = new Set(roleIds);\n return (ctx) => {\n const ids = memberRoleIds(ctx.member);\n return ids.some((id) => set.has(id)) ? true : denied(reason);\n };\n}\n\n/** Require the invoking member to hold EVERY one of these role ids. */\nexport function requireAllRoles(\n roleIds: readonly string[],\n reason: string = \"You're missing one of the required roles.\",\n): Guard {\n return (ctx) => {\n const ids = new Set(memberRoleIds(ctx.member));\n return roleIds.every((id) => ids.has(id)) ? true : denied(reason);\n };\n}\n\n/** Require the invoking user to be one of `ownerIds` (\"bot owners\"). */\nexport function requireOwner(\n ownerIds: readonly string[],\n reason: string = \"This is owner-only.\",\n): Guard {\n const set = new Set(ownerIds);\n return (ctx) => (set.has(ctx.user.id) ? true : denied(reason));\n}\n\n/** Require the invoking member to hold a Discord permission flag. */\nexport function requireUserPermissions(\n permission: PermissionResolvable,\n reason: string = \"You don't have permission to use this.\",\n): Guard {\n return (ctx) => {\n const bits = memberPermissionsBitField(ctx.member);\n if (bits === null) return denied(reason);\n return bits.has(permission) ? true : denied(reason);\n };\n}\n\n/** Require the BOT's own member to hold a Discord permission flag. */\nexport function requireBotPermissions(\n permission: PermissionResolvable,\n reason: string = \"I don't have permission to do that here.\",\n): Guard {\n return async (ctx) => {\n const guild = ctx.guild;\n if (guild === null) return denied(reason);\n const me = guild.members.me ?? (await guild.members.fetchMe().catch(() => null));\n if (me === null) return denied(reason);\n return me.permissions.has(permission) ? true : denied(reason);\n };\n}\n\n/** Inline custom predicate; sugar so a one-off check still types as a Guard. */\nexport function guard<TCtx extends GuardContext = GuardContext>(predicate: Guard<TCtx>): Guard<TCtx> {\n return predicate;\n}\n","import {\n MessageFlags,\n type InteractionEditReplyOptions,\n type InteractionReplyOptions,\n type InteractionResponse,\n type Message,\n type RepliableInteraction,\n} from \"discord.js\";\nimport type { Client } from \"discord.js\";\nimport { Embeds, defaultEmbeds, type EmbedLevel, type EmbedPresetInput } from \"./embeds.js\";\n\n/** A client (or anything client-shaped) that may expose a configured {@link Embeds}. */\ntype EmbedHost = Client & { embeds?: Embeds };\n\n/** Reply options with an ergonomic `ephemeral` shortcut (mapped to flags). */\nexport type ReplyData = InteractionReplyOptions & { ephemeral?: boolean };\n\n/** Either a plain string or full reply options. */\nexport type ReplyInput = string | ReplyData;\n\ntype Flags = InteractionReplyOptions[\"flags\"];\n\nfunction withEphemeralFlag(flags: Flags): Flags {\n if (flags == null) return MessageFlags.Ephemeral;\n if (typeof flags === \"number\" || typeof flags === \"bigint\") {\n return Number(flags) | MessageFlags.Ephemeral;\n }\n if (Array.isArray(flags)) return [...flags, MessageFlags.Ephemeral] as Flags;\n return [flags, MessageFlags.Ephemeral] as Flags;\n}\n\n/** Normalises spearkit reply input into a discord.js reply payload. */\nexport function normalizeReply(input: ReplyInput): InteractionReplyOptions {\n if (typeof input === \"string\") return { content: input };\n const { ephemeral, ...rest } = input;\n if (ephemeral) return { ...rest, flags: withEphemeralFlag(rest.flags) };\n return rest;\n}\n\nfunction normalizeEdit(input: ReplyInput): InteractionEditReplyOptions {\n if (typeof input === \"string\") return { content: input };\n const { ephemeral: _ephemeral, flags: _flags, ...rest } = input;\n return rest;\n}\n\n/** Marks an input as ephemeral, regardless of how it was passed. */\nexport function asEphemeral(input: ReplyInput): ReplyData {\n if (typeof input === \"string\") return { content: input, ephemeral: true };\n return { ...input, ephemeral: true };\n}\n\n/**\n * Ergonomic base wrapper shared by every interaction context (commands,\n * buttons, selects, modals). Exposes the common actor/location accessors plus\n * reply helpers that smooth over discord.js' state machine.\n */\nexport abstract class BaseContext<I extends RepliableInteraction = RepliableInteraction> {\n constructor(readonly interaction: I) {}\n\n get client(): I[\"client\"] {\n return this.interaction.client;\n }\n get user() {\n return this.interaction.user;\n }\n get member() {\n return this.interaction.member;\n }\n get guild() {\n return this.interaction.guild;\n }\n get guildId() {\n return this.interaction.guildId;\n }\n get channel() {\n return this.interaction.channel;\n }\n get channelId() {\n return this.interaction.channelId;\n }\n get locale() {\n return this.interaction.locale;\n }\n /** Whether the interaction is already deferred. */\n get deferred() {\n return this.interaction.deferred;\n }\n /** Whether the interaction already received an initial response. */\n get replied() {\n return this.interaction.replied;\n }\n\n /** Send the initial response to the interaction. */\n reply(input: ReplyInput): Promise<InteractionResponse<boolean>> {\n return this.interaction.reply(normalizeReply(input));\n }\n\n /** Reply, but always hidden to everyone except the invoking user. */\n replyEphemeral(input: ReplyInput): Promise<InteractionResponse<boolean>> {\n return this.reply(asEphemeral(input));\n }\n\n /** Acknowledge now and respond later via {@link editReply}. */\n defer(options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.interaction.deferReply(\n options.ephemeral ? { flags: MessageFlags.Ephemeral } : {},\n );\n }\n\n /** Edit the original (or deferred) response. */\n editReply(input: ReplyInput): Promise<Message> {\n return this.interaction.editReply(normalizeEdit(input));\n }\n\n /** Add an additional message after the initial response. */\n followUp(input: ReplyInput): Promise<Message> {\n return this.interaction.followUp(normalizeReply(input));\n }\n\n /**\n * State-aware send: replies, edits a deferred response, or follows up —\n * whichever is valid given the current interaction state. The single method\n * most handlers ever need.\n */\n async send(input: ReplyInput): Promise<void> {\n if (this.interaction.deferred) {\n await this.editReply(input);\n } else if (this.interaction.replied) {\n await this.followUp(input);\n } else {\n await this.reply(input);\n }\n }\n\n\n /** Get the configured {@link Embeds} factory — `client.embeds` or the default. */\n protected getEmbeds(): Embeds {\n return (this.interaction.client as EmbedHost).embeds ?? defaultEmbeds;\n }\n\n /** State-aware send of a red error embed. Defaults to ephemeral. */\n error(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"error\", input, { ephemeral: options.ephemeral ?? true });\n }\n\n /** State-aware send of a green success embed. */\n success(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"success\", input, options);\n }\n\n /** State-aware send of a blue info embed. */\n info(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"info\", input, options);\n }\n\n /** State-aware send of a yellow warn embed. */\n warn(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"warn\", input, options);\n }\n\n /** Initial-reply variant of {@link error} (always `reply`, never `editReply`/`followUp`). */\n replyError(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"error\", input, { ephemeral: options.ephemeral ?? true });\n }\n\n /** Initial-reply variant of {@link success}. */\n replySuccess(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"success\", input, options);\n }\n\n /** Initial-reply variant of {@link info}. */\n replyInfo(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"info\", input, options);\n }\n\n /** Initial-reply variant of {@link warn}. */\n replyWarn(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"warn\", input, options);\n }\n\n private sendPreset(level: EmbedLevel, input: EmbedPresetInput, options: { ephemeral?: boolean }): Promise<void> {\n const embed = this.getEmbeds().build(level, input);\n return this.send({ embeds: [embed], ephemeral: options.ephemeral });\n }\n\n private replyPreset(level: EmbedLevel, input: EmbedPresetInput, options: { ephemeral?: boolean }): Promise<InteractionResponse<boolean>> {\n const embed = this.getEmbeds().build(level, input);\n return this.reply({ embeds: [embed], ephemeral: options.ephemeral });\n }\n}\n","/**\n * Rate-limit commands per user, per role, per guild, per channel or globally.\n *\n * A cooldown is described by a {@link CooldownConfig}: a base `duration`, the\n * `scope` it is keyed on, an `exempt` set (users/roles that never wait) and\n * per-user / per-role `overrides` (different durations for specific ids). Set a\n * default on the client (applies to every command) and/or per command.\n */\n\n/** What a cooldown is bucketed against. Default `\"user\"`. */\nexport type CooldownScope = \"user\" | \"guild\" | \"channel\" | \"global\";\n\n/** Users and roles that bypass a cooldown entirely. */\nexport interface CooldownExemptions {\n /** User ids that never wait. */\n users?: readonly string[];\n /** Role ids whose members never wait. */\n roles?: readonly string[];\n}\n\n/** Per-user and per-role duration overrides (milliseconds; `0` disables). */\nexport interface CooldownOverrides {\n /** `userId -> duration ms`. */\n users?: Readonly<Record<string, number>>;\n /** `roleId -> duration ms`. The most lenient matching role wins. */\n roles?: Readonly<Record<string, number>>;\n}\n\n/** Full cooldown description. */\nexport interface CooldownConfig {\n /** Base cooldown in milliseconds. */\n duration: number;\n /** What the cooldown is keyed on. Default `\"user\"`. */\n scope?: CooldownScope;\n /** Users/roles that bypass the cooldown. */\n exempt?: CooldownExemptions;\n /** Per-user / per-role duration overrides. */\n overrides?: CooldownOverrides;\n /** Message shown when blocked. A function receives the remaining ms. */\n message?: string | ((remainingMs: number) => string);\n}\n\n/** A `CooldownConfig`, or a bare duration in milliseconds. */\nexport type CooldownInput = number | CooldownConfig;\n\n/** Normalise a {@link CooldownInput} to a full {@link CooldownConfig}. */\nexport function normalizeCooldown(input: CooldownInput): CooldownConfig {\n return typeof input === \"number\" ? { duration: input } : input;\n}\n\n/** The actor a cooldown is evaluated for. */\nexport interface CooldownActor {\n userId: string;\n roleIds: readonly string[];\n guildId: string | null;\n channelId: string | null;\n}\n\n/** Whether an action is allowed now, and if not, how long remains. */\nexport type CooldownResult = { allowed: true } | { allowed: false; remaining: number };\n\nfunction scopeKey(scope: CooldownScope, actor: CooldownActor): string {\n switch (scope) {\n case \"guild\":\n return `g:${actor.guildId ?? \"dm\"}`;\n case \"channel\":\n return `c:${actor.channelId ?? \"dm\"}`;\n case \"global\":\n return \"global\";\n case \"user\":\n return `u:${actor.userId}`;\n }\n}\n\n/**\n * Resolve the cooldown an actor should serve. `null` means exempt (no\n * cooldown). Otherwise a duration in milliseconds (which may be `0`).\n */\nexport function effectiveDuration(config: CooldownConfig, actor: CooldownActor): number | null {\n if (config.exempt?.users?.includes(actor.userId) === true) return null;\n if (config.exempt?.roles?.some((roleId) => actor.roleIds.includes(roleId)) === true) return null;\n\n const userOverride = config.overrides?.users?.[actor.userId];\n if (userOverride !== undefined) return userOverride;\n\n const roleOverrides = config.overrides?.roles;\n if (roleOverrides !== undefined) {\n let best: number | undefined;\n for (const roleId of actor.roleIds) {\n const candidate = roleOverrides[roleId];\n if (candidate !== undefined) best = best === undefined ? candidate : Math.min(best, candidate);\n }\n if (best !== undefined) return best;\n }\n\n return config.duration;\n}\n\nfunction keyFor(bucket: string, config: CooldownConfig, actor: CooldownActor): string {\n return `${bucket}|${scopeKey(config.scope ?? \"user\", actor)}`;\n}\n\n/**\n * Tracks last-use timestamps and decides whether an action is allowed.\n * Stateful but dependency-free; one instance is shared on `client.cooldowns`.\n */\nexport class CooldownManager {\n private readonly hits = new Map<string, number>();\n\n /** Number of tracked buckets. */\n get size(): number {\n return this.hits.size;\n }\n\n /**\n * Check whether `actor` may use `bucket`, recording the use when allowed.\n * Exempt actors and non-positive durations are always allowed (no record).\n */\n consume(bucket: string, input: CooldownInput, actor: CooldownActor, now: number = Date.now()): CooldownResult {\n const config = normalizeCooldown(input);\n const duration = effectiveDuration(config, actor);\n if (duration === null || duration <= 0) return { allowed: true };\n const key = keyFor(bucket, config, actor);\n const last = this.hits.get(key);\n if (last !== undefined && now - last < duration) {\n return { allowed: false, remaining: duration - (now - last) };\n }\n this.hits.set(key, now);\n return { allowed: true };\n }\n\n /** Like {@link consume} but never records — a read-only check. */\n peek(bucket: string, input: CooldownInput, actor: CooldownActor, now: number = Date.now()): CooldownResult {\n const config = normalizeCooldown(input);\n const duration = effectiveDuration(config, actor);\n if (duration === null || duration <= 0) return { allowed: true };\n const last = this.hits.get(keyFor(bucket, config, actor));\n if (last !== undefined && now - last < duration) {\n return { allowed: false, remaining: duration - (now - last) };\n }\n return { allowed: true };\n }\n\n /** Clear a single actor's cooldown for a bucket. Returns whether one existed. */\n reset(bucket: string, actor: CooldownActor, scope: CooldownScope = \"user\"): boolean {\n return this.hits.delete(`${bucket}|${scopeKey(scope, actor)}`);\n }\n\n /** Drop every tracked cooldown. */\n clear(): void {\n this.hits.clear();\n }\n}\n\n/** Build the user-facing message for a blocked action. */\nexport function formatCooldownMessage(config: CooldownConfig, remainingMs: number): string {\n if (typeof config.message === \"function\") return config.message(remainingMs);\n if (typeof config.message === \"string\") return config.message;\n const seconds = Math.max(1, Math.ceil(remainingMs / 1000));\n return `You're on cooldown — try again in ${seconds}s.`;\n}\n","/**\n * User- and message-context-menu commands (\"Apps\") as first-class spearkit\n * citizens. The bot studied for spearkit hand-rolls these with raw\n * `ContextMenuCommandBuilder` + manual modal hand-offs and lives them under\n * the slash loader — context menus need their own type, target accessor, and\n * dispatch path, and the deploy payload needs to be merged with slash\n * commands.\n *\n * Use {@link userCommand} / {@link messageCommand} to define one, then\n * register with `client.register(...)`. Cooldowns, guards and usage tracking\n * compose exactly like slash commands.\n */\nimport {\n ApplicationCommandType,\n InteractionContextType,\n MessageFlags,\n PermissionsBitField,\n type Awaitable,\n type LocalizationMap,\n type MessageContextMenuCommandInteraction,\n type PermissionResolvable,\n type RESTPostAPIContextMenuApplicationCommandsJSONBody,\n type UserContextMenuCommandInteraction,\n} from \"discord.js\";\nimport { BaseContext } from \"./context.js\";\nimport {\n normalizeCooldown,\n formatCooldownMessage,\n type CooldownActor,\n type CooldownConfig,\n type CooldownInput,\n type CooldownManager,\n} from \"./cooldown.js\";\nimport { runGuards, type Guard } from \"./guards.js\";\nimport { defaultEmbeds, type Embeds } from \"./embeds.js\";\nimport type { Logger } from \"./logger.js\";\nimport type { UsageEvent } from \"./usage.js\";\n\n/** Metadata accepted by both context-menu kinds. */\ninterface ContextMenuMeta {\n defaultMemberPermissions?: PermissionResolvable | null;\n nsfw?: boolean;\n guildOnly?: boolean;\n nameLocalizations?: LocalizationMap;\n cooldown?: CooldownInput;\n guards?: readonly Guard[];\n}\n\n/** Configuration for {@link userCommand}. */\nexport interface UserCommandConfig<R = void> extends ContextMenuMeta {\n name: string;\n run: (ctx: UserContextMenuContext) => Awaitable<R>;\n}\n\n/** Configuration for {@link messageCommand}. */\nexport interface MessageCommandConfig<R = void> extends ContextMenuMeta {\n name: string;\n run: (ctx: MessageContextMenuContext) => Awaitable<R>;\n}\n/** Common shape for any context-menu command (user or message). */\nexport interface BaseContextMenuCommand {\n readonly name: string;\n readonly cooldown?: CooldownConfig;\n readonly guards?: readonly Guard[];\n toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody;\n}\n\n/** A user-target context-menu command. */\nexport interface UserContextMenu extends BaseContextMenuCommand {\n readonly kind: \"userMenu\";\n execute(interaction: UserContextMenuCommandInteraction): Promise<void>;\n}\n\n/** A message-target context-menu command. */\nexport interface MessageContextMenu extends BaseContextMenuCommand {\n readonly kind: \"messageMenu\";\n execute(interaction: MessageContextMenuCommandInteraction): Promise<void>;\n}\n\n/** A registered context-menu command — discriminated by `kind`. */\nexport type ContextMenuCommand = UserContextMenu | MessageContextMenu;\n\n\n/** Handler context for a user-target context menu. */\nexport class UserContextMenuContext extends BaseContext<UserContextMenuCommandInteraction> {\n /** The user the menu was invoked on. */\n get targetUser() {\n return this.interaction.targetUser;\n }\n /** The member version of the target, if available. */\n get targetMember() {\n return this.interaction.targetMember;\n }\n}\n\n/** Handler context for a message-target context menu. */\nexport class MessageContextMenuContext extends BaseContext<MessageContextMenuCommandInteraction> {\n /** The message the menu was invoked on. */\n get targetMessage() {\n return this.interaction.targetMessage;\n }\n}\n\nfunction baseJSON(\n meta: ContextMenuMeta & { name: string },\n type: ApplicationCommandType.User | ApplicationCommandType.Message,\n): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n return {\n type,\n name: meta.name,\n name_localizations: meta.nameLocalizations,\n nsfw: meta.nsfw,\n default_member_permissions:\n meta.defaultMemberPermissions == null\n ? meta.defaultMemberPermissions\n : new PermissionsBitField(meta.defaultMemberPermissions).bitfield.toString(),\n contexts: meta.guildOnly ? [InteractionContextType.Guild] : undefined,\n };\n}\n\n/** Define a user-target (\"Apps → user\") context-menu command. */\nexport function userCommand<R = void>(config: UserCommandConfig<R>): UserContextMenu {\n const cooldown = config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined;\n return {\n kind: \"userMenu\",\n name: config.name,\n cooldown,\n guards: config.guards,\n toJSON: () => baseJSON(config, ApplicationCommandType.User),\n execute: async (interaction) => {\n await config.run(new UserContextMenuContext(interaction));\n },\n };\n}\n\n/** Define a message-target (\"Apps → message\") context-menu command. */\nexport function messageCommand<R = void>(config: MessageCommandConfig<R>): MessageContextMenu {\n const cooldown = config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined;\n return {\n kind: \"messageMenu\",\n name: config.name,\n cooldown,\n guards: config.guards,\n toJSON: () => baseJSON(config, ApplicationCommandType.Message),\n execute: async (interaction) => {\n await config.run(new MessageContextMenuContext(interaction));\n },\n };\n}\n\n/** Holds context-menu commands and routes incoming interactions to them. */\nexport class ContextMenuRegistry {\n private readonly users = new Map<string, UserContextMenu>();\n private readonly messages = new Map<string, MessageContextMenu>();\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private defaultGuards: readonly Guard[] = [];\n private onUsage?: (event: UsageEvent) => void;\n\n /** Register one or more context-menu commands. */\n add(...commands: readonly ContextMenuCommand[]): this {\n for (const command of commands) {\n if (command.kind === \"userMenu\") this.users.set(command.name, command as UserContextMenu);\n else this.messages.set(command.name, command as MessageContextMenu);\n }\n return this;\n }\n\n /** Total number of registered context-menu commands. */\n get size(): number {\n return this.users.size + this.messages.size;\n }\n\n /** Every registered command, both kinds. */\n all(): ContextMenuCommand[] {\n return [...this.users.values(), ...this.messages.values()];\n }\n\n /** Serialise every command for the REST `applicationCommands` PUT body. */\n toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody[] {\n return this.all().map((c) => c.toJSON());\n }\n\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Dispatch a user-target interaction. */\n async handleUser(interaction: UserContextMenuCommandInteraction): Promise<void> {\n const command = this.users.get(interaction.commandName);\n if (command === undefined) return;\n await this.dispatch(command, interaction);\n }\n\n /** Dispatch a message-target interaction. */\n async handleMessage(interaction: MessageContextMenuCommandInteraction): Promise<void> {\n const command = this.messages.get(interaction.commandName);\n if (command === undefined) return;\n await this.dispatch(command, interaction);\n }\n\n private async dispatch(\n command: UserContextMenu | MessageContextMenu,\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n ): Promise<void> {\n this.logger?.debug(\"contextMenu\", {\n data: { kind: command.kind, name: command.name, user: interaction.user.id },\n });\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(\n `${command.kind}:${command.name}`,\n cooldown,\n actorOf(interaction),\n );\n if (!result.allowed) {\n await replyCooldown(interaction, cooldown, result.remaining);\n return;\n }\n }\n const guards = combineGuards(this.defaultGuards, command.guards);\n if (guards.length > 0) {\n const guardResult = await runGuards(interaction, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"contextMenu denied\", {\n data: { name: command.name, user: interaction.user.id, reason: guardResult.reason ?? \"\" },\n });\n await replyDenied(interaction, guardResult.reason);\n return;\n }\n }\n const start = Date.now();\n try {\n if (command.kind === \"userMenu\") {\n await command.execute(interaction as UserContextMenuCommandInteraction);\n } else {\n await command.execute(interaction as MessageContextMenuCommandInteraction);\n }\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n detail: command.kind,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n detail: command.kind,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n interaction.client.emit(\"error\", err);\n try {\n if (!interaction.replied && !interaction.deferred) {\n await interaction.reply({\n content: \"Something went wrong.\",\n flags: MessageFlags.Ephemeral,\n });\n }\n } catch {\n // Interaction likely expired.\n }\n }\n }\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction actorOf(\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n): CooldownActor {\n const member = interaction.member;\n let roleIds: readonly string[] = [];\n if (member !== null) {\n const roles = member.roles;\n roleIds = Array.isArray(roles) ? roles : [...roles.cache.keys()];\n }\n return {\n userId: interaction.user.id,\n roleIds,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n };\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\nasync function replyCooldown(\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n config: CooldownConfig,\n remaining: number,\n): Promise<void> {\n const content = formatCooldownMessage(config, remaining);\n try {\n if (interaction.deferred) await interaction.editReply({ content });\n else if (interaction.replied) await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n else await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n } catch {\n // Interaction likely expired.\n }\n}\n\nasync function replyDenied(\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n reason: string | undefined,\n): Promise<void> {\n const embeds = clientEmbeds(interaction.client);\n const text = reason ?? \"You don't have permission to use this.\";\n try {\n const payload = { embeds: [embeds.error(text)], flags: MessageFlags.Ephemeral } as const;\n if (interaction.deferred) await interaction.editReply({ embeds: payload.embeds });\n else if (interaction.replied) await interaction.followUp(payload);\n else await interaction.reply(payload);\n } catch {\n // Interaction likely expired.\n }\n}\n","/**\n * Typed argument parsing for prefix commands.\n *\n * Real bots reimplement the same mention-or-snowflake / ms-duration /\n * \"rest is the reason\" parsing in every prefix command (44+ hand-rolled sites\n * is normal). spearkit lets you declare what you want once and receive a\n * typed `ctx.options` shaped exactly like a slash command's.\n *\n * @example\n * ```ts\n * prefixCommand({\n * name: \"mute\",\n * args: (a) => a.snowflake(\"target\").duration(\"duration\").rest(\"reason\"),\n * run: (ctx) => {\n * ctx.options.target; // string (snowflake id)\n * ctx.options.duration; // number (ms)\n * ctx.options.reason; // string\n * },\n * });\n * ```\n */\nimport { parseDuration } from \"./format.js\";\n\ntype Resolved = {\n string: string;\n integer: number;\n number: number;\n boolean: boolean;\n snowflake: string;\n duration: number;\n rest: string;\n};\n\n/** A single argument's runtime spec; recorded by {@link PrefixArgsBuilder}. */\nexport interface PrefixArgSpec {\n readonly name: string;\n readonly kind: keyof Resolved;\n readonly required: boolean;\n readonly defaultValue?: string | number | boolean;\n}\n\n/** A failed parse, returned by {@link PrefixArgsParser.parse}. */\nexport interface PrefixArgError {\n readonly ok: false;\n readonly arg: string;\n readonly reason: string;\n}\n\n/** A successful parse, returned by {@link PrefixArgsParser.parse}. */\nexport interface PrefixArgsOk<T> {\n readonly ok: true;\n readonly values: T;\n}\n\n/** The compiled parser produced by {@link PrefixArgsBuilder.compile}. */\nexport interface PrefixArgsParser<T> {\n readonly specs: readonly PrefixArgSpec[];\n parse(tokens: readonly string[], rest: string): PrefixArgsOk<T> | PrefixArgError;\n}\n\ntype AddField<TShape, K extends string, T, Req extends boolean> = Req extends true\n ? TShape & { [P in K]: T }\n : TShape & { [P in K]?: T };\n\nconst SNOWFLAKE_RE = /^\\d{15,21}$/;\nconst USER_MENTION_RE = /^<@!?(\\d{15,21})>$/;\nconst CHANNEL_MENTION_RE = /^<#(\\d{15,21})>$/;\nconst ROLE_MENTION_RE = /^<@&(\\d{15,21})>$/;\n\nfunction extractSnowflake(input: string): string | null {\n if (SNOWFLAKE_RE.test(input)) return input;\n const m = USER_MENTION_RE.exec(input) ?? CHANNEL_MENTION_RE.exec(input) ?? ROLE_MENTION_RE.exec(input);\n return m === null ? null : (m[1] ?? null);\n}\n\ninterface BaseOpts {\n /** Mark the arg required. Default `false`. */\n required?: boolean;\n}\n\ninterface StringOpts extends BaseOpts {\n minLength?: number;\n maxLength?: number;\n /** Default value when the token is missing. Makes the arg effectively optional. */\n default?: string;\n}\n\ninterface NumericOpts extends BaseOpts {\n minValue?: number;\n maxValue?: number;\n default?: number;\n}\n\ninterface BooleanOpts extends BaseOpts {\n default?: boolean;\n}\n\ninterface RestOpts extends BaseOpts {\n default?: string;\n}\n\n/**\n * Build a typed argument schema for {@link prefixCommand}. Chain calls\n * positionally — first token → first arg, second → second arg, etc.\n */\nexport class PrefixArgsBuilder<TShape extends Record<string, unknown> = {}> {\n private readonly specs: readonly PrefixArgSpec[];\n\n /** @internal */\n constructor(specs: readonly PrefixArgSpec[] = []) {\n this.specs = specs;\n }\n\n /** A raw string token. */\n string<K extends string, Req extends boolean = false>(\n name: K,\n options?: StringOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, string, Req>> {\n return this.push({ name, kind: \"string\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A whole integer. */\n integer<K extends string, Req extends boolean = false>(\n name: K,\n options?: NumericOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, number, Req>> {\n return this.push({ name, kind: \"integer\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A floating-point number. */\n number<K extends string, Req extends boolean = false>(\n name: K,\n options?: NumericOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, number, Req>> {\n return this.push({ name, kind: \"number\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A boolean (`true`/`yes`/`1`/`on` vs `false`/`no`/`0`/`off`). */\n boolean<K extends string, Req extends boolean = false>(\n name: K,\n options?: BooleanOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, boolean, Req>> {\n return this.push({ name, kind: \"boolean\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A Discord snowflake id — accepts raw ids and `<@u>` / `<#c>` / `<@&r>` mentions. */\n snowflake<K extends string, Req extends boolean = false>(\n name: K,\n options?: BaseOpts & { required?: Req; default?: string },\n ): PrefixArgsBuilder<AddField<TShape, K, string, Req>> {\n return this.push({ name, kind: \"snowflake\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A duration like `\"1h30m\"` or `\"1 saat\"` parsed to milliseconds. */\n duration<K extends string, Req extends boolean = false>(\n name: K,\n options?: BaseOpts & { required?: Req; default?: number },\n ): PrefixArgsBuilder<AddField<TShape, K, number, Req>> {\n return this.push({ name, kind: \"duration\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** The remainder of the message (everything after previous args). */\n rest<K extends string, Req extends boolean = false>(\n name: K,\n options?: RestOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, string, Req>> {\n return this.push({ name, kind: \"rest\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n private push<TNew extends Record<string, unknown>>(spec: PrefixArgSpec): PrefixArgsBuilder<TNew> {\n return new PrefixArgsBuilder<TNew>([...this.specs, spec]);\n }\n\n /** Compile this builder into a parser. */\n compile(): PrefixArgsParser<TShape> {\n const specs = this.specs;\n return {\n specs,\n parse(tokens, rest) {\n const out: Record<string, string | number | boolean | undefined> = {};\n let idx = 0;\n for (let i = 0; i < specs.length; i++) {\n const spec = specs[i] as PrefixArgSpec;\n if (spec.kind === \"rest\") {\n const tail = idx === 0 ? rest : tokens.slice(idx).join(\" \");\n if (tail.length === 0) {\n if (spec.required) return { ok: false, arg: spec.name, reason: `missing required argument \"${spec.name}\"` };\n out[spec.name] = spec.defaultValue as string | undefined;\n } else {\n out[spec.name] = tail;\n }\n idx = tokens.length;\n continue;\n }\n const token = tokens[idx];\n if (token === undefined) {\n if (spec.required) {\n return { ok: false, arg: spec.name, reason: `missing required argument \"${spec.name}\"` };\n }\n out[spec.name] = spec.defaultValue;\n continue;\n }\n const parsed = coerce(spec, token);\n if (parsed.ok === false) return { ok: false, arg: spec.name, reason: parsed.reason };\n out[spec.name] = parsed.value;\n idx += 1;\n }\n return { ok: true, values: out as TShape };\n },\n };\n }\n}\n\nfunction coerce(\n spec: PrefixArgSpec,\n token: string,\n): { ok: true; value: string | number | boolean } | { ok: false; reason: string } {\n switch (spec.kind) {\n case \"string\":\n return { ok: true, value: token };\n case \"integer\": {\n const n = Number(token);\n if (!Number.isInteger(n)) return { ok: false, reason: `\"${token}\" is not an integer` };\n return { ok: true, value: n };\n }\n case \"number\": {\n const n = Number(token);\n if (!Number.isFinite(n)) return { ok: false, reason: `\"${token}\" is not a number` };\n return { ok: true, value: n };\n }\n case \"boolean\": {\n const low = token.toLowerCase();\n if ([\"true\", \"1\", \"yes\", \"on\"].includes(low)) return { ok: true, value: true };\n if ([\"false\", \"0\", \"no\", \"off\"].includes(low)) return { ok: true, value: false };\n return { ok: false, reason: `\"${token}\" is not a boolean` };\n }\n case \"snowflake\": {\n const id = extractSnowflake(token);\n if (id === null) return { ok: false, reason: `\"${token}\" is not a snowflake or mention` };\n return { ok: true, value: id };\n }\n case \"duration\": {\n const ms = parseDuration(token);\n if (ms === null) return { ok: false, reason: `\"${token}\" is not a duration` };\n return { ok: true, value: ms };\n }\n default:\n return { ok: false, reason: `unknown arg kind for \"${spec.name}\"` };\n }\n}\n\n/** Start a fresh args builder. Pass to `prefixCommand({ args })`. */\nexport function prefixArgs(): PrefixArgsBuilder<{}> {\n return new PrefixArgsBuilder();\n}\n","/**\n * Paginated embed replies driven by buttons.\n *\n * Real bots reimplement the same {page state, prev/next buttons, user-only\n * filter, disable-on-timeout} dance per command. {@link paginate} handles it:\n * pass an item list and a render function, and you get an interactive,\n * timeout-aware paginator in one call. {@link buildPaginatorPage} exposes the\n * same logic without the collector, for tests or custom flows.\n */\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ComponentType,\n type BaseMessageOptions,\n type ButtonInteraction,\n type EmbedBuilder,\n type RepliableInteraction,\n} from \"discord.js\";\n\n/** Result of {@link PaginateOptions.render}: a builder OR a full message payload. */\nexport type PaginateRender =\n | EmbedBuilder\n | readonly EmbedBuilder[]\n | BaseMessageOptions;\n\n/** Options for {@link paginate} / {@link buildPaginatorPage}. */\nexport interface PaginateOptions<T> {\n /** Items per page. Default `10`. */\n pageSize?: number;\n /** Build the body for one page. */\n render: (\n slice: readonly T[],\n state: { page: number; pages: number },\n ) => PaginateRender | Promise<PaginateRender>;\n /** When set, only this user id can click. Defaults to the invoker. */\n user?: string;\n /** Time (ms) before buttons are disabled. Default `5 * 60_000`. */\n timeoutMs?: number;\n /** Custom-id prefix to avoid clashes with other components. Default `\"spk-page\"`. */\n namespace?: string;\n /** Make the initial reply ephemeral. Default `false`. */\n ephemeral?: boolean;\n /** Button labels. Defaults: `‹` Prev / `›` Next / `«` First / `»` Last. */\n labels?: {\n first?: string;\n prev?: string;\n next?: string;\n last?: string;\n };\n /** Which buttons to show. Default `\"prev-next\"`. */\n controls?: \"prev-next\" | \"first-prev-next-last\";\n}\n\nfunction normalisePayload(render: PaginateRender): BaseMessageOptions {\n if (\n typeof (render as EmbedBuilder).setColor === \"function\" &&\n typeof (render as EmbedBuilder).toJSON === \"function\"\n ) {\n return { embeds: [render as EmbedBuilder] };\n }\n if (Array.isArray(render)) {\n return { embeds: render as EmbedBuilder[] };\n }\n return render as BaseMessageOptions;\n}\n\nfunction controlsRow(\n page: number,\n pages: number,\n ns: string,\n controls: \"prev-next\" | \"first-prev-next-last\",\n labels: Required<NonNullable<PaginateOptions<unknown>[\"labels\"]>>,\n): ActionRowBuilder<ButtonBuilder> {\n const buttons: ButtonBuilder[] = [];\n if (controls === \"first-prev-next-last\") {\n buttons.push(\n new ButtonBuilder()\n .setCustomId(`${ns}:first`)\n .setStyle(ButtonStyle.Secondary)\n .setLabel(labels.first)\n .setDisabled(page === 0),\n );\n }\n buttons.push(\n new ButtonBuilder()\n .setCustomId(`${ns}:prev`)\n .setStyle(ButtonStyle.Primary)\n .setLabel(labels.prev)\n .setDisabled(page === 0),\n new ButtonBuilder()\n .setCustomId(`${ns}:next`)\n .setStyle(ButtonStyle.Primary)\n .setLabel(labels.next)\n .setDisabled(page >= pages - 1),\n );\n if (controls === \"first-prev-next-last\") {\n buttons.push(\n new ButtonBuilder()\n .setCustomId(`${ns}:last`)\n .setStyle(ButtonStyle.Secondary)\n .setLabel(labels.last)\n .setDisabled(page >= pages - 1),\n );\n }\n return new ActionRowBuilder<ButtonBuilder>().addComponents(...buttons);\n}\n\nfunction resolveLabels(input: PaginateOptions<unknown>[\"labels\"]): Required<NonNullable<PaginateOptions<unknown>[\"labels\"]>> {\n return {\n first: input?.first ?? \"«\",\n prev: input?.prev ?? \"‹\",\n next: input?.next ?? \"›\",\n last: input?.last ?? \"»\",\n };\n}\n\n/**\n * Build the payload for a single paginator page (embeds + button row), without\n * any interaction or collector wiring. Useful for tests, web previews and\n * custom UIs that want spearkit's slicing/controls but their own send path.\n */\nexport async function buildPaginatorPage<T>(\n items: readonly T[],\n page: number,\n options: PaginateOptions<T>,\n): Promise<{ payload: BaseMessageOptions; pages: number }> {\n const pageSize = options.pageSize ?? 10;\n const pages = Math.max(1, Math.ceil(items.length / pageSize));\n const ns = options.namespace ?? \"spk-page\";\n const controls = options.controls ?? \"prev-next\";\n const labels = resolveLabels(options.labels);\n const slice = items.slice(page * pageSize, page * pageSize + pageSize);\n const body = await options.render(slice, { page, pages });\n const payload = normalisePayload(body);\n const components = pages > 1 ? [controlsRow(page, pages, ns, controls, labels)] : [];\n return { payload: { ...payload, components }, pages };\n}\n\n/**\n * Send an item list across paginated, button-controlled embeds.\n *\n * The first page is replied to {@link interaction} (or `editReply`d when\n * already deferred), then a button-component collector handles prev/next\n * clicks until the timeout fires — at which point the buttons are disabled.\n */\nexport async function paginate<T>(\n interaction: RepliableInteraction,\n items: readonly T[],\n options: PaginateOptions<T>,\n): Promise<void> {\n const pageSize = options.pageSize ?? 10;\n const ns = options.namespace ?? \"spk-page\";\n const controls = options.controls ?? \"prev-next\";\n const labels = resolveLabels(options.labels);\n const allowedUser = options.user ?? interaction.user.id;\n let page = 0;\n\n const buildPage = async (): Promise<{ payload: BaseMessageOptions; pages: number }> => {\n return buildPaginatorPage(items, page, { ...options, pageSize, namespace: ns, controls, labels });\n };\n\n const { payload: initial, pages } = await buildPage();\n const sent = interaction.deferred\n ? await interaction.editReply(initial)\n : (await interaction.reply({\n ...initial,\n flags: options.ephemeral === true ? 64 : undefined,\n } as never),\n await interaction.fetchReply());\n\n if (pages <= 1) return;\n\n const collector = sent.createMessageComponentCollector({\n componentType: ComponentType.Button,\n time: options.timeoutMs ?? 5 * 60_000,\n filter: (i: ButtonInteraction) => i.user.id === allowedUser && i.customId.startsWith(`${ns}:`),\n });\n\n collector.on(\"collect\", async (button) => {\n const action = button.customId.slice(ns.length + 1);\n if (action === \"first\") page = 0;\n else if (action === \"prev\") page = Math.max(0, page - 1);\n else if (action === \"next\") page = Math.min(pages - 1, page + 1);\n else if (action === \"last\") page = pages - 1;\n const next = await buildPage();\n await button.update(next.payload).catch(() => undefined);\n });\n\n collector.on(\"end\", async () => {\n const disabledRow = controlsRow(page, pages, ns, controls, labels);\n for (const c of disabledRow.components) c.setDisabled(true);\n const { payload: final } = await buildPage();\n await interaction.editReply({ ...final, components: [disabledRow] }).catch(() => undefined);\n });\n}\n","/**\n * Yes/no confirmation prompts: a one-line API for the \"are you sure?\" flow\n * Yes/no confirmation prompts: a one-line API for the \"are you sure?\" flow\n * that bots reimplement every time (reaction-based, button-based, or modal).\n *\n * @example\n * ```ts\n * const ok = await confirm(interaction, {\n * body: `Reset **${role.name}** for **${members}** members?`,\n * confirm: { label: \"Reset\", style: \"Danger\" },\n * cancel: { label: \"Cancel\" },\n * timeoutMs: 30_000,\n * });\n * if (!ok.confirmed) return ctx.error(\"Cancelled.\");\n * ```\n */\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ComponentType,\n type ButtonInteraction,\n type RepliableInteraction,\n} from \"discord.js\";\nimport { defaultEmbeds, type Embeds } from \"./embeds.js\";\n\n/** Visual style for a confirm/cancel button. */\nexport type ConfirmButtonStyle = \"Primary\" | \"Secondary\" | \"Success\" | \"Danger\";\n\n/** One of the two buttons. */\nexport interface ConfirmButtonOptions {\n /** Visible label. */\n label?: string;\n /** Visual style. */\n style?: ConfirmButtonStyle;\n}\n\n/** Options for {@link confirm}. */\nexport interface ConfirmOptions {\n /** Embed title. */\n title?: string;\n /** Embed body. */\n body: string;\n /** Confirm button config. Defaults: label `\"Confirm\"`, style `\"Success\"`. */\n confirm?: ConfirmButtonOptions;\n /** Cancel button config. Defaults: label `\"Cancel\"`, style `\"Secondary\"`. */\n cancel?: ConfirmButtonOptions;\n /** Only this user id can click. Defaults to the invoker. */\n user?: string;\n /** Time (ms) before the prompt times out as cancelled. Default `30_000`. */\n timeoutMs?: number;\n /** Make the prompt ephemeral. Default `true`. */\n ephemeral?: boolean;\n /** Custom-id prefix to avoid clashes. Default `\"spk-confirm\"`. */\n namespace?: string;\n}\n\n/** Result of {@link confirm}. */\nexport interface ConfirmResult {\n /** Whether the user confirmed (clicked the confirm button before timeout). */\n confirmed: boolean;\n /** How the prompt ended. */\n reason: \"confirm\" | \"cancel\" | \"timeout\";\n /** The triggering button interaction when `reason !== \"timeout\"`. */\n interaction?: ButtonInteraction;\n}\n\nconst STYLE_MAP: Record<ConfirmButtonStyle, ButtonStyle> = {\n Primary: ButtonStyle.Primary,\n Secondary: ButtonStyle.Secondary,\n Success: ButtonStyle.Success,\n Danger: ButtonStyle.Danger,\n};\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\n/**\n * Show a yes/no confirmation prompt and wait for the user's choice.\n *\n * Resolves once a button is clicked or the timeout fires. The clicked button\n * is automatically acknowledged via `deferUpdate`, and the original message's\n * buttons are disabled. Returns `{ confirmed, reason, interaction? }`.\n */\nexport async function confirm(\n interaction: RepliableInteraction,\n options: ConfirmOptions,\n): Promise<ConfirmResult> {\n const ns = options.namespace ?? \"spk-confirm\";\n const confirmLabel = options.confirm?.label ?? \"Confirm\";\n const cancelLabel = options.cancel?.label ?? \"Cancel\";\n const confirmStyle = STYLE_MAP[options.confirm?.style ?? \"Success\"];\n const cancelStyle = STYLE_MAP[options.cancel?.style ?? \"Secondary\"];\n const user = options.user ?? interaction.user.id;\n const ephemeral = options.ephemeral !== false; // default true\n\n const embeds = clientEmbeds(interaction.client);\n const promptEmbed = embeds.info(\n options.title !== undefined\n ? { title: options.title, description: options.body }\n : options.body,\n );\n\n const row = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder().setCustomId(`${ns}:yes`).setLabel(confirmLabel).setStyle(confirmStyle),\n new ButtonBuilder().setCustomId(`${ns}:no`).setLabel(cancelLabel).setStyle(cancelStyle),\n );\n\n const payload = { embeds: [promptEmbed], components: [row] };\n const sent = interaction.deferred\n ? await interaction.editReply(payload)\n : (await interaction.reply({\n ...payload,\n flags: ephemeral ? 64 : undefined,\n } as never),\n await interaction.fetchReply());\n\n return new Promise<ConfirmResult>((resolve) => {\n const collector = sent.createMessageComponentCollector({\n componentType: ComponentType.Button,\n time: options.timeoutMs ?? 30_000,\n max: 1,\n filter: (i: ButtonInteraction) => i.user.id === user && i.customId.startsWith(`${ns}:`),\n });\n\n let outcome: ConfirmResult | null = null;\n\n collector.on(\"collect\", async (button) => {\n const action = button.customId.slice(ns.length + 1);\n outcome = {\n confirmed: action === \"yes\",\n reason: action === \"yes\" ? \"confirm\" : \"cancel\",\n interaction: button,\n };\n await button.deferUpdate().catch(() => undefined);\n });\n\n collector.on(\"end\", async () => {\n // Disable both buttons regardless of outcome.\n for (const c of row.components) c.setDisabled(true);\n await interaction\n .editReply({ embeds: [promptEmbed], components: [row] })\n .catch(() => undefined);\n resolve(outcome ?? { confirmed: false, reason: \"timeout\" });\n });\n });\n}\n","/**\n * A small, dependency-free structured logger used across spearkit so every\n * problem (command/component/event failures, gateway errors, your own code)\n * lands in one consistent, debuggable place.\n *\n * Pluggable transports — the default writes to the console, but you can also\n * stream to a JSONL file ({@link jsonlSink}), POST high-severity entries to a\n * Discord webhook ({@link webhookSink}), or write your own. Setting\n * `transports: [...]` replaces the default; otherwise pass a single `sink`.\n */\nimport { appendFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\n/** Severity of a log entry, lowest to highest. */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\n/** A minimum severity to emit, or `\"silent\"` to suppress everything. */\nexport type LogThreshold = LogLevel | \"silent\";\n\n/** A primitive metadata value attached to a log entry. */\nexport type LogValue = string | number | boolean | bigint | null | undefined;\n\n/** Extra context passed alongside a log message. */\nexport interface LogOptions {\n /** An error to attach; the default sink renders its stack. */\n error?: Error;\n /** Structured key/value metadata. */\n data?: Record<string, LogValue>;\n}\n\n/** A fully-resolved record handed to a {@link LogSink}. */\nexport interface LogEntry {\n readonly level: LogLevel;\n readonly message: string;\n readonly scope?: string;\n readonly timestamp: Date;\n readonly error?: Error;\n readonly data?: Readonly<Record<string, LogValue>>;\n}\n\n/** Receives every entry at or above the configured threshold. */\nexport type LogSink = (entry: LogEntry) => void;\n\n/** Construction options for a {@link Logger}. */\nexport interface LoggerOptions {\n /** Minimum level to emit. Default `\"info\"`. */\n level?: LogThreshold;\n /** Single transport — shorthand for `transports: [sink]`. */\n sink?: LogSink;\n /** Multiple transports. If set, takes precedence over `sink`. */\n transports?: readonly LogSink[];\n /** A scope prefix for every entry (e.g. `\"commands\"`). */\n scope?: string;\n}\n\nconst RANK: Record<LogThreshold, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n silent: Number.POSITIVE_INFINITY,\n};\n\nfunction formatValue(value: LogValue): string {\n return typeof value === \"string\" ? value : String(value);\n}\n\n/** Default sink: human-readable lines to the console (stderr for warn/error). */\nexport function consoleSink(entry: LogEntry): void {\n const scope = entry.scope !== undefined ? ` [${entry.scope}]` : \"\";\n let suffix = \"\";\n if (entry.data !== undefined) {\n const parts = Object.entries(entry.data).map(([k, v]) => `${k}=${formatValue(v)}`);\n if (parts.length > 0) suffix = ` ${parts.join(\" \")}`;\n }\n const line = `${entry.timestamp.toISOString()} ${entry.level.toUpperCase()}${scope} ${entry.message}${suffix}`;\n const write = entry.level === \"warn\" || entry.level === \"error\" ? console.error : console.log;\n write(line);\n if (entry.error !== undefined) write(entry.error.stack ?? String(entry.error));\n}\n\n/**\n * JSON-lines sink: appends one JSON object per entry to `path`. Fire-and-forget;\n * filesystem errors are swallowed so logging never crashes the bot.\n */\nexport function jsonlSink(path: string, options: { minLevel?: LogLevel } = {}): LogSink {\n const min = options.minLevel ?? \"debug\";\n let dirReady = false;\n let chain: Promise<void> = Promise.resolve();\n return (entry) => {\n if (RANK[entry.level] < RANK[min]) return;\n const record = {\n ...entry,\n timestamp: entry.timestamp.toISOString(),\n error: entry.error\n ? { name: entry.error.name, message: entry.error.message, stack: entry.error.stack }\n : undefined,\n };\n const line = `${JSON.stringify(record)}\\n`;\n chain = chain.then(async () => {\n try {\n if (!dirReady) {\n await mkdir(dirname(path), { recursive: true });\n dirReady = true;\n }\n await appendFile(path, line, \"utf8\");\n } catch {\n // Swallow — log file unwritable shouldn't kill the bot.\n }\n });\n };\n}\n\n\n/**\n * Discord-webhook sink: POSTs an embed to a webhook URL for entries at or\n * above `minLevel` (default `\"warn\"`). Useful for sending errors to a private\n * `#bot-errors` channel.\n */\nexport function webhookSink(options: { url: string; minLevel?: LogLevel; username?: string }): LogSink {\n const min = options.minLevel ?? \"warn\";\n return (entry) => {\n if (RANK[entry.level] < RANK[min]) return;\n const color = entry.level === \"error\" ? 0xf04a47 : entry.level === \"warn\" ? 0xf9a825 : 0x3498db;\n const fields: { name: string; value: string; inline?: boolean }[] = [];\n if (entry.scope !== undefined) fields.push({ name: \"Scope\", value: entry.scope, inline: true });\n if (entry.data !== undefined) {\n for (const [k, v] of Object.entries(entry.data)) {\n fields.push({ name: k, value: formatValue(v).slice(0, 1000), inline: true });\n }\n }\n const desc = entry.error?.stack !== undefined\n ? `${entry.message}\\n\\`\\`\\`\\n${entry.error.stack.slice(0, 1800)}\\n\\`\\`\\``\n : entry.message;\n const body = {\n username: options.username ?? \"spearkit\",\n embeds: [\n {\n title: `[${entry.level.toUpperCase()}] ${entry.message.slice(0, 240)}`,\n description: desc.slice(0, 4000),\n color,\n timestamp: entry.timestamp.toISOString(),\n fields: fields.slice(0, 25),\n },\n ],\n };\n void fetch(options.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n }).catch(() => undefined);\n };\n}\n\ninterface SharedState {\n threshold: LogThreshold;\n transports: readonly LogSink[];\n}\n\nfunction resolveTransports(options: LoggerOptions): readonly LogSink[] {\n if (options.transports !== undefined && options.transports.length > 0) return options.transports;\n if (options.sink !== undefined) return [options.sink];\n return [consoleSink];\n}\n\n/**\n * A leveled, scoped logger. Create one directly or read `client.logger`.\n * {@link child} loggers share the parent's threshold and transports, so calling\n * {@link setLevel} on any of them affects the whole tree.\n *\n * @example\n * ```ts\n * const log = new Logger({ level: \"debug\", transports: [consoleSink, jsonlSink(\"./logs/bot.jsonl\")] });\n * log.info(\"ready\", { data: { shard: 0 } });\n * log.child(\"commands\").error(\"handler failed\", { error });\n * ```\n */\nexport class Logger {\n private state: SharedState;\n /** The scope prefix applied to every entry, if any. */\n readonly scope?: string;\n\n constructor(options: LoggerOptions = {}) {\n this.state = {\n threshold: options.level ?? \"info\",\n transports: resolveTransports(options),\n };\n this.scope = options.scope;\n }\n\n /** The current minimum threshold. */\n get level(): LogThreshold {\n return this.state.threshold;\n }\n\n /** Change the threshold for this logger and every child sharing its state. */\n setLevel(level: LogThreshold): this {\n this.state.threshold = level;\n return this;\n }\n\n /** Replace the transport list for this logger and every child sharing its state. */\n setTransports(transports: readonly LogSink[]): this {\n this.state.transports = transports;\n return this;\n }\n\n /** Append a transport to the existing list. */\n addTransport(sink: LogSink): this {\n this.state.transports = [...this.state.transports, sink];\n return this;\n }\n\n /** Whether an entry of `level` would currently be emitted. */\n enabled(level: LogLevel): boolean {\n return RANK[level] >= RANK[this.state.threshold];\n }\n\n /** A child logger with an extra scope segment, sharing this logger's state. */\n child(scope: string): Logger {\n const combined = this.scope !== undefined ? `${this.scope}:${scope}` : scope;\n const child = new Logger({ scope: combined });\n child.state = this.state;\n return child;\n }\n\n /** Emit an entry at an explicit level. */\n log(level: LogLevel, message: string, options?: LogOptions): void {\n if (!this.enabled(level)) return;\n const entry: LogEntry = {\n level,\n message,\n scope: this.scope,\n timestamp: new Date(),\n error: options?.error,\n data: options?.data,\n };\n for (const sink of this.state.transports) {\n try {\n sink(entry);\n } catch {\n // Never let a broken transport kill the dispatcher.\n }\n }\n }\n\n /** Verbose diagnostics, off by default. */\n debug(message: string, options?: LogOptions): void {\n this.log(\"debug\", message, options);\n }\n\n /** Normal operational messages. */\n info(message: string, options?: LogOptions): void {\n this.log(\"info\", message, options);\n }\n\n /** Recoverable problems worth attention. */\n warn(message: string, options?: LogOptions): void {\n this.log(\"warn\", message, options);\n }\n\n /** Failures. Attach the cause via `{ error }`. */\n error(message: string, options?: LogOptions): void {\n this.log(\"error\", message, options);\n }\n}\n\n/** Coerce an unknown thrown value into an {@link Error}. */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n","/**\n * A tiny, dependency-free `.env` loader plus a typed reader for\n * `process.env`. Pulls your existing environment in directly — no `dotenv`\n * package required — and parses values the way `dotenv` does (quotes, `export`\n * prefixes, `#` comments, `\\n` escapes in double quotes).\n */\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/** The flat key/value map parsed from a `.env` file. */\nexport type ParsedEnv = Record<string, string>;\n\n/** Options for {@link loadEnv}. */\nexport interface LoadEnvOptions {\n /** File to read. Default `.env` in the current working directory. */\n path?: string;\n /** Overwrite variables already present in `process.env`. Default `false`. */\n override?: boolean;\n}\n\nfunction stripInlineComment(value: string): string {\n // A `#` that starts a comment must be preceded by whitespace (or be the\n // whole value); `pass#1` is a literal, `value # note` is not.\n const match = /\\s#/.exec(value);\n return match !== null ? value.slice(0, match.index).trimEnd() : value;\n}\n\nfunction unquote(raw: string): string {\n if (raw.length >= 2) {\n const quote = raw[0];\n if ((quote === '\"' || quote === \"'\") && raw.endsWith(quote)) {\n const inner = raw.slice(1, -1);\n return quote === '\"'\n ? inner.replace(/\\\\n/g, \"\\n\").replace(/\\\\r/g, \"\\r\").replace(/\\\\t/g, \"\\t\")\n : inner;\n }\n }\n return stripInlineComment(raw);\n}\n\n/** Parse `.env`-formatted text into a flat object. Does not touch `process.env`. */\nexport function parseEnv(content: string): ParsedEnv {\n const out: ParsedEnv = {};\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line.length === 0 || line.startsWith(\"#\")) continue;\n const body = line.startsWith(\"export \") ? line.slice(7).trimStart() : line;\n const eq = body.indexOf(\"=\");\n if (eq <= 0) continue;\n const key = body.slice(0, eq).trim();\n if (key.length === 0) continue;\n out[key] = unquote(body.slice(eq + 1).trim());\n }\n return out;\n}\n\n/**\n * Read a `.env` file and merge it into `process.env`. Existing variables win\n * unless `override` is set. Missing files are ignored (returns `{}`), so it is\n * safe to call unconditionally.\n *\n * @returns the parsed key/value pairs from the file.\n */\nexport function loadEnv(options: LoadEnvOptions = {}): ParsedEnv {\n const path = options.path ?? join(process.cwd(), \".env\");\n let content: string;\n try {\n content = readFileSync(path, \"utf8\");\n } catch {\n return {};\n }\n const parsed = parseEnv(content);\n for (const [key, value] of Object.entries(parsed)) {\n if (options.override === true || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n return parsed;\n}\n\nconst TRUTHY = new Set([\"true\", \"1\", \"yes\", \"on\"]);\nconst FALSY = new Set([\"false\", \"0\", \"no\", \"off\"]);\n\nfunction read(key: string): string | undefined {\n const value = process.env[key];\n return value !== undefined && value !== \"\" ? value : undefined;\n}\n\nfunction envString(key: string): string | undefined;\nfunction envString(key: string, fallback: string): string;\nfunction envString(key: string, fallback?: string): string | undefined {\n return read(key) ?? fallback;\n}\n\nfunction envNumber(key: string): number | undefined;\nfunction envNumber(key: string, fallback: number): number;\nfunction envNumber(key: string, fallback?: number): number | undefined {\n const value = read(key);\n if (value === undefined) return fallback;\n const parsed = Number(value);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\nfunction envBoolean(key: string): boolean | undefined;\nfunction envBoolean(key: string, fallback: boolean): boolean;\nfunction envBoolean(key: string, fallback?: boolean): boolean | undefined {\n const value = read(key)?.toLowerCase();\n if (value === undefined) return fallback;\n if (TRUTHY.has(value)) return true;\n if (FALSY.has(value)) return false;\n return fallback;\n}\n\nfunction envRequire(key: string): string {\n const value = read(key);\n if (value === undefined) {\n throw new Error(`spearkit: required environment variable \"${key}\" is missing or empty`);\n }\n return value;\n}\n\n/** Typed, ergonomic reader over `process.env`. */\nexport interface EnvReader {\n /** A string value (empty strings count as missing), or `undefined`/`fallback`. */\n string(key: string): string | undefined;\n string(key: string, fallback: string): string;\n /** A numeric value, or `undefined`/`fallback` when missing or non-numeric. */\n number(key: string): number | undefined;\n number(key: string, fallback: number): number;\n /** A boolean (`true/1/yes/on` vs `false/0/no/off`), or `undefined`/`fallback`. */\n boolean(key: string): boolean | undefined;\n boolean(key: string, fallback: boolean): boolean;\n /** A string value, throwing if the variable is missing or empty. */\n require(key: string): string;\n}\n\n/**\n * Typed accessor over `process.env`.\n *\n * @example\n * ```ts\n * loadEnv();\n * const token = env.require(\"DISCORD_TOKEN\");\n * const port = env.number(\"PORT\", 3000);\n * const debug = env.boolean(\"DEBUG\", false);\n * ```\n */\nexport const env: EnvReader = {\n string: envString,\n number: envNumber,\n boolean: envBoolean,\n require: envRequire,\n};\n","/**\n * Scheduled tasks: run work on a cron schedule or a fixed interval.\n *\n * Dependency-free. Includes a standard 5-field cron parser (`*`, ranges,\n * lists, steps, `@daily` style aliases) evaluated in local time, plus a\n * {@link TaskScheduler} that the client starts on ready and stops on destroy.\n */\nimport type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\n\nconst ALIASES: Record<string, string> = {\n \"@yearly\": \"0 0 1 1 *\",\n \"@annually\": \"0 0 1 1 *\",\n \"@monthly\": \"0 0 1 * *\",\n \"@weekly\": \"0 0 * * 0\",\n \"@daily\": \"0 0 * * *\",\n \"@midnight\": \"0 0 * * *\",\n \"@hourly\": \"0 * * * *\",\n};\n\nfunction parseField(spec: string, min: number, max: number, label: string): Set<number> {\n const set = new Set<number>();\n for (const part of spec.split(\",\")) {\n let range = part;\n let step = 1;\n const slash = part.indexOf(\"/\");\n if (slash >= 0) {\n step = Number(part.slice(slash + 1));\n range = part.slice(0, slash);\n if (!Number.isInteger(step) || step <= 0) {\n throw new Error(`spearkit: invalid step in cron ${label} field \"${part}\"`);\n }\n }\n let lo: number;\n let hi: number;\n if (range === \"*\") {\n lo = min;\n hi = max;\n } else if (range.includes(\"-\")) {\n const dash = range.indexOf(\"-\");\n lo = Number(range.slice(0, dash));\n hi = Number(range.slice(dash + 1));\n } else {\n lo = Number(range);\n hi = lo;\n }\n if (!Number.isInteger(lo) || !Number.isInteger(hi) || lo < min || hi > max || lo > hi) {\n throw new Error(`spearkit: cron ${label} field out of range ${min}-${max}: \"${part}\"`);\n }\n for (let value = lo; value <= hi; value += step) set.add(value);\n }\n return set;\n}\n\n/**\n * A parsed cron expression. Evaluates in the host's local time.\n *\n * @example\n * ```ts\n * cron(\"*\\u200b/5 * * * *\").next(); // next 5-minute boundary\n * cron(\"@daily\").next(new Date()); // next midnight\n * ```\n */\nexport class CronExpression {\n /** The original expression string. */\n readonly source: string;\n private readonly minutes: Set<number>;\n private readonly hours: Set<number>;\n private readonly daysOfMonth: Set<number>;\n private readonly months: Set<number>;\n private readonly daysOfWeek: Set<number>;\n private readonly domRestricted: boolean;\n private readonly dowRestricted: boolean;\n\n constructor(expression: string) {\n const trimmed = expression.trim();\n const normalized = ALIASES[trimmed] ?? trimmed;\n const parts = normalized.split(/\\s+/);\n if (parts.length !== 5) {\n throw new Error(`spearkit: cron expression must have 5 fields, got \"${expression}\"`);\n }\n const [minute, hour, dom, month, dow] = parts;\n if (\n minute === undefined ||\n hour === undefined ||\n dom === undefined ||\n month === undefined ||\n dow === undefined\n ) {\n throw new Error(`spearkit: invalid cron expression \"${expression}\"`);\n }\n this.source = expression;\n this.minutes = parseField(minute, 0, 59, \"minute\");\n this.hours = parseField(hour, 0, 23, \"hour\");\n this.daysOfMonth = parseField(dom, 1, 31, \"day-of-month\");\n this.months = parseField(month, 1, 12, \"month\");\n const weekdays = parseField(dow, 0, 7, \"day-of-week\");\n if (weekdays.has(7)) {\n weekdays.delete(7);\n weekdays.add(0);\n }\n this.daysOfWeek = weekdays;\n this.domRestricted = dom !== \"*\";\n this.dowRestricted = dow !== \"*\";\n }\n\n private dayMatches(date: Date): boolean {\n const dom = this.daysOfMonth.has(date.getDate());\n const dow = this.daysOfWeek.has(date.getDay());\n if (this.domRestricted && this.dowRestricted) return dom || dow;\n if (this.domRestricted) return dom;\n if (this.dowRestricted) return dow;\n return true;\n }\n\n /** The next time strictly after `from` (default now) that matches. */\n next(from: Date = new Date()): Date {\n const date = new Date(from.getTime());\n date.setSeconds(0, 0);\n date.setMinutes(date.getMinutes() + 1);\n for (let guard = 0; guard < 100_000; guard++) {\n if (!this.months.has(date.getMonth() + 1)) {\n date.setMonth(date.getMonth() + 1, 1);\n date.setHours(0, 0, 0, 0);\n continue;\n }\n if (!this.dayMatches(date)) {\n date.setDate(date.getDate() + 1);\n date.setHours(0, 0, 0, 0);\n continue;\n }\n if (!this.hours.has(date.getHours())) {\n date.setHours(date.getHours() + 1, 0, 0, 0);\n continue;\n }\n if (!this.minutes.has(date.getMinutes())) {\n date.setMinutes(date.getMinutes() + 1, 0, 0);\n continue;\n }\n return new Date(date.getTime());\n }\n throw new Error(`spearkit: cron expression \"${this.source}\" has no upcoming match`);\n }\n}\n\n/** Compile a cron expression. Throws on malformed input. */\nexport function cron(expression: string): CronExpression {\n return new CronExpression(expression);\n}\n\n/** Configuration for a scheduled task. Provide exactly one of `cron`/`interval`. */\nexport interface TaskConfig {\n /** Unique task name. */\n name: string;\n /** A cron expression (local time). */\n cron?: string;\n /** A fixed interval in milliseconds. */\n interval?: number;\n /** Also run once immediately when the scheduler starts. Default `false`. */\n runOnStart?: boolean;\n /** The work to perform. */\n run: (client: SpearClient) => Awaitable<void>;\n}\n\n/** A compiled, registrable scheduled task. Build it with {@link task}. */\nexport interface ScheduledTask {\n readonly kind: \"task\";\n readonly name: string;\n readonly interval?: number;\n readonly cron?: CronExpression;\n readonly runOnStart: boolean;\n readonly run: (client: SpearClient) => Awaitable<void>;\n}\n\n/** Define a scheduled task. Throws if neither `cron` nor `interval` is given. */\nexport function task(config: TaskConfig): ScheduledTask {\n if (config.cron === undefined && config.interval === undefined) {\n throw new Error(`spearkit: task \"${config.name}\" needs a cron expression or an interval`);\n }\n if (config.interval !== undefined && config.interval <= 0) {\n throw new Error(`spearkit: task \"${config.name}\" interval must be positive`);\n }\n return {\n kind: \"task\",\n name: config.name,\n interval: config.interval,\n cron: config.cron !== undefined ? new CronExpression(config.cron) : undefined,\n runOnStart: config.runOnStart ?? false,\n run: config.run,\n };\n}\n\nconst MAX_TIMEOUT = 2_147_483_647;\n\n/**\n * Runs {@link ScheduledTask}s. The client owns one as `client.scheduler`,\n * starts it on `clientReady` and stops it on `destroy`. Tasks added while\n * running are scheduled immediately.\n */\nexport class TaskScheduler {\n private readonly tasks = new Map<string, ScheduledTask>();\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private running = false;\n private client?: SpearClient;\n private logger?: Logger;\n private readonly reconcilers: { name: string; run: (client: SpearClient) => Awaitable<void> }[] = [];\n\n /** Number of registered tasks. */\n get size(): number {\n return this.tasks.size;\n }\n\n /** Whether the scheduler is currently running. */\n get active(): boolean {\n return this.running;\n }\n\n /** Every registered task. */\n list(): ScheduledTask[] {\n return [...this.tasks.values()];\n }\n\n /** Attach a logger for task error reporting. */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Register one or more tasks. If already running, they are scheduled now. */\n add(...tasks: ScheduledTask[]): this {\n for (const task of tasks) {\n this.tasks.set(task.name, task);\n if (this.running) this.begin(task);\n }\n return this;\n }\n\n /** Remove a task and cancel its timer. */\n remove(name: string): boolean {\n this.cancel(name);\n return this.tasks.delete(name);\n }\n\n /**\n * Schedule a one-shot job: run `fn` once after `ms` milliseconds, then forget.\n * Returns a cancel handle. Replaces hand-rolled `setTimeout` calls for things\n * like \"remind the moderator in 10 minutes if no claim happened\".\n */\n delay(name: string, ms: number, fn: () => Awaitable<void>): { cancel: () => boolean } {\n const key = `delay:${name}`;\n this.cancel(key);\n const timer = setTimeout(async () => {\n this.timers.delete(key);\n try {\n await fn();\n } catch (error) {\n this.logger?.error(`delay \"${name}\" failed`, { error: toError(error) });\n }\n }, Math.max(0, ms));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(key, timer);\n return {\n cancel: () => {\n const had = this.timers.has(key);\n this.cancel(key);\n return had;\n },\n };\n }\n\n /**\n * Schedule a series of follow-up fires from a single start point. Each\n * delay is measured from \"now\"; the callback receives the index of the\n * fire. Generalises the 10s/30s/60s retry pattern in real bots.\n */\n followUp(\n name: string,\n delays: readonly number[],\n fn: (index: number) => Awaitable<void>,\n ): { cancel: () => boolean } {\n const keys = delays.map((_, i) => `followUp:${name}:${i}`);\n for (const key of keys) this.cancel(key);\n delays.forEach((delay, i) => {\n const key = keys[i] as string;\n const timer = setTimeout(async () => {\n this.timers.delete(key);\n try {\n await fn(i);\n } catch (error) {\n this.logger?.error(`followUp \"${name}\" fire ${i} failed`, { error: toError(error) });\n }\n }, Math.max(0, delay));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(key, timer);\n });\n return {\n cancel: () => {\n let any = false;\n for (const key of keys) {\n if (this.timers.has(key)) any = true;\n this.cancel(key);\n }\n return any;\n },\n };\n }\n\n /**\n * Register a once-on-ready reconciler — runs the first time the scheduler\n * starts (typically when the client becomes ready) and never again. Use\n * for restart-recovery work like closing orphaned voice sessions or\n * reapplying cached channel state.\n */\n reconcile(name: string, fn: (client: SpearClient) => Awaitable<void>): void {\n if (this.running && this.client !== undefined) {\n void this.runReconciler(name, fn, this.client);\n } else {\n this.reconcilers.push({ name, run: fn });\n }\n }\n\n private async runReconciler(\n name: string,\n run: (client: SpearClient) => Awaitable<void>,\n client: SpearClient,\n ): Promise<void> {\n this.logger?.debug(\"reconcile\", { data: { name } });\n try {\n await run(client);\n } catch (error) {\n this.logger?.error(`reconciler \"${name}\" failed`, { error: toError(error) });\n }\n }\n\n /** Start every task. Safe to call once; later calls are ignored. */\n start(client: SpearClient): void {\n if (this.running) return;\n this.client = client;\n this.running = true;\n for (const task of this.tasks.values()) this.begin(task);\n const pending = this.reconcilers.splice(0);\n for (const { name, run } of pending) void this.runReconciler(name, run, client);\n }\n\n /** Stop the scheduler and cancel every pending timer. */\n stop(): void {\n this.running = false;\n for (const name of [...this.timers.keys()]) this.cancel(name);\n }\n\n private cancel(name: string): void {\n const timer = this.timers.get(name);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.timers.delete(name);\n }\n }\n\n private begin(task: ScheduledTask): void {\n if (task.runOnStart) void this.runTask(task);\n this.scheduleNext(task);\n }\n\n private delayFor(task: ScheduledTask): number {\n if (task.interval !== undefined) return task.interval;\n if (task.cron !== undefined) return Math.max(0, task.cron.next().getTime() - Date.now());\n return MAX_TIMEOUT;\n }\n\n private scheduleNext(task: ScheduledTask): void {\n if (!this.running) return;\n this.arm(task.name, this.delayFor(task), () => {\n void this.runTask(task);\n this.scheduleNext(task);\n });\n }\n\n private arm(name: string, delay: number, fire: () => void): void {\n if (delay > MAX_TIMEOUT) {\n // setTimeout caps at ~24.8 days — chain until the remainder fits.\n const timer = setTimeout(() => this.arm(name, delay - MAX_TIMEOUT, fire), MAX_TIMEOUT);\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(name, timer);\n return;\n }\n const timer = setTimeout(fire, Math.max(0, delay));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(name, timer);\n }\n\n private async runTask(task: ScheduledTask): Promise<void> {\n if (this.client === undefined) return;\n this.logger?.debug(\"task\", { data: { task: task.name } });\n try {\n await task.run(this.client);\n } catch (error) {\n this.logger?.error(`task \"${task.name}\" failed`, { error: toError(error) });\n }\n }\n}\n","/**\n * Classic text/prefix commands (e.g. `!ping`) alongside slash commands.\n *\n * Reading other users' message content requires the privileged\n * `MessageContent` intent (use `Intents.messages`). The client listens on\n * `messageCreate`, matches a configured prefix (or a bot mention), parses the\n * command name + arguments and dispatches. Cooldowns are shared with slash\n * commands via the same {@link CooldownManager}.\n */\nimport type {\n Awaitable,\n Message,\n MessageCreateOptions,\n MessagePayload,\n MessageReplyOptions,\n} from \"discord.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\nimport type { UsageEvent } from \"./usage.js\";\nimport { runGuards, type Guard, type GuardContext } from \"./guards.js\";\nimport { defaultEmbeds, type Embeds } from \"./embeds.js\";\nimport { PrefixArgsBuilder, prefixArgs, type PrefixArgsParser } from \"./prefix-args.js\";\nimport {\n formatCooldownMessage,\n normalizeCooldown,\n type CooldownActor,\n type CooldownConfig,\n type CooldownInput,\n type CooldownManager,\n} from \"./cooldown.js\";\n\n/** Options controlling how prefix messages are recognised. */\nexport interface PrefixOptions {\n /** One or more command prefixes (e.g. `\"!\"` or `[\"!\", \"?\"]`). */\n prefix?: string | readonly string[];\n /** Also accept a leading bot mention as a prefix. Default `true`. */\n mention?: boolean;\n /** Ignore messages authored by bots. Default `true`. */\n ignoreBots?: boolean;\n /** Match command names case-insensitively. Default `true`. */\n caseInsensitive?: boolean;\n}\n\n/** Configuration for a prefix command. */\nexport interface PrefixCommandConfig<\n TArgs extends Record<string, unknown> = Record<string, never>,\n R = void,\n> {\n /** Primary command name (the word after the prefix). */\n name: string;\n /** Alternative names that also trigger the command. */\n aliases?: readonly string[];\n /** Human description (for your own help command). */\n description?: string;\n /** Rate-limit this command. A number is a duration in ms. */\n cooldown?: CooldownInput;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n /** Typed argument schema; `ctx.options` will be shaped from this. */\n args?: (builder: PrefixArgsBuilder<{}>) => PrefixArgsBuilder<TArgs>;\n /** Handler invoked with a {@link PrefixContext} typed by `args`. */\n run: (ctx: PrefixContext<TArgs>) => Awaitable<R>;\n}\n\n/** A registrable prefix command. Build it with {@link prefixCommand}. */\nexport interface PrefixCommand {\n readonly kind: \"prefixCommand\";\n readonly name: string;\n readonly aliases: readonly string[];\n readonly description?: string;\n readonly cooldown?: CooldownConfig;\n readonly guards?: readonly Guard[];\n readonly parser?: PrefixArgsParser<Record<string, unknown>>;\n readonly run: (ctx: PrefixContext) => Promise<void>;\n}\n\n/** Define a prefix command. */\nexport function prefixCommand<\n TArgs extends Record<string, unknown> = Record<string, never>,\n R = void,\n>(config: PrefixCommandConfig<TArgs, R>): PrefixCommand {\n const parser =\n config.args !== undefined\n ? (config.args(prefixArgs()).compile() as PrefixArgsParser<Record<string, unknown>>)\n : undefined;\n return {\n kind: \"prefixCommand\",\n name: config.name,\n aliases: config.aliases ?? [],\n description: config.description,\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n guards: config.guards,\n parser,\n run: async (ctx) => {\n await config.run(ctx as PrefixContext<TArgs>);\n },\n };\n}\n\n/** The handler argument for a prefix command: the message plus parsed args. */\nexport class PrefixContext<\n TArgs extends Record<string, unknown> = Record<string, never>,\n> {\n constructor(\n /** The triggering message. */\n readonly message: Message,\n /** The matched command name (as typed). */\n readonly commandName: string,\n /** Whitespace-split arguments after the command name. */\n readonly args: string[],\n /** The raw text after the command name. */\n readonly rest: string,\n /** Typed parsed arguments from `args` schema, or `{}` if none. */\n readonly options: TArgs = {} as TArgs,\n ) {}\n\n get client(): Message[\"client\"] {\n return this.message.client;\n }\n get author() {\n return this.message.author;\n }\n get member() {\n return this.message.member;\n }\n get guild() {\n return this.message.guild;\n }\n get guildId(): string | null {\n return this.message.guildId;\n }\n get channel() {\n return this.message.channel;\n }\n get channelId(): string {\n return this.message.channelId;\n }\n\n /** Reply to the triggering message. */\n reply(content: string | MessagePayload | MessageReplyOptions): Promise<Message> {\n return this.message.reply(content);\n }\n\n /** Send a message to the same channel (no reply reference). */\n async send(content: string | MessagePayload | MessageCreateOptions): Promise<Message | undefined> {\n const channel = this.message.channel;\n if (\"send\" in channel) return channel.send(content);\n return undefined;\n }\n}\n\n/** Error hook invoked when a prefix command handler throws. */\nexport type PrefixErrorHandler = (error: Error, message: Message) => Awaitable<void>;\n\ninterface ResolvedPrefixOptions {\n prefixes: string[];\n mention: boolean;\n ignoreBots: boolean;\n caseInsensitive: boolean;\n}\n\nfunction resolveOptions(input: string | readonly string[] | PrefixOptions): ResolvedPrefixOptions {\n if (typeof input === \"string\") return { prefixes: [input], mention: true, ignoreBots: true, caseInsensitive: true };\n if (Array.isArray(input)) {\n return { prefixes: [...input], mention: true, ignoreBots: true, caseInsensitive: true };\n }\n const options = input as PrefixOptions;\n const prefix = options.prefix ?? [];\n return {\n prefixes: typeof prefix === \"string\" ? [prefix] : [...prefix],\n mention: options.mention ?? true,\n ignoreBots: options.ignoreBots ?? true,\n caseInsensitive: options.caseInsensitive ?? true,\n };\n}\n\nfunction actorFromMessage(message: Message): CooldownActor {\n const member = message.member;\n const roleIds = member !== null ? [...member.roles.cache.keys()] : [];\n return {\n userId: message.author.id,\n roleIds,\n guildId: message.guildId,\n channelId: message.channelId,\n };\n}\n\n/** Holds prefix commands and dispatches matching messages to them. */\nexport class PrefixRegistry {\n private readonly commands = new Map<string, PrefixCommand>();\n private readonly lookup = new Map<string, PrefixCommand>();\n private options: ResolvedPrefixOptions = {\n prefixes: [],\n mention: true,\n ignoreBots: true,\n caseInsensitive: true,\n };\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private errorHandler?: PrefixErrorHandler;\n private defaultGuards: readonly Guard[] = [];\n private onUsage?: (event: UsageEvent) => void;\n\n /** Configure prefixes and matching behaviour. */\n setOptions(input: string | readonly string[] | PrefixOptions): this {\n this.options = resolveOptions(input);\n return this;\n }\n\n /** Attach a logger for dispatch tracing and error reporting. */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Attach a hook called after each successful prefix command run. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Share a cooldown manager and an optional default cooldown. */\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n /** Guards that run before every prefix command's own guards. */\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Set the handler used when a prefix command throws. */\n onError(handler: PrefixErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Register one or more prefix commands (and their aliases). */\n add(...commands: PrefixCommand[]): this {\n for (const command of commands) {\n this.commands.set(command.name, command);\n this.index(command.name, command);\n for (const alias of command.aliases) this.index(alias, command);\n }\n return this;\n }\n\n private index(key: string, command: PrefixCommand): void {\n this.lookup.set(this.options.caseInsensitive ? key.toLowerCase() : key, command);\n }\n\n /** Look up a command by name or alias. */\n get(nameOrAlias: string): PrefixCommand | undefined {\n return this.lookup.get(this.options.caseInsensitive ? nameOrAlias.toLowerCase() : nameOrAlias);\n }\n\n /** Number of registered commands (excluding aliases). */\n get size(): number {\n return this.commands.size;\n }\n\n /** Every registered command. */\n list(): PrefixCommand[] {\n return [...this.commands.values()];\n }\n\n /** Strip a matching prefix (or bot mention) from `content`, or return `null`. */\n private stripPrefix(content: string, botId: string | undefined): string | null {\n for (const prefix of this.options.prefixes) {\n if (prefix.length > 0 && content.startsWith(prefix)) return content.slice(prefix.length);\n }\n if (this.options.mention && botId !== undefined) {\n const match = /^<@!?(\\d+)>\\s*/.exec(content);\n if (match !== null && match[1] === botId) return content.slice(match[0].length);\n }\n return null;\n }\n\n /**\n * Parse and dispatch a message. Returns `true` when a command ran (or was\n * blocked by a cooldown), `false` when the message was not a prefix command.\n */\n async handle(message: Message): Promise<boolean> {\n if (this.options.prefixes.length === 0 && !this.options.mention) return false;\n if (this.options.ignoreBots && message.author.bot) return false;\n\n const stripped = this.stripPrefix(message.content, message.client.user?.id);\n if (stripped === null) return false;\n\n const trimmed = stripped.trimStart();\n const match = /^(\\S+)\\s*([\\s\\S]*)$/.exec(trimmed);\n if (match === null) return false;\n const name = match[1] ?? \"\";\n const rest = match[2] ?? \"\";\n const command = this.get(name);\n if (command === undefined) return false;\n\n this.logger?.debug(\"prefix\", { data: { command: command.name, user: message.author.id } });\n\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(`prefix:${command.name}`, cooldown, actorFromMessage(message));\n if (!result.allowed) {\n await message.reply(formatCooldownMessage(cooldown, result.remaining)).catch(() => undefined);\n return true;\n }\n }\n const guards = combineGuards(this.defaultGuards, command.guards);\n if (guards.length > 0) {\n const guardCtx = guardContextFromMessage(message);\n const guardResult = await runGuards(guardCtx, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"prefix denied\", {\n data: {\n command: command.name,\n user: message.author.id,\n reason: guardResult.reason ?? \"\",\n },\n });\n await replyDeniedMessage(message, guardResult.reason);\n return true;\n }\n }\n\n const args = rest.length > 0 ? rest.split(/\\s+/) : [];\n let options: Record<string, unknown> = {};\n if (command.parser !== undefined) {\n const parsed = command.parser.parse(args, rest);\n if (!parsed.ok) {\n this.logger?.debug(\"prefix arg error\", {\n data: { command: command.name, user: message.author.id, arg: parsed.arg, reason: parsed.reason },\n });\n const embeds = clientEmbeds(message.client);\n await message.reply({ embeds: [embeds.error(`Argument \\`${parsed.arg}\\`: ${parsed.reason}`)] }).catch(() => undefined);\n return true;\n }\n options = parsed.values as Record<string, unknown>;\n }\n const start = Date.now();\n try {\n await command.run(new PrefixContext(message, name, args, rest, options) as PrefixContext);\n this.onUsage?.({\n type: \"prefix\",\n name: command.name,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: message.author.id,\n userTag: message.author.tag,\n guildId: message.guildId,\n channelId: message.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = toError(error);\n this.logger?.error(`prefix command \"${command.name}\" failed`, { error: err });\n this.onUsage?.({\n type: \"prefix\",\n name: command.name,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: message.author.id,\n userTag: message.author.tag,\n guildId: message.guildId,\n channelId: message.channelId,\n timestamp: new Date(),\n });\n if (this.errorHandler !== undefined) await this.errorHandler(err, message);\n }\n return true;\n }\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction guardContextFromMessage(message: Message): GuardContext {\n return {\n client: message.client,\n user: message.author,\n member: message.member,\n guild: message.guild,\n guildId: message.guildId,\n channelId: message.channelId,\n };\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\nasync function replyDeniedMessage(message: Message, reason: string | undefined): Promise<void> {\n const embeds = clientEmbeds(message.client);\n const text = reason ?? \"You don't have permission to use this.\";\n await message.reply({ embeds: [embeds.error(text)] }).catch(() => undefined);\n}","/**\n * Usage tracking — record *who used what*. Two independent sinks:\n *\n * - a {@link UsageStore} (a database) that persists every use, and\n * - a Discord-channel reporter that posts a human-readable line per use.\n *\n * This is deliberately separate from the {@link Logger}: the logger is for\n * problems/diagnostics, this is an audit trail of command/component usage that\n * you can keep in a store and/or mirror into a channel.\n */\nimport { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\n\n/** What kind of interaction was used. */\nexport type UsageType = \"command\" | \"prefix\" | \"component\" | \"event\";\n\n/** Outcome of a tracked use — `\"success\"` if the handler returned without throwing. */\nexport type UsageOutcome = \"success\" | \"error\";\n\n/** A primitive metadata value attached to a usage event. */\nexport type UsageMetaValue = string | number | boolean | null;\n\n/** A single recorded use. */\nexport interface UsageEvent {\n readonly type: UsageType;\n /** Command/component name (or event name). */\n readonly name: string;\n readonly userId?: string;\n readonly userTag?: string;\n readonly guildId?: string | null;\n readonly channelId?: string | null;\n /** Free-form extra detail. */\n readonly detail?: string;\n readonly timestamp: Date;\n /** Outcome of the handler — `\"success\"` or `\"error\"`. */\n readonly outcome?: UsageOutcome;\n /** Wall-clock duration of the handler in milliseconds. */\n readonly durationMs?: number;\n /** Snapshot of the typed options the handler ran with. */\n readonly options?: Readonly<Record<string, UsageMetaValue>>;\n /** Error message if `outcome === \"error\"`. */\n readonly errorMessage?: string;\n}\n\n/** A pluggable persistence backend for {@link UsageEvent}s. */\nexport interface UsageStore {\n /** Persist one event. */\n record(event: UsageEvent): Awaitable<void>;\n /** Read every persisted event. */\n all(): Awaitable<readonly UsageEvent[]>;\n}\n\n/** In-memory store; great for tests and dashboards. Optionally capped. */\nexport class MemoryUsageStore implements UsageStore {\n private readonly events: UsageEvent[] = [];\n\n constructor(private readonly limit: number = Number.POSITIVE_INFINITY) {}\n\n record(event: UsageEvent): void {\n this.events.push(event);\n if (this.events.length > this.limit) this.events.splice(0, this.events.length - this.limit);\n }\n\n all(): readonly UsageEvent[] {\n return this.events;\n }\n\n /** Total recorded events. */\n get size(): number {\n return this.events.length;\n }\n\n /** Events recorded for a given user id. */\n byUser(userId: string): UsageEvent[] {\n return this.events.filter((event) => event.userId === userId);\n }\n\n /** Forget everything. */\n clear(): void {\n this.events.length = 0;\n }\n}\n\ninterface SerializedEvent {\n type: UsageType;\n name: string;\n userId?: string;\n userTag?: string;\n guildId?: string | null;\n channelId?: string | null;\n detail?: string;\n timestamp: string;\n}\n\n/**\n * File-backed store using newline-delimited JSON (`.jsonl`). Appends one line\n * per event — durable, human-inspectable, and dependency-free.\n */\nexport class JsonFileUsageStore implements UsageStore {\n constructor(private readonly path: string) {}\n\n async record(event: UsageEvent): Promise<void> {\n const line = `${JSON.stringify({ ...event, timestamp: event.timestamp.toISOString() })}\\n`;\n await mkdir(dirname(this.path), { recursive: true });\n await appendFile(this.path, line, \"utf8\");\n }\n\n async all(): Promise<readonly UsageEvent[]> {\n let content: string;\n try {\n content = await readFile(this.path, \"utf8\");\n } catch {\n return [];\n }\n const events: UsageEvent[] = [];\n for (const line of content.split(\"\\n\")) {\n if (line.trim().length === 0) continue;\n const parsed = JSON.parse(line) as SerializedEvent;\n events.push({ ...parsed, timestamp: new Date(parsed.timestamp) });\n }\n return events;\n }\n}\n\n/** Default one-line rendering of a usage event for a Discord channel. */\nexport function formatUsage(event: UsageEvent): string {\n const who = event.userTag ?? (event.userId !== undefined ? `<@${event.userId}>` : \"unknown\");\n const where =\n event.channelId !== undefined && event.channelId !== null ? ` in <#${event.channelId}>` : \"\";\n const detail = event.detail !== undefined ? ` — ${event.detail}` : \"\";\n return `\\`${event.type}\\` **${event.name}** by ${who}${where}${detail}`;\n}\n\n/** Client-level usage configuration (the `usage` option). */\nexport interface UsageOptions {\n /** Persist events to this store (a database). */\n store?: UsageStore;\n /** Mirror events into this Discord channel id. */\n channel?: string;\n /** Custom channel-line formatter. */\n format?: (event: UsageEvent) => string;\n}\ninterface Reporter {\n channelId: string;\n format: (event: UsageEvent) => string;\n}\n\n/**\n * Routes each {@link UsageEvent} to a store and/or a Discord channel. The\n * client owns one as `client.usage`. Tracking is fire-and-forget: a slow store\n * or channel never blocks command handling, and failures are logged.\n */\nexport class UsageTracker {\n /** The configured store, if any. Directly queryable. */\n store?: UsageStore;\n private reporter?: Reporter;\n private client?: SpearClient;\n private logger?: Logger;\n\n /** Whether anything will happen on {@link track}. */\n get enabled(): boolean {\n return this.store !== undefined || this.reporter !== undefined;\n }\n\n /** @internal Used by the client to resolve report channels. */\n setClient(client: SpearClient): this {\n this.client = client;\n return this;\n }\n\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Persist events to a store (a database). */\n setStore(store: UsageStore): this {\n this.store = store;\n return this;\n }\n\n /** Mirror events into a Discord channel. */\n reportTo(channelId: string, format: (event: UsageEvent) => string = formatUsage): this {\n this.reporter = { channelId, format };\n return this;\n }\n\n /** Record a use. Returns immediately; storing/reporting happen in the background. */\n track(event: UsageEvent): void {\n if (!this.enabled) return;\n void this.run(event);\n }\n\n private async run(event: UsageEvent): Promise<void> {\n if (this.store !== undefined) {\n try {\n await this.store.record(event);\n } catch (error) {\n this.logger?.error(\"usage store failed\", { error: toError(error) });\n }\n }\n if (this.reporter !== undefined && this.client !== undefined) {\n try {\n const cache = this.client.channels.cache.get(this.reporter.channelId);\n const channel = cache ?? (await this.client.channels.fetch(this.reporter.channelId));\n if (channel !== null && \"send\" in channel) {\n await channel.send(this.reporter.format(event));\n }\n } catch (error) {\n this.logger?.error(\"usage report failed\", { error: toError(error) });\n }\n }\n }\n}\n","import {\n ApplicationCommandOptionType,\n type APIApplicationCommandBasicOption,\n type APIApplicationCommandChannelOption,\n type APIApplicationCommandOptionChoice,\n type Attachment,\n type Awaitable,\n type ChatInputCommandInteraction,\n type CommandInteractionOption,\n type LocalizationMap,\n} from \"discord.js\";\nimport type { AutocompleteContext } from \"./context.js\";\n\n/**\n * Resolved runtime value types, derived directly from discord.js' option\n * resolver so spearkit stays exactly in lockstep with the underlying getters.\n */\ntype Opt = CommandInteractionOption;\ntype UserValue = NonNullable<Opt[\"user\"]>;\ntype ChannelValue = NonNullable<Opt[\"channel\"]>;\ntype RoleValue = NonNullable<Opt[\"role\"]>;\ntype MentionableValue = NonNullable<Opt[\"user\" | \"role\" | \"member\"]>;\ntype AttachmentValue = Attachment;\n\n/** The discord-allowed channel types for a channel option. */\nexport type AllowedChannelType = NonNullable<APIApplicationCommandChannelOption[\"channel_types\"]>[number];\n\n/** The reader surface spearkit needs off a chat-input interaction. */\ntype OptionReader = ChatInputCommandInteraction[\"options\"];\n\n/** The closed set of values a slash option can resolve to. */\nexport type OptionValue =\n | string\n | number\n | boolean\n | UserValue\n | ChannelValue\n | RoleValue\n | MentionableValue\n | AttachmentValue;\n\n/** A single choice for string/integer/number options. */\nexport interface OptionChoice<V extends string | number = string | number> {\n readonly name: string;\n readonly value: V;\n readonly nameLocalizations?: LocalizationMap;\n}\n\n/** Provides autocomplete suggestions for an option as the user types. */\nexport type AutocompleteHandler<V extends string | number = string | number> = (\n ctx: AutocompleteContext,\n) => Awaitable<OptionChoice<V>[]>;\n\n/**\n * A fully-described slash command option. The two type parameters are phantom\n * markers used purely for compile-time inference of the resolved value:\n * - `TValue` is the type produced for the command handler.\n * - `TRequired` controls nullability (`true` => value, `false` => `| undefined`).\n */\nexport interface OptionDef<TValue extends OptionValue, TRequired extends boolean> {\n readonly type: ApplicationCommandOptionType;\n readonly description: string;\n readonly required: TRequired;\n readonly choices?: readonly OptionChoice[];\n readonly minValue?: number;\n readonly maxValue?: number;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly channelTypes?: readonly AllowedChannelType[];\n readonly autocomplete?: AutocompleteHandler;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n /** Phantom-only marker. Never populated at runtime. */\n readonly __value?: TValue;\n}\n\n/** Any option definition, regardless of value/required type. */\nexport type AnyOptionDef = OptionDef<OptionValue, boolean>;\n\n/** A map of option name => definition. */\nexport type OptionMap = Record<string, AnyOptionDef>;\n\n/** Maps an {@link OptionDef} to the value passed into the command handler. */\nexport type ResolvedOption<O extends AnyOptionDef> = O extends OptionDef<infer V, infer Req>\n ? Req extends true\n ? V\n : V | undefined\n : never;\n\n/** Resolves a whole {@link OptionMap} into the handler's `options` object. */\nexport type ResolvedOptions<O extends OptionMap> = {\n [K in keyof O]: ResolvedOption<O[K]>;\n};\n\n// --- builder config shapes -------------------------------------------------\n\ninterface BaseConfig {\n readonly description: string;\n readonly required?: boolean;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n}\n\ntype IsRequired<C extends BaseConfig> = C[\"required\"] extends true ? true : false;\n\ninterface StringConfig extends BaseConfig {\n readonly choices?: readonly OptionChoice<string>[];\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly autocomplete?: AutocompleteHandler<string>;\n}\n\ninterface NumericConfig extends BaseConfig {\n readonly choices?: readonly OptionChoice<number>[];\n readonly minValue?: number;\n readonly maxValue?: number;\n readonly autocomplete?: AutocompleteHandler<number>;\n}\n\ninterface ChannelConfig extends BaseConfig {\n readonly channelTypes?: readonly AllowedChannelType[];\n}\n\ntype ChoiceValue<C, Fallback extends string | number> = C extends {\n readonly choices: readonly { value: infer V }[];\n}\n ? [V] extends [string | number]\n ? V\n : Fallback\n : Fallback;\n\n/**\n * The single boundary assertion in the option system: the runtime `required`\n * value is a wide `boolean`, but the public type narrows it to the literal the\n * caller supplied. Centralised so every builder stays otherwise cast-free.\n */\nfunction makeOption<TValue extends OptionValue, C extends BaseConfig>(\n type: ApplicationCommandOptionType,\n config: C,\n): OptionDef<TValue, IsRequired<C>> {\n return { type, ...config, required: (config.required ?? false) as IsRequired<C> };\n}\n\n/**\n * Type-safe slash command option builders.\n *\n * @example\n * ```ts\n * options: {\n * target: option.user({ description: \"Who to greet\", required: true }),\n * loud: option.boolean({ description: \"Shout it\" }),\n * }\n * ```\n */\nexport const option = {\n string<const C extends StringConfig>(config: C): OptionDef<ChoiceValue<C, string>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.String, config);\n },\n integer<const C extends NumericConfig>(config: C): OptionDef<ChoiceValue<C, number>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Integer, config);\n },\n number<const C extends NumericConfig>(config: C): OptionDef<ChoiceValue<C, number>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Number, config);\n },\n boolean<const C extends BaseConfig>(config: C): OptionDef<boolean, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Boolean, config);\n },\n user<const C extends BaseConfig>(config: C): OptionDef<UserValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.User, config);\n },\n channel<const C extends ChannelConfig>(config: C): OptionDef<ChannelValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Channel, config);\n },\n role<const C extends BaseConfig>(config: C): OptionDef<RoleValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Role, config);\n },\n mentionable<const C extends BaseConfig>(config: C): OptionDef<MentionableValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Mentionable, config);\n },\n attachment<const C extends BaseConfig>(config: C): OptionDef<AttachmentValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Attachment, config);\n },\n} as const;\n\nfunction mapChoices<V extends string | number>(\n choices: readonly OptionChoice[] | undefined,\n): APIApplicationCommandOptionChoice<V>[] | undefined {\n return choices?.map((c) => ({\n name: c.name,\n value: c.value as V,\n name_localizations: c.nameLocalizations,\n }));\n}\n\n/** Converts a spearkit option definition into the discord REST option payload. */\nexport function toAPIOption(name: string, def: AnyOptionDef): APIApplicationCommandBasicOption {\n const shared = {\n name,\n description: def.description,\n required: def.required,\n name_localizations: def.nameLocalizations,\n description_localizations: def.descriptionLocalizations,\n };\n\n switch (def.type) {\n case ApplicationCommandOptionType.String: {\n const base = { ...shared, min_length: def.minLength, max_length: def.maxLength };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.String, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.String, choices: mapChoices<string>(def.choices) };\n }\n case ApplicationCommandOptionType.Integer: {\n const base = { ...shared, min_value: def.minValue, max_value: def.maxValue };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.Integer, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.Integer, choices: mapChoices<number>(def.choices) };\n }\n case ApplicationCommandOptionType.Number: {\n const base = { ...shared, min_value: def.minValue, max_value: def.maxValue };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.Number, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.Number, choices: mapChoices<number>(def.choices) };\n }\n case ApplicationCommandOptionType.Channel:\n return {\n ...shared,\n type: ApplicationCommandOptionType.Channel,\n channel_types: def.channelTypes ? [...def.channelTypes] : undefined,\n };\n case ApplicationCommandOptionType.User:\n return { ...shared, type: ApplicationCommandOptionType.User };\n case ApplicationCommandOptionType.Boolean:\n return { ...shared, type: ApplicationCommandOptionType.Boolean };\n case ApplicationCommandOptionType.Role:\n return { ...shared, type: ApplicationCommandOptionType.Role };\n case ApplicationCommandOptionType.Mentionable:\n return { ...shared, type: ApplicationCommandOptionType.Mentionable };\n case ApplicationCommandOptionType.Attachment:\n return { ...shared, type: ApplicationCommandOptionType.Attachment };\n default:\n return { ...shared, type: ApplicationCommandOptionType.String };\n }\n}\n\n/** Reads a resolved option value off a discord.js option resolver. */\nexport function readOption(\n resolver: OptionReader,\n name: string,\n def: AnyOptionDef,\n): OptionValue | undefined {\n switch (def.type) {\n case ApplicationCommandOptionType.String:\n return resolver.getString(name) ?? undefined;\n case ApplicationCommandOptionType.Integer:\n return resolver.getInteger(name) ?? undefined;\n case ApplicationCommandOptionType.Number:\n return resolver.getNumber(name) ?? undefined;\n case ApplicationCommandOptionType.Boolean:\n return resolver.getBoolean(name) ?? undefined;\n case ApplicationCommandOptionType.User:\n return resolver.getUser(name) ?? undefined;\n case ApplicationCommandOptionType.Channel:\n return resolver.getChannel(name) ?? undefined;\n case ApplicationCommandOptionType.Role:\n return resolver.getRole(name) ?? undefined;\n case ApplicationCommandOptionType.Mentionable:\n return resolver.getMentionable(name) ?? undefined;\n case ApplicationCommandOptionType.Attachment:\n return resolver.getAttachment(name) ?? undefined;\n default:\n return undefined;\n }\n}\n\n/** True if any option in the map declares an autocomplete handler. */\nexport function optionsHaveAutocomplete(options: OptionMap): boolean {\n for (const def of Object.values(options)) {\n if (def.autocomplete !== undefined) return true;\n }\n return false;\n}\n","import type {\n AutocompleteInteraction,\n ChatInputCommandInteraction,\n JSONEncodable,\n ModalComponentData,\n ModalBuilder,\n APIModalInteractionResponseCallbackData,\n} from \"discord.js\";\nimport { BaseContext } from \"../context.js\";\nimport type { OptionChoice, OptionMap, ResolvedOptions } from \"./options.js\";\n\n/**\n * The handler argument for a slash command. Wraps the discord.js interaction\n * and exposes the resolved, fully-typed {@link options}.\n */\nexport class CommandContext<O extends OptionMap = OptionMap> extends BaseContext<ChatInputCommandInteraction> {\n constructor(\n interaction: ChatInputCommandInteraction,\n /** Resolved option values, typed from the command's `options` map. */\n readonly options: ResolvedOptions<O>,\n ) {\n super(interaction);\n }\n\n get commandName(): string {\n return this.interaction.commandName;\n }\n\n /** The invoked subcommand name, if any. */\n get subcommand(): string | null {\n return this.interaction.options.getSubcommand(false);\n }\n\n /** Present a modal to the user in response to this command. */\n async showModal(\n modal: JSONEncodable<APIModalInteractionResponseCallbackData> | ModalComponentData | ModalBuilder,\n ): Promise<void> {\n await this.interaction.showModal(modal);\n }\n}\n\n/**\n * The handler argument for autocomplete requests. Provides the focused value\n * and a typed {@link respond} helper.\n */\nexport class AutocompleteContext {\n constructor(readonly interaction: AutocompleteInteraction) {}\n\n get client() {\n return this.interaction.client;\n }\n get user() {\n return this.interaction.user;\n }\n get guild() {\n return this.interaction.guild;\n }\n get guildId() {\n return this.interaction.guildId;\n }\n get commandName(): string {\n return this.interaction.commandName;\n }\n\n /** Name of the option currently being completed. */\n get focusedName(): string {\n return this.interaction.options.getFocused(true).name;\n }\n\n /** Current partial value typed by the user. */\n get value(): string {\n return this.interaction.options.getFocused();\n }\n\n /** Send autocomplete suggestions (capped at the discord limit of 25). */\n respond(choices: OptionChoice<string | number>[]): Promise<void> {\n return this.interaction.respond(\n choices.slice(0, 25).map((c) => ({\n name: c.name,\n value: c.value,\n name_localizations: c.nameLocalizations,\n })),\n );\n }\n}\n","import {\n ApplicationCommandOptionType,\n ApplicationCommandType,\n InteractionContextType,\n PermissionsBitField,\n type APIApplicationCommandSubcommandGroupOption,\n type APIApplicationCommandSubcommandOption,\n type AutocompleteInteraction,\n type Awaitable,\n type ChatInputCommandInteraction,\n type LocalizationMap,\n type PermissionResolvable,\n type RESTPostAPIChatInputApplicationCommandsJSONBody,\n} from \"discord.js\";\nimport { AutocompleteContext, CommandContext } from \"./context.js\";\nimport {\n optionsHaveAutocomplete,\n readOption,\n toAPIOption,\n type OptionMap,\n type OptionValue,\n type ResolvedOptions,\n} from \"./options.js\";\nimport { normalizeCooldown, type CooldownConfig, type CooldownInput } from \"../cooldown.js\";\nimport type { Guard } from \"../guards.js\";\n\n/** Metadata shared by every kind of command. */\ninterface CommonMeta {\n /** Permissions a member must have by default to see/use the command. */\n defaultMemberPermissions?: PermissionResolvable | null;\n /** Mark the command NSFW (age-restricted). */\n nsfw?: boolean;\n /** Restrict invocation to guilds only. */\n guildOnly?: boolean;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n /** Rate-limit this command. A number is a duration in ms; see {@link CooldownConfig}. */\n cooldown?: CooldownInput;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n}\n\n/** Configuration for a leaf (non-subcommand) slash command. */\nexport interface CommandConfig<O extends OptionMap, R> extends CommonMeta {\n name: string;\n description: string;\n options?: O;\n run: (ctx: CommandContext<O>) => Awaitable<R>;\n}\n\n/** Configuration for one subcommand. */\nexport interface SubcommandConfig<O extends OptionMap, R> {\n description: string;\n options?: O;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n run: (ctx: CommandContext<O>) => Awaitable<R>;\n}\n\n/** A type-erased, ready-to-run subcommand created with {@link subcommand}. */\nexport interface Subcommand {\n readonly kind: \"subcommand\";\n readonly description: string;\n readonly options: OptionMap;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n readonly hasAutocomplete: boolean;\n readonly execute: (interaction: ChatInputCommandInteraction) => Promise<void>;\n readonly autocomplete: (interaction: AutocompleteInteraction) => Promise<void>;\n}\n\n/** Configuration for a subcommand group (a folder of subcommands). */\nexport interface SubcommandGroupConfig {\n description: string;\n subcommands: Record<string, Subcommand>;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n}\n\n/** A subcommand group created with {@link subcommandGroup}. */\nexport interface SubcommandGroup extends SubcommandGroupConfig {\n readonly kind: \"group\";\n}\n\n/** Configuration for a command that contains subcommands and/or groups. */\nexport interface CommandGroupConfig extends CommonMeta {\n name: string;\n description: string;\n subcommands?: Record<string, Subcommand>;\n groups?: Record<string, SubcommandGroup>;\n}\n\n/** Everything {@link SlashCommand} needs, pre-built by the factories. */\ninterface SlashCommandSpec {\n name: string;\n json: RESTPostAPIChatInputApplicationCommandsJSONBody;\n hasAutocomplete: boolean;\n executor: (interaction: ChatInputCommandInteraction) => Promise<void>;\n autocompleter: (interaction: AutocompleteInteraction) => Promise<void>;\n cooldown?: CooldownConfig;\n guards?: readonly Guard[];\n}\n\n/**\n * A registered slash command. Serialises itself for the discord REST API and\n * executes its matching interactions. Construct via {@link command} or\n * {@link commandGroup} rather than directly.\n */\nexport class SlashCommand {\n /** The top-level command name (used as the registry lookup key). */\n readonly name: string;\n /** Whether any option declares an autocomplete handler. */\n readonly hasAutocomplete: boolean;\n private readonly json: RESTPostAPIChatInputApplicationCommandsJSONBody;\n private readonly executor: (interaction: ChatInputCommandInteraction) => Promise<void>;\n private readonly autocompleter: (interaction: AutocompleteInteraction) => Promise<void>;\n /** Resolved cooldown configuration for this command, if any. */\n readonly cooldown?: CooldownConfig;\n /** Resolved guard list for this command, if any. */\n readonly guards?: readonly Guard[];\n\n /** @internal */\n constructor(spec: SlashCommandSpec) {\n this.name = spec.name;\n this.hasAutocomplete = spec.hasAutocomplete;\n this.json = spec.json;\n this.executor = spec.executor;\n this.autocompleter = spec.autocompleter;\n this.cooldown = spec.cooldown;\n this.guards = spec.guards;\n }\n\n /** Serialise to the discord REST chat-input command payload. */\n toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n return this.json;\n }\n\n /** Execute the command for an incoming chat-input interaction. */\n execute(interaction: ChatInputCommandInteraction): Promise<void> {\n return this.executor(interaction);\n }\n\n /** Execute autocomplete for the focused option. */\n autocomplete(interaction: AutocompleteInteraction): Promise<void> {\n return this.autocompleter(interaction);\n }\n}\n\nfunction resolveOptions(\n interaction: ChatInputCommandInteraction,\n options: OptionMap,\n): Record<string, OptionValue | undefined> {\n const resolved: Record<string, OptionValue | undefined> = {};\n for (const [name, def] of Object.entries(options)) {\n resolved[name] = readOption(interaction.options, name, def);\n }\n return resolved;\n}\n\nfunction makeAutocompleter(\n options: OptionMap,\n): (interaction: AutocompleteInteraction) => Promise<void> {\n return async (interaction) => {\n const focused = interaction.options.getFocused(true);\n const def = options[focused.name];\n if (def?.autocomplete === undefined) {\n if (!interaction.responded) await interaction.respond([]);\n return;\n }\n const ctx = new AutocompleteContext(interaction);\n const choices = await def.autocomplete(ctx);\n if (!interaction.responded) await ctx.respond(choices);\n };\n}\n\nfunction baseJSON(\n meta: CommonMeta & { name: string; description: string },\n options: RESTPostAPIChatInputApplicationCommandsJSONBody[\"options\"],\n): RESTPostAPIChatInputApplicationCommandsJSONBody {\n return {\n type: ApplicationCommandType.ChatInput,\n name: meta.name,\n description: meta.description,\n name_localizations: meta.nameLocalizations,\n description_localizations: meta.descriptionLocalizations,\n nsfw: meta.nsfw,\n default_member_permissions:\n meta.defaultMemberPermissions == null\n ? meta.defaultMemberPermissions\n : new PermissionsBitField(meta.defaultMemberPermissions).bitfield.toString(),\n contexts: meta.guildOnly ? [InteractionContextType.Guild] : undefined,\n options,\n };\n}\n\nfunction leafOptionsJSON(options: OptionMap): RESTPostAPIChatInputApplicationCommandsJSONBody[\"options\"] {\n return Object.entries(options).map(([name, def]) => toAPIOption(name, def));\n}\n\nfunction subcommandJSON(name: string, sub: Subcommand): APIApplicationCommandSubcommandOption {\n return {\n type: ApplicationCommandOptionType.Subcommand,\n name,\n description: sub.description,\n name_localizations: sub.nameLocalizations,\n description_localizations: sub.descriptionLocalizations,\n options: Object.entries(sub.options).map(([n, def]) => toAPIOption(n, def)),\n };\n}\n\nfunction routeSubcommand(\n groupName: string | null,\n subName: string | null,\n subcommands: Record<string, Subcommand> | undefined,\n groups: Record<string, SubcommandGroup> | undefined,\n): Subcommand | undefined {\n if (groupName !== null) return groups?.[groupName]?.subcommands[subName ?? \"\"];\n if (subName !== null) return subcommands?.[subName];\n return undefined;\n}\n\n/**\n * Define a slash command with type-safe options and a co-located handler.\n *\n * @example\n * ```ts\n * export default command({\n * name: \"echo\",\n * description: \"Repeat a message\",\n * options: { msg: option.string({ description: \"Text\", required: true }) },\n * run: (ctx) => ctx.reply(ctx.options.msg),\n * });\n * ```\n */\nexport function command<O extends OptionMap = Record<string, never>, R = void>(\n config: CommandConfig<O, R>,\n): SlashCommand {\n const options: OptionMap = config.options ?? {};\n const { run } = config;\n const executor = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const resolved = resolveOptions(interaction, options) as ResolvedOptions<O>;\n await run(new CommandContext<O>(interaction, resolved));\n };\n return new SlashCommand({\n name: config.name,\n json: baseJSON(config, leafOptionsJSON(options)),\n hasAutocomplete: optionsHaveAutocomplete(options),\n executor,\n autocompleter: makeAutocompleter(options),\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n guards: config.guards,\n });\n}\n\n/** Define a single subcommand with type-safe options and a handler. */\nexport function subcommand<O extends OptionMap = Record<string, never>, R = void>(\n config: SubcommandConfig<O, R>,\n): Subcommand {\n const options: OptionMap = config.options ?? {};\n const { run } = config;\n const execute = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const resolved = resolveOptions(interaction, options) as ResolvedOptions<O>;\n await run(new CommandContext<O>(interaction, resolved));\n };\n return {\n kind: \"subcommand\",\n description: config.description,\n options,\n nameLocalizations: config.nameLocalizations,\n descriptionLocalizations: config.descriptionLocalizations,\n hasAutocomplete: optionsHaveAutocomplete(options),\n execute,\n autocomplete: makeAutocompleter(options),\n };\n}\n\n/** Group several subcommands under a shared name. */\nexport function subcommandGroup(config: SubcommandGroupConfig): SubcommandGroup {\n return { kind: \"group\", ...config };\n}\n\n/** Define a command that routes to subcommands and/or subcommand groups. */\nexport function commandGroup(config: CommandGroupConfig): SlashCommand {\n const { subcommands, groups } = config;\n\n const options: (APIApplicationCommandSubcommandOption | APIApplicationCommandSubcommandGroupOption)[] =\n [];\n for (const [name, sub] of Object.entries(subcommands ?? {})) {\n options.push(subcommandJSON(name, sub));\n }\n for (const [name, group] of Object.entries(groups ?? {})) {\n options.push({\n type: ApplicationCommandOptionType.SubcommandGroup,\n name,\n description: group.description,\n name_localizations: group.nameLocalizations,\n description_localizations: group.descriptionLocalizations,\n options: Object.entries(group.subcommands).map(([n, s]) => subcommandJSON(n, s)),\n });\n }\n\n const hasAutocomplete =\n Object.values(subcommands ?? {}).some((s) => s.hasAutocomplete) ||\n Object.values(groups ?? {}).some((g) => Object.values(g.subcommands).some((s) => s.hasAutocomplete));\n\n const executor = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const target = routeSubcommand(\n interaction.options.getSubcommandGroup(false),\n interaction.options.getSubcommand(false),\n subcommands,\n groups,\n );\n if (target === undefined) {\n throw new Error(`spearkit: no subcommand handler for /${config.name}`);\n }\n await target.execute(interaction);\n };\n\n const autocompleter = async (interaction: AutocompleteInteraction): Promise<void> => {\n const target = routeSubcommand(\n interaction.options.getSubcommandGroup(false),\n interaction.options.getSubcommand(false),\n subcommands,\n groups,\n );\n if (target === undefined) {\n if (!interaction.responded) await interaction.respond([]);\n return;\n }\n await target.autocomplete(interaction);\n };\n\n return new SlashCommand({\n name: config.name,\n json: baseJSON(config, options),\n hasAutocomplete,\n executor,\n autocompleter,\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n guards: config.guards,\n });\n}\n","import {\n MessageFlags,\n REST,\n Routes,\n type AutocompleteInteraction,\n type Awaitable,\n type ChatInputCommandInteraction,\n type RESTPostAPIApplicationCommandsJSONBody,\n type RESTPutAPIApplicationCommandsResult,\n type RESTPutAPIApplicationGuildCommandsResult,\n} from \"discord.js\";\nimport type { SlashCommand } from \"./command.js\";\nimport type { Logger } from \"../logger.js\";\nimport { runGuards, type Guard } from \"../guards.js\";\nimport { defaultEmbeds, type Embeds } from \"../embeds.js\";\nimport {\n CooldownManager,\n formatCooldownMessage,\n type CooldownActor,\n type CooldownConfig,\n} from \"../cooldown.js\";\nimport type { UsageEvent } from \"../usage.js\";\n\n/** Error hook invoked when a command handler throws. */\nexport type CommandErrorHandler = (\n error: Error,\n interaction: ChatInputCommandInteraction,\n) => Awaitable<void>;\n\n/** Options for pushing commands to discord. */\nexport interface DeployOptions {\n /** Bot token. Falls back to the client token when omitted. */\n token?: string;\n /** Application (client) id. */\n applicationId: string;\n /** Deploy to a single guild (updates instantly) instead of globally. */\n guildId?: string;\n /** Reuse an existing REST instance instead of creating one. */\n rest?: REST;\n}\n\n/** Result of a {@link CommandRegistry.deploy} call. */\nexport type DeployResult =\n | RESTPutAPIApplicationCommandsResult\n | RESTPutAPIApplicationGuildCommandsResult;\n\n/** Holds every slash command and routes interactions to them. */\nexport class CommandRegistry {\n private readonly commands = new Map<string, SlashCommand>();\n private errorHandler?: CommandErrorHandler;\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private defaultGuards: readonly Guard[] = [];\n private onUsage?: (event: UsageEvent) => void;\n\n /** Register one or more commands. Later registrations override by name. */\n add(...commands: SlashCommand[]): this {\n for (const command of commands) this.commands.set(command.name, command);\n return this;\n }\n\n /** Remove a command by name. */\n remove(name: string): boolean {\n return this.commands.delete(name);\n }\n\n /** Look up a command by name. */\n get(name: string): SlashCommand | undefined {\n return this.commands.get(name);\n }\n\n /** All registered commands. */\n all(): SlashCommand[] {\n return [...this.commands.values()];\n }\n\n /** All registered command names. */\n get names(): string[] {\n return [...this.commands.keys()];\n }\n\n /** Number of registered commands. */\n get size(): number {\n return this.commands.size;\n }\n\n /** Set the handler used when a command throws. */\n onError(handler: CommandErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Attach a logger used for dispatch tracing (debug level). */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Wire a shared cooldown manager and an optional default cooldown for every command. */\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n /** Guards that run before every command's own guards. */\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Attach a hook called after each successful command execution. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Serialise every command to discord REST payloads. */\n toJSON(): RESTPostAPIApplicationCommandsJSONBody[] {\n return this.all().map((c) => c.toJSON());\n }\n\n /** Dispatch an incoming chat-input interaction to its command. */\n async handle(interaction: ChatInputCommandInteraction): Promise<void> {\n const command = this.commands.get(interaction.commandName);\n if (command === undefined) return;\n this.logger?.debug(\"command\", {\n data: { command: interaction.commandName, user: interaction.user.id },\n });\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(command.name, cooldown, actorOf(interaction));\n if (!result.allowed) {\n await this.replyCooldown(interaction, cooldown, result.remaining);\n return;\n }\n }\n const guards = combineGuards(this.defaultGuards, command.guards);\n if (guards.length > 0) {\n const guardResult = await runGuards(interaction, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"command denied\", {\n data: {\n command: command.name,\n user: interaction.user.id,\n reason: guardResult.reason ?? \"\",\n },\n });\n await this.replyDenied(interaction, guardResult.reason);\n return;\n }\n }\n const start = Date.now();\n try {\n await command.execute(interaction);\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n if (this.errorHandler !== undefined) {\n await this.errorHandler(err, interaction);\n } else {\n await this.defaultErrorReply(err, interaction);\n }\n }\n }\n\n /** Dispatch an autocomplete interaction to its command. */\n async handleAutocomplete(interaction: AutocompleteInteraction): Promise<void> {\n const command = this.commands.get(interaction.commandName);\n if (command === undefined) return;\n try {\n await command.autocomplete(interaction);\n } catch {\n if (!interaction.responded) await interaction.respond([]).catch(() => undefined);\n }\n }\n\n /**\n * Push the registered commands to discord. Returns the API response.\n *\n * Guild deploys apply instantly and are ideal during development; global\n * deploys can take up to an hour to propagate.\n */\n async deploy(options: DeployOptions): Promise<DeployResult> {\n let rest = options.rest;\n if (rest === undefined) {\n if (options.token === undefined) {\n throw new Error(\"spearkit: deploy() requires a token or a pre-configured REST instance\");\n }\n rest = new REST().setToken(options.token);\n }\n const body = this.toJSON();\n const route =\n options.guildId !== undefined\n ? Routes.applicationGuildCommands(options.applicationId, options.guildId)\n : Routes.applicationCommands(options.applicationId);\n return (await rest.put(route, { body })) as DeployResult;\n }\n\n private async defaultErrorReply(\n error: Error,\n interaction: ChatInputCommandInteraction,\n ): Promise<void> {\n interaction.client.emit(\"error\", error);\n const content = \"Something went wrong while running that command.\";\n try {\n if (interaction.deferred) {\n await interaction.editReply({ content });\n } else if (interaction.replied) {\n await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n } else {\n await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n }\n } catch {\n // Interaction likely expired; nothing actionable left to do.\n }\n }\n\n private async replyCooldown(\n interaction: ChatInputCommandInteraction,\n config: CooldownConfig,\n remaining: number,\n ): Promise<void> {\n this.logger?.debug(\"cooldown\", {\n data: { command: interaction.commandName, user: interaction.user.id, remaining },\n });\n const content = formatCooldownMessage(config, remaining);\n try {\n if (interaction.deferred) await interaction.editReply({ content });\n else if (interaction.replied) await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n else await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n } catch {\n // Interaction likely expired.\n }\n }\n\n private async replyDenied(\n interaction: ChatInputCommandInteraction,\n reason: string | undefined,\n ): Promise<void> {\n const embeds = clientEmbeds(interaction.client);\n const text = reason ?? \"You don't have permission to use this.\";\n try {\n const payload = { embeds: [embeds.error(text)], flags: MessageFlags.Ephemeral } as const;\n if (interaction.deferred) await interaction.editReply({ embeds: payload.embeds });\n else if (interaction.replied) await interaction.followUp(payload);\n else await interaction.reply(payload);\n } catch {\n // Interaction likely expired.\n }\n }\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n const host = client as { embeds?: Embeds };\n return host.embeds ?? defaultEmbeds;\n}\n\nfunction actorOf(interaction: ChatInputCommandInteraction): CooldownActor {\n const member = interaction.member;\n let roleIds: readonly string[] = [];\n if (member !== null) {\n const roles = member.roles;\n roleIds = Array.isArray(roles) ? roles : [...roles.cache.keys()];\n }\n return {\n userId: interaction.user.id,\n roleIds,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n };\n}\n","import type { Awaitable, Client, ClientEvents } from \"discord.js\";\n\n/** A typed handler for a discord.js client event. */\nexport type EventHandler<E extends keyof ClientEvents> = (\n ...args: ClientEvents[E]\n) => Awaitable<void>;\n\n/** Object form accepted by {@link event}. */\nexport interface EventConfig<E extends keyof ClientEvents> {\n name: E;\n /** Run the handler at most once, then auto-detach. */\n once?: boolean;\n run: EventHandler<E>;\n}\n\n/**\n * A type-erased, ready-to-attach event listener. Built by {@link event}; the\n * concrete event type is captured in the closures so binding stays type-safe.\n */\nexport interface EventDef {\n readonly name: keyof ClientEvents;\n readonly once: boolean;\n /** Attach the listener to a client. */\n attach(client: Client): void;\n /** Remove the listener from a client it was attached to. */\n detach(client: Client): void;\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction build<E extends keyof ClientEvents>(name: E, once: boolean, run: EventHandler<E>): EventDef {\n const listeners = new WeakMap<Client, (...args: ClientEvents[E]) => void>();\n return {\n name,\n once,\n attach(client) {\n const listener = (...args: ClientEvents[E]): void => {\n try {\n const result = run(...args);\n if (result instanceof Promise) {\n result.catch((error: unknown) => client.emit(\"error\", toError(error)));\n }\n } catch (error) {\n client.emit(\"error\", toError(error));\n }\n };\n listeners.set(client, listener);\n if (once) client.once(name, listener);\n else client.on(name, listener);\n },\n detach(client) {\n const listener = listeners.get(client);\n if (listener !== undefined) {\n client.off(name, listener);\n listeners.delete(client);\n }\n },\n };\n}\n\n/**\n * Define a discord.js event listener with a fully-typed handler. Thrown errors\n * and rejected promises are routed to the client's `error` event instead of\n * crashing the process.\n *\n * @example\n * ```ts\n * export default event(\"messageCreate\", (message) => {\n * if (message.author.bot) return;\n * // message is fully typed as Message\n * });\n * ```\n */\nexport function event<E extends keyof ClientEvents>(name: E, run: EventHandler<E>): EventDef;\nexport function event<E extends keyof ClientEvents>(config: EventConfig<E>): EventDef;\nexport function event<E extends keyof ClientEvents>(\n nameOrConfig: E | EventConfig<E>,\n run?: EventHandler<E>,\n): EventDef {\n if (typeof nameOrConfig === \"object\") {\n return build(nameOrConfig.name, nameOrConfig.once ?? false, nameOrConfig.run);\n }\n if (run === undefined) {\n throw new Error(\"spearkit: event(name, run) requires a handler\");\n }\n return build(nameOrConfig, false, run);\n}\n\n/** Holds event listeners and attaches them to clients in bulk. */\nexport class EventRegistry {\n private readonly events: EventDef[] = [];\n private readonly attached = new Set<Client>();\n\n /** Register one or more event definitions. */\n add(...defs: EventDef[]): this {\n this.events.push(...defs);\n for (const client of this.attached) {\n for (const def of defs) def.attach(client);\n }\n return this;\n }\n\n /** Number of registered listeners. */\n get size(): number {\n return this.events.length;\n }\n\n /** Attach every registered listener to the client. */\n attachAll(client: Client): void {\n this.attached.add(client);\n for (const def of this.events) def.attach(client);\n }\n\n /** Detach every registered listener from the client. */\n detachAll(client: Client): void {\n this.attached.delete(client);\n for (const def of this.events) def.detach(client);\n }\n}\n","/**\n * Typed custom-id codec.\n *\n * Patterns follow the grammar `namespace(:{param})*`, e.g. `\"vote\"` or\n * `\"vote:{choice}\"` or `\"page:{id}:{dir}\"`. The `namespace` is the routing key;\n * each `{param}` becomes a positional, percent-escaped value in the encoded id.\n * Param names are recovered at the type level so handlers get a typed `params`\n * object and `build()` requires exactly the right params.\n */\n\n/** Names of the `{param}` placeholders inside a pattern. */\nexport type ParamNames<S extends string> = S extends `${string}{${infer Name}}${infer Rest}`\n ? Name | ParamNames<Rest>\n : never;\n\n/** The params object a pattern resolves to (every value is a string). */\nexport type Params<S extends string> = { [K in ParamNames<S>]: string };\n\n/** Arguments `build()` accepts: none when the pattern has no params. */\nexport type BuildArgs<S extends string> = [ParamNames<S>] extends [never]\n ? []\n : [params: Params<S>];\n\n/** The discord custom-id length limit. */\nexport const MAX_CUSTOM_ID_LENGTH = 100;\n\nconst PARAM_SEGMENT = /^\\{([A-Za-z0-9_]+)\\}$/;\n\n/** A compiled pattern: its routing namespace and ordered param names. */\nexport interface CompiledPattern {\n readonly pattern: string;\n readonly namespace: string;\n readonly paramNames: readonly string[];\n}\n\n/** Compile and validate a custom-id pattern. Throws on malformed input. */\nexport function compilePattern(pattern: string): CompiledPattern {\n const segments = pattern.split(\":\");\n const namespace = segments[0] ?? \"\";\n if (namespace.length === 0 || /[{}]/.test(namespace)) {\n throw new Error(\n `spearkit: invalid custom-id pattern \"${pattern}\". Expected \"namespace\" or \"namespace:{param}\".`,\n );\n }\n const paramNames: string[] = [];\n for (let i = 1; i < segments.length; i++) {\n const match = PARAM_SEGMENT.exec(segments[i] ?? \"\");\n if (match === null) {\n throw new Error(\n `spearkit: invalid custom-id pattern \"${pattern}\". Segment \"${segments[i]}\" must be \"{param}\".`,\n );\n }\n paramNames.push(match[1] as string);\n }\n return { pattern, namespace, paramNames };\n}\n\nfunction encodeValue(value: string): string {\n return value.replace(/%/g, \"%25\").replace(/:/g, \"%3A\");\n}\n\nfunction decodeValue(value: string): string {\n return value.replace(/%3A/g, \":\").replace(/%25/g, \"%\");\n}\n\n/** Build a concrete custom-id from a compiled pattern and its params. */\nexport function buildCustomId(\n compiled: CompiledPattern,\n params: Readonly<Record<string, string>>,\n): string {\n const parts = [compiled.namespace];\n for (const name of compiled.paramNames) {\n const value = params[name];\n if (value === undefined) {\n throw new Error(`spearkit: missing param \"${name}\" for custom-id \"${compiled.pattern}\"`);\n }\n parts.push(encodeValue(value));\n }\n const id = parts.join(\":\");\n if (id.length > MAX_CUSTOM_ID_LENGTH) {\n throw new Error(\n `spearkit: custom-id \"${id}\" exceeds the ${MAX_CUSTOM_ID_LENGTH}-character discord limit`,\n );\n }\n return id;\n}\n\n/** The namespace + raw values parsed out of an incoming custom-id. */\nexport interface ParsedCustomId {\n readonly namespace: string;\n readonly values: readonly string[];\n}\n\n/** Parse an incoming custom-id into its namespace and decoded values. */\nexport function parseCustomId(customId: string): ParsedCustomId {\n const segments = customId.split(\":\");\n const namespace = segments[0] ?? \"\";\n const values = segments.slice(1).map(decodeValue);\n return { namespace, values };\n}\n\n/** Map ordered values onto their param names. */\nexport function paramsFromValues(\n paramNames: readonly string[],\n values: readonly string[],\n): Record<string, string> {\n const params: Record<string, string> = {};\n for (let i = 0; i < paramNames.length; i++) {\n params[paramNames[i] as string] = values[i] ?? \"\";\n }\n return params;\n}\n","import type {\n APIModalInteractionResponseCallbackData,\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n InteractionUpdateOptions,\n JSONEncodable,\n MentionableSelectMenuInteraction,\n ModalBuilder,\n ModalComponentData,\n ModalSubmitInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserSelectMenuInteraction,\n} from \"discord.js\";\nimport { BaseContext } from \"../context.js\";\n\ntype UpdateInput = string | InteractionUpdateOptions;\n/** The concrete message-component interaction types (button + every select). */\nexport type AnyComponentInteraction =\n | ButtonInteraction\n | StringSelectMenuInteraction\n | UserSelectMenuInteraction\n | RoleSelectMenuInteraction\n | ChannelSelectMenuInteraction\n | MentionableSelectMenuInteraction;\n\n/**\n * Base context for message-component interactions (buttons and selects).\n * Adds the component-only `update`/`deferUpdate`/`showModal` helpers and the\n * routed, typed {@link params}.\n */\nexport class MessageComponentContext<\n P,\n I extends AnyComponentInteraction = AnyComponentInteraction,\n> extends BaseContext<I> {\n constructor(\n interaction: I,\n /** Params extracted from the custom-id pattern. */\n readonly params: P,\n ) {\n super(interaction);\n }\n\n /** The raw custom-id that triggered this interaction. */\n get customId(): string {\n return this.interaction.customId;\n }\n\n /** The message the component lives on. */\n get message() {\n return this.interaction.message;\n }\n\n /** Edit the message this component belongs to. */\n async update(input: UpdateInput): Promise<void> {\n await this.interaction.update(input);\n }\n\n /** Acknowledge the interaction without editing the message yet. */\n async deferUpdate(): Promise<void> {\n await this.interaction.deferUpdate();\n }\n\n /** Open a modal in response to this component. */\n async showModal(\n modal: JSONEncodable<APIModalInteractionResponseCallbackData> | ModalComponentData | ModalBuilder,\n ): Promise<void> {\n await this.interaction.showModal(modal);\n }\n}\n\n/** Context for a button click. */\nexport class ButtonContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n ButtonInteraction\n> {}\n\n/** Context for a string select; exposes the chosen {@link values}. */\nexport class StringSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n StringSelectMenuInteraction\n> {\n /** All selected values. */\n get values(): string[] {\n return this.interaction.values;\n }\n /** The first selected value, or `undefined` if none. */\n get value(): string | undefined {\n return this.interaction.values[0];\n }\n}\n\n/** Context for a user select; exposes selected ids, users and members. */\nexport class UserSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n UserSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get users() {\n return this.interaction.users;\n }\n get members() {\n return this.interaction.members;\n }\n}\n\n/** Context for a role select. */\nexport class RoleSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n RoleSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get roles() {\n return this.interaction.roles;\n }\n}\n\n/** Context for a channel select. */\nexport class ChannelSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n ChannelSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get channels() {\n return this.interaction.channels;\n }\n}\n\n/** Context for a mentionable (user + role) select. */\nexport class MentionableSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n MentionableSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get users() {\n return this.interaction.users;\n }\n get roles() {\n return this.interaction.roles;\n }\n get members() {\n return this.interaction.members;\n }\n}\n\n/**\n * Context for a submitted modal. Exposes the routed {@link params} plus the\n * resolved text-input {@link fields}, keyed by the field names you declared.\n */\nexport class ModalContext<P, F extends string = string> extends BaseContext<ModalSubmitInteraction> {\n constructor(\n interaction: ModalSubmitInteraction,\n readonly params: P,\n /** Submitted values, keyed by the field names from your modal definition. */\n readonly fields: Record<F, string>,\n ) {\n super(interaction);\n }\n\n /** The raw custom-id that triggered this modal submission. */\n get customId(): string {\n return this.interaction.customId;\n }\n}\n","import type {\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n Interaction,\n MentionableSelectMenuInteraction,\n ModalSubmitInteraction,\n RepliableInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserSelectMenuInteraction,\n Awaitable,\n} from \"discord.js\";\nimport { MessageFlags } from \"discord.js\";\nimport { parseCustomId, paramsFromValues } from \"./customId.js\";\nimport type { Logger } from \"../logger.js\";\nimport type { UsageEvent } from \"../usage.js\";\nimport { runGuards, type Guard } from \"../guards.js\";\nimport { defaultEmbeds, type Embeds } from \"../embeds.js\";\n\n/** Shared shape of every routed component. */\ninterface RouteBase {\n readonly namespace: string;\n readonly paramNames: readonly string[];\n readonly guards?: readonly Guard[];\n}\n\n/** Routing entry for a button. */\nexport interface ButtonRoute extends RouteBase {\n readonly kind: \"button\";\n handle(interaction: ButtonInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a string select. */\nexport interface StringSelectRoute extends RouteBase {\n readonly kind: \"stringSelect\";\n handle(interaction: StringSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a user select. */\nexport interface UserSelectRoute extends RouteBase {\n readonly kind: \"userSelect\";\n handle(interaction: UserSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a role select. */\nexport interface RoleSelectRoute extends RouteBase {\n readonly kind: \"roleSelect\";\n handle(interaction: RoleSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a channel select. */\nexport interface ChannelSelectRoute extends RouteBase {\n readonly kind: \"channelSelect\";\n handle(interaction: ChannelSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a mentionable select. */\nexport interface MentionableSelectRoute extends RouteBase {\n readonly kind: \"mentionableSelect\";\n handle(\n interaction: MentionableSelectMenuInteraction,\n params: Record<string, string>,\n ): Promise<void>;\n}\n/** Routing entry for a modal submission. */\nexport interface ModalRoute extends RouteBase {\n readonly kind: \"modal\";\n handle(interaction: ModalSubmitInteraction, params: Record<string, string>): Promise<void>;\n}\n\n/** Any registrable component routing entry. */\nexport type ComponentDef =\n | ButtonRoute\n | StringSelectRoute\n | UserSelectRoute\n | RoleSelectRoute\n | ChannelSelectRoute\n | MentionableSelectRoute\n | ModalRoute;\n\n/** Error hook invoked when a component handler throws. */\nexport type ComponentErrorHandler = (\n error: Error,\n interaction: RepliableInteraction,\n) => Awaitable<void>;\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\n/**\n * Routes button, select and modal interactions to the handlers registered for\n * their custom-id namespace. Decodes the custom-id, extracts typed params, and\n * invokes the matching handler.\n */\nexport class ComponentRegistry {\n private readonly buttons = new Map<string, ButtonRoute>();\n private readonly stringSelects = new Map<string, StringSelectRoute>();\n private readonly userSelects = new Map<string, UserSelectRoute>();\n private readonly roleSelects = new Map<string, RoleSelectRoute>();\n private readonly channelSelects = new Map<string, ChannelSelectRoute>();\n private readonly mentionableSelects = new Map<string, MentionableSelectRoute>();\n private readonly modals = new Map<string, ModalRoute>();\n private errorHandler?: ComponentErrorHandler;\n private logger?: Logger;\n private onUsage?: (event: UsageEvent) => void;\n private defaultGuards: readonly Guard[] = [];\n\n /** Register one or more components. Later registrations override by namespace. */\n add(...defs: ComponentDef[]): this {\n for (const def of defs) {\n switch (def.kind) {\n case \"button\":\n this.buttons.set(def.namespace, def);\n break;\n case \"stringSelect\":\n this.stringSelects.set(def.namespace, def);\n break;\n case \"userSelect\":\n this.userSelects.set(def.namespace, def);\n break;\n case \"roleSelect\":\n this.roleSelects.set(def.namespace, def);\n break;\n case \"channelSelect\":\n this.channelSelects.set(def.namespace, def);\n break;\n case \"mentionableSelect\":\n this.mentionableSelects.set(def.namespace, def);\n break;\n case \"modal\":\n this.modals.set(def.namespace, def);\n break;\n }\n }\n return this;\n }\n\n /** Set the handler used when a component throws. */\n onError(handler: ComponentErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Attach a logger used for dispatch tracing (debug level). */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Attach a hook called after each successful component handler run. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Guards that run before every component's own guards. */\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Total number of registered components. */\n get size(): number {\n return (\n this.buttons.size +\n this.stringSelects.size +\n this.userSelects.size +\n this.roleSelects.size +\n this.channelSelects.size +\n this.mentionableSelects.size +\n this.modals.size\n );\n }\n\n /**\n * Dispatch an interaction to its component handler. Returns `true` if a\n * handler matched and ran, `false` otherwise.\n */\n async handle(interaction: Interaction): Promise<boolean> {\n if (interaction.isButton()) {\n return this.exec(this.buttons.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isStringSelectMenu()) {\n return this.exec(this.stringSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isUserSelectMenu()) {\n return this.exec(this.userSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isRoleSelectMenu()) {\n return this.exec(this.roleSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isChannelSelectMenu()) {\n return this.exec(this.channelSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isMentionableSelectMenu()) {\n return this.exec(this.mentionableSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isModalSubmit()) {\n return this.exec(this.modals.get(namespaceOf(interaction.customId)), interaction);\n }\n return false;\n }\n\n private async exec<I extends RepliableInteraction & { customId: string }>(\n route: (RouteBase & { handle(interaction: I, params: Record<string, string>): Promise<void> }) | undefined,\n interaction: I,\n ): Promise<boolean> {\n if (route === undefined) return false;\n this.logger?.debug(\"component\", { data: { customId: interaction.customId } });\n const guards = combineGuards(this.defaultGuards, route.guards);\n if (guards.length > 0) {\n const guardResult = await runGuards(interaction, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"component denied\", {\n data: { customId: interaction.customId, reason: guardResult.reason ?? \"\" },\n });\n await replyDeniedComponent(interaction, guardResult.reason);\n return true;\n }\n }\n const { values } = parseCustomId(interaction.customId);\n const params = paramsFromValues(route.paramNames, values);\n const start = Date.now();\n try {\n await route.handle(interaction, params);\n this.onUsage?.({\n type: \"component\",\n name: route.namespace,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = toError(error);\n this.onUsage?.({\n type: \"component\",\n name: route.namespace,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n if (this.errorHandler !== undefined) {\n await this.errorHandler(err, interaction);\n } else {\n interaction.client.emit(\"error\", err);\n if (!interaction.replied && !interaction.deferred) {\n await interaction\n .reply({ content: \"Something went wrong.\", flags: MessageFlags.Ephemeral })\n .catch(() => undefined);\n }\n }\n }\n return true;\n }\n}\n\nfunction namespaceOf(customId: string): string {\n return parseCustomId(customId).namespace;\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\nasync function replyDeniedComponent(\n interaction: RepliableInteraction,\n reason: string | undefined,\n): Promise<void> {\n const embeds = clientEmbeds(interaction.client);\n const text = reason ?? \"You don't have permission to use this.\";\n try {\n const payload = { embeds: [embeds.error(text)], flags: MessageFlags.Ephemeral } as const;\n if (interaction.deferred) await interaction.editReply({ embeds: payload.embeds });\n else if (interaction.replied) await interaction.followUp(payload);\n else await interaction.reply(payload);\n } catch {\n // Interaction likely expired.\n }\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ChannelSelectMenuBuilder,\n MentionableSelectMenuBuilder,\n ModalBuilder,\n RoleSelectMenuBuilder,\n StringSelectMenuBuilder,\n TextInputBuilder,\n TextInputStyle,\n UserSelectMenuBuilder,\n type Awaitable,\n type ChannelType,\n type ComponentEmojiResolvable,\n type SelectMenuComponentOptionData,\n} from \"discord.js\";\nimport {\n ButtonContext,\n ChannelSelectContext,\n MentionableSelectContext,\n ModalContext,\n RoleSelectContext,\n StringSelectContext,\n UserSelectContext,\n} from \"./context.js\";\nimport {\n buildCustomId,\n compilePattern,\n type BuildArgs,\n type Params,\n} from \"./customId.js\";\nimport type {\n ButtonRoute,\n ChannelSelectRoute,\n MentionableSelectRoute,\n ModalRoute,\n RoleSelectRoute,\n StringSelectRoute,\n UserSelectRoute,\n} from \"./registry.js\";\nimport type { Guard } from \"../guards.js\";\n\n// --- buttons ---------------------------------------------------------------\n\n/** Accepted button styles for an interactive (custom-id) button. */\nexport type ButtonStyleInput =\n | \"Primary\"\n | \"Secondary\"\n | \"Success\"\n | \"Danger\"\n | ButtonStyle.Primary\n | ButtonStyle.Secondary\n | ButtonStyle.Success\n | ButtonStyle.Danger;\n\nfunction resolveButtonStyle(input: ButtonStyleInput | undefined): ButtonStyle {\n if (input === undefined) return ButtonStyle.Secondary;\n return typeof input === \"number\" ? input : ButtonStyle[input];\n}\n\n/** Config for an interactive button created with {@link button}. */\nexport interface ButtonConfig<P extends string, R> {\n /** Custom-id pattern, e.g. `\"vote\"` or `\"vote:{choice}\"`. */\n id: P;\n label?: string;\n style?: ButtonStyleInput;\n emoji?: ComponentEmojiResolvable;\n disabled?: boolean;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n run: (ctx: ButtonContext<Params<P>>) => Awaitable<R>;\n}\n\n/** A registrable button with a typed {@link build}. */\nexport interface Button<P extends string> extends ButtonRoute {\n build(...args: BuildArgs<P>): ButtonBuilder;\n}\n\n/**\n * Define an interactive button: its appearance, its custom-id pattern and its\n * click handler, all in one place. Register it with `client.components.add`.\n *\n * @example\n * ```ts\n * const vote = button({\n * id: \"vote:{choice}\",\n * label: \"Yes\",\n * style: \"Success\",\n * run: (ctx) => ctx.reply(`You chose ${ctx.params.choice}`),\n * });\n * row(vote.build({ choice: \"yes\" }));\n * ```\n */\nexport function button<const P extends string, R = void>(config: ButtonConfig<P, R>): Button<P> {\n const compiled = compilePattern(config.id);\n const style = resolveButtonStyle(config.style);\n return { kind: \"button\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new ButtonContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): ButtonBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ButtonBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .setStyle(style);\n if (config.label !== undefined) builder.setLabel(config.label);\n if (config.emoji !== undefined) builder.setEmoji(config.emoji);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n return builder;\n }, };\n}\n\n/** Config for a link button (no handler — just opens a URL). */\nexport interface LinkButtonConfig {\n url: string;\n label?: string;\n emoji?: ComponentEmojiResolvable;\n disabled?: boolean;\n}\n\n/** Build a link button. Link buttons have no custom-id and run no handler. */\nexport function linkButton(config: LinkButtonConfig): ButtonBuilder {\n const builder = new ButtonBuilder().setStyle(ButtonStyle.Link).setURL(config.url);\n if (config.label !== undefined) builder.setLabel(config.label);\n if (config.emoji !== undefined) builder.setEmoji(config.emoji);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n return builder;\n}\n\n// --- selects ---------------------------------------------------------------\n\ninterface SelectConfigBase {\n placeholder?: string;\n minValues?: number;\n maxValues?: number;\n disabled?: boolean;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n}\n\n/** Any of the select-menu builders that share the base configuration setters. */\ntype AnySelectBuilder =\n | StringSelectMenuBuilder\n | UserSelectMenuBuilder\n | RoleSelectMenuBuilder\n | ChannelSelectMenuBuilder\n | MentionableSelectMenuBuilder;\nfunction applySelectBase(builder: AnySelectBuilder, config: SelectConfigBase): void {\n if (config.placeholder !== undefined) builder.setPlaceholder(config.placeholder);\n if (config.minValues !== undefined) builder.setMinValues(config.minValues);\n if (config.maxValues !== undefined) builder.setMaxValues(config.maxValues);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n}\n\n/** Config for a string select created with {@link stringSelect}. */\nexport interface StringSelectConfig<P extends string, R> extends SelectConfigBase {\n id: P;\n options: readonly SelectMenuComponentOptionData[];\n run: (ctx: StringSelectContext<Params<P>>) => Awaitable<R>;\n}\n\n/** A registrable string select with a typed {@link build}. */\nexport interface StringSelect<P extends string> extends StringSelectRoute {\n build(...args: BuildArgs<P>): StringSelectMenuBuilder;\n}\n\n/** Define a string select menu, its custom-id pattern and its handler. */\nexport function stringSelect<const P extends string, R = void>(\n config: StringSelectConfig<P, R>,\n): StringSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"stringSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new StringSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): StringSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new StringSelectMenuBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .addOptions(...config.options);\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** Config shared by the entity-select builders (user/role/channel/mentionable). */\nexport interface EntitySelectConfig<P extends string> extends SelectConfigBase {\n id: P;\n}\n\n/** A registrable user select. */\nexport interface UserSelect<P extends string> extends UserSelectRoute {\n build(...args: BuildArgs<P>): UserSelectMenuBuilder;\n}\n\n/** Define a user select menu. */\nexport function userSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & { run: (ctx: UserSelectContext<Params<P>>) => Awaitable<R> },\n): UserSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"userSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new UserSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): UserSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new UserSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** A registrable role select. */\nexport interface RoleSelect<P extends string> extends RoleSelectRoute {\n build(...args: BuildArgs<P>): RoleSelectMenuBuilder;\n}\n\n/** Define a role select menu. */\nexport function roleSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & { run: (ctx: RoleSelectContext<Params<P>>) => Awaitable<R> },\n): RoleSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"roleSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new RoleSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): RoleSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new RoleSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** A registrable channel select. */\nexport interface ChannelSelect<P extends string> extends ChannelSelectRoute {\n build(...args: BuildArgs<P>): ChannelSelectMenuBuilder;\n}\n\n/** Define a channel select menu, optionally restricted to channel types. */\nexport function channelSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & {\n channelTypes?: readonly ChannelType[];\n run: (ctx: ChannelSelectContext<Params<P>>) => Awaitable<R>;\n },\n): ChannelSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"channelSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new ChannelSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): ChannelSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ChannelSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n if (config.channelTypes !== undefined) builder.setChannelTypes(...config.channelTypes);\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** A registrable mentionable select. */\nexport interface MentionableSelect<P extends string> extends MentionableSelectRoute {\n build(...args: BuildArgs<P>): MentionableSelectMenuBuilder;\n}\n\n/** Define a mentionable (user + role) select menu. */\nexport function mentionableSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & {\n run: (ctx: MentionableSelectContext<Params<P>>) => Awaitable<R>;\n },\n): MentionableSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"mentionableSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new MentionableSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): MentionableSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new MentionableSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n// --- modals ----------------------------------------------------------------\n\n/** Accepted text-input styles. */\nexport type TextInputStyleInput = \"Short\" | \"Paragraph\" | TextInputStyle;\n\nfunction resolveTextInputStyle(input: TextInputStyleInput | undefined): TextInputStyle {\n if (input === undefined) return TextInputStyle.Short;\n return typeof input === \"number\" ? input : TextInputStyle[input];\n}\n\n/** A resolved text-input field definition. */\nexport interface TextInputDef {\n readonly label: string;\n readonly style: TextInputStyle;\n readonly placeholder?: string;\n readonly required?: boolean;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly value?: string;\n}\n\n/** Define a single modal text-input field. */\nexport function textInput(config: {\n label: string;\n style?: TextInputStyleInput;\n placeholder?: string;\n required?: boolean;\n minLength?: number;\n maxLength?: number;\n value?: string;\n}): TextInputDef {\n return {\n label: config.label,\n style: resolveTextInputStyle(config.style),\n placeholder: config.placeholder,\n required: config.required,\n minLength: config.minLength,\n maxLength: config.maxLength,\n value: config.value,\n };\n}\n\n/** Config for a modal created with {@link modal}. */\nexport interface ModalConfig<P extends string, F extends Record<string, TextInputDef>, R> {\n id: P;\n title: string;\n fields: F;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n run: (ctx: ModalContext<Params<P>, keyof F & string>) => Awaitable<R>;\n}\n\n/** A registrable modal with a typed {@link build}. */\nexport interface Modal<P extends string> extends ModalRoute {\n build(...args: BuildArgs<P>): ModalBuilder;\n}\n\nfunction buildTextInput(customId: string, def: TextInputDef): TextInputBuilder {\n const input = new TextInputBuilder()\n .setCustomId(customId)\n .setLabel(def.label)\n .setStyle(def.style);\n if (def.placeholder !== undefined) input.setPlaceholder(def.placeholder);\n if (def.required !== undefined) input.setRequired(def.required);\n if (def.minLength !== undefined) input.setMinLength(def.minLength);\n if (def.maxLength !== undefined) input.setMaxLength(def.maxLength);\n if (def.value !== undefined) input.setValue(def.value);\n return input;\n}\n\n/**\n * Define a modal: its title, its custom-id pattern, its text-input fields and\n * a submit handler. The handler receives the submitted values keyed by field\n * name in `ctx.fields`.\n *\n * @example\n * ```ts\n * const feedback = modal({\n * id: \"feedback:{ticket}\",\n * title: \"Feedback\",\n * fields: { comment: textInput({ label: \"Comment\", style: \"Paragraph\" }) },\n * run: (ctx) => ctx.reply(`Thanks! (${ctx.params.ticket}): ${ctx.fields.comment}`),\n * });\n * ```\n */\nexport function modal<const P extends string, F extends Record<string, TextInputDef>, R = void>(\n config: ModalConfig<P, F, R>,\n): Modal<P> {\n const compiled = compilePattern(config.id);\n const fieldKeys = Object.keys(config.fields);\n return { kind: \"modal\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n const fields: Record<string, string> = {};\n for (const key of fieldKeys) {\n try {\n fields[key] = interaction.fields.getTextInputValue(key);\n } catch {\n fields[key] = \"\";\n }\n }\n await config.run(\n new ModalContext(interaction, params as Params<P>, fields as Record<keyof F & string, string>),\n );\n },\n build(...args: BuildArgs<P>): ModalBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ModalBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .setTitle(config.title);\n for (const [key, def] of Object.entries(config.fields)) {\n builder.addComponents(\n new ActionRowBuilder<TextInputBuilder>().addComponents(buildTextInput(key, def)),\n );\n }\n return builder;\n }, };\n}\n","import { ActionRowBuilder, type MessageActionRowComponentBuilder } from \"discord.js\";\n\n/**\n * Wrap one or more component builders in an action row.\n *\n * A row holds up to five buttons, or exactly one select menu.\n *\n * @example\n * ```ts\n * const components = [row(yes.build(), no.build())];\n * await channel.send({ content: \"Vote:\", components });\n * ```\n */\nexport function row<C extends MessageActionRowComponentBuilder>(\n ...components: C[]\n): ActionRowBuilder<C> {\n return new ActionRowBuilder<C>().addComponents(...components);\n}\n","import { readdir } from \"node:fs/promises\";\nimport { extname, join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { SlashCommand } from \"./commands/command.js\";\nimport type { Registerable, SpearClient } from \"./client.js\";\n\n/** Options for the directory loader. */\nexport interface LoadOptions {\n /** File extensions to import. Default: `.js`, `.mjs`, `.cjs`. */\n extensions?: readonly string[];\n /** Recurse into subdirectories. Default: `true`. */\n recursive?: boolean;\n}\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\", \".cjs\"] as const;\n\n/** Structural guard: is this exported value something spearkit can register? */\nfunction isRegisterable(value: unknown): value is Registerable {\n if (value instanceof SlashCommand) return true;\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Record<string, unknown>;\n if (typeof record[\"attach\"] === \"function\" && typeof record[\"detach\"] === \"function\") {\n return true;\n }\n if (typeof record[\"kind\"] === \"string\" && typeof record[\"handle\"] === \"function\") {\n return true;\n }\n if (\n (record[\"kind\"] === \"task\" || record[\"kind\"] === \"prefixCommand\") &&\n typeof record[\"run\"] === \"function\"\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Recursively import a directory and collect every spearkit-registrable export\n * (commands, events, components) found in default or named exports.\n */\nexport async function collectModules(\n dir: string,\n options: LoadOptions = {},\n): Promise<Registerable[]> {\n const extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n const recursive = options.recursive ?? true;\n const found: Registerable[] = [];\n\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (recursive) found.push(...(await collectModules(fullPath, options)));\n continue;\n }\n if (!extensions.includes(extname(entry.name))) continue;\n\n const mod: Record<string, unknown> = await import(pathToFileURL(fullPath).href);\n for (const value of Object.values(mod)) {\n if (isRegisterable(value)) found.push(value);\n }\n }\n return found;\n}\n\n/**\n * Load a directory and register everything it exports into the client.\n * Returns the number of items registered.\n */\nexport async function loadInto(\n client: SpearClient,\n dir: string,\n options?: LoadOptions,\n): Promise<number> {\n const items = await collectModules(dir, options);\n client.register(...items);\n return items.length;\n}\n","import {\n Client,\n GatewayIntentBits,\n Routes,\n type ClientOptions,\n type Interaction,\n} from \"discord.js\";\nimport { SlashCommand } from \"./commands/command.js\";\nimport { CommandRegistry, type DeployResult } from \"./commands/registry.js\";\nimport { EventRegistry, type EventDef } from \"./events.js\";\nimport { ComponentRegistry, type ComponentDef } from \"./components/registry.js\";\nimport type { SpearPlugin } from \"./plugin.js\";\nimport { loadInto, type LoadOptions } from \"./loader.js\";\nimport { Logger, type LoggerOptions, toError } from \"./logger.js\";\nimport { loadEnv, type LoadEnvOptions } from \"./env.js\";\nimport { CooldownManager, normalizeCooldown, type CooldownInput } from \"./cooldown.js\";\nimport { TaskScheduler, task, type ScheduledTask, type TaskConfig } from \"./scheduler.js\";\nimport { PrefixRegistry, type PrefixCommand, type PrefixOptions } from \"./prefix.js\";\nimport { UsageTracker, type UsageEvent, type UsageOptions } from \"./usage.js\";\nimport { Embeds, type EmbedsOptions } from \"./embeds.js\";\nimport type { Guard } from \"./guards.js\";\nimport { ContextMenuRegistry, type ContextMenuCommand } from \"./context-menus.js\";\n\n/** Anything that can be handed to {@link SpearClient.register}. */\nexport type Registerable =\n | SlashCommand\n | EventDef\n | ComponentDef\n | ScheduledTask\n | PrefixCommand\n | ContextMenuCommand;\n\nconst allIntents = Object.values(GatewayIntentBits).filter(\n (value): value is GatewayIntentBits => typeof value === \"number\",\n);\n\n/**\n * Ready-made intent presets. Pass one to {@link SpearClient} as `intents`.\n * `all` includes privileged intents — enable them in the developer portal.\n */\nexport const Intents = {\n /** No intents. */\n none: [] as GatewayIntentBits[],\n /** Just `Guilds` — enough for slash commands and interactions. */\n default: [GatewayIntentBits.Guilds],\n /** Guild + member gateway data. */\n guilds: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],\n /** Read message content (privileged) alongside guild messages. */\n messages: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n ],\n /** Every intent, including privileged ones. */\n all: allIntents,\n} as const;\n\n/** spearkit-specific client options layered on top of discord.js {@link ClientOptions}. */\nexport interface SpearOptions {\n /** A {@link Logger} instance, or options to build one. Exposed as `client.logger`. */\n logger?: Logger | LoggerOptions;\n /**\n * Auto-load a `.env` file into `process.env` on {@link SpearClient.start}.\n * `true` (default) loads `.env` from the cwd; pass {@link LoadEnvOptions} for\n * a custom path or override behaviour, or `false` to disable.\n */\n dotenv?: boolean | LoadEnvOptions;\n /** A default cooldown applied to every command. A command's own cooldown overrides it. */\n cooldown?: CooldownInput;\n /** Enable prefix (text) commands. A string/array sets prefixes; an object configures matching. */\n prefix?: string | readonly string[] | PrefixOptions;\n /** Track command/component/prefix usage to a store and/or a Discord channel. */\n usage?: UsageOptions;\n /** Default {@link Embeds} factory for preset replies. Pass an instance or options. */\n embeds?: Embeds | EmbedsOptions;\n /** Default guards (preconditions) applied before every command/component/prefix handler. */\n guards?: readonly Guard[];\n}\n\n/** Options for {@link SpearClient}: discord.js options plus {@link SpearOptions}. `intents` may be omitted. */\nexport type SpearClientOptions = Partial<ClientOptions> & SpearOptions;\n\n/**\n * A discord.js {@link Client} with batteries included: command, event,\n * component, prefix-command, scheduler and context-menu registries plus\n * interaction routing wired up automatically.\n *\n * @example\n * ```ts\n * const client = new SpearClient({ intents: Intents.default });\n * client.register(ping, onReady, voteButton);\n * await client.start(process.env.TOKEN);\n * await client.deployAllCommands({ guildId: \"123\" });\n * ```\n */\nexport class SpearClient extends Client {\n /** Slash command registry and dispatcher. */\n readonly commands = new CommandRegistry();\n /** Event listener registry. */\n readonly events = new EventRegistry();\n /** Button / select / modal registry and router. */\n readonly components = new ComponentRegistry();\n /** Structured logger shared across spearkit and available to your code. */\n readonly logger: Logger;\n /** Shared cooldown manager used by command dispatch; also usable directly. */\n readonly cooldowns = new CooldownManager();\n /** Cron/interval task scheduler; started on ready and stopped on destroy. */\n readonly scheduler = new TaskScheduler();\n /** Prefix (text) command registry, dispatched from `messageCreate`. */\n readonly prefix = new PrefixRegistry();\n /** Usage tracker: records who used what to a store and/or a Discord channel. */\n readonly usage = new UsageTracker();\n /** Preset embed factory used by `ctx.error/success/info/warn` and available to your code. */\n readonly embeds: Embeds;\n /** User- and message-context-menu command registry. */\n readonly contextMenus = new ContextMenuRegistry();\n private readonly envConfig: false | LoadEnvOptions;\n\n constructor(options: SpearClientOptions = {}) {\n const { intents, logger, dotenv, cooldown, prefix, usage, embeds, guards, ...rest } = options;\n super({ ...rest, intents: intents ?? Intents.default });\n this.embeds = embeds instanceof Embeds ? embeds : new Embeds(embeds);\n this.envConfig = dotenv === false ? false : dotenv === undefined || dotenv === true ? {} : dotenv;\n this.logger = logger instanceof Logger ? logger : new Logger(logger);\n const defaultCooldown = cooldown !== undefined ? normalizeCooldown(cooldown) : undefined;\n\n this.commands.setLogger(this.logger.child(\"commands\"));\n this.commands.setCooldowns(this.cooldowns, defaultCooldown);\n this.components.setLogger(this.logger.child(\"components\"));\n this.contextMenus.setLogger(this.logger.child(\"contextMenus\"));\n this.contextMenus.setCooldowns(this.cooldowns, defaultCooldown);\n this.prefix.setLogger(this.logger.child(\"prefix\"));\n this.prefix.setCooldowns(this.cooldowns, defaultCooldown);\n if (prefix !== undefined) this.prefix.setOptions(prefix);\n this.scheduler.setLogger(this.logger.child(\"scheduler\"));\n\n if (guards !== undefined && guards.length > 0) {\n this.commands.setDefaultGuards(guards);\n this.contextMenus.setDefaultGuards(guards);\n this.components.setDefaultGuards(guards);\n this.prefix.setDefaultGuards(guards);\n }\n\n this.usage.setClient(this).setLogger(this.logger.child(\"usage\"));\n if (usage !== undefined) {\n if (usage.store !== undefined) this.usage.setStore(usage.store);\n if (usage.channel !== undefined) this.usage.reportTo(usage.channel, usage.format);\n const onUsage = (event: UsageEvent): void => this.usage.track(event);\n this.commands.setUsageHook(onUsage);\n this.contextMenus.setUsageHook(onUsage);\n this.components.setUsageHook(onUsage);\n this.prefix.setUsageHook(onUsage);\n }\n\n this.events.attachAll(this);\n this.on(\"interactionCreate\", (interaction) => this.route(interaction));\n this.on(\"error\", (error) => this.logger.error(\"client error\", { error: toError(error) }));\n this.once(\"clientReady\", () => this.scheduler.start(this));\n this.on(\"messageCreate\", (message) => {\n void this.prefix.handle(message);\n });\n }\n\n /**\n * Register commands, events, components, scheduled tasks, prefix commands\n * and context menus in one call. Each item is routed to its matching registry.\n */\n register(...items: Registerable[]): this {\n for (const item of items) {\n if (item instanceof SlashCommand) {\n this.commands.add(item);\n } else if (\"attach\" in item) {\n this.events.add(item);\n } else if (item.kind === \"task\") {\n this.scheduler.add(item);\n } else if (item.kind === \"prefixCommand\") {\n this.prefix.add(item);\n } else if (item.kind === \"userMenu\") {\n this.contextMenus.add(item);\n } else if (item.kind === \"messageMenu\") {\n this.contextMenus.add(item);\n } else {\n this.components.add(item);\n }\n }\n return this;\n }\n\n /** Install one or more plugins, running each plugin's `setup`. */\n async use(...plugins: SpearPlugin[]): Promise<this> {\n for (const plugin of plugins) {\n await plugin.setup(this);\n }\n return this;\n }\n\n /**\n * Recursively load a directory and register every command, event and\n * component it exports. Returns the number of items registered.\n */\n load(dir: string, options?: LoadOptions): Promise<number> {\n return loadInto(this, dir, options);\n }\n\n /**\n * Log in. Falls back to the `DISCORD_TOKEN` environment variable when no\n * token is passed.\n */\n async start(token?: string): Promise<this> {\n if (this.envConfig !== false) loadEnv(this.envConfig);\n const resolved = token ?? process.env.DISCORD_TOKEN;\n if (resolved === undefined || resolved.length === 0) {\n throw new Error(\"spearkit: start() needs a token (pass one or set DISCORD_TOKEN)\");\n }\n await this.login(resolved);\n return this;\n }\n\n /**\n * Push the registered slash commands to Discord using the client's REST\n * connection. Slash-only — use {@link deployAllCommands} to include context\n * menus in the same request.\n */\n async deployCommands(options: { guildId?: string } = {}): Promise<DeployResult> {\n const applicationId = this.application?.id ?? this.user?.id;\n if (applicationId == null) {\n throw new Error(\"spearkit: deployCommands() must run after the client is ready\");\n }\n return this.commands.deploy({ rest: this.rest, applicationId, guildId: options.guildId });\n }\n\n /**\n * Deploy slash commands AND context menus together to Discord in a single\n * PUT. Use this once you mix `userCommand` / `messageCommand` with `command`.\n */\n /**\n * Deploy slash commands AND context menus together. Supports a `diff`\n * strategy that fetches the remote set first and skips the PUT when\n * nothing changed, and a `dryRun` flag that returns the body without\n * touching Discord (perfect for CI deploy gates).\n *\n * @returns the API's DeployResult on PUT, or a skipped report when\n * `dryRun: true` is set OR `strategy: \"diff\"` finds no changes.\n */\n async deployAllCommands(options: {\n guildId?: string;\n dryRun?: boolean;\n strategy?: \"always\" | \"diff\";\n /** Override the application id (default reads from the ready client). */\n applicationId?: string;\n } = {}): Promise<DeployResult | { skipped: true; reason: \"dry-run\" | \"no-changes\"; body: readonly unknown[] }> {\n const applicationId = options.applicationId ?? this.application?.id ?? this.user?.id;\n if (applicationId == null) {\n throw new Error(\"spearkit: deployAllCommands() must run after the client is ready\");\n }\n const body = [...this.commands.toJSON(), ...this.contextMenus.toJSON()];\n const route =\n options.guildId !== undefined\n ? Routes.applicationGuildCommands(applicationId, options.guildId)\n : Routes.applicationCommands(applicationId);\n if (options.dryRun === true) {\n return { skipped: true, reason: \"dry-run\", body };\n }\n if (options.strategy === \"diff\") {\n const remote = (await this.rest.get(route)) as readonly unknown[];\n if (commandsEqual(body, remote)) {\n return { skipped: true, reason: \"no-changes\", body };\n }\n }\n return (await this.rest.put(route, { body })) as DeployResult;\n }\n\n /** Define and register a scheduled task in one call. */\n schedule(config: TaskConfig): ScheduledTask {\n const scheduled = task(config);\n this.scheduler.add(scheduled);\n return scheduled;\n }\n\n /** Stop the scheduler, then tear down the discord.js client. */\n override async destroy(): Promise<void> {\n this.scheduler.stop();\n await super.destroy();\n }\n\n private async route(interaction: Interaction): Promise<void> {\n if (interaction.isChatInputCommand()) {\n await this.commands.handle(interaction);\n } else if (interaction.isAutocomplete()) {\n await this.commands.handleAutocomplete(interaction);\n } else if (interaction.isUserContextMenuCommand()) {\n await this.contextMenus.handleUser(interaction);\n } else if (interaction.isMessageContextMenuCommand()) {\n await this.contextMenus.handleMessage(interaction);\n } else {\n await this.components.handle(interaction);\n }\n }\n}\n\n/** Structural equality check used by deployAllCommands' diff strategy. */\nfunction commandsEqual(local: readonly unknown[], remote: readonly unknown[]): boolean {\n if (local.length !== remote.length) return false;\n const lset = new Set(local.map(commandHash));\n for (const r of remote) {\n if (!lset.has(commandHash(r))) return false;\n }\n return true;\n}\n\nfunction commandHash(cmd: unknown): string {\n const c = cmd as Record<string, unknown>;\n return JSON.stringify({\n name: c.name,\n type: c.type ?? 1,\n description: c.description ?? \"\",\n nsfw: c.nsfw === true,\n default_member_permissions: c.default_member_permissions ?? null,\n contexts: Array.isArray(c.contexts) ? [...(c.contexts as number[])].sort((a, b) => a - b) : null,\n options: normaliseOptions(c.options),\n });\n}\n\nfunction normaliseOptions(options: unknown): readonly unknown[] {\n if (!Array.isArray(options)) return [];\n return options\n .map((o) => {\n const opt = o as Record<string, unknown>;\n return {\n name: opt.name,\n type: opt.type,\n description: opt.description ?? \"\",\n required: opt.required === true,\n choices: Array.isArray(opt.choices)\n ? [...(opt.choices as { name: string; value: unknown }[])]\n .map((ch) => ({ name: ch.name, value: ch.value }))\n .sort((a, b) => String(a.name).localeCompare(String(b.name)))\n : null,\n options: normaliseOptions(opt.options),\n channel_types: Array.isArray(opt.channel_types)\n ? [...(opt.channel_types as number[])].sort((a, b) => a - b)\n : null,\n min_value: opt.min_value ?? null,\n max_value: opt.max_value ?? null,\n min_length: opt.min_length ?? null,\n max_length: opt.max_length ?? null,\n autocomplete: opt.autocomplete === true,\n };\n })\n .sort((a, b) => String(a.name).localeCompare(String(b.name)));\n}","import type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\n\n/**\n * A spearkit plugin: a named, reusable bundle of commands, events and components.\n * Its {@link setup} runs once when added to a client via `client.use(plugin)`.\n */\nexport interface SpearPlugin {\n readonly name: string;\n setup(client: SpearClient): Awaitable<void>;\n}\n\n/** Identity helper that gives a plugin object its type and editor hints. */\nexport function definePlugin(plugin: SpearPlugin): SpearPlugin {\n return plugin;\n}\n"]}
1
+ {"version":3,"sources":["../src/embeds.ts","../src/lock.ts","../src/safe-fetch.ts","../src/format.ts","../src/cache.ts","../src/config.ts","../src/store.ts","../src/guards.ts","../src/permissions.ts","../src/discord-errors.ts","../src/shutdown.ts","../src/collectors.ts","../src/auto-defer.ts","../src/context.ts","../src/cooldown.ts","../src/context-menus.ts","../src/prefix-args.ts","../src/pagination.ts","../src/confirm.ts","../src/logger.ts","../src/env.ts","../src/scheduler.ts","../src/prefix.ts","../src/usage.ts","../src/commands/options.ts","../src/commands/context.ts","../src/commands/command.ts","../src/commands/registry.ts","../src/events.ts","../src/components/customId.ts","../src/components/context.ts","../src/components/registry.ts","../src/components/builders.ts","../src/components/row.ts","../src/loader.ts","../src/client.ts","../src/plugin.ts"],"names":["resetAt","readFile","keyFor","guard","PermissionsBitField","modal","MessageFlags","command","resolveLabels","button","ButtonStyle","clientEmbeds","row","ActionRowBuilder","ButtonBuilder","ComponentType","mkdir","dirname","readFileSync","task","timer","combineGuards","event","appendFile","resolveOptions","baseJSON","ApplicationCommandType","InteractionContextType","ApplicationCommandOptionType","actorOf","toError","join","Routes"],"mappings":";;;;;;;;;AAyDO,IAAM,oBAAA,GAAoC;AAAA,EAC/C,KAAA,EAAO,QAAA;AAAA,EACP,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM;AACR;AAGO,IAAM,mBAAA,GAAkC;AAAA,EAC7C,KAAA,EAAO,QAAA;AAAA,EACP,OAAA,EAAS,QAAA;AAAA,EACT,IAAA,EAAM,cAAA;AAAA,EACN,IAAA,EAAM;AACR;AAWO,IAAM,SAAN,MAAa;AAAA;AAAA,EAET,MAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,oBAAA,EAAsB,GAAG,QAAQ,MAAA,EAAO;AAC3D,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,mBAAA,EAAqB,GAAG,QAAQ,KAAA,EAAM;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,KAAA,EAAuC;AAC3C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,QAAQ,KAAA,EAAuC;AAC7C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,KAAK,KAAA,EAAuC;AAC1C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,KAAK,KAAA,EAAuC;AAC1C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,KAAA,CAAM,OAAmB,KAAA,EAAuC;AAC9D,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa,CAAE,SAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC7B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA,GAAM,EAAA;AAC9C,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAA,CAAQ,cAAA,CAAe,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAC1C,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,MAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAA,CAAS,MAAM,KAAK,CAAA;AAC3D,IAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,eAAe,CAAA,EAAG,MAAM,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,MAAM,MAAA,KAAW,MAAA,UAAmB,SAAA,CAAU,GAAG,MAAM,MAAM,CAAA;AACjE,IAAA,IAAI,MAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,MAAM,MAAM,CAAA;AAC9D,IAAA,IAAI,MAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,MAAM,MAAM,CAAA;AAC9D,IAAA,IAAI,MAAM,GAAA,KAAQ,MAAA,EAAW,OAAA,CAAQ,MAAA,CAAO,MAAM,GAAG,CAAA;AACrD,IAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,MAAA,OAAA,CAAQ,YAAA;AAAA,QACN,KAAA,CAAM,qBAAqB,IAAA,GAAO,KAAA,CAAM,YAAY,IAAI,IAAA,CAAK,MAAM,SAAS;AAAA,OAC9E;AAAA,IACF;AACA,IAAA,IAAI,MAAM,SAAA,KAAc,MAAA,UAAmB,YAAA,CAAa,KAAA,CAAM,UAAU,GAAG,CAAA;AAC3E,IAAA,IAAI,MAAM,KAAA,KAAU,MAAA,UAAmB,QAAA,CAAS,KAAA,CAAM,MAAM,GAAG,CAAA;AAC/D,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAGO,IAAM,aAAA,GAAgB,IAAI,MAAA;;;ACxG1B,IAAM,YAAN,MAAgB;AAAA,EACJ,OAAA,uBAAc,GAAA,EAAwB;AAAA,EACtC,UAAA;AAAA,EACA,UAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,GAAA,IAAO,GAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AAC/B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,IAAA,CAAK,aAAa,WAAA,CAAY,MAAM,IAAA,CAAK,KAAA,IAAS,KAAK,CAAA;AACvD,MAAA,IAAI,OAAO,IAAA,CAAK,UAAA,CAAW,UAAU,UAAA,EAAY,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,IACzE;AAAA,EACF;AAAA;AAAA,EAGA,UAAA,CAAW,GAAA,EAAa,GAAA,GAAc,IAAA,CAAK,UAAA,EAAgC;AACzE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,QAAA,KAAa,UAAa,IAAA,CAAK,GAAA,KAAQ,QAAA,CAAS,SAAA,GAAY,SAAS,GAAA,EAAK;AAC5E,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,EAAK,EAAE,WAAW,IAAA,CAAK,GAAA,EAAI,EAAG,GAAA,EAAK,CAAA;AACpD,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,IACzB,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,GAAA,EAAsB;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,OAAO,UAAU,MAAA,IAAa,IAAA,CAAK,KAAI,GAAI,KAAA,CAAM,YAAY,KAAA,CAAM,GAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAA,CACJ,GAAA,EACA,EAAA,EACA,OAAA,GAA2D,EAAC,EACpC;AACxB,IAAA,MAAM,UAAU,IAAA,CAAK,UAAA,CAAW,KAAK,OAAA,CAAQ,GAAA,IAAO,KAAK,UAAU,CAAA;AACnE,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,OAAO,QAAQ,MAAA,KAAW,MAAA,GAAY,MAAM,OAAA,CAAQ,QAAO,GAAI,MAAA;AAAA,IACjE;AACA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,EAAW,aAAA,CAAc,KAAK,UAAU,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,OAAO,GAAA,EAAsB;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAA,EAChC;AAAA,EAEQ,KAAA,GAAc;AACpB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,IAAA,CAAK,OAAA,CAAQ,SAAQ,EAAG;AACjD,MAAA,IAAI,GAAA,GAAM,MAAM,SAAA,GAAY,KAAA,CAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,IAChE;AAAA,EACF;AACF;;;ACxFA,IAAM,kBAAA,GAAqB,GAAA;AAE3B,eAAe,WAAA,CAAe,SAAqB,EAAA,EAA+B;AAChF,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AAC7C,MAAA,KAAA,GAAQ,UAAA,CAAW,MAAM,OAAA,CAAQ,IAAI,GAAG,EAAE,CAAA;AAAA,IAC5C,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,CAAQ,MAAM,MAAM,IAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,EAChE,CAAA,SAAE;AACA,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAAA,EAC7C;AACF;AAGA,eAAsB,WAAA,CACpB,KAAA,EACA,MAAA,EACA,OAAA,GAA4B,EAAC,EACA;AAC7B,EAAA,IAAI,SAAS,IAAA,IAAQ,MAAA,IAAU,QAAQ,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,IAAA;AACnE,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,KAAA,IAAS,OAAA,CAAQ,UAAU,IAAA,EAAM;AACrD,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,MAAM,CAAA;AAC7C,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAAA,EACnC;AACA,EAAA,OAAO,WAAA;AAAA,IACL,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,KAAA,EAAO,CAAA;AAAA,IACnE,QAAQ,SAAA,IAAa;AAAA,GACvB;AACF;AAGA,eAAsB,YAAA,CACpB,MAAA,EACA,SAAA,EACA,OAAA,GAA4B,EAAC,EACJ;AACzB,EAAA,IAAI,UAAU,IAAA,IAAQ,SAAA,IAAa,QAAQ,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,IAAA;AAC1E,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,KAAA,IAAS,OAAA,CAAQ,UAAU,IAAA,EAAM;AACrD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,IAAI,SAAS,CAAA;AAClD,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAAA,EACnC;AACA,EAAA,OAAO,WAAA;AAAA,IACL,MAAA,CAAO,SAAS,KAAA,CAAM,SAAA,EAAW,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,KAAA,EAAO,CAAA;AAAA,IAClE,QAAQ,SAAA,IAAa;AAAA,GACvB;AACF;AAGA,eAAsB,YAAA,CACpB,QAAA,EACA,SAAA,EACA,OAAA,GAA4B,EAAC,EACJ;AACzB,EAAA,IAAI,YAAY,IAAA,IAAQ,SAAA,IAAa,QAAQ,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,IAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,KAAA,IAAS,OAAA,CAAQ,UAAU,IAAA,EAAM;AACrD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAAA,EACnC;AACA,EAAA,OAAO,WAAA;AAAA,IACL,QAAA,CAAS,MAAM,EAAE,OAAA,EAAS,WAAW,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,KAAA,EAAO,CAAA;AAAA,IACpE,QAAQ,SAAA,IAAa;AAAA,GACvB;AACF;AAGA,eAAsB,SAAA,CACpB,MAAA,EACA,MAAA,EACA,OAAA,GAA4B,EAAC,EACP;AACtB,EAAA,IAAI,UAAU,IAAA,IAAQ,MAAA,IAAU,QAAQ,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,IAAA;AACpE,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,KAAA,IAAS,OAAA,CAAQ,UAAU,IAAA,EAAM;AACrD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,IAAI,MAAM,CAAA;AAC5C,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAAA,EACnC;AACA,EAAA,OAAO,WAAA;AAAA,IACL,MAAA,CAAO,MAAM,KAAA,CAAM,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,KAAA,EAAO,CAAA;AAAA,IAC5D,QAAQ,SAAA,IAAa;AAAA,GACvB;AACF;AAGA,eAAsB,UAAA,CACpB,MAAA,EACA,OAAA,EACA,OAAA,GAA4B,EAAC,EACN;AACvB,EAAA,IAAI,UAAU,IAAA,IAAQ,OAAA,IAAW,QAAQ,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,IAAA;AACtE,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,KAAA,IAAS,OAAA,CAAQ,UAAU,IAAA,EAAM;AACrD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,IAAI,OAAO,CAAA;AAC9C,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAAA,EACnC;AACA,EAAA,OAAO,WAAA;AAAA,IACL,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,EAAE,KAAA,EAAO,SAAS,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,KAAA,EAAO,CAAA;AAAA,IACrE,QAAQ,SAAA,IAAa;AAAA,GACvB;AACF;AAGA,eAAsB,SAAA,CACpB,KAAA,EACA,MAAA,EACA,OAAA,GAA4B,EAAC,EACP;AACtB,EAAA,IAAI,SAAS,IAAA,IAAQ,MAAA,IAAU,QAAQ,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,IAAA;AACnE,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,KAAA,IAAS,OAAA,CAAQ,UAAU,IAAA,EAAM;AACrD,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,IAAI,MAAM,CAAA;AAC3C,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAAA,EACnC;AACA,EAAA,OAAO,WAAA;AAAA,IACL,KAAA,CAAM,MAAM,KAAA,CAAM,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,KAAA,EAAO,CAAA;AAAA,IAC3D,QAAQ,SAAA,IAAa;AAAA,GACvB;AACF;AAWA,eAAsB,QAAW,EAAA,EAA6C;AAC5E,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,EAAA,EAAG;AAAA,EAClB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGA,eAAsB,eAAA,CACpB,SACA,SAAA,EACmB;AACnB,EAAA,OAAO,WAAA,CAAY,SAAS,SAAS,CAAA;AACvC;AAGO,IAAM,SAAA,GAAY;AAAA,EACvB,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK;AACP;;;AC3JA,IAAM,EAAA,GAAiB;AAAA,EACrB,IAAA,EAAM,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,EACtB,GAAA,EAAK,CAAC,KAAA,EAAO,MAAM,CAAA;AAAA,EACnB,IAAA,EAAM,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,EACtB,MAAA,EAAQ,CAAC,QAAA,EAAU,SAAS,CAAA;AAAA,EAC5B,MAAA,EAAQ,CAAC,QAAA,EAAU,SAAS,CAAA;AAAA,EAC5B,SAAA,EAAW,GAAA;AAAA,EACX,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,EAAA,GAAiB;AAAA,EACrB,IAAA,EAAM,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,EACvB,GAAA,EAAK,CAAC,QAAA,EAAO,QAAK,CAAA;AAAA,EAClB,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,EACrB,MAAA,EAAQ,CAAC,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC3B,MAAA,EAAQ,CAAC,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC3B,SAAA,EAAW,GAAA;AAAA,EACX,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,MAAA,GAAqC;AAAA,EACzC,EAAA,EAAI,EAAA;AAAA,EACJ,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,EAAA,EAAI,EAAA;AAAA,EACJ,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,OAAA,GAAwC;AAAA,EAC5C,MAAM,CAAA,GAAI,KAAA;AAAA,EACV,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,aAA6B,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAY7E,SAAS,cAAc,MAAA,EAAqD;AAC1E,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,MAAM,OAAO,MAAA;AAC1D,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,EAAA;AACjC,EAAA,OAAO,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAE,CAAA,IAAK,EAAA;AACjE;AAYO,SAAS,cAAA,CAAe,EAAA,EAAY,OAAA,GAAiC,EAAC,EAAW;AACtF,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,EAAE,KAAK,EAAA,IAAM,CAAA,SAAU,MAAA,CAAO,IAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,IAAW,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,UAAA;AAC/B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAC7B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AAC3B,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,IAAA,IAAI,YAAY,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAI,CAAA;AACzC,IAAA,SAAA,IAAa,KAAA,GAAQ,IAAA;AACrB,IAAA,MAAM,IAAA,GAAO,KAAA,KAAU,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA,CAAE,CAAC,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA,CAAE,CAAC,CAAA;AAC3D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,CAAM,KAAK,MAAA,CAAO,SAAS,IAAI,MAAA,CAAO,IAAA;AAClE;AAEA,IAAM,gBAAA,GAAmB,4KAAA;AACzB,IAAM,WAAA,GAAsC;AAAA,EAC1C,EAAA,EAAI,CAAA;AAAA,EACJ,WAAA,EAAa,CAAA;AAAA,EACb,YAAA,EAAc,CAAA;AAAA,EACd,CAAA,EAAG,GAAA;AAAA,EACH,GAAA,EAAK,GAAA;AAAA,EACL,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ,GAAA;AAAA,EACR,CAAA,EAAG,GAAA;AAAA,EACH,GAAA,EAAK,GAAA;AAAA,EACL,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ,GAAA;AAAA,EACR,EAAA,EAAI,GAAA;AAAA,EACJ,CAAA,EAAG,IAAA;AAAA,EACH,EAAA,EAAI,IAAA;AAAA,EACJ,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,IAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,CAAA,EAAG,KAAA;AAAA,EACH,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,KAAA;AAAA,EACN,QAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,CAAA,EAAG,MAAA;AAAA,EACH,EAAA,EAAI,MAAA;AAAA,EACJ,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAaO,SAAS,cAAc,KAAA,EAA8B;AAC1D,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACzC,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,gBAAA,CAAiB,SAAA,GAAY,CAAA;AAC7B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,WAAS;AACP,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,IAAI,UAAU,IAAA,EAAM;AACpB,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,IAAA,MAAM,EAAA,GAAK,YAAY,IAAI,CAAA;AAC3B,IAAA,IAAI,OAAO,MAAA,IAAa,MAAA,CAAO,SAAS,KAAK,CAAA,WAAY,KAAA,GAAQ,EAAA;AAAA,EACnE;AACA,EAAA,OAAO,UAAU,KAAA,GAAQ,IAAA;AAC3B;AAEA,SAAS,eAAe,IAAA,EAA6B;AACnD,EAAA,OAAO,IAAA,CAAK,OAAO,IAAA,YAAgB,IAAA,GAAO,KAAK,OAAA,EAAQ,GAAI,QAAQ,GAAI,CAAA;AACzE;AAeO,SAAS,gBAAA,CAAiB,IAAA,EAAqB,KAAA,GAA+B,GAAA,EAAa;AAChG,EAAA,OAAO,CAAA,GAAA,EAAM,cAAA,CAAe,IAAI,CAAC,IAAI,KAAK,CAAA,CAAA,CAAA;AAC5C;AAGO,SAAS,kBAAkB,IAAA,EAA6B;AAC7D,EAAA,OAAO,gBAAA,CAAiB,MAAM,GAAG,CAAA;AACnC;AAGO,IAAM,uBAAA,GAA0B;AAWhC,SAAS,QAAA,CAAS,IAAA,EAAc,GAAA,EAAa,MAAA,GAAS,QAAA,EAAa;AACxE,EAAA,IAAI,GAAA,IAAO,GAAG,OAAO,EAAA;AACrB,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,GAAA,EAAK,OAAO,IAAA;AAC/B,EAAA,IAAI,OAAO,MAAA,IAAU,GAAA,SAAY,MAAA,CAAO,KAAA,CAAM,GAAG,GAAG,CAAA;AACpD,EAAA,OAAO,KAAK,KAAA,CAAM,CAAA,EAAG,GAAA,GAAM,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA;AAC9C;AAQA,SAAS,SAAA,CAAU,MAAc,GAAA,EAAuB;AACtD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,OAAO,IAAA,CAAK,SAAS,GAAA,EAAK;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,GAAG,CAAA;AACvC,IAAA,MAAM,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAM,GAAA,GAAM,CAAC,IAAI,KAAA,GAAQ,GAAA;AAClD,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3B,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,KAAK,IAAI,CAAA;AAClC,EAAA,OAAO,GAAA;AACT;AAYO,SAAS,YAAA,CAAa,IAAA,EAAc,OAAA,GAAwB,EAAC,EAAa;AAC/E,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,uBAAA;AAC3B,EAAA,IAAI,GAAA,IAAO,CAAA,EAAG,MAAM,IAAI,WAAW,6CAA6C,CAAA;AAChF,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAC/B,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,GAAA,EAAK,OAAO,CAAC,IAAI,CAAA;AAEpC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,MAAM,QAAQ,MAAY;AACxB,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAA,GAAU,EAAA;AAAA,IACZ;AAAA,EACF,CAAA;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,IAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA,KAAA,EAAM;AACN,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,EAAM,GAAG,CAAA;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAW,CAAA;AAC3E,MAAA,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAClC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,GAAG,OAAO;AAAA,EAAK,IAAI,CAAA,CAAA,GAAK,IAAA;AAC/D,IAAA,IAAI,SAAA,CAAU,SAAS,GAAA,EAAK;AAC1B,MAAA,KAAA,EAAM;AACN,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,SAAA;AAAA,IACZ;AAAA,EACF;AACA,EAAA,KAAA,EAAM;AACN,EAAA,OAAO,MAAA;AACT;;;AC9NO,IAAM,cAAN,MAAwC;AAAA,EAC5B,KAAA,uBAAY,GAAA,EAA4B;AAAA;AAAA,EAGzD,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AAAA,EAEA,MAAM,IAAiB,GAAA,EAAqC;AAC1D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAChC,IAAA,IAAI,MAAM,SAAA,KAAc,MAAA,IAAa,MAAM,SAAA,IAAa,IAAA,CAAK,KAAI,EAAG;AAClE,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AAAA,EAEA,MAAM,GAAA,CAAO,GAAA,EAAa,KAAA,EAAU,OAAA,EAA0C;AAC5E,IAAA,MAAM,MAAM,OAAA,EAAS,GAAA;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,GAAA,EAAK;AAAA,MAClB,KAAA;AAAA,MACA,SAAA,EAAW,QAAQ,MAAA,IAAa,GAAA,GAAM,IAAI,IAAA,CAAK,GAAA,KAAQ,GAAA,GAAM;AAAA,KAC9D,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,OAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,KAAO,MAAA;AAAA,EACnC;AAAA,EAEA,MAAM,SAAA,CAAU,GAAA,EAAa,KAAA,GAAgB,GAAG,OAAA,EAA4C;AAC1F,IAAA,MAAM,OAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAY,GAAG,CAAA,IAAM,CAAA;AACjD,IAAA,MAAM,OAAO,OAAA,GAAU,KAAA;AACvB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAEnC,IAAA,MAAM,MAAM,OAAA,EAAS,GAAA;AACrB,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,GAAM,CAAA,EAAG;AAChC,MAAA,MAAM,KAAK,GAAA,CAAI,GAAA,EAAK,IAAA,EAAM,EAAE,KAAK,CAAA;AAAA,IACnC,CAAA,MAAA,IAAW,QAAA,EAAU,SAAA,KAAc,MAAA,EAAW;AAC5C,MAAA,IAAA,CAAK,KAAA,CAAM,IAAI,GAAA,EAAK,EAAE,OAAO,IAAA,EAAM,SAAA,EAAW,QAAA,CAAS,SAAA,EAAW,CAAA;AAAA,IACpE,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,CAAU,GAAA,EAAa,OAAA,EAAwE;AACnG,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAA,GAAY,UAAU,GAAG,CAAA,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACtC,IAAA,MAAM,UAAU,KAAA,KAAU,MAAA,IAAa,MAAM,SAAA,KAAc,MAAA,IAAa,MAAM,SAAA,IAAa,GAAA;AAC3F,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAMA,QAAAA,GAAU,MAAM,OAAA,CAAQ,QAAA;AAC9B,MAAA,IAAA,CAAK,KAAA,CAAM,IAAI,SAAA,EAAW,EAAE,OAAO,CAAA,EAAG,SAAA,EAAWA,UAAS,CAAA;AAC1D,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,EAAG,OAAA,EAAAA,QAAAA,EAAQ;AAAA,IAC7E;AACA,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,IAAa,GAAA;AACnC,IAAA,IAAI,KAAA,IAAS,QAAQ,KAAA,EAAO;AAC1B,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,GAAG,OAAA,EAAQ;AAAA,IACjD;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,SAAA,EAAW,EAAE,OAAO,KAAA,GAAQ,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,CAAA;AAClE,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,KAAA,GAAQ,KAAA,GAAQ,CAAC,CAAA,EAAG,OAAA,EAAQ;AAAA,EACrF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AACF;AAGO,SAAS,WAAA,GAA0B;AACxC,EAAA,OAAO,IAAI,WAAA,EAAY;AACzB;ACrHA,IAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAejC,SAAS,WAAwB,OAAA,EAAkC;AACxE,EAAA,MAAM,OAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,YAAY,MAAM,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,KAAA;AACtC,EAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,EAAA,OAAO,QAAQ,MAAA,KAAW,MAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,GAAK,MAAA;AAClE;AAGA,eAAsB,gBAA6B,OAAA,EAA2C;AAC5F,EAAA,MAAM,OAAO,MAAM,aAAA,CAAc,QAAQ,IAAA,EAAM,OAAA,CAAQ,YAAY,MAAM,CAAA;AACzE,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,KAAA;AACtC,EAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,EAAA,OAAO,QAAQ,MAAA,KAAW,MAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,GAAK,MAAA;AAClE;AAYO,SAAS,MAAA,CACd,KAAA,EACA,YAAA,GAAuB,KAAA,EACR;AACf,EAAA,OAAO,CAAC,GAAA,KAAQ;AACd,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAG,CAAA;AACvB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,MAAM,CAAA,UAAA,EAAa,YAAY,KAAK,MAAA,CAAO,GAAG,CAAC,CAAA,qBAAA,CAAuB,CAAA;AAAA,IAClF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACF;AAGO,SAAS,eACd,KAAA,EAC2B;AAC3B,EAAA,OAAO,CAAC,GAAA,KAAQ,KAAA,CAAM,GAAG,CAAA;AAC3B;AC1BA,SAAS,MAAS,KAAA,EAAa;AAC7B,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,KAAA;AAClD,EAAA,IAAI,OAAO,eAAA,KAAoB,UAAA,EAAY,OAAO,gBAAgB,KAAK,CAAA;AACvE,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC;AAOO,IAAM,cAAN,MAA2C;AAAA,EAC/B,GAAA,uBAAU,GAAA,EAAqB;AAAA,EAEhD,MAAM,IAAO,GAAA,EAAqC;AAChD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAM,CAAA,GAAI,MAAA;AAAA,EAC7D;AAAA,EACA,MAAM,GAAA,CAAO,GAAA,EAAa,KAAA,EAAyB;AACjD,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAChC;AAAA,EACA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAAA,EACzB;AAAA,EACA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAAA,EAC5B;AAAA,EACA,MAAM,IAAA,GAA0B;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAAA,EAC5B;AAAA,EACA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AAAA,EACjB;AACF;AAQO,IAAM,YAAN,MAAyC;AAAA,EAK9C,YAA6B,IAAA,EAAc;AAAd,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAe;AAAA,EAAf,IAAA;AAAA,EAJZ,KAAA,uBAAY,GAAA,EAAqB;AAAA,EAC1C,OAAA;AAAA,EACA,UAAA,GAA4B,QAAQ,OAAA,EAAQ;AAAA,EAI5C,YAAA,GAA8B;AACpC,IAAA,IAAI,KAAK,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,OAAA,GAAU,KAAK,IAAA,EAAK;AACzD,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,MAAc,IAAA,GAAsB;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAMC,UAAAA,CAAS,IAAA,CAAK,MAAM,MAAM,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IAC9E,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,IAAA,KAAS,QAAA,EAAU,MAAM,KAAA;AAAA,IAChE;AAAA,EACF;AAAA;AAAA,EAGQ,OAAA,GAAyB;AAC/B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,YAAY;AACjD,MAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,MAAA,CAAO,YAAY,IAAA,CAAK,KAAK,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA;AACnE,MAAA,MAAM,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,IAAA,CAAA;AACrD,MAAA,MAAM,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,MAAM,CAAA;AACjC,MAAA,MAAM,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,MAAM,IAAO,GAAA,EAAqC;AAChD,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAM,CAAA,GAAI,MAAA;AAAA,EACjE;AAAA,EACA,MAAM,GAAA,CAAO,GAAA,EAAa,KAAA,EAAyB;AACjD,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAChC,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACrB;AAAA,EACA,MAAM,IAAI,GAAA,EAA+B;AACvC,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC3B;AAAA,EACA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AACrC,IAAA,IAAI,OAAA,EAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAChC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EACA,MAAM,IAAA,GAA0B;AAC9B,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,EAC9B;AAAA,EACA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACrB;AACF;AAMO,SAAS,UAAA,CAAW,OAAsB,MAAA,EAA+B;AAC9E,EAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA,CAAA,CAAA;AACrB,EAAA,OAAO;AAAA,IACL,KAAK,CAAC,GAAA,KAAQ,KAAA,CAAM,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IACjC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAA,KAAU,MAAM,GAAA,CAAI,GAAA,GAAM,KAAK,KAAK,CAAA;AAAA,IAC/C,KAAK,CAAC,GAAA,KAAQ,KAAA,CAAM,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IACjC,QAAQ,CAAC,GAAA,KAAQ,KAAA,CAAM,MAAA,CAAO,MAAM,GAAG,CAAA;AAAA,IACvC,MAAM,IAAA,GAAO;AACX,MAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,IAAA,IAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IAC7F,CAAA;AAAA,IACA,MAAM,KAAA,GAAQ;AACZ,MAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,CAAK,IAAA,IAAQ,MAAM,KAAA,CAAM,MAAA,CAAO,GAAA,GAAM,GAAG,CAAA;AAAA,IACnE;AAAA,GACF;AACF;AA+BO,SAAS,eACd,OAAA,EACoB;AACpB,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,OAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,QAAQ,SAAA,IAAa,UAAA;AAChC,EAAA,MAAMC,UAAS,CAAC,EAAA,KAAuB,CAAA,EAAG,EAAE,IAAI,EAAE,CAAA,CAAA;AAClD,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAM,IAAI,EAAA,EAAI;AACZ,MAAA,MAAM,SAAS,MAAM,KAAA,CAAM,GAAA,CAAgBA,OAAAA,CAAO,EAAE,CAAC,CAAA;AACrD,MAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAI,MAAA,IAAU,EAAC,EAAG;AAAA,IAC1C,CAAA;AAAA,IACA,MAAM,GAAA,CAAI,EAAA,EAAI,KAAA,EAAO;AACnB,MAAA,MAAM,MAAA,GAAU,MAAM,KAAA,CAAM,GAAA,CAAgBA,QAAO,EAAE,CAAC,KAAM,EAAC;AAC7D,MAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,GAAG,KAAA,EAAM;AACrC,MAAA,MAAM,KAAA,CAAM,GAAA,CAAIA,OAAAA,CAAO,EAAE,GAAG,MAAM,CAAA;AAClC,MAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,MAAA,EAAO;AAAA,IAClC,CAAA;AAAA,IACA,MAAM,MAAM,EAAA,EAAI;AACd,MAAA,MAAM,KAAA,CAAM,MAAA,CAAOA,OAAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IAC/B;AAAA,GACF;AACF;AChLO,SAAS,OAAO,MAAA,EAA8B;AACnD,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AAClC;AAMA,eAAsB,SAAA,CACpB,KACA,MAAA,EAC0B;AAC1B,EAAA,IAAI,MAAA,KAAW,UAAa,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,EAAE,SAAS,IAAA,EAAK;AACxE,EAAA,KAAA,MAAWC,UAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAMA,MAAAA,CAAM,GAAG,CAAA;AAC9B,IAAA,IAAI,WAAW,IAAA,EAAM;AACrB,IAAA,IAAI,WAAW,KAAA,EAAO,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,QAAQ,MAAA,EAAU;AACjE,IAAA,IAAI,MAAA,CAAO,YAAY,KAAA,EAAO,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO;AAAA,EAC/E;AACA,EAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AACzB;AAKO,SAAS,SAAA,CAAU,SAAiB,oCAAA,EAA6C;AACtF,EAAA,OAAO,CAAC,GAAA,KAAS,GAAA,CAAI,YAAY,IAAA,GAAO,IAAA,GAAO,OAAO,MAAM,CAAA;AAC9D;AAGO,SAAS,MAAA,CAAO,SAAiB,+BAAA,EAAwC;AAC9E,EAAA,OAAO,CAAC,GAAA,KAAS,GAAA,CAAI,YAAY,IAAA,GAAO,IAAA,GAAO,OAAO,MAAM,CAAA;AAC9D;AAEA,SAAS,cAAc,MAAA,EAAkE;AACvF,EAAA,IAAI,MAAA,KAAW,IAAA,EAAM,OAAO,EAAC;AAC7B,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAC/B;AAEA,SAAS,0BACP,MAAA,EAC4B;AAC5B,EAAA,IAAI,MAAA,KAAW,MAAM,OAAO,IAAA;AAC5B,EAAA,MAAM,QAAQ,MAAA,CAAO,WAAA;AACrB,EAAA,IAAI,KAAA,YAAiB,qBAAqB,OAAO,KAAA;AACjD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,IAAI,mBAAA,CAAoB,MAAA,CAAO,KAAK,CAAC,CAAA;AAC3E,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,cAAA,CACd,OAAA,EACA,MAAA,GAAiB,wCAAA,EACV;AACP,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAO,CAAA;AAC3B,EAAA,OAAO,CAAC,GAAA,KAAQ;AACd,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AACpC,IAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,EAAA,KAAO,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC,CAAA,GAAI,IAAA,GAAO,MAAA,CAAO,MAAM,CAAA;AAAA,EAC7D,CAAA;AACF;AAGO,SAAS,eAAA,CACd,OAAA,EACA,MAAA,GAAiB,2CAAA,EACV;AACP,EAAA,OAAO,CAAC,GAAA,KAAQ;AACd,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,MAAM,CAAC,CAAA;AAC7C,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAA,KAAO,GAAA,CAAI,GAAA,CAAI,EAAE,CAAC,CAAA,GAAI,IAAA,GAAO,MAAA,CAAO,MAAM,CAAA;AAAA,EAClE,CAAA;AACF;AAGO,SAAS,YAAA,CACd,QAAA,EACA,MAAA,GAAiB,qBAAA,EACV;AACP,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC5B,EAAA,OAAO,CAAC,GAAA,KAAS,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,KAAK,EAAE,CAAA,GAAI,IAAA,GAAO,MAAA,CAAO,MAAM,CAAA;AAC9D;AAGO,SAAS,sBAAA,CACd,UAAA,EACA,MAAA,GAAiB,wCAAA,EACV;AACP,EAAA,OAAO,CAAC,GAAA,KAAQ;AACd,IAAA,MAAM,IAAA,GAAO,yBAAA,CAA0B,GAAA,CAAI,MAAM,CAAA;AACjD,IAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,MAAA,CAAO,MAAM,CAAA;AACvC,IAAA,OAAO,KAAK,GAAA,CAAI,UAAU,CAAA,GAAI,IAAA,GAAO,OAAO,MAAM,CAAA;AAAA,EACpD,CAAA;AACF;AAGO,SAAS,qBAAA,CACd,UAAA,EACA,MAAA,GAAiB,0CAAA,EACV;AACP,EAAA,OAAO,OAAO,GAAA,KAAQ;AACpB,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,IAAA,IAAI,KAAA,KAAU,IAAA,EAAM,OAAO,MAAA,CAAO,MAAM,CAAA;AACxC,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,CAAQ,EAAA,IAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9E,IAAA,IAAI,EAAA,KAAO,IAAA,EAAM,OAAO,MAAA,CAAO,MAAM,CAAA;AACrC,IAAA,OAAO,GAAG,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA,GAAI,IAAA,GAAO,OAAO,MAAM,CAAA;AAAA,EAC9D,CAAA;AACF;AAGO,SAAS,MAAgD,SAAA,EAAqC;AACnG,EAAA,OAAO,SAAA;AACT;ACrHO,SAAS,kBAAA,CACd,OAAA,EACA,GAAA,EACA,QAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,cAAA,CAAe,GAAG,CAAA;AACvC,EAAA,IAAI,SAAS,IAAA,EAAM,OAAO,IAAIC,mBAAAA,CAAoB,QAAQ,EAAE,OAAA,EAAQ;AACpE,EAAA,OAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAC9B;AAOO,SAAS,qBAAA,CACd,SACA,QAAA,EACqB;AACrB,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,EAAA;AACjC,EAAA,IAAI,OAAO,IAAA,EAAM,OAAO,IAAIA,mBAAAA,CAAoB,QAAQ,EAAE,OAAA,EAAQ;AAClE,EAAA,OAAO,kBAAA,CAAmB,OAAA,EAAS,EAAA,EAAI,QAAQ,CAAA;AACjD;AAGO,SAAS,cAAA,CACd,OAAA,EACA,GAAA,EACA,QAAA,EACS;AACT,EAAA,OAAO,kBAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,QAAQ,EAAE,MAAA,KAAW,CAAA;AAC/D;AAOO,SAAS,YAAA,CAAa,GAAgB,CAAA,EAAwB;AACnE,EAAA,OAAO,EAAE,KAAA,CAAM,OAAA,CAAQ,iBAAA,CAAkB,CAAA,CAAE,MAAM,OAAO,CAAA;AAC1D;AAOO,SAAS,QAAA,CAAS,OAAoB,MAAA,EAA8B;AACzE,EAAA,IAAI,KAAA,CAAM,EAAA,KAAO,MAAA,CAAO,EAAA,EAAI,OAAO,KAAA;AACnC,EAAA,IAAI,MAAA,CAAO,EAAA,KAAO,MAAA,CAAO,KAAA,CAAM,SAAS,OAAO,KAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,EAAA,KAAO,KAAA,CAAM,KAAA,CAAM,SAAS,OAAO,IAAA;AAC7C,EAAA,OAAO,YAAA,CAAa,KAAA,EAAO,MAAM,CAAA,GAAI,CAAA;AACvC;AA0BO,SAAS,gBAAgB,OAAA,EAAwD;AACtF,EAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,OAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,UAAA;AACjC,EAAA,MAAM,EAAA,GAAK,QAAQ,EAAA,KAAO,MAAA,GAAY,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,OAAA,CAAQ,EAAA;AACxE,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,QAAA;AAEzB,EAAA,IAAI,SAAA,CAAU,EAAA,KAAO,MAAA,CAAO,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAM,CAAA,UAAA,CAAA,EAAa;AAC5F,EAAA,IAAI,MAAA,CAAO,EAAA,KAAO,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS;AACtC,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAM,CAAA,kBAAA,CAAA,EAAqB;AAAA,EACtE;AACA,EAAA,IAAI,SAAA,CAAU,OAAO,SAAA,CAAU,KAAA,CAAM,WAAW,YAAA,CAAa,SAAA,EAAW,MAAM,CAAA,IAAK,CAAA,EAAG;AACpF,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,wDAAA;AAAA,KACvC;AAAA,EACF;AACA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,IAAI,EAAA,CAAG,EAAA,KAAO,MAAA,CAAO,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,QAAA,EAAW,MAAM,CAAA,QAAA,CAAA,EAAW;AACjF,IAAA,IAAI,EAAA,CAAG,OAAO,EAAA,CAAG,KAAA,CAAM,WAAW,YAAA,CAAa,EAAA,EAAI,MAAM,CAAA,IAAK,CAAA,EAAG;AAC/D,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,MAAA,EAAQ,CAAA,QAAA,EAAW,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,kDAAA;AAAA,OACrC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AACpB;AAEA,IAAM,iBAAA,GAAgE;AAAA,EACpE,mBAAA,EAAqB,eAAA;AAAA,EACrB,WAAA,EAAa,cAAA;AAAA,EACb,UAAA,EAAY,aAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA,EACf,cAAA,EAAgB,iBAAA;AAAA,EAChB,WAAA,EAAa,eAAA;AAAA,EACb,YAAA,EAAc,eAAA;AAAA,EACd,YAAA,EAAc,gBAAA;AAAA,EACd,eAAA,EAAiB,kBAAA;AAAA,EACjB,MAAA,EAAQ,OAAA;AAAA,EACR,WAAA,EAAa,cAAA;AAAA,EACb,YAAA,EAAc,eAAA;AAAA,EACd,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,iBAAA;AAAA,EAChB,UAAA,EAAY,aAAA;AAAA,EACZ,WAAA,EAAa,cAAA;AAAA,EACb,kBAAA,EAAoB,sBAAA;AAAA,EACpB,eAAA,EAAiB,kBAAA;AAAA,EACjB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,iBAAA,EAAmB,sBAAA;AAAA,EACnB,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,WAAA,EAAa,cAAA;AAAA,EACb,aAAA,EAAe,gBAAA;AAAA,EACf,WAAA,EAAa,cAAA;AAAA,EACb,MAAA,EAAQ,oBAAA;AAAA,EACR,cAAA,EAAgB,iBAAA;AAAA,EAChB,eAAA,EAAiB,kBAAA;AAAA,EACjB,WAAA,EAAa,cAAA;AAAA,EACb,cAAA,EAAgB,iBAAA;AAAA,EAChB,sBAAA,EAAwB,oBAAA;AAAA,EACxB,sBAAA,EAAwB,0BAAA;AAAA,EACxB,cAAA,EAAgB,kBAAA;AAAA,EAChB,YAAA,EAAc,eAAA;AAAA,EACd,aAAA,EAAe,gBAAA;AAAA,EACf,mBAAA,EAAqB,uBAAA;AAAA,EACrB,oBAAA,EAAsB,wBAAA;AAAA,EACtB,mBAAA,EAAqB,uBAAA;AAAA,EACrB,qBAAA,EAAuB,0BAAA;AAAA,EACvB,qBAAA,EAAuB,gBAAA;AAAA,EACvB,eAAA,EAAiB;AACnB,CAAA;AAaO,SAAS,kBAAkB,WAAA,EAA2C;AAC3E,EAAA,MAAM,KAAA,GAAQ,IAAIA,mBAAAA,CAAoB,WAAW,EAAE,OAAA,EAAQ;AAC3D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAC/B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAA,CAAkB,IAAI,CAAA,IAAK,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACvE;AC9KO,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAE9B,gBAAgB,kBAAA,CAAmB,cAAA;AAAA;AAAA;AAAA,EAEnC,cAAc,kBAAA,CAAmB,YAAA;AAAA;AAAA;AAAA,EAEjC,eAAe,kBAAA,CAAmB,aAAA;AAAA;AAAA;AAAA,EAElC,gBAAgB,kBAAA,CAAmB,cAAA;AAAA;AAAA;AAAA,EAEnC,aAAa,kBAAA,CAAmB,WAAA;AAAA;AAAA;AAAA,EAEhC,oBAAoB,kBAAA,CAAmB,kBAAA;AAAA;AAAA;AAAA,EAEvC,eAAe,kBAAA,CAAmB,aAAA;AAAA;AAAA;AAAA,EAElC,gCAAgC,kBAAA,CAAmB,8BAAA;AAAA;AAAA;AAAA,EAEnD,8BAA8B,kBAAA,CAAmB,4BAAA;AAAA;AAAA;AAAA,EAEjD,oBAAoB,kBAAA,CAAmB,kBAAA;AAAA;AAAA;AAAA,EAEvC,8BACE,kBAAA,CAAmB,4BAAA;AAAA;AAAA;AAAA,EAErB,uCACE,kBAAA,CAAmB,qCAAA;AAAA;AAAA;AAAA,EAErB,8BAA8B,kBAAA,CAAmB,4BAAA;AAAA;AAAA;AAAA,EAEjD,iCACE,kBAAA,CAAmB;AAAA;AACvB;AAgBO,SAAS,cAAA,CACd,OACA,IAAA,EAC0B;AAC1B,EAAA,IAAI,EAAE,KAAA,YAAiB,eAAA,CAAA,EAAkB,OAAO,KAAA;AAChD,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAC/B,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,IAAI,CAAA;AAChD,EAAA,OAAO,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAClC;AAMO,SAAS,YAAY,KAAA,EAAoC;AAC9D,EAAA,OAAO,KAAA,YAAiB,SAAA;AAC1B;AAGO,SAAS,iBAAiB,KAAA,EAAyB;AACxD,EAAA,OAAO,KAAA,YAAiB,eAAA,IAAmB,KAAA,CAAM,MAAA,KAAW,GAAA;AAC9D;AAEA,IAAM,QAAA,GAA4C;AAAA,EAChD,CAAC,gBAAA,CAAiB,cAAc,GAAG,gCAAA;AAAA,EACnC,CAAC,gBAAA,CAAiB,cAAc,GAAG,gCAAA;AAAA,EACnC,CAAC,gBAAA,CAAiB,aAAa,GAAG,mCAAA;AAAA,EAClC,CAAC,gBAAA,CAAiB,WAAW,GAAG,4BAAA;AAAA,EAChC,CAAC,gBAAA,CAAiB,kBAAkB,GAClC,4DAAA;AAAA,EACF,CAAC,gBAAA,CAAiB,qCAAqC,GACrD,4DAAA;AAAA,EACF,CAAC,gBAAA,CAAiB,aAAa,GAAG,sCAAA;AAAA,EAClC,CAAC,gBAAA,CAAiB,4BAA4B,GAC5C,yDAAA;AAAA,EACF,CAAC,gBAAA,CAAiB,8BAA8B,GAC9C,6BAAA;AAAA,EACF,CAAC,gBAAA,CAAiB,kBAAkB,GAClC;AACJ,CAAA;AAYO,SAAS,oBAAoB,KAAA,EAA+B;AACjE,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,uEAAA;AAAA,EACT;AACA,EAAA,IAAI,EAAE,KAAA,YAAiB,eAAA,CAAA,EAAkB,OAAO,IAAA;AAChD,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAAA,EAClC;AACA,EAAA,OAAO,IAAA;AACT;;;AC1FO,SAAS,gBAAA,CACd,MAAA,EACA,OAAA,GAAmC,EAAC,EACxB;AACZ,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAY,CAAC,UAAU,SAAS,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACvC,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,IAAA;AAC7B,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,CAAC,MAAA,KAAiC;AAChD,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,OAAA,CAAQ,MAAA,EAAQ,IAAA,GAAO,CAAA,SAAA,EAAY,MAAM,CAAA,eAAA,CAAiB,CAAA;AAC1D,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,OAAA,CAAQ,MAAA,EAAQ,QAAQ,wCAAmC,CAAA;AAC3D,MAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,IAC1B,GAAG,SAAS,CAAA;AACZ,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,UAAA,QAAkB,KAAA,EAAM;AACnD,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,CAAQ,aAAa,MAAM,CAAA;AACjC,QAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAA,CAAQ,MAAA,EAAQ,OAAO,mBAAmB,CAAA;AAC1C,QAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,MAC1B,SAAS,KAAA,EAAO;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAA,CAAQ,MAAA,EAAQ,KAAA,GAAQ,iBAAA,EAAmB,KAAK,CAAA;AAChD,QAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,GAAG;AAAA,EACL,CAAA;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAA,EAAS,OAAA,CAAQ,EAAA,CAAG,QAAQ,OAAO,CAAA;AACxD,EAAA,OAAO,MAAM;AACX,IAAA,KAAA,MAAW,MAAA,IAAU,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,QAAQ,OAAO,CAAA;AAAA,EAC3D,CAAA;AACF;;;ACjCA,eAAsB,YAAA,CACpB,OAAA,EACA,OAAA,GAA+B,EAAC,EACP;AACzB,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,GAAO,GAAA,EAAO,GAAI,OAAA;AAClC,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,aAAA,CAAc;AAAA,MAC5C,MAAA;AAAA,MACA,GAAA,EAAK,CAAA;AAAA,MACL,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,MAAM;AAAA,KAChB,CAAA;AACD,IAAA,OAAO,SAAA,CAAU,OAAM,IAAK,IAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAiBA,eAAsB,cAAA,CACpB,OAAA,EACA,OAAA,GAAiC,EAAC,EACW;AAC7C,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,GAAO,GAAA,EAAQ,eAAc,GAAI,OAAA;AACjD,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,QAAQ,qBAAA,CAAsB;AAAA,MACzC,IAAA;AAAA,MACA,MAAA,EAAQ,CAAC,WAAA,KAAA,CACN,aAAA,KAAkB,KAAA,CAAA,IAAa,YAAY,aAAA,KAAkB,aAAA,MAC7D,MAAA,GAAS,WAAW,CAAA,IAAK,IAAA;AAAA,KAC7B,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAuBA,SAAS,qBAAqBC,MAAAA,EAAsC;AAClE,EAAA,MAAM,CAAA,GAAIA,MAAAA;AAKV,EAAA,OAAO,CAAA,CAAE,IAAA,EAAM,SAAA,IAAa,CAAA,CAAE,aAAa,CAAA,CAAE,QAAA;AAC/C;AASA,eAAsB,iBAAA,CACpB,WAAA,EACAA,MAAAA,EACA,OAAA,GAA6B,EAAC,EACU;AACxC,EAAA,MAAM,QAAA,GAAW,qBAAqBA,MAAK,CAAA;AAC3C,EAAA,MAAM,WAAA,CAAY,UAAUA,MAAK,CAAA;AACjC,EAAA,MAAM,EAAE,IAAA,GAAO,IAAA,EAAS,MAAA,EAAO,GAAI,OAAA;AACnC,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,YAAY,gBAAA,CAAiB;AAAA,MACxC,IAAA;AAAA,MACA,QAAQ,CAAC,SAAA,KACP,SAAA,CAAU,IAAA,CAAK,OAAO,WAAA,CAAY,IAAA,CAAK,EAAA,KACtC,QAAA,KAAa,UAAa,SAAA,CAAU,QAAA,KAAa,QAAA,CAAA,KACjD,MAAA,GAAS,SAAS,CAAA,IAAK,IAAA;AAAA,KAC3B,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AC5HO,IAAM,2BAAA,GAA8B;AAGpC,SAAS,mBAAmB,KAAA,EAAgE;AACjG,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,KAAA,EAAO,OAAO,MAAA;AACnD,EAAA,IAAI,UAAU,IAAA,EAAM,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,SAAS,2BAAA,EAA4B;AACpF,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,MAAM,SAAA,IAAa,KAAA;AAAA,IAC9B,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,GAC5B;AACF;AAaO,SAAS,YAAA,CACd,aACA,MAAA,EACY;AACZ,EAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,IAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,CAAC,YAAY,QAAA,EAAU;AACjD,MAAA,KAAK,WAAA,CACF,UAAA,CAAW,MAAA,CAAO,SAAA,GAAY,EAAE,KAAA,EAAO,YAAA,CAAa,SAAA,EAAU,GAAI,EAAE,CAAA,CACpE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,OAAO,OAAO,CAAA;AACjB,EAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,UAAA,QAAkB,KAAA,EAAM;AACnD,EAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AACjC;AC5CA,SAAS,kBAAkB,KAAA,EAAqB;AAC9C,EAAA,IAAI,KAAA,IAAS,IAAA,EAAM,OAAOC,YAAAA,CAAa,SAAA;AACvC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AAC1D,IAAA,OAAO,MAAA,CAAO,KAAK,CAAA,GAAIA,YAAAA,CAAa,SAAA;AAAA,EACtC;AACA,EAAA,IAAI,KAAA,CAAM,QAAQ,KAAK,CAAA,SAAU,CAAC,GAAG,KAAA,EAAOA,YAAAA,CAAa,SAAS,CAAA;AAClE,EAAA,OAAO,CAAC,KAAA,EAAOA,YAAAA,CAAa,SAAS,CAAA;AACvC;AAGO,SAAS,eAAe,KAAA,EAA4C;AACzE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAE,SAAS,KAAA,EAAM;AACvD,EAAA,MAAM,EAAE,SAAA,EAAW,GAAG,IAAA,EAAK,GAAI,KAAA;AAC/B,EAAA,IAAI,SAAA,SAAkB,EAAE,GAAG,MAAM,KAAA,EAAO,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,EAAE;AACtE,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAgD;AACrE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAE,SAAS,KAAA,EAAM;AACvD,EAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAY,OAAO,MAAA,EAAQ,GAAG,MAAK,GAAI,KAAA;AAC1D,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,YAAY,KAAA,EAA8B;AACxD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AACxE,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,SAAA,EAAW,IAAA,EAAK;AACrC;AAOO,IAAe,cAAf,MAAkF;AAAA,EACvF,YAAqB,WAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAAiB;AAAA,EAAjB,WAAA;AAAA,EAErB,IAAI,MAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA,EACA,IAAI,IAAA,GAAO;AACT,IAAA,OAAO,KAAK,WAAA,CAAY,IAAA;AAAA,EAC1B;AAAA,EACA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA,EACA,IAAI,KAAA,GAAQ;AACV,IAAA,OAAO,KAAK,WAAA,CAAY,KAAA;AAAA,EAC1B;AAAA,EACA,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC1B;AAAA,EACA,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC1B;AAAA,EACA,IAAI,SAAA,GAAY;AACd,IAAA,OAAO,KAAK,WAAA,CAAY,SAAA;AAAA,EAC1B;AAAA,EACA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA;AAAA,EAEA,IAAI,QAAA,GAAW;AACb,IAAA,OAAO,KAAK,WAAA,CAAY,QAAA;AAAA,EAC1B;AAAA;AAAA,EAEA,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,KAAA,EAA0D;AAC9D,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,eAAe,KAAA,EAA0D;AACvE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,EACtC;AAAA;AAAA,EAGA,KAAA,CAAM,OAAA,GAAmC,EAAC,EAA0C;AAClF,IAAA,OAAO,KAAK,WAAA,CAAY,UAAA;AAAA,MACtB,QAAQ,SAAA,GAAY,EAAE,OAAOA,YAAAA,CAAa,SAAA,KAAc;AAAC,KAC3D;AAAA,EACF;AAAA;AAAA,EAGA,UAAU,KAAA,EAAqC;AAC7C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,EACxD;AAAA;AAAA,EAGA,SAAS,KAAA,EAAqC;AAC5C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,KAAA,EAAkC;AAC3C,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IAC5B,CAAA,MAAA,IAAW,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS;AACnC,MAAA,MAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,cAAA,GAAgD;AAClD,IAAA,OAAO,KAAK,WAAA,CAAY,cAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAAA,EAAqD;AAC9D,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzD;AAAA;AAAA,EAGA,YAAY,QAAA,EAAqD;AAC/D,IAAA,MAAM,IAAA,GAAO,KAAK,WAAA,CAAY,iBAAA;AAC9B,IAAA,IAAI,SAAS,IAAA,EAAM,OAAO,IAAIF,mBAAAA,CAAoB,QAAQ,EAAE,OAAA,EAAQ;AACpE,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBACE,MAAA,GAAiB,IAAA,CAAK,KAAK,EAAA,EAC3B,OAAA,GAA+B,EAAC,EACP;AACzB,IAAA,MAAM,OAAA,GAAU,KAAK,WAAA,CAAY,OAAA;AACjC,IAAA,IAAI,OAAA,KAAY,QAAQ,EAAE,eAAA,IAAmB,UAAU,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAClF,IAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,IAAA,OAAO,aAAa,OAAA,EAAS;AAAA,MAC3B,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAA,EAAQ,CAAC,OAAA,KAAY,OAAA,CAAQ,OAAO,EAAA,KAAO,MAAA,KAAW,KAAA,GAAQ,OAAO,CAAA,IAAK,IAAA;AAAA,KAC3E,CAAA;AAAA,EACH;AAAA;AAAA,EAGU,SAAA,GAAoB;AAC5B,IAAA,OAAQ,IAAA,CAAK,WAAA,CAAY,MAAA,CAAqB,MAAA,IAAU,aAAA;AAAA,EAC1D;AAAA;AAAA,EAGA,KAAA,CAAM,KAAA,EAAyB,OAAA,GAAmC,EAAC,EAAkB;AACnF,IAAA,OAAO,IAAA,CAAK,WAAW,OAAA,EAAS,KAAA,EAAO,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,EAAM,CAAA;AAAA,EACjF;AAAA;AAAA,EAGA,OAAA,CAAQ,KAAA,EAAyB,OAAA,GAAmC,EAAC,EAAkB;AACrF,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AAAA,EAClD;AAAA;AAAA,EAGA,IAAA,CAAK,KAAA,EAAyB,OAAA,GAAmC,EAAC,EAAkB;AAClF,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA,EAGA,IAAA,CAAK,KAAA,EAAyB,OAAA,GAAmC,EAAC,EAAkB;AAClF,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA,EAGA,UAAA,CAAW,KAAA,EAAyB,OAAA,GAAmC,EAAC,EAA0C;AAChH,IAAA,OAAO,IAAA,CAAK,YAAY,OAAA,EAAS,KAAA,EAAO,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,EAAM,CAAA;AAAA,EAClF;AAAA;AAAA,EAGA,YAAA,CAAa,KAAA,EAAyB,OAAA,GAAmC,EAAC,EAA0C;AAClH,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,OAAO,CAAA;AAAA,EACnD;AAAA;AAAA,EAGA,SAAA,CAAU,KAAA,EAAyB,OAAA,GAAmC,EAAC,EAA0C;AAC/G,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,SAAA,CAAU,KAAA,EAAyB,OAAA,GAAmC,EAAC,EAA0C;AAC/G,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAAA,EAChD;AAAA,EAEQ,UAAA,CAAW,KAAA,EAAmB,KAAA,EAAyB,OAAA,EAAiD;AAC9G,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,EAAU,CAAE,KAAA,CAAM,OAAO,KAAK,CAAA;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAC,KAAK,CAAA,EAAG,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACpE;AAAA,EAEQ,WAAA,CAAY,KAAA,EAAmB,KAAA,EAAyB,OAAA,EAAyE;AACvI,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,EAAU,CAAE,KAAA,CAAM,OAAO,KAAK,CAAA;AACjD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,MAAA,EAAQ,CAAC,KAAK,CAAA,EAAG,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACrE;AACF;;;ACzLO,SAAS,kBAAkB,KAAA,EAAsC;AACtE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,EAAE,QAAA,EAAU,OAAM,GAAI,KAAA;AAC3D;AAaA,SAAS,QAAA,CAAS,OAAsB,KAAA,EAA8B;AACpE,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,OAAA,IAAW,IAAI,CAAA,CAAA;AAAA,IACnC,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,SAAA,IAAa,IAAI,CAAA,CAAA;AAAA,IACrC,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,MAAM,MAAM,CAAA,CAAA;AAAA;AAE9B;AAMO,SAAS,iBAAA,CAAkB,QAAwB,KAAA,EAAqC;AAC7F,EAAA,IAAI,MAAA,CAAO,QAAQ,KAAA,EAAO,QAAA,CAAS,MAAM,MAAM,CAAA,KAAM,MAAM,OAAO,IAAA;AAClE,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,CAAC,MAAA,KAAW,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAC,CAAA,KAAM,MAAM,OAAO,IAAA;AAE5F,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,SAAA,EAAW,KAAA,GAAQ,MAAM,MAAM,CAAA;AAC3D,EAAA,IAAI,YAAA,KAAiB,QAAW,OAAO,YAAA;AAEvC,EAAA,MAAM,aAAA,GAAgB,OAAO,SAAA,EAAW,KAAA;AACxC,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,IAAI,IAAA;AACJ,IAAA,KAAA,MAAW,MAAA,IAAU,MAAM,OAAA,EAAS;AAClC,MAAA,MAAM,SAAA,GAAY,cAAc,MAAM,CAAA;AACtC,MAAA,IAAI,SAAA,KAAc,QAAW,IAAA,GAAO,IAAA,KAAS,SAAY,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AAAA,IAC/F;AACA,IAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAAA,EACjC;AAEA,EAAA,OAAO,MAAA,CAAO,QAAA;AAChB;AAEA,SAAS,MAAA,CAAO,MAAA,EAAgB,MAAA,EAAwB,KAAA,EAA8B;AACpF,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,OAAO,KAAA,IAAS,MAAA,EAAQ,KAAK,CAAC,CAAA,CAAA;AAC7D;AAMO,IAAM,kBAAN,MAAsB;AAAA,EACV,IAAA,uBAAW,GAAA,EAAoB;AAAA;AAAA,EAGhD,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,MAAA,EAAgB,KAAA,EAAsB,OAAsB,GAAA,GAAc,IAAA,CAAK,KAAI,EAAmB;AAC5G,IAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAA;AAChD,IAAA,IAAI,aAAa,IAAA,IAAQ,QAAA,IAAY,GAAG,OAAO,EAAE,SAAS,IAAA,EAAK;AAC/D,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,GAAA,GAAM,IAAA,GAAO,QAAA,EAAU;AAC/C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,QAAA,IAAY,MAAM,IAAA,CAAA,EAAM;AAAA,IAC9D;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AACtB,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA,EAGA,KAAK,MAAA,EAAgB,KAAA,EAAsB,OAAsB,GAAA,GAAc,IAAA,CAAK,KAAI,EAAmB;AACzG,IAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAA;AAChD,IAAA,IAAI,aAAa,IAAA,IAAQ,QAAA,IAAY,GAAG,OAAO,EAAE,SAAS,IAAA,EAAK;AAC/D,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAC,CAAA;AACxD,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,GAAA,GAAM,IAAA,GAAO,QAAA,EAAU;AAC/C,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,QAAA,IAAY,MAAM,IAAA,CAAA,EAAM;AAAA,IAC9D;AACA,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA,EAGA,KAAA,CAAM,MAAA,EAAgB,KAAA,EAAsB,KAAA,GAAuB,MAAA,EAAiB;AAClF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,MAAM,IAAI,QAAA,CAAS,KAAA,EAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,EAClB;AACF;AAGO,SAAS,qBAAA,CAAsB,QAAwB,WAAA,EAA6B;AACzF,EAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,YAAY,OAAO,MAAA,CAAO,QAAQ,WAAW,CAAA;AAC3E,EAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,SAAiB,MAAA,CAAO,OAAA;AACtD,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,WAAA,GAAc,GAAI,CAAC,CAAA;AACzD,EAAA,OAAO,0CAAqC,OAAO,CAAA,EAAA,CAAA;AACrD;;;AClEO,IAAM,sBAAA,GAAN,cAAqC,WAAA,CAA+C;AAAA;AAAA,EAEzF,IAAI,UAAA,GAAa;AACf,IAAA,OAAO,KAAK,WAAA,CAAY,UAAA;AAAA,EAC1B;AAAA;AAAA,EAEA,IAAI,YAAA,GAAe;AACjB,IAAA,OAAO,KAAK,WAAA,CAAY,YAAA;AAAA,EAC1B;AACF;AAGO,IAAM,yBAAA,GAAN,cAAwC,WAAA,CAAkD;AAAA;AAAA,EAE/F,IAAI,aAAA,GAAgB;AAClB,IAAA,OAAO,KAAK,WAAA,CAAY,aAAA;AAAA,EAC1B;AACF;AAEA,SAAS,QAAA,CACP,MACA,IAAA,EACmD;AACnD,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,oBAAoB,IAAA,CAAK,iBAAA;AAAA,IACzB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,0BAAA,EACE,IAAA,CAAK,wBAAA,IAA4B,IAAA,GAC7B,IAAA,CAAK,wBAAA,GACL,IAAIA,mBAAAA,CAAoB,IAAA,CAAK,wBAAwB,CAAA,CAAE,QAAA,CAAS,QAAA,EAAS;AAAA,IAC/E,UAAU,IAAA,CAAK,SAAA,GAAY,CAAC,sBAAA,CAAuB,KAAK,CAAA,GAAI;AAAA,GAC9D;AACF;AAGO,SAAS,YAAsB,MAAA,EAA+C;AACnF,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA,KAAa,SAAY,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AACtF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,QAAA;AAAA,IACA,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,SAAA,EAAW,kBAAA,CAAmB,MAAA,CAAO,SAAS,CAAA;AAAA,IAC9C,MAAA,EAAQ,MAAM,QAAA,CAAS,MAAA,EAAQ,uBAAuB,IAAI,CAAA;AAAA,IAC1D,OAAA,EAAS,OAAO,WAAA,KAAgB;AAC9B,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,IAAI,sBAAA,CAAuB,WAAW,CAAC,CAAA;AAAA,IAC1D;AAAA,GACF;AACF;AAGO,SAAS,eAAyB,MAAA,EAAqD;AAC5F,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA,KAAa,SAAY,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AACtF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,QAAA;AAAA,IACA,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,SAAA,EAAW,kBAAA,CAAmB,MAAA,CAAO,SAAS,CAAA;AAAA,IAC9C,MAAA,EAAQ,MAAM,QAAA,CAAS,MAAA,EAAQ,uBAAuB,OAAO,CAAA;AAAA,IAC7D,OAAA,EAAS,OAAO,WAAA,KAAgB;AAC9B,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,IAAI,yBAAA,CAA0B,WAAW,CAAC,CAAA;AAAA,IAC7D;AAAA,GACF;AACF;AAGO,IAAM,sBAAN,MAA0B;AAAA,EACd,KAAA,uBAAY,GAAA,EAA6B;AAAA,EACzC,QAAA,uBAAe,GAAA,EAAgC;AAAA,EACxD,MAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAkC,EAAC;AAAA,EACnC,OAAA;AAAA,EACA,gBAAA;AAAA;AAAA,EAGR,OAAO,QAAA,EAA+C;AACpD,IAAA,KAAA,MAAWG,YAAW,QAAA,EAAU;AAC9B,MAAA,IAAIA,QAAAA,CAAQ,SAAS,UAAA,EAAY,IAAA,CAAK,MAAM,GAAA,CAAIA,QAAAA,CAAQ,MAAMA,QAA0B,CAAA;AAAA,WACnF,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIA,QAAAA,CAAQ,MAAMA,QAA6B,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,IAAA;AAAA,EACzC;AAAA;AAAA,EAGA,GAAA,GAA4B;AAC1B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,GAAG,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA,EAGA,MAAA,GAA8D;AAC5D,IAAA,OAAO,IAAA,CAAK,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CAAa,SAA0B,eAAA,EAAwC;AAC7E,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,iBAAiB,MAAA,EAAgC;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,MAAA,EAAgC;AAC3C,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,aAAa,IAAA,EAAyC;AACpD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,WAAW,WAAA,EAA+D;AAC9E,IAAA,MAAMA,QAAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,YAAY,WAAW,CAAA;AACtD,IAAA,IAAIA,aAAY,MAAA,EAAW;AAC3B,IAAA,MAAM,IAAA,CAAK,QAAA,CAASA,QAAAA,EAAS,WAAW,CAAA;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,cAAc,WAAA,EAAkE;AACpF,IAAA,MAAMA,QAAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,YAAY,WAAW,CAAA;AACzD,IAAA,IAAIA,aAAY,MAAA,EAAW;AAC3B,IAAA,MAAM,IAAA,CAAK,QAAA,CAASA,QAAAA,EAAS,WAAW,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAc,QAAA,CACZA,QAAAA,EACA,WAAA,EACe;AACf,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,aAAA,EAAe;AAAA,MAChC,IAAA,EAAM,EAAE,IAAA,EAAMA,QAAAA,CAAQ,IAAA,EAAM,IAAA,EAAMA,QAAAA,CAAQ,IAAA,EAAM,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,EAAA;AAAG,KAC3E,CAAA;AACD,IAAA,MAAM,QAAA,GAAWA,QAAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,eAAA;AAC1C,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW;AAC1D,MAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,OAAA;AAAA,QAC5B,CAAA,EAAGA,QAAAA,CAAQ,IAAI,CAAA,CAAA,EAAIA,SAAQ,IAAI,CAAA,CAAA;AAAA,QAC/B,QAAA;AAAA,QACA,QAAQ,WAAW;AAAA,OACrB;AACA,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,aAAA,CAAc,WAAA,EAAa,QAAA,EAAU,MAAA,CAAO,SAAS,CAAA;AAC3D,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,aAAA,EAAeA,SAAQ,MAAM,CAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,WAAA,EAAa,MAAM,CAAA;AACvD,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,oBAAA,EAAsB;AAAA,UACvC,IAAA,EAAM,EAAE,IAAA,EAAMA,QAAAA,CAAQ,IAAA,EAAM,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,WAAA,CAAY,MAAA,IAAU,EAAA;AAAG,SACzF,CAAA;AACD,QAAA,MAAM,WAAA,CAAY,WAAA,EAAa,WAAA,CAAY,MAAM,CAAA;AACjD,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAYA,QAAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,gBAAA;AAC5C,IAAA,MAAM,kBAAkB,SAAA,KAAc,MAAA,GAAY,YAAA,CAAa,WAAA,EAAa,SAAS,CAAA,GAAI,MAAA;AACzF,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAI;AACF,MAAA,IAAIA,QAAAA,CAAQ,SAAS,UAAA,EAAY;AAC/B,QAAA,MAAMA,QAAAA,CAAQ,QAAQ,WAAgD,CAAA;AAAA,MACxE,CAAA,MAAO;AACL,QAAA,MAAMA,QAAAA,CAAQ,QAAQ,WAAmD,CAAA;AAAA,MAC3E;AACA,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,MAAMA,QAAAA,CAAQ,IAAA;AAAA,QACd,QAAQA,QAAAA,CAAQ,IAAA;AAAA,QAChB,OAAA,EAAS,SAAA;AAAA,QACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,MAAA,EAAQ,YAAY,IAAA,CAAK,EAAA;AAAA,QACzB,OAAA,EAAS,YAAY,IAAA,CAAK,GAAA;AAAA,QAC1B,SAAS,WAAA,CAAY,OAAA;AAAA,QACrB,WAAW,WAAA,CAAY,SAAA;AAAA,QACvB,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,MAAMA,QAAAA,CAAQ,IAAA;AAAA,QACd,QAAQA,QAAAA,CAAQ,IAAA;AAAA,QAChB,OAAA,EAAS,OAAA;AAAA,QACT,cAAc,GAAA,CAAI,OAAA;AAAA,QAClB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,MAAA,EAAQ,YAAY,IAAA,CAAK,EAAA;AAAA,QACzB,OAAA,EAAS,YAAY,IAAA,CAAK,GAAA;AAAA,QAC1B,SAAS,WAAA,CAAY,OAAA;AAAA,QACrB,WAAW,WAAA,CAAY,SAAA;AAAA,QACvB,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AACD,MAAA,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AACpC,MAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,GAAG,CAAA,IAAK,uBAAA;AAC5C,MAAA,IAAI;AACF,QAAA,IAAI,YAAY,QAAA,EAAU;AACxB,UAAA,MAAM,WAAA,CAAY,SAAA,CAAU,EAAE,OAAA,EAAS,CAAA;AAAA,QACzC,CAAA,MAAA,IAAW,YAAY,OAAA,EAAS;AAC9B,UAAA,MAAM,YAAY,QAAA,CAAS,EAAE,SAAS,KAAA,EAAOD,YAAAA,CAAa,WAAW,CAAA;AAAA,QACvE,CAAA,MAAO;AACL,UAAA,MAAM,YAAY,KAAA,CAAM,EAAE,SAAS,KAAA,EAAOA,YAAAA,CAAa,WAAW,CAAA;AAAA,QACpE;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA,SAAE;AACA,MAAA,eAAA,IAAkB;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,aAAA,CAAc,UAA4B,GAAA,EAAqD;AACtG,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,QAAA;AAClD,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAClC,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,GAAG,GAAG,CAAA;AAC7B;AAEA,SAAS,QACP,WAAA,EACe;AACf,EAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAC3B,EAAA,IAAI,UAA6B,EAAC;AAClC,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,EACjE;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,YAAY,IAAA,CAAK,EAAA;AAAA,IACzB,OAAA;AAAA,IACA,SAAS,WAAA,CAAY,OAAA;AAAA,IACrB,WAAW,WAAA,CAAY;AAAA,GACzB;AACF;AAEA,SAAS,aAAa,MAAA,EAA+C;AACnE,EAAA,OAAS,OAA+B,MAAA,IAAW,aAAA;AACrD;AAEA,eAAe,aAAA,CACb,WAAA,EACA,MAAA,EACA,SAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,MAAA,EAAQ,SAAS,CAAA;AACvD,EAAA,IAAI;AACF,IAAA,IAAI,YAAY,QAAA,EAAU,MAAM,YAAY,SAAA,CAAU,EAAE,SAAS,CAAA;AAAA,SAAA,IACxD,WAAA,CAAY,OAAA,EAAS,MAAM,WAAA,CAAY,QAAA,CAAS,EAAE,OAAA,EAAS,KAAA,EAAOA,YAAAA,CAAa,SAAA,EAAW,CAAA;AAAA,SAC9F,MAAM,YAAY,KAAA,CAAM,EAAE,SAAS,KAAA,EAAOA,YAAAA,CAAa,WAAW,CAAA;AAAA,EACzE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,eAAe,WAAA,CACb,aACA,MAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,WAAA,CAAY,MAAM,CAAA;AAC9C,EAAA,MAAM,OAAO,MAAA,IAAU,wCAAA;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAQ,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,KAAA,EAAOA,YAAAA,CAAa,SAAA,EAAU;AAC9E,IAAA,IAAI,WAAA,CAAY,UAAU,MAAM,WAAA,CAAY,UAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,SAAA,IACvE,WAAA,CAAY,OAAA,EAAS,MAAM,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,SAC3D,MAAM,WAAA,CAAY,KAAA,CAAM,OAAO,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;AC3TA,IAAM,YAAA,GAAe,aAAA;AACrB,IAAM,eAAA,GAAkB,oBAAA;AACxB,IAAM,kBAAA,GAAqB,kBAAA;AAC3B,IAAM,eAAA,GAAkB,mBAAA;AAExB,SAAS,iBAAiB,KAAA,EAA8B;AACtD,EAAA,IAAI,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AACrC,EAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,IAAK,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAAK,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AACrG,EAAA,OAAO,CAAA,KAAM,IAAA,GAAO,IAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AACtC;AAgCO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAA+D;AAAA,EACzD,KAAA;AAAA;AAAA,EAGjB,WAAA,CAAY,KAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA;AAAA,EAGA,MAAA,CACE,MACA,OAAA,EACqD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAAA,EACjH;AAAA;AAAA,EAGA,OAAA,CACE,MACA,OAAA,EACqD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAAA,EAClH;AAAA;AAAA,EAGA,MAAA,CACE,MACA,OAAA,EACqD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAAA,EACjH;AAAA;AAAA,EAGA,OAAA,CACE,MACA,OAAA,EACsD;AACtD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAAA,EAClH;AAAA;AAAA,EAGA,SAAA,CACE,MACA,OAAA,EACqD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,WAAA,EAAa,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAAA,EACpH;AAAA;AAAA,EAGA,QAAA,CACE,MACA,OAAA,EACqD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAAA,EACnH;AAAA;AAAA,EAGA,IAAA,CACE,MACA,OAAA,EACqD;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAAA,EAC/G;AAAA,EAEQ,KAA2C,IAAA,EAA8C;AAC/F,IAAA,OAAO,IAAI,kBAAA,CAAwB,CAAC,GAAG,IAAA,CAAK,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA,EAGA,OAAA,GAAoC;AAClC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA,CAAM,QAAQ,IAAA,EAAM;AAClB,QAAA,MAAM,MAA6D,EAAC;AACpE,QAAA,IAAI,GAAA,GAAM,CAAA;AACV,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,UAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,UAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,YAAA,MAAM,IAAA,GAAO,QAAQ,CAAA,GAAI,IAAA,GAAO,OAAO,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1D,YAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,cAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,CAAA,2BAAA,EAA8B,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,EAAI;AAC1G,cAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,YAAA;AAAA,YACxB,CAAA,MAAO;AACL,cAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,YACnB;AACA,YAAA,GAAA,GAAM,MAAA,CAAO,MAAA;AACb,YAAA;AAAA,UACF;AACA,UAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,UAAA,IAAI,UAAU,MAAA,EAAW;AACvB,YAAA,IAAI,KAAK,QAAA,EAAU;AACjB,cAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,MAAM,MAAA,EAAQ,CAAA,2BAAA,EAA8B,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,EAAI;AAAA,YACzF;AACA,YAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,YAAA;AACtB,YAAA;AAAA,UACF;AACA,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AACjC,UAAA,IAAI,MAAA,CAAO,EAAA,KAAO,KAAA,EAAO,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO;AACnF,UAAA,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA,CAAO,KAAA;AACxB,UAAA,GAAA,IAAO,CAAA;AAAA,QACT;AACA,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAc;AAAA,MAC3C;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,MAAA,CACP,MACA,KAAA,EACgF;AAChF,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,IAClC,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,mBAAA,CAAA,EAAsB;AACrF,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE;AAAA,IAC9B;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,iBAAA,CAAA,EAAoB;AAClF,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE;AAAA,IAC9B;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,GAAA,GAAM,MAAM,WAAA,EAAY;AAC9B,MAAA,IAAI,CAAC,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAK;AAC7E,MAAA,IAAI,CAAC,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,KAAA,EAAM;AAC/E,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,kBAAA,CAAA,EAAqB;AAAA,IAC5D;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,EAAA,GAAK,iBAAiB,KAAK,CAAA;AACjC,MAAA,IAAI,EAAA,KAAO,MAAM,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,+BAAA,CAAA,EAAkC;AACxF,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,EAAA,EAAG;AAAA,IAC/B;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,EAAA,GAAK,cAAc,KAAK,CAAA;AAC9B,MAAA,IAAI,EAAA,KAAO,MAAM,OAAO,EAAE,IAAI,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,mBAAA,CAAA,EAAsB;AAC5E,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,EAAA,EAAG;AAAA,IAC/B;AAAA,IACA;AACE,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,CAAA,sBAAA,EAAyB,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,EAAI;AAAA;AAExE;AAGO,SAAS,UAAA,GAAoC;AAClD,EAAA,OAAO,IAAI,iBAAA,EAAkB;AAC/B;ACxMA,SAAS,iBAAiB,MAAA,EAA4C;AACpE,EAAA,IACE,OAAQ,MAAA,CAAwB,QAAA,KAAa,cAC7C,OAAQ,MAAA,CAAwB,WAAW,UAAA,EAC3C;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,CAAC,MAAsB,CAAA,EAAE;AAAA,EAC5C;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,QAAQ,MAAA,EAAyB;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAA,CACP,IAAA,EACA,KAAA,EACA,EAAA,EACA,UACA,MAAA,EACiC;AACjC,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,IAAI,aAAa,sBAAA,EAAwB;AACvC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAI,aAAA,EAAc,CACf,YAAY,CAAA,EAAG,EAAE,QAAQ,CAAA,CACzB,QAAA,CAAS,WAAA,CAAY,SAAS,EAC9B,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,CACrB,WAAA,CAAY,SAAS,CAAC;AAAA,KAC3B;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN,IAAI,aAAA,EAAc,CACf,YAAY,CAAA,EAAG,EAAE,OAAO,CAAA,CACxB,QAAA,CAAS,WAAA,CAAY,OAAO,EAC5B,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,CACpB,WAAA,CAAY,SAAS,CAAC,CAAA;AAAA,IACzB,IAAI,aAAA,EAAc,CACf,YAAY,CAAA,EAAG,EAAE,OAAO,CAAA,CACxB,QAAA,CAAS,YAAY,OAAO,CAAA,CAC5B,SAAS,MAAA,CAAO,IAAI,EACpB,WAAA,CAAY,IAAA,IAAQ,QAAQ,CAAC;AAAA,GAClC;AACA,EAAA,IAAI,aAAa,sBAAA,EAAwB;AACvC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAI,aAAA,EAAc,CACf,YAAY,CAAA,EAAG,EAAE,OAAO,CAAA,CACxB,QAAA,CAAS,YAAY,SAAS,CAAA,CAC9B,SAAS,MAAA,CAAO,IAAI,EACpB,WAAA,CAAY,IAAA,IAAQ,QAAQ,CAAC;AAAA,KAClC;AAAA,EACF;AACA,EAAA,OAAO,IAAI,gBAAA,EAAgC,CAAE,aAAA,CAAc,GAAG,OAAO,CAAA;AACvE;AAEA,SAASE,eAAc,KAAA,EAAsG;AAC3H,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,KAAA,IAAS,MAAA;AAAA,IACvB,IAAA,EAAM,OAAO,IAAA,IAAQ,QAAA;AAAA,IACrB,IAAA,EAAM,OAAO,IAAA,IAAQ,QAAA;AAAA,IACrB,IAAA,EAAM,OAAO,IAAA,IAAQ;AAAA,GACvB;AACF;AAOA,eAAsB,kBAAA,CACpB,KAAA,EACA,IAAA,EACA,OAAA,EACyD;AACzD,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AAC5D,EAAA,MAAM,EAAA,GAAK,QAAQ,SAAA,IAAa,UAAA;AAChC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,WAAA;AACrC,EAAA,MAAM,MAAA,GAASA,cAAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,OAAO,QAAA,EAAU,IAAA,GAAO,WAAW,QAAQ,CAAA;AACrE,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,EAAE,IAAA,EAAM,OAAO,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,iBAAiB,IAAI,CAAA;AACrC,EAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,CAAA,GAAI,CAAC,WAAA,CAAY,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,QAAA,EAAU,MAAM,CAAC,CAAA,GAAI,EAAC;AACnF,EAAA,OAAO,EAAE,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,UAAA,IAAc,KAAA,EAAM;AACtD;AASA,eAAsB,QAAA,CACpB,WAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACrC,EAAA,MAAM,EAAA,GAAK,QAAQ,SAAA,IAAa,UAAA;AAChC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,WAAA;AACrC,EAAA,MAAM,MAAA,GAASA,cAAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,IAAQ,WAAA,CAAY,IAAA,CAAK,EAAA;AACrD,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,MAAM,YAAY,YAAqE;AACrF,IAAA,OAAO,kBAAA,CAAmB,KAAA,EAAO,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,EAAA,EAAI,QAAA,EAAU,MAAA,EAAQ,CAAA;AAAA,EAClG,CAAA;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM,GAAI,MAAM,SAAA,EAAU;AACpD,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,GACrB,MAAM,WAAA,CAAY,UAAU,OAAO,CAAA,IAClC,MAAM,WAAA,CAAY,KAAA,CAAM;AAAA,IACvB,GAAG,OAAA;AAAA,IACH,KAAA,EAAO,OAAA,CAAQ,SAAA,KAAc,IAAA,GAAO,EAAA,GAAK;AAAA,GACjC,CAAA,EACV,MAAM,WAAA,CAAY,UAAA,EAAW,CAAA;AAEjC,EAAA,IAAI,SAAS,CAAA,EAAG;AAEhB,EAAA,MAAM,SAAA,GAAY,KAAK,+BAAA,CAAgC;AAAA,IACrD,eAAe,aAAA,CAAc,MAAA;AAAA,IAC7B,IAAA,EAAM,OAAA,CAAQ,SAAA,IAAa,CAAA,GAAI,GAAA;AAAA,IAC/B,MAAA,EAAQ,CAAC,CAAA,KAAyB,CAAA,CAAE,IAAA,CAAK,EAAA,KAAO,WAAA,IAAe,CAAA,CAAE,QAAA,CAAS,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,CAAA,CAAG;AAAA,GAC9F,CAAA;AAED,EAAA,SAAA,CAAU,EAAA,CAAG,SAAA,EAAW,OAAOC,OAAAA,KAAW;AACxC,IAAA,MAAM,SAASA,OAAAA,CAAO,QAAA,CAAS,KAAA,CAAM,EAAA,CAAG,SAAS,CAAC,CAAA;AAClD,IAAA,IAAI,MAAA,KAAW,SAAS,IAAA,GAAO,CAAA;AAAA,SAAA,IACtB,WAAW,MAAA,EAAQ,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,SAAA,IAC9C,MAAA,KAAW,QAAQ,IAAA,GAAO,IAAA,CAAK,IAAI,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,SAAA,IACtD,MAAA,KAAW,MAAA,EAAQ,IAAA,GAAO,KAAA,GAAQ,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,MAAM,SAAA,EAAU;AAC7B,IAAA,MAAMA,QAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EACzD,CAAC,CAAA;AAED,EAAA,SAAA,CAAU,EAAA,CAAG,OAAO,YAAY;AAC9B,IAAA,MAAM,cAAc,WAAA,CAAY,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,UAAU,MAAM,CAAA;AACjE,IAAA,KAAA,MAAW,CAAA,IAAK,WAAA,CAAY,UAAA,EAAY,CAAA,CAAE,YAAY,IAAI,CAAA;AAC1D,IAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,MAAM,SAAA,EAAU;AAC3C,IAAA,MAAM,WAAA,CAAY,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,UAAA,EAAY,CAAC,WAAW,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EAC5F,CAAC,CAAA;AACH;AChIA,IAAM,SAAA,GAAqD;AAAA,EACzD,SAASC,WAAAA,CAAY,OAAA;AAAA,EACrB,WAAWA,WAAAA,CAAY,SAAA;AAAA,EACvB,SAASA,WAAAA,CAAY,OAAA;AAAA,EACrB,QAAQA,WAAAA,CAAY;AACtB,CAAA;AAEA,SAASC,cAAa,MAAA,EAA+C;AACnE,EAAA,OAAS,OAA+B,MAAA,IAAW,aAAA;AACrD;AASA,eAAsB,OAAA,CACpB,aACA,OAAA,EACwB;AACxB,EAAA,MAAM,EAAA,GAAK,QAAQ,SAAA,IAAa,aAAA;AAChC,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,EAAS,KAAA,IAAS,SAAA;AAC/C,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,EAAQ,KAAA,IAAS,QAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,SAAS,SAAS,CAAA;AAClE,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,SAAS,WAAW,CAAA;AAClE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,WAAA,CAAY,IAAA,CAAK,EAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,KAAc,KAAA;AAExC,EAAA,MAAM,MAAA,GAASA,aAAAA,CAAa,WAAA,CAAY,MAAM,CAAA;AAC9C,EAAA,MAAM,cAAc,MAAA,CAAO,IAAA;AAAA,IACzB,OAAA,CAAQ,KAAA,KAAU,MAAA,GACd,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,WAAA,EAAa,OAAA,CAAQ,IAAA,EAAK,GAClD,OAAA,CAAQ;AAAA,GACd;AAEA,EAAA,MAAMC,IAAAA,GAAM,IAAIC,gBAAAA,EAAgC,CAAE,aAAA;AAAA,IAChD,IAAIC,aAAAA,EAAc,CAAE,WAAA,CAAY,CAAA,EAAG,EAAE,CAAA,IAAA,CAAM,CAAA,CAAE,QAAA,CAAS,YAAY,CAAA,CAAE,QAAA,CAAS,YAAY,CAAA;AAAA,IACzF,IAAIA,aAAAA,EAAc,CAAE,WAAA,CAAY,CAAA,EAAG,EAAE,CAAA,GAAA,CAAK,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA,CAAE,QAAA,CAAS,WAAW;AAAA,GACxF;AAEA,EAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAQ,CAAC,WAAW,CAAA,EAAG,UAAA,EAAY,CAACF,IAAG,CAAA,EAAE;AAC3D,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,GACrB,MAAM,WAAA,CAAY,UAAU,OAAO,CAAA,IAClC,MAAM,WAAA,CAAY,KAAA,CAAM;AAAA,IACvB,GAAG,OAAA;AAAA,IACH,KAAA,EAAO,YAAY,EAAA,GAAK;AAAA,GAChB,CAAA,EACV,MAAM,WAAA,CAAY,UAAA,EAAW,CAAA;AAEjC,EAAA,OAAO,IAAI,OAAA,CAAuB,CAAC,OAAA,KAAY;AAC7C,IAAA,MAAM,SAAA,GAAY,KAAK,+BAAA,CAAgC;AAAA,MACrD,eAAeG,aAAAA,CAAc,MAAA;AAAA,MAC7B,IAAA,EAAM,QAAQ,SAAA,IAAa,GAAA;AAAA,MAC3B,GAAA,EAAK,CAAA;AAAA,MACL,MAAA,EAAQ,CAAC,CAAA,KAAyB,CAAA,CAAE,IAAA,CAAK,EAAA,KAAO,IAAA,IAAQ,CAAA,CAAE,QAAA,CAAS,UAAA,CAAW,CAAA,EAAG,EAAE,CAAA,CAAA,CAAG;AAAA,KACvF,CAAA;AAED,IAAA,IAAI,OAAA,GAAgC,IAAA;AAEpC,IAAA,SAAA,CAAU,EAAA,CAAG,SAAA,EAAW,OAAON,OAAAA,KAAW;AACxC,MAAA,MAAM,SAASA,OAAAA,CAAO,QAAA,CAAS,KAAA,CAAM,EAAA,CAAG,SAAS,CAAC,CAAA;AAClD,MAAA,OAAA,GAAU;AAAA,QACR,WAAW,MAAA,KAAW,KAAA;AAAA,QACtB,MAAA,EAAQ,MAAA,KAAW,KAAA,GAAQ,SAAA,GAAY,QAAA;AAAA,QACvC,WAAA,EAAaA;AAAA,OACf;AACA,MAAA,MAAMA,OAAAA,CAAO,WAAA,EAAY,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAClD,CAAC,CAAA;AAED,IAAA,SAAA,CAAU,EAAA,CAAG,OAAO,YAAY;AAE9B,MAAA,KAAA,MAAW,CAAA,IAAKG,IAAAA,CAAI,UAAA,EAAY,CAAA,CAAE,YAAY,IAAI,CAAA;AAClD,MAAA,MAAM,WAAA,CACH,SAAA,CAAU,EAAE,MAAA,EAAQ,CAAC,WAAW,CAAA,EAAG,UAAA,EAAY,CAACA,IAAG,CAAA,EAAG,CAAA,CACtD,KAAA,CAAM,MAAM,MAAS,CAAA;AACxB,MAAA,OAAA,CAAQ,WAAW,EAAE,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,WAAW,CAAA;AAAA,IAC5D,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AC5FA,IAAM,IAAA,GAAqC;AAAA,EACzC,KAAA,EAAO,EAAA;AAAA,EACP,IAAA,EAAM,EAAA;AAAA,EACN,IAAA,EAAM,EAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,QAAQ,MAAA,CAAO;AACjB,CAAA;AAEA,SAAS,YAAY,KAAA,EAAyB;AAC5C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAO,KAAK,CAAA;AACzD;AAGO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,KAAU,SAAY,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AAChE,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,IAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,MAAM,IAAI,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAA,EAAG,CAAC,IAAI,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE,CAAA;AACjF,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA,GAAS,IAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,EACpD;AACA,EAAA,MAAM,OAAO,CAAA,EAAG,KAAA,CAAM,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG,KAAK,IAAI,KAAA,CAAM,OAAO,GAAG,MAAM,CAAA,CAAA;AAC5G,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,KAAU,MAAA,IAAU,MAAM,KAAA,KAAU,OAAA,GAAU,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,GAAA;AAC1F,EAAA,KAAA,CAAM,IAAI,CAAA;AACV,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,KAAA,CAAM,MAAM,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAC/E;AAMO,SAAS,SAAA,CAAU,IAAA,EAAc,OAAA,GAAmC,EAAC,EAAY;AACtF,EAAA,MAAM,GAAA,GAAM,QAAQ,QAAA,IAAY,OAAA;AAChC,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,KAAA,GAAuB,QAAQ,OAAA,EAAQ;AAC3C,EAAA,OAAO,CAAC,KAAA,KAAU;AAChB,IAAA,IAAI,KAAK,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,KAAA;AAAA,MACH,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,WAAA,EAAY;AAAA,MACvC,OAAO,KAAA,CAAM,KAAA,GACT,EAAE,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,KAAA,CAAM,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,OAAM,GACjF;AAAA,KACN;AACA,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC;AAAA,CAAA;AACtC,IAAA,KAAA,GAAQ,KAAA,CAAM,KAAK,YAAY;AAC7B,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAMI,MAAMC,OAAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,UAAA,QAAA,GAAW,IAAA;AAAA,QACb;AACA,QAAA,MAAM,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAAA,MACrC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AAQO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,MAAM,GAAA,GAAM,QAAQ,QAAA,IAAY,MAAA;AAChC,EAAA,OAAO,CAAC,KAAA,KAAU;AAChB,IAAA,IAAI,KAAK,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,KAAU,OAAA,GAAU,WAAW,KAAA,CAAM,KAAA,KAAU,SAAS,QAAA,GAAW,OAAA;AACvF,IAAA,MAAM,SAA8D,EAAC;AACrE,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AAC9F,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,MAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AAC/C,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,WAAA,CAAY,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA,EAAG,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC7E;AAAA,IACF;AACA,IAAA,MAAM,OAAO,KAAA,CAAM,KAAA,EAAO,UAAU,MAAA,GAChC,CAAA,EAAG,MAAM,OAAO;AAAA;AAAA,EAAa,MAAM,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC;AAAA,MAAA,CAAA,GAC7D,KAAA,CAAM,OAAA;AACV,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,QAAA,EAAU,QAAQ,QAAA,IAAY,UAAA;AAAA,MAC9B,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,KAAA,EAAO,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,WAAA,EAAa,CAAA,EAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,UACpE,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAI,CAAA;AAAA,UAC/B,KAAA;AAAA,UACA,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,WAAA,EAAY;AAAA,UACvC,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE;AAAA;AAC5B;AACF,KACF;AACA,IAAA,KAAK,KAAA,CAAM,QAAQ,GAAA,EAAK;AAAA,MACtB,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EAC1B,CAAA;AACF;AAOA,SAAS,kBAAkB,OAAA,EAA4C;AACrE,EAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,IAAa,OAAA,CAAQ,WAAW,MAAA,GAAS,CAAA,SAAU,OAAA,CAAQ,UAAA;AACtF,EAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,CAAC,QAAQ,IAAI,CAAA;AACpD,EAAA,OAAO,CAAC,WAAW,CAAA;AACrB;AAcO,IAAM,MAAA,GAAN,MAAM,OAAA,CAAO;AAAA,EACV,KAAA;AAAA;AAAA,EAEC,KAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,SAAA,EAAW,QAAQ,KAAA,IAAS,MAAA;AAAA,MAC5B,UAAA,EAAY,kBAAkB,OAAO;AAAA,KACvC;AACA,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,KAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,KAAA,CAAM,SAAA;AAAA,EACpB;AAAA;AAAA,EAGA,SAAS,KAAA,EAA2B;AAClC,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,KAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,cAAc,UAAA,EAAsC;AAClD,IAAA,IAAA,CAAK,MAAM,UAAA,GAAa,UAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,IAAA,EAAqB;AAChC,IAAA,IAAA,CAAK,MAAM,UAAA,GAAa,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,YAAY,IAAI,CAAA;AACvD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ,KAAA,EAA0B;AAChC,IAAA,OAAO,KAAK,KAAK,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,KAAA,EAAuB;AAC3B,IAAA,MAAM,QAAA,GAAW,KAAK,KAAA,KAAU,MAAA,GAAY,GAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,KAAA;AACvE,IAAA,MAAM,QAAQ,IAAI,OAAA,CAAO,EAAE,KAAA,EAAO,UAAU,CAAA;AAC5C,IAAA,KAAA,CAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,GAAA,CAAI,KAAA,EAAiB,OAAA,EAAiB,OAAA,EAA4B;AAChE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1B,IAAA,MAAM,KAAA,GAAkB;AAAA,MACtB,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,MAAM,OAAA,EAAS;AAAA,KACjB;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY;AACxC,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,KAAK,CAAA;AAAA,MACZ,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,KAAA,CAAM,SAAiB,OAAA,EAA4B;AACjD,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,IAAA,CAAK,SAAiB,OAAA,EAA4B;AAChD,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,IAAA,CAAK,SAAiB,OAAA,EAA4B;AAChD,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,KAAA,CAAM,SAAiB,OAAA,EAA4B;AACjD,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EACpC;AACF;AAGO,SAAS,QAAQ,KAAA,EAAuB;AAC7C,EAAA,OAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACjE;AC1PA,SAAS,mBAAmB,KAAA,EAAuB;AAGjD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC9B,EAAA,OAAO,KAAA,KAAU,OAAO,KAAA,CAAM,KAAA,CAAM,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,OAAA,EAAQ,GAAI,KAAA;AAClE;AAEA,SAAS,QAAQ,GAAA,EAAqB;AACpC,EAAA,IAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAI,CAAC,CAAA;AACnB,IAAA,IAAA,CAAK,UAAU,GAAA,IAAO,KAAA,KAAU,QAAQ,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3D,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC7B,MAAA,OAAO,KAAA,KAAU,GAAA,GACb,KAAA,CAAM,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAI,CAAA,GACtE,KAAA;AAAA,IACN;AAAA,EACF;AACA,EAAA,OAAO,mBAAmB,GAAG,CAAA;AAC/B;AAGO,SAAS,SAAS,OAAA,EAA4B;AACnD,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,OAAA,IAAW,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAK;AAC1B,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,GAAI,KAAK,KAAA,CAAM,CAAC,CAAA,CAAE,SAAA,EAAU,GAAI,IAAA;AACtE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,MAAM,CAAA,EAAG;AACb,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACnC,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACtB,IAAA,GAAA,CAAI,GAAG,IAAI,OAAA,CAAQ,IAAA,CAAK,MAAM,EAAA,GAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,GAAA;AACT;AASO,SAAS,OAAA,CAAQ,OAAA,GAA0B,EAAC,EAAc;AAC/D,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA,IAAQ,KAAK,OAAA,CAAQ,GAAA,IAAO,MAAM,CAAA;AACvD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAUC,YAAAA,CAAa,MAAM,MAAM,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,MAAA,GAAS,SAAS,OAAO,CAAA;AAC/B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,QAAQ,QAAA,KAAa,IAAA,IAAQ,QAAQ,GAAA,CAAI,GAAG,MAAM,MAAA,EAAW;AAC/D,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,MAAA,uBAAa,GAAA,CAAI,CAAC,QAAQ,GAAA,EAAK,KAAA,EAAO,IAAI,CAAC,CAAA;AACjD,IAAM,KAAA,uBAAY,GAAA,CAAI,CAAC,SAAS,GAAA,EAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AAEjD,SAAS,KAAK,GAAA,EAAiC;AAC7C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,EAAA,OAAO,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA,GAAK,KAAA,GAAQ,MAAA;AACvD;AAIA,SAAS,SAAA,CAAU,KAAa,QAAA,EAAuC;AACrE,EAAA,OAAO,IAAA,CAAK,GAAG,CAAA,IAAK,QAAA;AACtB;AAIA,SAAS,SAAA,CAAU,KAAa,QAAA,EAAuC;AACrE,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,QAAA;AAChC,EAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,GAAI,QAAA,GAAW,MAAA;AAC3C;AAIA,SAAS,UAAA,CAAW,KAAa,QAAA,EAAyC;AACxE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAG,CAAA,EAAG,WAAA,EAAY;AACrC,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,QAAA;AAChC,EAAA,IAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4C,GAAG,CAAA,qBAAA,CAAuB,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,KAAA;AACT;AA4BO,IAAM,GAAA,GAAiB;AAAA,EAC5B,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS;AACX;;;AC5IA,IAAM,OAAA,GAAkC;AAAA,EACtC,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,WAAA;AAAA,EACb,UAAA,EAAY,WAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,WAAA;AAAA,EACV,WAAA,EAAa,WAAA;AAAA,EACb,SAAA,EAAW;AACb,CAAA;AAEA,SAAS,UAAA,CAAW,IAAA,EAAc,GAAA,EAAa,GAAA,EAAa,KAAA,EAA4B;AACtF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG;AAClC,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AACnC,MAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAC3B,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,IAAK,QAAQ,CAAA,EAAG;AACxC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MAC3E;AAAA,IACF;AACA,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,EAAA,GAAK,GAAA;AACL,MAAA,EAAA,GAAK,GAAA;AAAA,IACP,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,MAAA,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA;AAChC,MAAA,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,EAAA,GAAK,OAAO,KAAK,CAAA;AACjB,MAAA,EAAA,GAAK,EAAA;AAAA,IACP;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,EAAE,KAAK,CAAC,MAAA,CAAO,SAAA,CAAU,EAAE,KAAK,EAAA,GAAK,GAAA,IAAO,EAAA,GAAK,GAAA,IAAO,KAAK,EAAA,EAAI;AACrF,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,KAAK,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACvF;AACA,IAAA,KAAA,IAAS,KAAA,GAAQ,IAAI,KAAA,IAAS,EAAA,EAAI,SAAS,IAAA,EAAM,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAA;AACT;AAWO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAEjB,MAAA;AAAA,EACQ,OAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EAEjB,YAAY,UAAA,EAAoB;AAC9B,IAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAChC,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACpC,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mDAAA,EAAsD,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IACrF;AACA,IAAA,MAAM,CAAC,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA,GAAI,KAAA;AACxC,IAAA,IACE,MAAA,KAAW,UACX,IAAA,KAAS,MAAA,IACT,QAAQ,MAAA,IACR,KAAA,KAAU,MAAA,IACV,GAAA,KAAQ,MAAA,EACR;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IACrE;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,UAAA,CAAW,MAAA,EAAQ,CAAA,EAAG,IAAI,QAAQ,CAAA;AACjD,IAAA,IAAA,CAAK,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,CAAA,EAAG,IAAI,MAAM,CAAA;AAC3C,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA,CAAW,GAAA,EAAK,CAAA,EAAG,IAAI,cAAc,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,GAAS,UAAA,CAAW,KAAA,EAAO,CAAA,EAAG,IAAI,OAAO,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,EAAK,CAAA,EAAG,GAAG,aAAa,CAAA;AACpD,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG;AACnB,MAAA,QAAA,CAAS,OAAO,CAAC,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA;AAClB,IAAA,IAAA,CAAK,gBAAgB,GAAA,KAAQ,GAAA;AAC7B,IAAA,IAAA,CAAK,gBAAgB,GAAA,KAAQ,GAAA;AAAA,EAC/B;AAAA,EAEQ,WAAW,IAAA,EAAqB;AACtC,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AAC/C,IAAA,MAAM,MAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAC7C,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,aAAA,SAAsB,GAAA,IAAO,GAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,eAAe,OAAO,GAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,eAAe,OAAO,GAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAA,CAAK,IAAA,mBAAa,IAAI,IAAA,EAAK,EAAS;AAClC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACpC,IAAA,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,CAAA;AACpB,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,UAAA,EAAW,GAAI,CAAC,CAAA;AACrC,IAAA,KAAA,IAASf,MAAAA,GAAQ,CAAA,EAAGA,MAAAA,GAAQ,GAAA,EAASA,MAAAA,EAAAA,EAAS;AAC5C,MAAA,IAAI,CAAC,KAAK,MAAA,CAAO,GAAA,CAAI,KAAK,QAAA,EAAS,GAAI,CAAC,CAAA,EAAG;AACzC,QAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,EAAS,GAAI,GAAG,CAAC,CAAA;AACpC,QAAA,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACxB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1B,QAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAQ,GAAI,CAAC,CAAA;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACxB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG;AACpC,QAAA,IAAA,CAAK,SAAS,IAAA,CAAK,QAAA,KAAa,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAI,IAAA,CAAK,UAAA,EAAY,CAAA,EAAG;AACxC,QAAA,IAAA,CAAK,WAAW,IAAA,CAAK,UAAA,EAAW,GAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3C,QAAA;AAAA,MACF;AACA,MAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,IAChC;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAA,CAAK,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAAA,EACpF;AACF;AAGO,SAAS,KAAK,UAAA,EAAoC;AACvD,EAAA,OAAO,IAAI,eAAe,UAAU,CAAA;AACtC;AA2BO,SAAS,KAAK,MAAA,EAAmC;AACtD,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,IAAa,MAAA,CAAO,aAAa,MAAA,EAAW;AAC9D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAA,CAAO,IAAI,CAAA,wCAAA,CAA0C,CAAA;AAAA,EAC1F;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,IAAa,MAAA,CAAO,YAAY,CAAA,EAAG;AACzD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAA,CAAO,IAAI,CAAA,2BAAA,CAA6B,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,IAAA,EAAM,OAAO,IAAA,KAAS,MAAA,GAAY,IAAI,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,IACpE,UAAA,EAAY,OAAO,UAAA,IAAc,KAAA;AAAA,IACjC,KAAK,MAAA,CAAO;AAAA,GACd;AACF;AAEA,IAAM,WAAA,GAAc,UAAA;AAOb,IAAM,gBAAN,MAAoB;AAAA,EACR,KAAA,uBAAY,GAAA,EAA2B;AAAA,EACvC,MAAA,uBAAa,GAAA,EAA2C;AAAA,EACjE,OAAA,GAAU,KAAA;AAAA,EACV,MAAA;AAAA,EACA,MAAA;AAAA,EACS,cAAiF,EAAC;AAAA;AAAA,EAGnG,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AAAA;AAAA,EAGA,IAAI,MAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAA,GAAwB;AACtB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,KAAA,EAA8B;AACnC,IAAA,KAAA,MAAWgB,SAAQ,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,KAAAA,CAAK,IAAA,EAAMA,KAAI,CAAA;AAC9B,MAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAA,CAAMA,KAAI,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,IAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAChB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,CAAM,IAAA,EAAc,EAAA,EAAY,EAAA,EAAsD;AACpF,IAAA,MAAM,GAAA,GAAM,SAAS,IAAI,CAAA,CAAA;AACzB,IAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,IAAA,MAAM,KAAA,GAAQ,WAAW,YAAY;AACnC,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,CAAA;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,EAAG;AAAA,MACX,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAA,EAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAA;AAAA,MACxE;AAAA,IACF,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAC,CAAA;AAClB,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,UAAA,QAAkB,KAAA,EAAM;AACnD,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC1B,IAAA,OAAO;AAAA,MACL,QAAQ,MAAM;AACZ,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC/B,QAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,CACE,IAAA,EACA,MAAA,EACA,EAAA,EAC2B;AAC3B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AACzD,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AACvC,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAC3B,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,MAAM,KAAA,GAAQ,WAAW,YAAY;AACnC,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,CAAA;AACtB,QAAA,IAAI;AACF,UAAA,MAAM,GAAG,CAAC,CAAA;AAAA,QACZ,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,CAAA,UAAA,EAAa,IAAI,CAAA,OAAA,EAAU,CAAC,CAAA,OAAA,CAAA,EAAW,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAA;AAAA,QACrF;AAAA,MACF,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACrB,MAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,UAAA,QAAkB,KAAA,EAAM;AACnD,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IAC5B,CAAC,CAAA;AACD,IAAA,OAAO;AAAA,MACL,QAAQ,MAAM;AACZ,QAAA,IAAI,GAAA,GAAM,KAAA;AACV,QAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,UAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,GAAG,GAAA,GAAM,IAAA;AAChC,UAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,QACjB;AACA,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,CAAU,MAAc,EAAA,EAAoD;AAC1E,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,MAAA,KAAW,MAAA,EAAW;AAC7C,MAAA,KAAK,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,EAAA,EAAI,KAAK,MAAM,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,IAAI,CAAA;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAc,aAAA,CACZ,IAAA,EACA,GAAA,EACA,MAAA,EACe;AACf,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,WAAA,EAAa,EAAE,MAAM,EAAE,IAAA,IAAQ,CAAA;AAClD,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,MAAM,CAAA;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,CAAA,YAAA,EAAe,IAAI,CAAA,QAAA,CAAA,EAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAA;AAAA,IAC7E;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAA,EAA2B;AAC/B,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,KAAA,MAAWA,SAAQ,IAAA,CAAK,KAAA,CAAM,QAAO,EAAG,IAAA,CAAK,MAAMA,KAAI,CAAA;AACvD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA;AACzC,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,GAAA,EAAI,IAAK,OAAA,OAAc,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,GAAA,EAAK,MAAM,CAAA;AAAA,EAChF;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAAA,EAC9D;AAAA,EAEQ,OAAO,IAAA,EAAoB;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAClC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,MAAMA,KAAAA,EAA2B;AACvC,IAAA,IAAIA,KAAAA,CAAK,UAAA,EAAY,KAAK,IAAA,CAAK,QAAQA,KAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,aAAaA,KAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,SAASA,KAAAA,EAA6B;AAC5C,IAAA,IAAIA,KAAAA,CAAK,QAAA,KAAa,MAAA,EAAW,OAAOA,KAAAA,CAAK,QAAA;AAC7C,IAAA,IAAIA,KAAAA,CAAK,IAAA,KAAS,MAAA,EAAW,OAAO,KAAK,GAAA,CAAI,CAAA,EAAGA,KAAAA,CAAK,IAAA,CAAK,MAAK,CAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,KAAK,CAAA;AACvF,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEQ,aAAaA,KAAAA,EAA2B;AAC9C,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,IAAIA,KAAAA,CAAK,IAAA,EAAM,KAAK,QAAA,CAASA,KAAI,GAAG,MAAM;AAC7C,MAAA,KAAK,IAAA,CAAK,QAAQA,KAAI,CAAA;AACtB,MAAA,IAAA,CAAK,aAAaA,KAAI,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,GAAA,CAAI,IAAA,EAAc,KAAA,EAAe,IAAA,EAAwB;AAC/D,IAAA,IAAI,QAAQ,WAAA,EAAa;AAEvB,MAAA,MAAMC,MAAAA,GAAQ,UAAA,CAAW,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,KAAA,GAAQ,WAAA,EAAa,IAAI,CAAA,EAAG,WAAW,CAAA;AACrF,MAAA,IAAI,OAAOA,MAAAA,CAAM,KAAA,KAAU,UAAA,EAAYA,OAAM,KAAA,EAAM;AACnD,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAMA,MAAK,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,UAAA,CAAW,IAAA,EAAM,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACjD,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,UAAA,QAAkB,KAAA,EAAM;AACnD,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAc,QAAQD,KAAAA,EAAoC;AACxD,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,EAAE,IAAA,EAAM,EAAE,IAAA,EAAMA,KAAAA,CAAK,IAAA,EAAK,EAAG,CAAA;AACxD,IAAA,IAAI;AACF,MAAA,MAAMA,KAAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,CAAA,MAAA,EAASA,KAAAA,CAAK,IAAI,CAAA,QAAA,CAAA,EAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAA;AAAA,IAC5E;AAAA,EACF;AACF;;;AC7TO,SAAS,cAGd,MAAA,EAAsD;AACtD,EAAA,MAAM,MAAA,GACJ,MAAA,CAAO,IAAA,KAAS,MAAA,GACX,MAAA,CAAO,KAAK,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,GACnC,MAAA;AACN,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,IAC5B,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,UAAU,MAAA,CAAO,QAAA,KAAa,SAAY,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAAA,IAC/E,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,MAAA;AAAA,IACA,GAAA,EAAK,OAAO,GAAA,KAAQ;AAClB,MAAA,MAAM,MAAA,CAAO,IAAI,GAA2B,CAAA;AAAA,IAC9C;AAAA,GACF;AACF;AAGO,IAAM,gBAAN,MAEL;AAAA,EACA,YAEW,OAAA,EAEA,WAAA,EAEA,MAEA,IAAA,EAEA,OAAA,GAAiB,EAAC,EAC3B;AATS,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAEA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACR;AAAA,EATQ,OAAA;AAAA,EAEA,WAAA;AAAA,EAEA,IAAA;AAAA,EAEA,IAAA;AAAA,EAEA,OAAA;AAAA,EAGX,IAAI,MAAA,GAA4B;AAC9B,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACtB;AAAA,EACA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACtB;AAAA,EACA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACtB;AAAA,EACA,IAAI,KAAA,GAAQ;AACV,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACtB;AAAA,EACA,IAAI,OAAA,GAAyB;AAC3B,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA;AAAA,EACtB;AAAA,EACA,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA;AAAA,EACtB;AAAA,EACA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,KAAK,OAAA,CAAQ,SAAA;AAAA,EACtB;AAAA;AAAA,EAGA,MAAM,OAAA,EAA0E;AAC9E,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,MAAM,KAAK,OAAA,EAAuF;AAChG,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,OAAA;AAC7B,IAAA,IAAI,MAAA,IAAU,OAAA,EAAS,OAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAClD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAaA,SAAS,eAAe,KAAA,EAA0E;AAChG,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAE,QAAA,EAAU,CAAC,KAAK,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,iBAAiB,IAAA,EAAK;AAClH,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,QAAA,EAAU,CAAC,GAAG,KAAK,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAK;AAAA,EACxF;AACA,EAAA,MAAM,OAAA,GAAU,KAAA;AAChB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,OAAO,MAAA,KAAW,QAAA,GAAW,CAAC,MAAM,CAAA,GAAI,CAAC,GAAG,MAAM,CAAA;AAAA,IAC5D,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,UAAA,EAAY,QAAQ,UAAA,IAAc,IAAA;AAAA,IAClC,eAAA,EAAiB,QAAQ,eAAA,IAAmB,IAAA;AAAA,IAC5C,SAAS,OAAA,CAAQ;AAAA,GACnB;AACF;AAEA,SAAS,iBAAiB,OAAA,EAAiC;AACzD,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,OAAA,GAAU,MAAA,KAAW,IAAA,GAAO,CAAC,GAAG,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAA,GAAI,EAAC;AACpE,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,QAAQ,MAAA,CAAO,EAAA;AAAA,IACvB,OAAA;AAAA,IACA,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,WAAW,OAAA,CAAQ;AAAA,GACrB;AACF;AAGO,IAAM,iBAAN,MAAqB;AAAA,EACT,QAAA,uBAAe,GAAA,EAA2B;AAAA,EAC1C,MAAA,uBAAa,GAAA,EAA2B;AAAA,EACjD,OAAA,GAAiC;AAAA,IACvC,UAAU,EAAC;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,eAAA,EAAiB;AAAA,GACnB;AAAA,EACQ,MAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAkC,EAAC;AAAA,EACnC,OAAA;AAAA;AAAA,EAGR,WAAW,KAAA,EAAyD;AAClE,IAAA,IAAA,CAAK,OAAA,GAAU,eAAe,KAAK,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,IAAA,EAAyC;AACpD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,YAAA,CAAa,SAA0B,eAAA,EAAwC;AAC7E,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,iBAAiB,MAAA,EAAgC;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ,OAAA,EAAmC;AACzC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,QAAA,EAAiC;AACtC,IAAA,KAAA,MAAWZ,YAAW,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIA,QAAAA,CAAQ,IAAA,EAAMA,QAAO,CAAA;AACvC,MAAA,IAAA,CAAK,KAAA,CAAMA,QAAAA,CAAQ,IAAA,EAAMA,QAAO,CAAA;AAChC,MAAA,KAAA,MAAW,SAASA,QAAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,OAAOA,QAAO,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,KAAA,CAAM,KAAaA,QAAAA,EAA8B;AACvD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,IAAA,CAAK,OAAA,CAAQ,kBAAkB,GAAA,CAAI,WAAA,EAAY,GAAI,GAAA,EAAKA,QAAO,CAAA;AAAA,EACjF;AAAA;AAAA,EAGA,IAAI,WAAA,EAAgD;AAClD,IAAA,OAAO,IAAA,CAAK,OAAO,GAAA,CAAI,IAAA,CAAK,QAAQ,eAAA,GAAkB,WAAA,CAAY,WAAA,EAAY,GAAI,WAAW,CAAA;AAAA,EAC/F;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EACvB;AAAA;AAAA,EAGA,IAAA,GAAwB;AACtB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA,EAGQ,WAAA,CACN,OAAA,EACA,KAAA,EACA,QAAA,EACe;AACf,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,IACzF;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,KAAA,KAAU,MAAA,EAAW;AAC/C,MAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC3C,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,KAAA,EAAO,OAAO,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,IAChF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,gBAAgB,OAAA,EAAqC;AACjE,IAAA,IAAI,KAAK,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW,OAAO,KAAK,OAAA,CAAQ,QAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAChD,IAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,KAAK,OAAA,CAAQ,QAAA;AAC/D,IAAA,MAAM,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,CAAC,KAAK,CAAA,GAAI,KAAA;AACnD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,GAAG,IAAI,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,OAAA,EAAoC;AAC/C,IAAA,MAAM,UAAA,GACJ,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,OAAA,KAAY,MAAA;AACvF,IAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,IAAA,IAAI,KAAK,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,MAAA,CAAO,KAAK,OAAO,KAAA;AAE1D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,CAAY,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,EAAA,EAAI,QAAQ,CAAA;AACpF,IAAA,IAAI,QAAA,KAAa,MAAM,OAAO,KAAA;AAE9B,IAAA,MAAM,OAAA,GAAU,SAAS,SAAA,EAAU;AACnC,IAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAChD,IAAA,IAAI,KAAA,KAAU,MAAM,OAAO,KAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,IAAA,MAAMA,QAAAA,GAAU,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC7B,IAAA,IAAIA,QAAAA,KAAY,QAAW,OAAO,KAAA;AAElC,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,QAAA,EAAU,EAAE,MAAM,EAAE,OAAA,EAASA,QAAAA,CAAQ,IAAA,EAAM,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,EAAA,IAAM,CAAA;AAEzF,IAAA,MAAM,QAAA,GAAWA,QAAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,eAAA;AAC1C,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW;AAC1D,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAA,OAAA,EAAUA,QAAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,QAAA,EAAU,gBAAA,CAAiB,OAAO,CAAC,CAAA;AACnG,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,OAAA,CAAQ,KAAA,CAAM,qBAAA,CAAsB,QAAA,EAAU,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC5F,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAASc,cAAAA,CAAc,IAAA,CAAK,aAAA,EAAed,SAAQ,MAAM,CAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,QAAA,GAAW,wBAAwB,OAAO,CAAA;AAChD,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,CAAA;AACpD,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,eAAA,EAAiB;AAAA,UAClC,IAAA,EAAM;AAAA,YACJ,SAASA,QAAAA,CAAQ,IAAA;AAAA,YACjB,IAAA,EAAM,QAAQ,MAAA,CAAO,EAAA;AAAA,YACrB,MAAA,EAAQ,YAAY,MAAA,IAAU;AAAA;AAChC,SACD,CAAA;AACD,QAAA,MAAM,kBAAA,CAAmB,OAAA,EAAS,WAAA,CAAY,MAAM,CAAA;AACpD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,GAAS,CAAA,GAAI,KAAK,KAAA,CAAM,KAAK,IAAI,EAAC;AACpD,IAAA,IAAI,UAAmC,EAAC;AACxC,IAAA,IAAIA,QAAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,MAAA,MAAM,MAAA,GAASA,QAAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9C,MAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,kBAAA,EAAoB;AAAA,UACrC,IAAA,EAAM,EAAE,OAAA,EAASA,QAAAA,CAAQ,MAAM,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,EAAA,EAAI,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,MAAA,EAAQ,OAAO,MAAA;AAAO,SAChG,CAAA;AACD,QAAA,MAAM,MAAA,GAASI,aAAAA,CAAa,OAAA,CAAQ,MAAM,CAAA;AAC1C,QAAA,MAAM,OAAA,CAAQ,MAAM,EAAE,MAAA,EAAQ,CAAC,MAAA,CAAO,KAAA,CAAM,cAAc,MAAA,CAAO,GAAG,OAAO,MAAA,CAAO,MAAM,EAAE,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACrH,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAA,GAAU,MAAA,CAAO,MAAA;AAAA,IACnB;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAI;AACF,MAAA,MAAMJ,QAAAA,CAAQ,IAAI,IAAI,aAAA,CAAc,SAAS,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,CAAkB,CAAA;AACxF,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,MAAMA,QAAAA,CAAQ,IAAA;AAAA,QACd,OAAA,EAAS,SAAA;AAAA,QACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,MAAA,EAAQ,QAAQ,MAAA,CAAO,EAAA;AAAA,QACvB,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA;AAAA,QACxB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,QAAQ,KAAK,CAAA;AACzB,MAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA,gBAAA,EAAmBA,QAAAA,CAAQ,IAAI,CAAA,QAAA,CAAA,EAAY,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA;AAC5E,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,MAAMA,QAAAA,CAAQ,IAAA;AAAA,QACd,OAAA,EAAS,OAAA;AAAA,QACT,cAAc,GAAA,CAAI,OAAA;AAAA,QAClB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,MAAA,EAAQ,QAAQ,MAAA,CAAO,EAAA;AAAA,QACvB,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA;AAAA,QACxB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AACD,MAAA,IAAI,KAAK,YAAA,KAAiB,MAAA,QAAiB,IAAA,CAAK,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA,IAC3E;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAASc,cAAAA,CAAc,UAA4B,GAAA,EAAqD;AACtG,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,QAAA;AAClD,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAClC,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,GAAG,GAAG,CAAA;AAC7B;AAEA,SAAS,wBAAwB,OAAA,EAAgC;AAC/D,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,MAAM,OAAA,CAAQ,MAAA;AAAA,IACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,WAAW,OAAA,CAAQ;AAAA,GACrB;AACF;AAEA,SAASV,cAAa,MAAA,EAA+C;AACnE,EAAA,OAAS,OAA+B,MAAA,IAAW,aAAA;AACrD;AAEA,eAAe,kBAAA,CAAmB,SAAkB,MAAA,EAA2C;AAC7F,EAAA,MAAM,MAAA,GAASA,aAAAA,CAAa,OAAA,CAAQ,MAAM,CAAA;AAC1C,EAAA,MAAM,OAAO,MAAA,IAAU,wCAAA;AACvB,EAAA,MAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,MAAA,EAAQ,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC7E;AClXO,IAAM,mBAAN,MAA6C;AAAA,EAGlD,WAAA,CAA6B,KAAA,GAAgB,MAAA,CAAO,iBAAA,EAAmB;AAA1C,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAA2C;AAAA,EAA3C,KAAA;AAAA,EAFZ,SAAuB,EAAC;AAAA,EAIzC,OAAOW,MAAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAKA,MAAK,CAAA;AACtB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,KAAK,KAAK,CAAA;AAAA,EAC5F;AAAA,EAEA,GAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA,EAGA,OAAO,MAAA,EAA8B;AACnC,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,CAACA,MAAAA,KAAUA,MAAAA,CAAM,WAAW,MAAM,CAAA;AAAA,EAC9D;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,MAAA,GAAS,CAAA;AAAA,EACvB;AACF;AAiBO,IAAM,qBAAN,MAA+C;AAAA,EACpD,YAA6B,IAAA,EAAc;AAAd,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAe;AAAA,EAAf,IAAA;AAAA,EAE7B,MAAM,OAAOA,MAAAA,EAAkC;AAC7C,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,EAAE,GAAGA,MAAAA,EAAO,SAAA,EAAWA,MAAAA,CAAM,SAAA,CAAU,WAAA,EAAY,EAAG,CAAC;AAAA,CAAA;AACtF,IAAA,MAAMN,KAAAA,CAAMC,QAAQ,IAAA,CAAK,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,IAAA,MAAMM,UAAAA,CAAW,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,GAAA,GAAsC;AAC1C,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAMtB,UAAAA,CAAS,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,IAC5C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,SAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,MAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAGO,SAAS,YAAYqB,MAAAA,EAA2B;AACrD,EAAA,MAAM,GAAA,GAAMA,OAAM,OAAA,KAAYA,MAAAA,CAAM,WAAW,MAAA,GAAY,CAAA,EAAA,EAAKA,MAAAA,CAAM,MAAM,CAAA,CAAA,CAAA,GAAM,SAAA,CAAA;AAClF,EAAA,MAAM,KAAA,GACJA,MAAAA,CAAM,SAAA,KAAc,MAAA,IAAaA,MAAAA,CAAM,cAAc,IAAA,GAAO,CAAA,MAAA,EAASA,MAAAA,CAAM,SAAS,CAAA,CAAA,CAAA,GAAM,EAAA;AAC5F,EAAA,MAAM,SAASA,MAAAA,CAAM,MAAA,KAAW,SAAY,CAAA,QAAA,EAAMA,MAAAA,CAAM,MAAM,CAAA,CAAA,GAAK,EAAA;AACnE,EAAA,OAAO,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAI,CAAA,KAAA,EAAQA,MAAAA,CAAM,IAAI,CAAA,MAAA,EAAS,GAAG,CAAA,EAAG,KAAK,CAAA,EAAG,MAAM,CAAA,CAAA;AACvE;AAqBO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAExB,KAAA;AAAA,EACQ,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAGR,IAAI,OAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,QAAA,KAAa,MAAA;AAAA,EACvD;AAAA;AAAA,EAGA,UAAU,MAAA,EAA2B;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,KAAA,EAAyB;AAChC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,QAAA,CAAS,SAAA,EAAmB,MAAA,GAAwC,WAAA,EAAmB;AACrF,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,SAAA,EAAW,MAAA,EAAO;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAMA,MAAAA,EAAyB;AAC7B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,KAAK,IAAA,CAAK,IAAIA,MAAK,CAAA;AAAA,EACrB;AAAA,EAEA,MAAc,IAAIA,MAAAA,EAAkC;AAClD,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAOA,MAAK,CAAA;AAAA,MAC/B,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,oBAAA,EAAsB,EAAE,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,MACpE;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,IAAa,IAAA,CAAK,WAAW,MAAA,EAAW;AAC5D,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,QAAA,CAAS,MAAM,GAAA,CAAI,IAAA,CAAK,SAAS,SAAS,CAAA;AACpE,QAAA,MAAM,OAAA,GAAU,SAAU,MAAM,IAAA,CAAK,OAAO,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAClF,QAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,MAAA,IAAU,OAAA,EAAS;AACzC,UAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,CAAOA,MAAK,CAAC,CAAA;AAAA,QAChD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,qBAAA,EAAuB,EAAE,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;ACjFA,SAAS,UAAA,CACP,MACA,MAAA,EACkC;AAClC,EAAA,OAAO,EAAE,IAAA,EAAM,GAAG,QAAQ,QAAA,EAAW,MAAA,CAAO,YAAY,KAAA,EAAwB;AAClF;AAaO,IAAM,MAAA,GAAS;AAAA,EACpB,OAAqC,MAAA,EAA6D;AAChG,IAAA,OAAO,UAAA,CAAW,4BAAA,CAA6B,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC/D,CAAA;AAAA,EACA,QAAuC,MAAA,EAA6D;AAClG,IAAA,OAAO,UAAA,CAAW,4BAAA,CAA6B,OAAA,EAAS,MAAM,CAAA;AAAA,EAChE,CAAA;AAAA,EACA,OAAsC,MAAA,EAA6D;AACjG,IAAA,OAAO,UAAA,CAAW,4BAAA,CAA6B,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC/D,CAAA;AAAA,EACA,QAAoC,MAAA,EAA8C;AAChF,IAAA,OAAO,UAAA,CAAW,4BAAA,CAA6B,OAAA,EAAS,MAAM,CAAA;AAAA,EAChE,CAAA;AAAA,EACA,KAAiC,MAAA,EAAgD;AAC/E,IAAA,OAAO,UAAA,CAAW,4BAAA,CAA6B,IAAA,EAAM,MAAM,CAAA;AAAA,EAC7D,CAAA;AAAA,EACA,QAAuC,MAAA,EAAmD;AACxF,IAAA,OAAO,UAAA,CAAW,4BAAA,CAA6B,OAAA,EAAS,MAAM,CAAA;AAAA,EAChE,CAAA;AAAA,EACA,KAAiC,MAAA,EAAgD;AAC/E,IAAA,OAAO,UAAA,CAAW,4BAAA,CAA6B,IAAA,EAAM,MAAM,CAAA;AAAA,EAC7D,CAAA;AAAA,EACA,YAAwC,MAAA,EAAuD;AAC7F,IAAA,OAAO,UAAA,CAAW,4BAAA,CAA6B,WAAA,EAAa,MAAM,CAAA;AAAA,EACpE,CAAA;AAAA,EACA,WAAuC,MAAA,EAAsD;AAC3F,IAAA,OAAO,UAAA,CAAW,4BAAA,CAA6B,UAAA,EAAY,MAAM,CAAA;AAAA,EACnE;AACF;AAEA,SAAS,WACP,OAAA,EACoD;AACpD,EAAA,OAAO,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC1B,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,oBAAoB,CAAA,CAAE;AAAA,GACxB,CAAE,CAAA;AACJ;AAGO,SAAS,WAAA,CAAY,MAAc,GAAA,EAAqD;AAC7F,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,IAAA;AAAA,IACA,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,oBAAoB,GAAA,CAAI,iBAAA;AAAA,IACxB,2BAA2B,GAAA,CAAI;AAAA,GACjC;AAEA,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,6BAA6B,MAAA,EAAQ;AACxC,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAQ,YAAY,GAAA,CAAI,SAAA,EAAW,UAAA,EAAY,GAAA,CAAI,SAAA,EAAU;AAC/E,MAAA,OAAO,GAAA,CAAI,iBAAiB,MAAA,GACxB,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,4BAAA,CAA6B,MAAA,EAAQ,YAAA,EAAc,IAAA,KACpE,EAAE,GAAG,MAAM,IAAA,EAAM,4BAAA,CAA6B,QAAQ,OAAA,EAAS,UAAA,CAAmB,GAAA,CAAI,OAAO,CAAA,EAAE;AAAA,IACrG;AAAA,IACA,KAAK,6BAA6B,OAAA,EAAS;AACzC,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAQ,WAAW,GAAA,CAAI,QAAA,EAAU,SAAA,EAAW,GAAA,CAAI,QAAA,EAAS;AAC3E,MAAA,OAAO,GAAA,CAAI,iBAAiB,MAAA,GACxB,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,4BAAA,CAA6B,OAAA,EAAS,YAAA,EAAc,IAAA,KACrE,EAAE,GAAG,MAAM,IAAA,EAAM,4BAAA,CAA6B,SAAS,OAAA,EAAS,UAAA,CAAmB,GAAA,CAAI,OAAO,CAAA,EAAE;AAAA,IACtG;AAAA,IACA,KAAK,6BAA6B,MAAA,EAAQ;AACxC,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAQ,WAAW,GAAA,CAAI,QAAA,EAAU,SAAA,EAAW,GAAA,CAAI,QAAA,EAAS;AAC3E,MAAA,OAAO,GAAA,CAAI,iBAAiB,MAAA,GACxB,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,4BAAA,CAA6B,MAAA,EAAQ,YAAA,EAAc,IAAA,KACpE,EAAE,GAAG,MAAM,IAAA,EAAM,4BAAA,CAA6B,QAAQ,OAAA,EAAS,UAAA,CAAmB,GAAA,CAAI,OAAO,CAAA,EAAE;AAAA,IACrG;AAAA,IACA,KAAK,4BAAA,CAA6B,OAAA;AAChC,MAAA,OAAO;AAAA,QACL,GAAG,MAAA;AAAA,QACH,MAAM,4BAAA,CAA6B,OAAA;AAAA,QACnC,eAAe,GAAA,CAAI,YAAA,GAAe,CAAC,GAAG,GAAA,CAAI,YAAY,CAAA,GAAI;AAAA,OAC5D;AAAA,IACF,KAAK,4BAAA,CAA6B,IAAA;AAChC,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,6BAA6B,IAAA,EAAK;AAAA,IAC9D,KAAK,4BAAA,CAA6B,OAAA;AAChC,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,6BAA6B,OAAA,EAAQ;AAAA,IACjE,KAAK,4BAAA,CAA6B,IAAA;AAChC,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,6BAA6B,IAAA,EAAK;AAAA,IAC9D,KAAK,4BAAA,CAA6B,WAAA;AAChC,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,6BAA6B,WAAA,EAAY;AAAA,IACrE,KAAK,4BAAA,CAA6B,UAAA;AAChC,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,6BAA6B,UAAA,EAAW;AAAA,IACpE;AACE,MAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,6BAA6B,MAAA,EAAO;AAAA;AAEpE;AAGO,SAAS,UAAA,CACd,QAAA,EACA,IAAA,EACA,GAAA,EACyB;AACzB,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,4BAAA,CAA6B,MAAA;AAChC,MAAA,OAAO,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA,IAAK,MAAA;AAAA,IACrC,KAAK,4BAAA,CAA6B,OAAA;AAChC,MAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,IAAK,MAAA;AAAA,IACtC,KAAK,4BAAA,CAA6B,MAAA;AAChC,MAAA,OAAO,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA,IAAK,MAAA;AAAA,IACrC,KAAK,4BAAA,CAA6B,OAAA;AAChC,MAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,IAAK,MAAA;AAAA,IACtC,KAAK,4BAAA,CAA6B,IAAA;AAChC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,IAAK,MAAA;AAAA,IACnC,KAAK,4BAAA,CAA6B,OAAA;AAChC,MAAA,OAAO,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,IAAK,MAAA;AAAA,IACtC,KAAK,4BAAA,CAA6B,IAAA;AAChC,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,IAAK,MAAA;AAAA,IACnC,KAAK,4BAAA,CAA6B,WAAA;AAChC,MAAA,OAAO,QAAA,CAAS,cAAA,CAAe,IAAI,CAAA,IAAK,MAAA;AAAA,IAC1C,KAAK,4BAAA,CAA6B,UAAA;AAChC,MAAA,OAAO,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA,IAAK,MAAA;AAAA,IACzC;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAGO,SAAS,wBAAwB,OAAA,EAA6B;AACnE,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,EAAG;AACxC,IAAA,IAAI,GAAA,CAAI,YAAA,KAAiB,MAAA,EAAW,OAAO,IAAA;AAAA,EAC7C;AACA,EAAA,OAAO,KAAA;AACT;;;ACnQO,IAAM,cAAA,GAAN,cAA8D,WAAA,CAAyC;AAAA,EAC5G,WAAA,CACE,aAES,OAAA,EACT;AACA,IAAA,KAAA,CAAM,WAAW,CAAA;AAFR,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAGX;AAAA,EAHW,OAAA;AAAA,EAKX,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,WAAA,CAAY,WAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,UAAA,GAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,UACJjB,MAAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,SAAA,CAAUA,MAAK,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,CAAWA,QAAkB,OAAA,EAAqE;AAChG,IAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,WAAA,EAAaA,MAAAA,EAAO,OAAO,CAAA;AAAA,EAC3D;AACF;AAMO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAAqB,WAAA,EAAsC;AAAtC,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAAuC;AAAA,EAAvC,WAAA;AAAA,EAErB,IAAI,MAAA,GAAS;AACX,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA,EACA,IAAI,IAAA,GAAO;AACT,IAAA,OAAO,KAAK,WAAA,CAAY,IAAA;AAAA,EAC1B;AAAA,EACA,IAAI,KAAA,GAAQ;AACV,IAAA,OAAO,KAAK,WAAA,CAAY,KAAA;AAAA,EAC1B;AAAA,EACA,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC1B;AAAA,EACA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,WAAA,CAAY,WAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,CAAE,IAAA;AAAA,EACnD;AAAA;AAAA,EAGA,IAAI,KAAA,GAAgB;AAClB,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAW;AAAA,EAC7C;AAAA;AAAA,EAGA,QAAQ,OAAA,EAAyD;AAC/D,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,MACtB,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC/B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,oBAAoB,CAAA,CAAE;AAAA,OACxB,CAAE;AAAA,KACJ;AAAA,EACF;AACF;;;ACsBO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAEf,IAAA;AAAA;AAAA,EAEA,eAAA;AAAA,EACQ,IAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA;AAAA,EAER,QAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAGT,YAAY,IAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,eAAA;AAC5B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAAA,EACxB;AAAA;AAAA,EAGA,MAAA,GAA0D;AACxD,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA,EAGA,QAAQ,WAAA,EAAyD;AAC/D,IAAA,OAAO,IAAA,CAAK,SAAS,WAAW,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,aAAa,WAAA,EAAqD;AAChE,IAAA,OAAO,IAAA,CAAK,cAAc,WAAW,CAAA;AAAA,EACvC;AACF;AAEA,SAASmB,eAAAA,CACP,aACA,OAAA,EACyC;AACzC,EAAA,MAAM,WAAoD,EAAC;AAC3D,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjD,IAAA,QAAA,CAAS,IAAI,CAAA,GAAI,UAAA,CAAW,WAAA,CAAY,OAAA,EAAS,MAAM,GAAG,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,kBACP,OAAA,EACyD;AACzD,EAAA,OAAO,OAAO,WAAA,KAAgB;AAC5B,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAChC,IAAA,IAAI,GAAA,EAAK,iBAAiB,MAAA,EAAW;AACnC,MAAA,IAAI,CAAC,WAAA,CAAY,SAAA,QAAiB,WAAA,CAAY,OAAA,CAAQ,EAAE,CAAA;AACxD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,mBAAA,CAAoB,WAAW,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,YAAA,CAAa,GAAG,CAAA;AAC1C,IAAA,IAAI,CAAC,WAAA,CAAY,SAAA,EAAW,MAAM,GAAA,CAAI,QAAQ,OAAO,CAAA;AAAA,EACvD,CAAA;AACF;AAEA,SAASC,SAAAA,CACP,MACA,OAAA,EACiD;AACjD,EAAA,OAAO;AAAA,IACL,MAAMC,sBAAAA,CAAuB,SAAA;AAAA,IAC7B,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,oBAAoB,IAAA,CAAK,iBAAA;AAAA,IACzB,2BAA2B,IAAA,CAAK,wBAAA;AAAA,IAChC,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,0BAAA,EACE,IAAA,CAAK,wBAAA,IAA4B,IAAA,GAC7B,IAAA,CAAK,wBAAA,GACL,IAAItB,mBAAAA,CAAoB,IAAA,CAAK,wBAAwB,CAAA,CAAE,QAAA,CAAS,QAAA,EAAS;AAAA,IAC/E,UAAU,IAAA,CAAK,SAAA,GAAY,CAACuB,sBAAAA,CAAuB,KAAK,CAAA,GAAI,MAAA;AAAA,IAC5D;AAAA,GACF;AACF;AAEA,SAAS,gBAAgB,OAAA,EAAgF;AACvG,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,GAAG,CAAA,KAAM,WAAA,CAAY,IAAA,EAAM,GAAG,CAAC,CAAA;AAC5E;AAEA,SAAS,cAAA,CAAe,MAAc,GAAA,EAAwD;AAC5F,EAAA,OAAO;AAAA,IACL,MAAMC,4BAAAA,CAA6B,UAAA;AAAA,IACnC,IAAA;AAAA,IACA,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,oBAAoB,GAAA,CAAI,iBAAA;AAAA,IACxB,2BAA2B,GAAA,CAAI,wBAAA;AAAA,IAC/B,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAG,GAAG,CAAA,KAAM,WAAA,CAAY,CAAA,EAAG,GAAG,CAAC;AAAA,GAC5E;AACF;AAEA,SAAS,eAAA,CACP,SAAA,EACA,OAAA,EACA,WAAA,EACA,MAAA,EACwB;AACxB,EAAA,IAAI,SAAA,KAAc,MAAM,OAAO,MAAA,GAAS,SAAS,CAAA,EAAG,WAAA,CAAY,WAAW,EAAE,CAAA;AAC7E,EAAA,IAAI,OAAA,KAAY,IAAA,EAAM,OAAO,WAAA,GAAc,OAAO,CAAA;AAClD,EAAA,OAAO,MAAA;AACT;AAeO,SAAS,QACd,MAAA,EACc;AACd,EAAA,MAAM,OAAA,GAAqB,MAAA,CAAO,OAAA,IAAW,EAAC;AAC9C,EAAA,MAAM,EAAE,KAAI,GAAI,MAAA;AAChB,EAAA,MAAM,QAAA,GAAW,OAAO,WAAA,KAA4D;AAClF,IAAA,MAAM,QAAA,GAAWJ,eAAAA,CAAe,WAAA,EAAa,OAAO,CAAA;AACpD,IAAA,MAAM,GAAA,CAAI,IAAI,cAAA,CAAkB,WAAA,EAAa,QAAQ,CAAC,CAAA;AAAA,EACxD,CAAA;AACA,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,IAAA,EAAMC,SAAAA,CAAS,MAAA,EAAQ,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,IAC/C,eAAA,EAAiB,wBAAwB,OAAO,CAAA;AAAA,IAChD,QAAA;AAAA,IACA,aAAA,EAAe,kBAAkB,OAAO,CAAA;AAAA,IACxC,UAAU,MAAA,CAAO,QAAA,KAAa,SAAY,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAAA,IAC/E,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,SAAA,EAAW,kBAAA,CAAmB,MAAA,CAAO,SAAS;AAAA,GAC/C,CAAA;AACH;AAGO,SAAS,WACd,MAAA,EACY;AACZ,EAAA,MAAM,OAAA,GAAqB,MAAA,CAAO,OAAA,IAAW,EAAC;AAC9C,EAAA,MAAM,EAAE,KAAI,GAAI,MAAA;AAChB,EAAA,MAAM,OAAA,GAAU,OAAO,WAAA,KAA4D;AACjF,IAAA,MAAM,QAAA,GAAWD,eAAAA,CAAe,WAAA,EAAa,OAAO,CAAA;AACpD,IAAA,MAAM,GAAA,CAAI,IAAI,cAAA,CAAkB,WAAA,EAAa,QAAQ,CAAC,CAAA;AAAA,EACxD,CAAA;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAA;AAAA,IACA,mBAAmB,MAAA,CAAO,iBAAA;AAAA,IAC1B,0BAA0B,MAAA,CAAO,wBAAA;AAAA,IACjC,eAAA,EAAiB,wBAAwB,OAAO,CAAA;AAAA,IAChD,OAAA;AAAA,IACA,YAAA,EAAc,kBAAkB,OAAO;AAAA,GACzC;AACF;AAGO,SAAS,gBAAgB,MAAA,EAAgD;AAC9E,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,GAAG,MAAA,EAAO;AACpC;AAGO,SAAS,aAAa,MAAA,EAA0C;AACrE,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,MAAA;AAEhC,EAAA,MAAM,UACJ,EAAC;AACH,EAAA,KAAA,MAAW,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA,EAAG;AAC3D,IAAA,OAAA,CAAQ,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,EAAG;AACxD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,MAAMI,4BAAAA,CAA6B,eAAA;AAAA,MACnC,IAAA;AAAA,MACA,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,oBAAoB,KAAA,CAAM,iBAAA;AAAA,MAC1B,2BAA2B,KAAA,CAAM,wBAAA;AAAA,MACjC,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,EAAG,CAAC,CAAC;AAAA,KAChF,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,eAAA,GACJ,MAAA,CAAO,MAAA,CAAO,WAAA,IAAe,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,CAAA,IAC9D,OAAO,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,OAAO,MAAA,CAAO,CAAA,CAAE,WAAW,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,CAAC,CAAA;AAErG,EAAA,MAAM,QAAA,GAAW,OAAO,WAAA,KAA4D;AAClF,IAAA,MAAM,MAAA,GAAS,eAAA;AAAA,MACb,WAAA,CAAY,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC5C,WAAA,CAAY,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,MACvC,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,MAAA,CAAO,QAAQ,WAAW,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAO,WAAA,KAAwD;AACnF,IAAA,MAAM,MAAA,GAAS,eAAA;AAAA,MACb,WAAA,CAAY,OAAA,CAAQ,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC5C,WAAA,CAAY,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,MACvC,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,IAAI,CAAC,WAAA,CAAY,SAAA,QAAiB,WAAA,CAAY,OAAA,CAAQ,EAAE,CAAA;AACxD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,CAAO,aAAa,WAAW,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA,IACtB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,IAAA,EAAMH,SAAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC9B,eAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAU,MAAA,CAAO,QAAA,KAAa,SAAY,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAAA,IAC/E,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,SAAA,EAAW,kBAAA,CAAmB,MAAA,CAAO,SAAS;AAAA,GAC/C,CAAA;AACH;ACrTO,IAAM,kBAAN,MAAsB;AAAA,EACV,QAAA,uBAAe,GAAA,EAA0B;AAAA,EAClD,YAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAkC,EAAC;AAAA,EACnC,OAAA;AAAA,EACA,gBAAA;AAAA;AAAA,EAGR,OAAO,QAAA,EAAgC;AACrC,IAAA,KAAA,MAAWlB,YAAW,QAAA,EAAU,IAAA,CAAK,SAAS,GAAA,CAAIA,QAAAA,CAAQ,MAAMA,QAAO,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,IAAA,EAAuB;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,IAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,GAAA,GAAsB;AACpB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,IAAI,KAAA,GAAkB;AACpB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EACvB;AAAA;AAAA,EAGA,QAAQ,OAAA,EAAoC;AAC1C,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,YAAA,CAAa,SAA0B,eAAA,EAAwC;AAC7E,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,iBAAiB,MAAA,EAAgC;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,MAAA,EAAgC;AAC3C,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,IAAA,EAAyC;AACpD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAA,GAAmD;AACjD,IAAA,OAAO,IAAA,CAAK,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,OAAO,WAAA,EAAyD;AACpE,IAAA,MAAMA,QAAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,YAAY,WAAW,CAAA;AACzD,IAAA,IAAIA,aAAY,MAAA,EAAW;AAC3B,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,SAAA,EAAW;AAAA,MAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,WAAA,CAAY,aAAa,IAAA,EAAM,WAAA,CAAY,KAAK,EAAA;AAAG,KACrE,CAAA;AACD,IAAA,MAAM,QAAA,GAAWA,QAAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,eAAA;AAC1C,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW;AAC1D,MAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,OAAA,CAAQA,SAAQ,IAAA,EAAM,QAAA,EAAUsB,QAAAA,CAAQ,WAAW,CAAC,CAAA;AAClF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,WAAA,EAAa,QAAA,EAAU,OAAO,SAAS,CAAA;AAChE,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAASR,cAAAA,CAAc,IAAA,CAAK,aAAA,EAAed,SAAQ,MAAM,CAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,WAAA,EAAa,MAAM,CAAA;AACvD,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,gBAAA,EAAkB;AAAA,UACnC,IAAA,EAAM;AAAA,YACJ,SAASA,QAAAA,CAAQ,IAAA;AAAA,YACjB,IAAA,EAAM,YAAY,IAAA,CAAK,EAAA;AAAA,YACvB,MAAA,EAAQ,YAAY,MAAA,IAAU;AAAA;AAChC,SACD,CAAA;AACD,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,WAAA,EAAa,WAAA,CAAY,MAAM,CAAA;AACtD,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAYA,QAAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,gBAAA;AAC5C,IAAA,MAAM,kBAAkB,SAAA,KAAc,MAAA,GAAY,YAAA,CAAa,WAAA,EAAa,SAAS,CAAA,GAAI,MAAA;AACzF,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAI;AACF,MAAA,MAAMA,QAAAA,CAAQ,QAAQ,WAAW,CAAA;AACjC,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,MAAMA,QAAAA,CAAQ,IAAA;AAAA,QACd,OAAA,EAAS,SAAA;AAAA,QACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,MAAA,EAAQ,YAAY,IAAA,CAAK,EAAA;AAAA,QACzB,OAAA,EAAS,YAAY,IAAA,CAAK,GAAA;AAAA,QAC1B,SAAS,WAAA,CAAY,OAAA;AAAA,QACrB,WAAW,WAAA,CAAY,SAAA;AAAA,QACvB,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,MAAMA,QAAAA,CAAQ,IAAA;AAAA,QACd,OAAA,EAAS,OAAA;AAAA,QACT,cAAc,GAAA,CAAI,OAAA;AAAA,QAClB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,MAAA,EAAQ,YAAY,IAAA,CAAK,EAAA;AAAA,QACzB,OAAA,EAAS,YAAY,IAAA,CAAK,GAAA;AAAA,QAC1B,SAAS,WAAA,CAAY,OAAA;AAAA,QACrB,WAAW,WAAA,CAAY,SAAA;AAAA,QACvB,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AACD,MAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,WAAW,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,WAAW,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA,SAAE;AACA,MAAA,eAAA,IAAkB;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,mBAAmB,WAAA,EAAqD;AAC5E,IAAA,MAAMA,QAAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,YAAY,WAAW,CAAA;AACzD,IAAA,IAAIA,aAAY,MAAA,EAAW;AAC3B,IAAA,IAAI;AACF,MAAA,MAAMA,QAAAA,CAAQ,aAAa,WAAW,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAI,CAAC,WAAA,CAAY,SAAA,EAAW,MAAM,WAAA,CAAY,OAAA,CAAQ,EAAE,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IACjF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,OAAA,EAA+C;AAC1D,IAAA,IAAI,OAAO,OAAA,CAAQ,IAAA;AACnB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,QAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,MACzF;AACA,MAAA,IAAA,GAAO,IAAI,IAAA,EAAK,CAAE,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,IAC1C;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,EAAO;AACzB,IAAA,MAAM,KAAA,GACJ,OAAA,CAAQ,OAAA,KAAY,MAAA,GAChB,OAAO,wBAAA,CAAyB,OAAA,CAAQ,aAAA,EAAe,OAAA,CAAQ,OAAO,CAAA,GACtE,MAAA,CAAO,mBAAA,CAAoB,QAAQ,aAAa,CAAA;AACtD,IAAA,OAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAE,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,MAAc,iBAAA,CACZ,KAAA,EACA,WAAA,EACe;AACf,IAAA,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AACtC,IAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,KAAK,CAAA,IAAK,kDAAA;AAC9C,IAAA,IAAI;AACF,MAAA,IAAI,YAAY,QAAA,EAAU;AACxB,QAAA,MAAM,WAAA,CAAY,SAAA,CAAU,EAAE,OAAA,EAAS,CAAA;AAAA,MACzC,CAAA,MAAA,IAAW,YAAY,OAAA,EAAS;AAC9B,QAAA,MAAM,YAAY,QAAA,CAAS,EAAE,SAAS,KAAA,EAAOD,YAAAA,CAAa,WAAW,CAAA;AAAA,MACvE,CAAA,MAAO;AACL,QAAA,MAAM,YAAY,KAAA,CAAM,EAAE,SAAS,KAAA,EAAOA,YAAAA,CAAa,WAAW,CAAA;AAAA,MACpE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,aAAA,CACZ,WAAA,EACA,MAAA,EACA,SAAA,EACe;AACf,IAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,UAAA,EAAY;AAAA,MAC7B,IAAA,EAAM,EAAE,OAAA,EAAS,WAAA,CAAY,aAAa,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,EAAA,EAAI,SAAA;AAAU,KAChF,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,MAAA,EAAQ,SAAS,CAAA;AACvD,IAAA,IAAI;AACF,MAAA,IAAI,YAAY,QAAA,EAAU,MAAM,YAAY,SAAA,CAAU,EAAE,SAAS,CAAA;AAAA,WAAA,IACxD,WAAA,CAAY,OAAA,EAAS,MAAM,WAAA,CAAY,QAAA,CAAS,EAAE,OAAA,EAAS,KAAA,EAAOA,YAAAA,CAAa,SAAA,EAAW,CAAA;AAAA,WAC9F,MAAM,YAAY,KAAA,CAAM,EAAE,SAAS,KAAA,EAAOA,YAAAA,CAAa,WAAW,CAAA;AAAA,IACzE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,CACZ,WAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,MAAA,GAASK,aAAAA,CAAa,WAAA,CAAY,MAAM,CAAA;AAC9C,IAAA,MAAM,OAAO,MAAA,IAAU,wCAAA;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAQ,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,KAAA,EAAOL,YAAAA,CAAa,SAAA,EAAU;AAC9E,MAAA,IAAI,WAAA,CAAY,UAAU,MAAM,WAAA,CAAY,UAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,WAAA,IACvE,WAAA,CAAY,OAAA,EAAS,MAAM,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,WAC3D,MAAM,WAAA,CAAY,KAAA,CAAM,OAAO,CAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAASe,cAAAA,CAAc,UAA4B,GAAA,EAAqD;AACtG,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,QAAA;AAClD,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAClC,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,GAAG,GAAG,CAAA;AAC7B;AAEA,SAASV,cAAa,MAAA,EAA+C;AACnE,EAAA,MAAM,IAAA,GAAO,MAAA;AACb,EAAA,OAAO,KAAK,MAAA,IAAU,aAAA;AACxB;AAEA,SAASkB,SAAQ,WAAA,EAAyD;AACxE,EAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAC3B,EAAA,IAAI,UAA6B,EAAC;AAClC,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,EACjE;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,YAAY,IAAA,CAAK,EAAA;AAAA,IACzB,OAAA;AAAA,IACA,SAAS,WAAA,CAAY,OAAA;AAAA,IACrB,WAAW,WAAA,CAAY;AAAA,GACzB;AACF;;;AC7RA,SAASC,SAAQ,KAAA,EAAuB;AACtC,EAAA,OAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACjE;AAEA,SAAS,KAAA,CAAoC,IAAA,EAAS,IAAA,EAAe,GAAA,EAAgC;AACnG,EAAA,MAAM,SAAA,uBAAgB,OAAA,EAAoD;AAC1E,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAO,MAAA,EAAQ;AACb,MAAA,MAAM,QAAA,GAAW,IAAI,IAAA,KAAgC;AACnD,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAG,IAAI,CAAA;AAC1B,UAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,YAAA,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAmB,MAAA,CAAO,KAAK,OAAA,EAASA,QAAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AAAA,UACvE;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA,CAAK,OAAA,EAASA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QACrC;AAAA,MACF,CAAA;AACA,MAAA,SAAA,CAAU,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAC9B,MAAA,IAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA;AAAA,WAC/B,MAAA,CAAO,EAAA,CAAG,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC/B,CAAA;AAAA,IACA,OAAO,MAAA,EAAQ;AACb,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AACrC,MAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,QAAA,MAAA,CAAO,GAAA,CAAI,MAAM,QAAQ,CAAA;AACzB,QAAA,SAAA,CAAU,OAAO,MAAM,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,GACF;AACF;AAiBO,SAAS,KAAA,CACd,cACA,GAAA,EACU;AACV,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,OAAO,MAAM,YAAA,CAAa,IAAA,EAAM,aAAa,IAAA,IAAQ,KAAA,EAAO,aAAa,GAAG,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,KAAA,CAAM,YAAA,EAAc,KAAA,EAAO,GAAG,CAAA;AACvC;AAGO,IAAM,gBAAN,MAAoB;AAAA,EACR,SAAqB,EAAC;AAAA,EACtB,QAAA,uBAAe,GAAA,EAAY;AAAA;AAAA,EAG5C,OAAO,IAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAG,IAAI,CAAA;AACxB,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,QAAA,EAAU;AAClC,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA,EAGA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,MAAM,CAAA;AACxB,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,EAClD;AAAA;AAAA,EAGA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,MAAM,CAAA;AAC3B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,EAClD;AACF;;;AChGO,IAAM,oBAAA,GAAuB;AAEpC,IAAM,aAAA,GAAgB,uBAAA;AAUf,SAAS,eAAe,OAAA,EAAkC;AAC/D,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAClC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,CAAC,CAAA,IAAK,EAAA;AACjC,EAAA,IAAI,UAAU,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACpD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,wCAAwC,OAAO,CAAA,+CAAA;AAAA,KACjD;AAAA,EACF;AACA,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,QAAQ,aAAA,CAAc,IAAA,CAAK,QAAA,CAAS,CAAC,KAAK,EAAE,CAAA;AAClD,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,qCAAA,EAAwC,OAAO,CAAA,YAAA,EAAe,QAAA,CAAS,CAAC,CAAC,CAAA,oBAAA;AAAA,OAC3E;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAW,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,SAAA,EAAW,UAAA,EAAW;AAC1C;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,MAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,OAAA,CAAQ,MAAM,KAAK,CAAA;AACvD;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,MAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACvD;AAGO,SAAS,aAAA,CACd,UACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,CAAS,SAAS,CAAA;AACjC,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,UAAA,EAAY;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAI,CAAA,iBAAA,EAAoB,QAAA,CAAS,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IACzF;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,IAAI,EAAA,CAAG,SAAS,oBAAA,EAAsB;AACpC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,EAAE,CAAA,cAAA,EAAiB,oBAAoB,CAAA,wBAAA;AAAA,KACjE;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AASO,SAAS,cAAc,QAAA,EAAkC;AAC9D,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,CAAC,CAAA,IAAK,EAAA;AACjC,EAAA,MAAM,SAAS,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,CAAE,IAAI,WAAW,CAAA;AAChD,EAAA,OAAO,EAAE,WAAW,MAAA,EAAO;AAC7B;AAGO,SAAS,gBAAA,CACd,YACA,MAAA,EACwB;AACxB,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAA,CAAO,WAAW,CAAC,CAAW,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,EAAA;AAAA,EACjD;AACA,EAAA,OAAO,MAAA;AACT;;;AC3EO,IAAM,uBAAA,GAAN,cAGG,WAAA,CAAe;AAAA,EACvB,WAAA,CACE,aAES,MAAA,EACT;AACA,IAAA,KAAA,CAAM,WAAW,CAAA;AAFR,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAGX;AAAA,EAHW,MAAA;AAAA;AAAA,EAMX,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,WAAA,CAAY,QAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,OAAO,KAAA,EAAmC;AAC9C,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,MAAM,WAAA,GAA6B;AACjC,IAAA,MAAM,IAAA,CAAK,YAAY,WAAA,EAAY;AAAA,EACrC;AAAA;AAAA,EAGA,MAAM,UACJzB,MAAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,SAAA,CAAUA,MAAK,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,CAAWA,QAAkB,OAAA,EAAqE;AAChG,IAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,WAAA,EAAaA,MAAAA,EAAO,OAAO,CAAA;AAAA,EAC3D;AACF;AAGO,IAAM,aAAA,GAAN,cAAuD,uBAAA,CAG5D;AAAC;AAGI,IAAM,mBAAA,GAAN,cAA6D,uBAAA,CAGlE;AAAA;AAAA,EAEA,IAAI,MAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA;AAAA,EAEA,IAAI,KAAA,GAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA;AAAA,EAClC;AACF;AAGO,IAAM,iBAAA,GAAN,cAA2D,uBAAA,CAGhE;AAAA,EACA,IAAI,MAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA,EACA,IAAI,KAAA,GAAQ;AACV,IAAA,OAAO,KAAK,WAAA,CAAY,KAAA;AAAA,EAC1B;AAAA,EACA,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC1B;AACF;AAGO,IAAM,iBAAA,GAAN,cAA2D,uBAAA,CAGhE;AAAA,EACA,IAAI,MAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA,EACA,IAAI,KAAA,GAAQ;AACV,IAAA,OAAO,KAAK,WAAA,CAAY,KAAA;AAAA,EAC1B;AACF;AAGO,IAAM,oBAAA,GAAN,cAA8D,uBAAA,CAGnE;AAAA,EACA,IAAI,MAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA,EACA,IAAI,QAAA,GAAW;AACb,IAAA,OAAO,KAAK,WAAA,CAAY,QAAA;AAAA,EAC1B;AACF;AAGO,IAAM,wBAAA,GAAN,cAAkE,uBAAA,CAGvE;AAAA,EACA,IAAI,MAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA,EACA,IAAI,KAAA,GAAQ;AACV,IAAA,OAAO,KAAK,WAAA,CAAY,KAAA;AAAA,EAC1B;AAAA,EACA,IAAI,KAAA,GAAQ;AACV,IAAA,OAAO,KAAK,WAAA,CAAY,KAAA;AAAA,EAC1B;AAAA,EACA,IAAI,OAAA,GAAU;AACZ,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC1B;AACF;AAMO,IAAM,YAAA,GAAN,cAAyD,WAAA,CAAoC;AAAA,EAClG,WAAA,CACE,WAAA,EACS,MAAA,EAEA,MAAA,EACT;AACA,IAAA,KAAA,CAAM,WAAW,CAAA;AAJR,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAGX;AAAA,EALW,MAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAMX,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,WAAA,CAAY,QAAA;AAAA,EAC1B;AACF;ACtGA,SAASyB,SAAQ,KAAA,EAAuB;AACtC,EAAA,OAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACjE;AAOO,IAAM,oBAAN,MAAwB;AAAA,EACZ,OAAA,uBAAc,GAAA,EAAyB;AAAA,EACvC,aAAA,uBAAoB,GAAA,EAA+B;AAAA,EACnD,WAAA,uBAAkB,GAAA,EAA6B;AAAA,EAC/C,WAAA,uBAAkB,GAAA,EAA6B;AAAA,EAC/C,cAAA,uBAAqB,GAAA,EAAgC;AAAA,EACrD,kBAAA,uBAAyB,GAAA,EAAoC;AAAA,EAC7D,MAAA,uBAAa,GAAA,EAAwB;AAAA,EAC9C,YAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAkC,EAAC;AAAA;AAAA,EAG3C,OAAO,IAAA,EAA4B;AACjC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,QAAQ,IAAI,IAAA;AAAM,QAChB,KAAK,QAAA;AACH,UAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AACnC,UAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AACzC,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AACvC,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AACvC,UAAA;AAAA,QACF,KAAK,eAAA;AACH,UAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AAC1C,UAAA;AAAA,QACF,KAAK,mBAAA;AACH,UAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AAC9C,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AAClC,UAAA;AAAA;AACJ,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ,OAAA,EAAsC;AAC5C,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,IAAA,EAAyC;AACpD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,iBAAiB,MAAA,EAAgC;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OACE,KAAK,OAAA,CAAQ,IAAA,GACb,KAAK,aAAA,CAAc,IAAA,GACnB,KAAK,WAAA,CAAY,IAAA,GACjB,KAAK,WAAA,CAAY,IAAA,GACjB,KAAK,cAAA,CAAe,IAAA,GACpB,KAAK,kBAAA,CAAmB,IAAA,GACxB,KAAK,MAAA,CAAO,IAAA;AAAA,EAEhB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,WAAA,EAA4C;AACvD,IAAA,IAAI,WAAA,CAAY,UAAS,EAAG;AAC1B,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,YAAY,WAAA,CAAY,QAAQ,CAAC,CAAA,EAAG,WAAW,CAAA;AAAA,IACnF;AACA,IAAA,IAAI,WAAA,CAAY,oBAAmB,EAAG;AACpC,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,YAAY,WAAA,CAAY,QAAQ,CAAC,CAAA,EAAG,WAAW,CAAA;AAAA,IACzF;AACA,IAAA,IAAI,WAAA,CAAY,kBAAiB,EAAG;AAClC,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,YAAY,WAAA,CAAY,QAAQ,CAAC,CAAA,EAAG,WAAW,CAAA;AAAA,IACvF;AACA,IAAA,IAAI,WAAA,CAAY,kBAAiB,EAAG;AAClC,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,YAAY,WAAA,CAAY,QAAQ,CAAC,CAAA,EAAG,WAAW,CAAA;AAAA,IACvF;AACA,IAAA,IAAI,WAAA,CAAY,qBAAoB,EAAG;AACrC,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,YAAY,WAAA,CAAY,QAAQ,CAAC,CAAA,EAAG,WAAW,CAAA;AAAA,IAC1F;AACA,IAAA,IAAI,WAAA,CAAY,yBAAwB,EAAG;AACzC,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,YAAY,WAAA,CAAY,QAAQ,CAAC,CAAA,EAAG,WAAW,CAAA;AAAA,IAC9F;AACA,IAAA,IAAI,WAAA,CAAY,eAAc,EAAG;AAC/B,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,YAAY,WAAA,CAAY,QAAQ,CAAC,CAAA,EAAG,WAAW,CAAA;AAAA,IAClF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAc,IAAA,CACZ,KAAA,EACA,WAAA,EACkB;AAClB,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAChC,IAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,EAAE,IAAA,EAAM,EAAE,QAAA,EAAU,WAAA,CAAY,QAAA,EAAS,EAAG,CAAA;AAC5E,IAAA,MAAM,MAAA,GAAST,cAAAA,CAAc,IAAA,CAAK,aAAA,EAAe,MAAM,MAAM,CAAA;AAC7D,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,WAAA,EAAa,MAAM,CAAA;AACvD,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAA,IAAA,CAAK,MAAA,EAAQ,MAAM,kBAAA,EAAoB;AAAA,UACrC,IAAA,EAAM,EAAE,QAAA,EAAU,WAAA,CAAY,UAAU,MAAA,EAAQ,WAAA,CAAY,UAAU,EAAA;AAAG,SAC1E,CAAA;AACD,QAAA,MAAM,oBAAA,CAAqB,WAAA,EAAa,WAAA,CAAY,MAAM,CAAA;AAC1D,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,aAAA,CAAc,YAAY,QAAQ,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,KAAA,CAAM,UAAA,EAAY,MAAM,CAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,MAAM,CAAA;AACtC,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,IAAA,EAAM,WAAA;AAAA,QACN,MAAM,KAAA,CAAM,SAAA;AAAA,QACZ,OAAA,EAAS,SAAA;AAAA,QACT,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,MAAA,EAAQ,YAAY,IAAA,CAAK,EAAA;AAAA,QACzB,OAAA,EAAS,YAAY,IAAA,CAAK,GAAA;AAAA,QAC1B,SAAS,WAAA,CAAY,OAAA;AAAA,QACrB,WAAW,WAAA,CAAY,SAAA;AAAA,QACvB,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAMS,SAAQ,KAAK,CAAA;AACzB,MAAA,IAAA,CAAK,OAAA,GAAU;AAAA,QACb,IAAA,EAAM,WAAA;AAAA,QACN,MAAM,KAAA,CAAM,SAAA;AAAA,QACZ,OAAA,EAAS,OAAA;AAAA,QACT,cAAc,GAAA,CAAI,OAAA;AAAA,QAClB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAAA,QACzB,MAAA,EAAQ,YAAY,IAAA,CAAK,EAAA;AAAA,QACzB,OAAA,EAAS,YAAY,IAAA,CAAK,GAAA;AAAA,QAC1B,SAAS,WAAA,CAAY,OAAA;AAAA,QACrB,WAAW,WAAA,CAAY,SAAA;AAAA,QACvB,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AACD,MAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,WAAW,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AACpC,QAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,GAAG,CAAA,IAAK,uBAAA;AAC5C,QAAA,IAAI,YAAY,QAAA,EAAU;AACxB,UAAA,MAAM,WAAA,CAAY,UAAU,EAAE,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,QAChE,CAAA,MAAA,IAAW,YAAY,OAAA,EAAS;AAC9B,UAAA,MAAM,WAAA,CAAY,QAAA,CAAS,EAAE,OAAA,EAAS,KAAA,EAAOxB,YAAAA,CAAa,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,QAC9F,CAAA,MAAO;AACL,UAAA,MAAM,WAAA,CAAY,KAAA,CAAM,EAAE,OAAA,EAAS,KAAA,EAAOA,YAAAA,CAAa,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,YAAY,QAAA,EAA0B;AAC7C,EAAA,OAAO,aAAA,CAAc,QAAQ,CAAA,CAAE,SAAA;AACjC;AAEA,SAASe,cAAAA,CAAc,UAA4B,GAAA,EAAqD;AACtG,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,QAAA;AAClD,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAClC,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,GAAG,GAAG,CAAA;AAC7B;AAEA,SAASV,cAAa,MAAA,EAA+C;AACnE,EAAA,OAAS,OAA+B,MAAA,IAAW,aAAA;AACrD;AAEA,eAAe,oBAAA,CACb,aACA,MAAA,EACe;AACf,EAAA,MAAM,MAAA,GAASA,aAAAA,CAAa,WAAA,CAAY,MAAM,CAAA;AAC9C,EAAA,MAAM,OAAO,MAAA,IAAU,wCAAA;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,EAAE,MAAA,EAAQ,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,KAAA,EAAOL,YAAAA,CAAa,SAAA,EAAU;AAC9E,IAAA,IAAI,WAAA,CAAY,UAAU,MAAM,WAAA,CAAY,UAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,SAAA,IACvE,WAAA,CAAY,OAAA,EAAS,MAAM,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,SAC3D,MAAM,WAAA,CAAY,KAAA,CAAM,OAAO,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AC7OA,SAAS,mBAAmB,KAAA,EAAkD;AAC5E,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAOI,WAAAA,CAAY,SAAA;AAC5C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQA,YAAY,KAAK,CAAA;AAC9D;AAmCO,SAAS,OAAyC,MAAA,EAAuC;AAC9F,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AAC7C,EAAA,OAAO;AAAA,IAAE,IAAA,EAAM,QAAA;AAAA,IAAU,WAAW,QAAA,CAAS,SAAA;AAAA,IAAW,YAAY,QAAA,CAAS,UAAA;AAAA,IAAY,QAAQ,MAAA,CAAO,MAAA;AAAA,IAAQ,MAAM,MAAA,CAAO,WAAA,EAAa,MAAA,EAAQ;AAChJ,MAAA,MAAM,OAAO,GAAA,CAAI,IAAI,aAAA,CAAc,WAAA,EAAa,MAAmB,CAAC,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,SAAS,IAAA,EAAmC;AAC1C,MAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAII,aAAAA,EAAc,CAC/B,WAAA,CAAY,aAAA,CAAc,QAAA,EAAU,MAAM,CAAC,CAAA,CAC3C,QAAA,CAAS,KAAK,CAAA;AACjB,MAAA,IAAI,OAAO,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,KAAK,CAAA;AAC7D,MAAA,IAAI,OAAO,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,KAAK,CAAA;AAC7D,MAAA,IAAI,OAAO,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAA,CAAY,OAAO,QAAQ,CAAA;AACtE,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GAAG;AACL;AAWO,SAAS,WAAW,MAAA,EAAyC;AAClE,EAAA,MAAM,OAAA,GAAU,IAAIA,aAAAA,EAAc,CAAE,QAAA,CAASJ,YAAY,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA;AAChF,EAAA,IAAI,OAAO,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,KAAK,CAAA;AAC7D,EAAA,IAAI,OAAO,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,KAAK,CAAA;AAC7D,EAAA,IAAI,OAAO,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAA,CAAY,OAAO,QAAQ,CAAA;AACtE,EAAA,OAAO,OAAA;AACT;AAoBA,SAAS,eAAA,CAAgB,SAA2B,MAAA,EAAgC;AAClF,EAAA,IAAI,OAAO,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,cAAA,CAAe,OAAO,WAAW,CAAA;AAC/E,EAAA,IAAI,OAAO,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,YAAA,CAAa,OAAO,SAAS,CAAA;AACzE,EAAA,IAAI,OAAO,SAAA,KAAc,MAAA,EAAW,OAAA,CAAQ,YAAA,CAAa,OAAO,SAAS,CAAA;AACzE,EAAA,IAAI,OAAO,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAA,CAAY,OAAO,QAAQ,CAAA;AACxE;AAeO,SAAS,aACd,MAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AACzC,EAAA,OAAO;AAAA,IAAE,IAAA,EAAM,cAAA;AAAA,IAAgB,WAAW,QAAA,CAAS,SAAA;AAAA,IAAW,YAAY,QAAA,CAAS,UAAA;AAAA,IAAY,QAAQ,MAAA,CAAO,MAAA;AAAA,IAAQ,MAAM,MAAA,CAAO,WAAA,EAAa,MAAA,EAAQ;AACtJ,MAAA,MAAM,OAAO,GAAA,CAAI,IAAI,mBAAA,CAAoB,WAAA,EAAa,MAAmB,CAAC,CAAA;AAAA,IAC5E,CAAA;AAAA,IACA,SAAS,IAAA,EAA6C;AACpD,MAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAI,uBAAA,EAAwB,CACzC,WAAA,CAAY,aAAA,CAAc,QAAA,EAAU,MAAM,CAAC,CAAA,CAC3C,UAAA,CAAW,GAAG,OAAO,OAAO,CAAA;AAC/B,MAAA,eAAA,CAAgB,SAAS,MAAM,CAAA;AAC/B,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GAAG;AACL;AAaO,SAAS,WACd,MAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AACzC,EAAA,OAAO;AAAA,IAAE,IAAA,EAAM,YAAA;AAAA,IAAc,WAAW,QAAA,CAAS,SAAA;AAAA,IAAW,YAAY,QAAA,CAAS,UAAA;AAAA,IAAY,QAAQ,MAAA,CAAO,MAAA;AAAA,IAAQ,MAAM,MAAA,CAAO,WAAA,EAAa,MAAA,EAAQ;AACpJ,MAAA,MAAM,OAAO,GAAA,CAAI,IAAI,iBAAA,CAAkB,WAAA,EAAa,MAAmB,CAAC,CAAA;AAAA,IAC1E,CAAA;AAAA,IACA,SAAS,IAAA,EAA2C;AAClD,MAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAI,qBAAA,EAAsB,CAAE,YAAY,aAAA,CAAc,QAAA,EAAU,MAAM,CAAC,CAAA;AACvF,MAAA,eAAA,CAAgB,SAAS,MAAM,CAAA;AAC/B,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GAAG;AACL;AAQO,SAAS,WACd,MAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AACzC,EAAA,OAAO;AAAA,IAAE,IAAA,EAAM,YAAA;AAAA,IAAc,WAAW,QAAA,CAAS,SAAA;AAAA,IAAW,YAAY,QAAA,CAAS,UAAA;AAAA,IAAY,QAAQ,MAAA,CAAO,MAAA;AAAA,IAAQ,MAAM,MAAA,CAAO,WAAA,EAAa,MAAA,EAAQ;AACpJ,MAAA,MAAM,OAAO,GAAA,CAAI,IAAI,iBAAA,CAAkB,WAAA,EAAa,MAAmB,CAAC,CAAA;AAAA,IAC1E,CAAA;AAAA,IACA,SAAS,IAAA,EAA2C;AAClD,MAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAI,qBAAA,EAAsB,CAAE,YAAY,aAAA,CAAc,QAAA,EAAU,MAAM,CAAC,CAAA;AACvF,MAAA,eAAA,CAAgB,SAAS,MAAM,CAAA;AAC/B,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GAAG;AACL;AAQO,SAAS,cACd,MAAA,EAIkB;AAClB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AACzC,EAAA,OAAO;AAAA,IAAE,IAAA,EAAM,eAAA;AAAA,IAAiB,WAAW,QAAA,CAAS,SAAA;AAAA,IAAW,YAAY,QAAA,CAAS,UAAA;AAAA,IAAY,QAAQ,MAAA,CAAO,MAAA;AAAA,IAAQ,MAAM,MAAA,CAAO,WAAA,EAAa,MAAA,EAAQ;AACvJ,MAAA,MAAM,OAAO,GAAA,CAAI,IAAI,oBAAA,CAAqB,WAAA,EAAa,MAAmB,CAAC,CAAA;AAAA,IAC7E,CAAA;AAAA,IACA,SAAS,IAAA,EAA8C;AACrD,MAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAI,wBAAA,EAAyB,CAAE,YAAY,aAAA,CAAc,QAAA,EAAU,MAAM,CAAC,CAAA;AAC1F,MAAA,IAAI,OAAO,YAAA,KAAiB,MAAA,UAAmB,eAAA,CAAgB,GAAG,OAAO,YAAY,CAAA;AACrF,MAAA,eAAA,CAAgB,SAAS,MAAM,CAAA;AAC/B,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GAAG;AACL;AAQO,SAAS,kBACd,MAAA,EAGsB;AACtB,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AACzC,EAAA,OAAO;AAAA,IAAE,IAAA,EAAM,mBAAA;AAAA,IAAqB,WAAW,QAAA,CAAS,SAAA;AAAA,IAAW,YAAY,QAAA,CAAS,UAAA;AAAA,IAAY,QAAQ,MAAA,CAAO,MAAA;AAAA,IAAQ,MAAM,MAAA,CAAO,WAAA,EAAa,MAAA,EAAQ;AAC3J,MAAA,MAAM,OAAO,GAAA,CAAI,IAAI,wBAAA,CAAyB,WAAA,EAAa,MAAmB,CAAC,CAAA;AAAA,IACjF,CAAA;AAAA,IACA,SAAS,IAAA,EAAkD;AACzD,MAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAI,4BAAA,EAA6B,CAAE,YAAY,aAAA,CAAc,QAAA,EAAU,MAAM,CAAC,CAAA;AAC9F,MAAA,eAAA,CAAgB,SAAS,MAAM,CAAA;AAC/B,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GAAG;AACL;AAOA,SAAS,sBAAsB,KAAA,EAAwD;AACrF,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,cAAA,CAAe,KAAA;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,eAAe,KAAK,CAAA;AACjE;AAcO,SAAS,UAAU,MAAA,EAQT;AACf,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,KAAA,EAAO,qBAAA,CAAsB,MAAA,CAAO,KAAK,CAAA;AAAA,IACzC,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAO,MAAA,CAAO;AAAA,GAChB;AACF;AAiBA,SAAS,cAAA,CAAe,UAAkB,GAAA,EAAqC;AAC7E,EAAA,MAAM,KAAA,GAAQ,IAAI,gBAAA,EAAiB,CAChC,WAAA,CAAY,QAAQ,CAAA,CACpB,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,CAClB,QAAA,CAAS,IAAI,KAAK,CAAA;AACrB,EAAA,IAAI,IAAI,WAAA,KAAgB,MAAA,EAAW,KAAA,CAAM,cAAA,CAAe,IAAI,WAAW,CAAA;AACvE,EAAA,IAAI,IAAI,QAAA,KAAa,MAAA,EAAW,KAAA,CAAM,WAAA,CAAY,IAAI,QAAQ,CAAA;AAC9D,EAAA,IAAI,IAAI,SAAA,KAAc,MAAA,EAAW,KAAA,CAAM,YAAA,CAAa,IAAI,SAAS,CAAA;AACjE,EAAA,IAAI,IAAI,SAAA,KAAc,MAAA,EAAW,KAAA,CAAM,YAAA,CAAa,IAAI,SAAS,CAAA;AACjE,EAAA,IAAI,IAAI,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,QAAA,CAAS,IAAI,KAAK,CAAA;AACrD,EAAA,OAAO,KAAA;AACT;AAiBO,SAAS,MACd,MAAA,EACU;AACV,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAC3C,EAAA,OAAO;AAAA,IAAE,IAAA,EAAM,OAAA;AAAA,IAAS,WAAW,QAAA,CAAS,SAAA;AAAA,IAAW,YAAY,QAAA,CAAS,UAAA;AAAA,IAAY,QAAQ,MAAA,CAAO,MAAA;AAAA,IAAQ,MAAM,MAAA,CAAO,WAAA,EAAa,MAAA,EAAQ;AAC/I,MAAA,MAAM,SAAiC,EAAC;AACxC,MAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA,CAAY,MAAA,CAAO,kBAAkB,GAAG,CAAA;AAAA,QACxD,CAAA,CAAA,MAAQ;AACN,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAA;AAAA,QAChB;AAAA,MACF;AACA,MAAA,MAAM,MAAA,CAAO,GAAA;AAAA,QACX,IAAI,YAAA,CAAa,WAAA,EAAa,MAAA,EAAqB,MAA0C;AAAA,OAC/F;AAAA,IACF,CAAA;AAAA,IACA,SAAS,IAAA,EAAkC;AACzC,MAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa,CAC9B,WAAA,CAAY,aAAA,CAAc,QAAA,EAAU,MAAM,CAAC,CAAA,CAC3C,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AACxB,MAAA,KAAA,MAAW,CAAC,KAAK,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AACtD,QAAA,OAAA,CAAQ,aAAA;AAAA,UACN,IAAIG,gBAAAA,EAAmC,CAAE,cAAc,cAAA,CAAe,GAAA,EAAK,GAAG,CAAC;AAAA,SACjF;AAAA,MACF;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GAAG;AACL;AC7XO,SAAS,OACX,UAAA,EACkB;AACrB,EAAA,OAAO,IAAIA,gBAAAA,EAAoB,CAAE,aAAA,CAAc,GAAG,UAAU,CAAA;AAC9D;ACHA,IAAM,kBAAA,GAAqB,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AAGjD,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,IAAI,KAAA,YAAiB,cAAc,OAAO,IAAA;AAC1C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,IAAI,OAAO,OAAO,QAAQ,CAAA,KAAM,cAAc,OAAO,MAAA,CAAO,QAAQ,CAAA,KAAM,UAAA,EAAY;AACpF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,OAAO,MAAM,CAAA,KAAM,YAAY,OAAO,MAAA,CAAO,QAAQ,CAAA,KAAM,UAAA,EAAY;AAChF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAA,CACG,MAAA,CAAO,MAAM,CAAA,KAAM,MAAA,IAAU,MAAA,CAAO,MAAM,CAAA,KAAM,eAAA,KACjD,OAAO,MAAA,CAAO,KAAK,CAAA,KAAM,UAAA,EACzB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAMA,eAAsB,cAAA,CACpB,GAAA,EACA,OAAA,GAAuB,EAAC,EACC;AACzB,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,kBAAA;AACzC,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AACvC,EAAA,MAAM,QAAwB,EAAC;AAE/B,EAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC1D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,QAAA,GAAWkB,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACrC,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,IAAI,SAAA,QAAiB,IAAA,CAAK,GAAI,MAAM,cAAA,CAAe,QAAA,EAAU,OAAO,CAAE,CAAA;AACtE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,QAAQ,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG;AAE/C,IAAA,MAAM,GAAA,GAA+B,MAAM,OAAO,aAAA,CAAc,QAAQ,CAAA,CAAE,IAAA,CAAA;AAC1E,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,EAAG;AACtC,MAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAMA,eAAsB,QAAA,CACpB,MAAA,EACA,GAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,MAAM,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AAC/C,EAAA,MAAA,CAAO,QAAA,CAAS,GAAG,KAAK,CAAA;AACxB,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;;;AC3CA,IAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAA,CAAE,MAAA;AAAA,EAClD,CAAC,KAAA,KAAsC,OAAO,KAAA,KAAU;AAC1D,CAAA;AAMO,IAAM,OAAA,GAAU;AAAA;AAAA,EAErB,MAAM,EAAC;AAAA;AAAA,EAEP,OAAA,EAAS,CAAC,iBAAA,CAAkB,MAAM,CAAA;AAAA;AAAA,EAElC,MAAA,EAAQ,CAAC,iBAAA,CAAkB,MAAA,EAAQ,kBAAkB,YAAY,CAAA;AAAA;AAAA,EAEjE,QAAA,EAAU;AAAA,IACR,iBAAA,CAAkB,MAAA;AAAA,IAClB,iBAAA,CAAkB,aAAA;AAAA,IAClB,iBAAA,CAAkB;AAAA,GACpB;AAAA;AAAA,EAEA,GAAA,EAAK;AACP;AA8CO,IAAM,WAAA,GAAN,cAA0B,MAAA,CAAO;AAAA;AAAA,EAE7B,QAAA,GAAW,IAAI,eAAA,EAAgB;AAAA;AAAA,EAE/B,MAAA,GAAS,IAAI,aAAA,EAAc;AAAA;AAAA,EAE3B,UAAA,GAAa,IAAI,iBAAA,EAAkB;AAAA;AAAA,EAEnC,MAAA;AAAA;AAAA,EAEA,SAAA,GAAY,IAAI,eAAA,EAAgB;AAAA;AAAA,EAEhC,SAAA,GAAY,IAAI,aAAA,EAAc;AAAA;AAAA,EAE9B,MAAA,GAAS,IAAI,cAAA,EAAe;AAAA;AAAA,EAE5B,KAAA,GAAQ,IAAI,YAAA,EAAa;AAAA;AAAA,EAEzB,MAAA;AAAA;AAAA,EAEA,YAAA,GAAe,IAAI,mBAAA,EAAoB;AAAA,EAC/B,SAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5C,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,GAAG,IAAA,EAAK,GAAI,OAAA;AACjG,IAAA,KAAA,CAAM,EAAE,GAAG,IAAA,EAAM,SAAS,OAAA,IAAW,OAAA,CAAQ,SAAS,CAAA;AACtD,IAAA,IAAA,CAAK,SAAS,MAAA,YAAkB,MAAA,GAAS,MAAA,GAAS,IAAI,OAAO,MAAM,CAAA;AACnE,IAAA,IAAA,CAAK,SAAA,GAAY,WAAW,KAAA,GAAQ,KAAA,GAAQ,WAAW,MAAA,IAAa,MAAA,KAAW,IAAA,GAAO,EAAC,GAAI,MAAA;AAC3F,IAAA,IAAA,CAAK,SAAS,MAAA,YAAkB,MAAA,GAAS,MAAA,GAAS,IAAI,OAAO,MAAM,CAAA;AACnE,IAAA,MAAM,eAAA,GAAkB,QAAA,KAAa,MAAA,GAAY,iBAAA,CAAkB,QAAQ,CAAA,GAAI,MAAA;AAC/E,IAAA,MAAM,gBAAA,GAAmB,mBAAmB,SAAS,CAAA;AAErD,IAAA,IAAA,CAAK,SAAS,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,UAAU,CAAC,CAAA;AACrD,IAAA,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,eAAe,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAA,CAAS,aAAa,gBAAgB,CAAA;AAC3C,IAAA,IAAA,CAAK,WAAW,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAY,CAAC,CAAA;AACzD,IAAA,IAAA,CAAK,aAAa,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAc,CAAC,CAAA;AAC7D,IAAA,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,eAAe,CAAA;AAC9D,IAAA,IAAA,CAAK,YAAA,CAAa,aAAa,gBAAgB,CAAA;AAC/C,IAAA,IAAA,CAAK,OAAO,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,eAAe,CAAA;AACxD,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,MAAA,CAAO,WAAW,MAAM,CAAA;AACvD,IAAA,IAAA,CAAK,UAAU,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAW,CAAC,CAAA;AAEvD,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,QAAA,CAAS,iBAAiB,MAAM,CAAA;AACrC,MAAA,IAAA,CAAK,YAAA,CAAa,iBAAiB,MAAM,CAAA;AACzC,MAAA,IAAA,CAAK,UAAA,CAAW,iBAAiB,MAAM,CAAA;AACvC,MAAA,IAAA,CAAK,MAAA,CAAO,iBAAiB,MAAM,CAAA;AAAA,IACrC;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,IAAI,CAAA,CAAE,UAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA;AAC/D,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAI,MAAM,KAAA,KAAU,MAAA,OAAgB,KAAA,CAAM,QAAA,CAAS,MAAM,KAAK,CAAA;AAC9D,MAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW,IAAA,CAAK,MAAM,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA;AAChF,MAAA,MAAM,UAAU,CAACT,MAAAA,KAA4B,IAAA,CAAK,KAAA,CAAM,MAAMA,MAAK,CAAA;AACnE,MAAA,IAAA,CAAK,QAAA,CAAS,aAAa,OAAO,CAAA;AAClC,MAAA,IAAA,CAAK,YAAA,CAAa,aAAa,OAAO,CAAA;AACtC,MAAA,IAAA,CAAK,UAAA,CAAW,aAAa,OAAO,CAAA;AACpC,MAAA,IAAA,CAAK,MAAA,CAAO,aAAa,OAAO,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,GAAG,mBAAA,EAAqB,CAAC,gBAAgB,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA;AACrE,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU,KAAK,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAC,CAAA;AACxF,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe,MAAM,KAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA;AACzD,IAAA,IAAA,CAAK,EAAA,CAAG,eAAA,EAAiB,CAAC,OAAA,KAAY;AACpC,MAAA,KAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,KAAA,EAA6B;AACvC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,QAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAI,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,YAAY,IAAA,EAAM;AAC3B,QAAA,IAAA,CAAK,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,MACtB,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,QAAA,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,MACzB,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,eAAA,EAAiB;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,MACtB,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,QAAA,IAAA,CAAK,YAAA,CAAa,IAAI,IAAI,CAAA;AAAA,MAC5B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,aAAA,EAAe;AACtC,QAAA,IAAA,CAAK,YAAA,CAAa,IAAI,IAAI,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,UAAA,CAAW,IAAI,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,OAAO,OAAA,EAAuC;AAClD,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,CAAK,KAAa,OAAA,EAAwC;AACxD,IAAA,OAAO,QAAA,CAAS,IAAA,EAAM,GAAA,EAAK,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,KAAA,EAA+B;AACzC,IAAA,IAAI,IAAA,CAAK,SAAA,KAAc,KAAA,EAAO,OAAA,CAAQ,KAAK,SAAS,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,aAAA;AACtC,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,IACnF;AACA,IAAA,MAAM,IAAA,CAAK,MAAM,QAAQ,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CAAe,OAAA,GAAgC,EAAC,EAA0B;AAC9E,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,WAAA,EAAa,EAAA,IAAM,KAAK,IAAA,EAAM,EAAA;AACzD,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,IACjF;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,aAAA,EAAe,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,CAAA;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,iBAAA,CAAkB,OAAA,GAMpB,EAAC,EAA0G;AAC7G,IAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA,IAAiB,KAAK,WAAA,EAAa,EAAA,IAAM,KAAK,IAAA,EAAM,EAAA;AAClF,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,IACpF;AACA,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG,GAAG,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,CAAA;AACtE,IAAA,MAAM,KAAA,GACJ,OAAA,CAAQ,OAAA,KAAY,MAAA,GAChBU,MAAAA,CAAO,wBAAA,CAAyB,aAAA,EAAe,OAAA,CAAQ,OAAO,CAAA,GAC9DA,MAAAA,CAAO,mBAAA,CAAoB,aAAa,CAAA;AAC9C,IAAA,IAAI,OAAA,CAAQ,WAAW,IAAA,EAAM;AAC3B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,WAAW,IAAA,EAAK;AAAA,IAClD;AACA,IAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAQ;AAC/B,MAAA,MAAM,MAAA,GAAU,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,KAAK,CAAA;AACzC,MAAA,IAAI,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA,EAAG;AAC/B,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,cAAc,IAAA,EAAK;AAAA,MACrD;AAAA,IACF;AACA,IAAA,OAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,EAAO,EAAE,MAAM,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,SAAS,MAAA,EAAmC;AAC1C,IAAA,MAAM,SAAA,GAAY,KAAK,MAAM,CAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,SAAS,CAAA;AAC5B,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAe,OAAA,GAAyB;AACtC,IAAA,IAAA,CAAK,UAAU,IAAA,EAAK;AACpB,IAAA,MAAM,MAAM,OAAA,EAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAA,CAAuB,OAAA,GAAmC,EAAC,EAAe;AACxE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AACxC,IAAA,OAAO,iBAAiB,IAAA,EAAM;AAAA,MAC5B,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,CAAC,OAAA,KAAY,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,QACnC,KAAA,EAAO,CAAC,OAAA,EAAS,IAAA,KAAS,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAAA,OACvE;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,MAAM,WAAA,EAAyC;AAC3D,IAAA,IAAI,WAAA,CAAY,oBAAmB,EAAG;AACpC,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,WAAW,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,WAAA,CAAY,cAAA,EAAe,EAAG;AACvC,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,kBAAA,CAAmB,WAAW,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,WAAA,CAAY,wBAAA,EAAyB,EAAG;AACjD,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,WAAW,CAAA;AAAA,IAChD,CAAA,MAAA,IAAW,WAAA,CAAY,2BAAA,EAA4B,EAAG;AACpD,MAAA,MAAM,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,WAAW,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,WAAW,CAAA;AAAA,IAC1C;AAAA,EACF;AACF;AAGA,SAAS,aAAA,CAAc,OAA2B,MAAA,EAAqC;AACrF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,CAAO,MAAA,EAAQ,OAAO,KAAA;AAC3C,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,WAAW,CAAC,CAAA;AAC3C,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,YAAY,CAAC,CAAC,GAAG,OAAO,KAAA;AAAA,EACxC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,IAAA,EAAM,EAAE,IAAA,IAAQ,CAAA;AAAA,IAChB,WAAA,EAAa,EAAE,WAAA,IAAe,EAAA;AAAA,IAC9B,IAAA,EAAM,EAAE,IAAA,KAAS,IAAA;AAAA,IACjB,0BAAA,EAA4B,EAAE,0BAAA,IAA8B,IAAA;AAAA,IAC5D,UAAU,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,IAAI,CAAC,GAAI,CAAA,CAAE,QAAqB,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA;AAAA,IAC5F,OAAA,EAAS,gBAAA,CAAiB,CAAA,CAAE,OAAO;AAAA,GACpC,CAAA;AACH;AAEA,SAAS,iBAAiB,OAAA,EAAsC;AAC9D,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,SAAU,EAAC;AACrC,EAAA,OAAO,OAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,GAAA,GAAM,CAAA;AACZ,IAAA,OAAO;AAAA,MACL,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,MAChC,QAAA,EAAU,IAAI,QAAA,KAAa,IAAA;AAAA,MAC3B,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,IAC9B,CAAC,GAAI,GAAA,CAAI,OAA8C,EACpD,GAAA,CAAI,CAAC,EAAA,MAAQ,EAAE,MAAM,EAAA,CAAG,IAAA,EAAM,KAAA,EAAO,EAAA,CAAG,OAAM,CAAE,CAAA,CAChD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,IAAI,EAAE,aAAA,CAAc,MAAA,CAAO,EAAE,IAAI,CAAC,CAAC,CAAA,GAC9D,IAAA;AAAA,MACJ,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAAA,MACrC,eAAe,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,IAC1C,CAAC,GAAI,GAAA,CAAI,aAA0B,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,GACzD,IAAA;AAAA,MACJ,SAAA,EAAW,IAAI,SAAA,IAAa,IAAA;AAAA,MAC5B,SAAA,EAAW,IAAI,SAAA,IAAa,IAAA;AAAA,MAC5B,UAAA,EAAY,IAAI,UAAA,IAAc,IAAA;AAAA,MAC9B,UAAA,EAAY,IAAI,UAAA,IAAc,IAAA;AAAA,MAC9B,YAAA,EAAc,IAAI,YAAA,KAAiB;AAAA,KACrC;AAAA,EACF,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,IAAI,EAAE,aAAA,CAAc,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAChE;;;AC5WO,SAAS,aAAa,MAAA,EAAkC;AAC7D,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["/**\n * Preset embeds — `error`, `success`, `info`, `warn` — with consistent colors\n * and icons so every reply in your bot looks the same. The client owns one as\n * `client.embeds` and the context preset methods (`ctx.success(...)` etc.) use\n * it; you can also call `embeds.error(...)` directly to build an embed for\n * `channel.send({ embeds: [...] })`.\n */\nimport {\n EmbedBuilder,\n type APIEmbedAuthor,\n type APIEmbedField,\n type APIEmbedFooter,\n} from \"discord.js\";\n\n/** Color in `0xRRGGBB` form for each preset level. */\nexport interface EmbedColors {\n error: number;\n success: number;\n info: number;\n warn: number;\n}\n\n/** Icon glyph prepended to the description of each preset. Pass `\"\"` to drop. */\nexport interface EmbedIcons {\n error: string;\n success: string;\n info: string;\n warn: string;\n}\n\n/** Construction options for {@link Embeds}. Missing fields fall back to defaults. */\nexport interface EmbedsOptions {\n /** Per-level color overrides. */\n colors?: Partial<EmbedColors>;\n /** Per-level icon overrides; pass `\"\"` to drop the prefix for a level. */\n icons?: Partial<EmbedIcons>;\n}\n\n/** Shape accepted by every preset: a plain string or a structured body. */\nexport type EmbedPresetInput =\n | string\n | {\n title?: string;\n description?: string;\n fields?: readonly APIEmbedField[];\n footer?: APIEmbedFooter;\n author?: APIEmbedAuthor;\n url?: string;\n timestamp?: Date | number | string;\n thumbnail?: { url: string };\n image?: { url: string };\n };\n\n/** One of the four built-in preset levels. */\nexport type EmbedLevel = \"error\" | \"success\" | \"info\" | \"warn\";\n\n/** Discord-ish defaults: red / green / blue / yellow + ⛔ ✅ ℹ️ ⚠️. */\nexport const DEFAULT_EMBED_COLORS: EmbedColors = {\n error: 0xf04a47,\n success: 0x43b582,\n info: 0x3498db,\n warn: 0xf9a825,\n};\n\n/** Default icons: warning / check / info / triangle. */\nexport const DEFAULT_EMBED_ICONS: EmbedIcons = {\n error: \"⛔\",\n success: \"✅\",\n info: \"ℹ️\",\n warn: \"⚠️\",\n};\n\n/**\n * Builds preset embeds with consistent colors and icons.\n *\n * @example\n * ```ts\n * const embeds = new Embeds({ colors: { success: 0x00ff88 } });\n * await channel.send({ embeds: [embeds.success(\"Saved.\")] });\n * ```\n */\nexport class Embeds {\n /** The resolved colors for every preset. */\n readonly colors: EmbedColors;\n /** The resolved icons for every preset. */\n readonly icons: EmbedIcons;\n\n constructor(options: EmbedsOptions = {}) {\n this.colors = { ...DEFAULT_EMBED_COLORS, ...options.colors };\n this.icons = { ...DEFAULT_EMBED_ICONS, ...options.icons };\n }\n\n /** Red preset — something went wrong. */\n error(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"error\", input);\n }\n\n /** Green preset — something succeeded. */\n success(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"success\", input);\n }\n\n /** Blue preset — neutral information. */\n info(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"info\", input);\n }\n\n /** Yellow preset — caution. */\n warn(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"warn\", input);\n }\n\n /** Build an embed at a chosen level. */\n build(level: EmbedLevel, input: EmbedPresetInput): EmbedBuilder {\n const builder = new EmbedBuilder().setColor(this.colors[level]);\n const icon = this.icons[level];\n const prefix = icon.length > 0 ? `${icon} ` : \"\";\n if (typeof input === \"string\") {\n builder.setDescription(`${prefix}${input}`);\n return builder;\n }\n if (input.title !== undefined) builder.setTitle(input.title);\n if (input.description !== undefined) {\n builder.setDescription(`${prefix}${input.description}`);\n }\n if (input.fields !== undefined) builder.addFields(...input.fields);\n if (input.footer !== undefined) builder.setFooter(input.footer);\n if (input.author !== undefined) builder.setAuthor(input.author);\n if (input.url !== undefined) builder.setURL(input.url);\n if (input.timestamp !== undefined) {\n builder.setTimestamp(\n input.timestamp instanceof Date ? input.timestamp : new Date(input.timestamp),\n );\n }\n if (input.thumbnail !== undefined) builder.setThumbnail(input.thumbnail.url);\n if (input.image !== undefined) builder.setImage(input.image.url);\n return builder;\n }\n}\n\n/** The shared default factory — used by contexts when the client has none. */\nexport const defaultEmbeds = new Embeds();\n","/**\n * Keyed in-memory async lock (mutex) with TTL.\n *\n * Prevents two handlers from mutating the same resource concurrently — e.g.\n * the same ticket id being claimed twice, or a user opening a ticket while\n * another button click is still creating one. Hold leases are auto-expired so\n * a forgotten `release()` cannot deadlock the process forever.\n */\n\n/** Construction options for {@link KeyedLock}. */\nexport interface KeyedLockOptions {\n /** Maximum lifetime (ms) of a held lock before it auto-expires. Default `60_000`. */\n ttl?: number;\n /** Sweep interval (ms) for expired-but-not-released locks. `0` disables sweeping. */\n sweep?: number;\n}\n\ninterface LeaseEntry {\n createdAt: number;\n ttl: number;\n}\n\n/** Release a previously-acquired lease. Idempotent — safe to call multiple times. */\nexport type LockRelease = () => void;\n\n/**\n * Acquire, release and run-while-locked operations keyed on an arbitrary string.\n *\n * @example\n * ```ts\n * const locks = new KeyedLock();\n * const result = await locks.run(`ticket:${id}:claim`, async () => {\n * // …mutate ticket atomically…\n * return \"ok\";\n * }, { onBusy: () => \"busy\" });\n * ```\n */\nexport class KeyedLock {\n private readonly entries = new Map<string, LeaseEntry>();\n private readonly defaultTtl: number;\n private readonly sweepTimer?: ReturnType<typeof setInterval>;\n\n constructor(options: KeyedLockOptions = {}) {\n this.defaultTtl = options.ttl ?? 60_000;\n const sweep = options.sweep ?? 15_000;\n if (sweep > 0) {\n this.sweepTimer = setInterval(() => this.sweep(), sweep);\n if (typeof this.sweepTimer.unref === \"function\") this.sweepTimer.unref();\n }\n }\n\n /** Try to acquire `key`. Returns a release function, or `null` if already held. */\n tryAcquire(key: string, ttl: number = this.defaultTtl): LockRelease | null {\n const existing = this.entries.get(key);\n if (existing !== undefined && Date.now() - existing.createdAt < existing.ttl) {\n return null;\n }\n this.entries.set(key, { createdAt: Date.now(), ttl });\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.entries.delete(key);\n };\n }\n\n /** Whether `key` is currently held and not expired. */\n isHeld(key: string): boolean {\n const entry = this.entries.get(key);\n return entry !== undefined && Date.now() - entry.createdAt < entry.ttl;\n }\n\n /**\n * Run `fn` while holding `key`. If the key is already held, calls `onBusy`\n * (or returns `undefined`) without ever calling `fn`. Always releases on\n * return or throw.\n */\n async run<T>(\n key: string,\n fn: () => Promise<T> | T,\n options: { ttl?: number; onBusy?: () => Promise<T> | T } = {},\n ): Promise<T | undefined> {\n const release = this.tryAcquire(key, options.ttl ?? this.defaultTtl);\n if (release === null) {\n return options.onBusy !== undefined ? await options.onBusy() : undefined;\n }\n try {\n return await fn();\n } finally {\n release();\n }\n }\n\n /** Number of currently-tracked leases (including expired-but-unswept). */\n get size(): number {\n return this.entries.size;\n }\n\n /** Drop all known leases and stop the sweep timer. */\n dispose(): void {\n this.entries.clear();\n if (this.sweepTimer !== undefined) clearInterval(this.sweepTimer);\n }\n\n /** Manually remove a single key without running anything. */\n forget(key: string): boolean {\n return this.entries.delete(key);\n }\n\n private sweep(): void {\n const now = Date.now();\n for (const [key, entry] of this.entries.entries()) {\n if (now - entry.createdAt > entry.ttl) this.entries.delete(key);\n }\n }\n}\n","/**\n * Cache-first, timeout-bounded fetch helpers that resolve to `T | null` instead\n * of throwing. They replace the `.catch(() => null)` pattern repeated 30+ times\n * in production bots (member/channel/message/user/guild/role lookups that may\n * 404, rate-limit, or block startup if awaited indefinitely).\n */\nimport type {\n Channel,\n Client,\n Guild,\n GuildMember,\n Message,\n MessageManager,\n Role,\n User,\n} from \"discord.js\";\n\n/** Shared options for every safe-fetch helper. */\nexport interface SafeFetchOptions {\n /** Use the cache when present and not `force`. Default `true`. */\n cache?: boolean;\n /** Bypass the cache and force a REST hit. Default `false`. */\n force?: boolean;\n /** Resolve to `null` if Discord takes longer than this (ms). Default `5000`. */\n timeoutMs?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5000;\n\nasync function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T | null> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timeout = new Promise<null>((resolve) => {\n timer = setTimeout(() => resolve(null), ms);\n });\n return await Promise.race([promise.catch(() => null), timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n\n/** Resolve a guild member with a cache-hit fast path. Returns `null` on failure. */\nexport async function fetchMember(\n guild: Guild | null | undefined,\n userId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<GuildMember | null> {\n if (guild == null || userId == null || userId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = guild.members.cache.get(userId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n guild.members.fetch({ user: userId, force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a channel by id from the client. Returns `null` on failure. */\nexport async function fetchChannel(\n client: Client | null | undefined,\n channelId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Channel | null> {\n if (client == null || channelId == null || channelId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = client.channels.cache.get(channelId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n client.channels.fetch(channelId, { force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a message id in a given channel's messages manager. */\nexport async function fetchMessage(\n messages: MessageManager | null | undefined,\n messageId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Message | null> {\n if (messages == null || messageId == null || messageId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = messages.cache.get(messageId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n messages.fetch({ message: messageId, force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a user by id from the client. Returns `null` on failure. */\nexport async function fetchUser(\n client: Client | null | undefined,\n userId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<User | null> {\n if (client == null || userId == null || userId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = client.users.cache.get(userId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n client.users.fetch(userId, { force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a guild by id from the client. Returns `null` on failure. */\nexport async function fetchGuild(\n client: Client | null | undefined,\n guildId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Guild | null> {\n if (client == null || guildId == null || guildId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = client.guilds.cache.get(guildId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n client.guilds.fetch({ guild: guildId, force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a role id from a guild's roles manager. Returns `null` on failure. */\nexport async function fetchRole(\n guild: Guild | null | undefined,\n roleId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Role | null> {\n if (guild == null || roleId == null || roleId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = guild.roles.cache.get(roleId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n guild.roles.fetch(roleId, { force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/**\n * Wrap an arbitrary best-effort operation so a failure resolves to `null`\n * instead of throwing. Useful for sends/deletes whose outcome is non-critical.\n *\n * @example\n * ```ts\n * await safeTry(() => message.delete());\n * ```\n */\nexport async function safeTry<T>(op: () => Promise<T> | T): Promise<T | null> {\n try {\n return await op();\n } catch {\n return null;\n }\n}\n\n/** Time-bound an arbitrary promise; resolves to `null` on timeout or rejection. */\nexport async function withSafeTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n): Promise<T | null> {\n return withTimeout(promise, timeoutMs);\n}\n\n/** Cache-first, timeout-bounded fetch helpers grouped for ergonomic imports. */\nexport const safeFetch = {\n member: fetchMember,\n channel: fetchChannel,\n message: fetchMessage,\n user: fetchUser,\n guild: fetchGuild,\n role: fetchRole,\n try: safeTry,\n} as const;\n","/**\n * Locale-aware duration formatter, duration parser and Discord timestamp\n * helpers. Replaces the dozens of inline `Math.floor(s/86400)`/`X gün Y saat`\n * and `<t:${secs}:R>` snippets in production bots, including the duplicate\n * `formatTimeInTurkish`-style helpers duplicated across many bot command files.\n */\n\n/** Discord timestamp style: `t/T/d/D/f/F/R`. */\nexport type DiscordTimestampStyle = \"t\" | \"T\" | \"d\" | \"D\" | \"f\" | \"F\" | \"R\";\n\ntype DurationUnit = \"week\" | \"day\" | \"hour\" | \"minute\" | \"second\";\n\ninterface UnitLabels {\n week: [string, string];\n day: [string, string];\n hour: [string, string];\n minute: [string, string];\n second: [string, string];\n separator: string;\n zero: string;\n}\n\nconst EN: UnitLabels = {\n week: [\"week\", \"weeks\"],\n day: [\"day\", \"days\"],\n hour: [\"hour\", \"hours\"],\n minute: [\"minute\", \"minutes\"],\n second: [\"second\", \"seconds\"],\n separator: \" \",\n zero: \"0 seconds\",\n};\n\nconst TR: UnitLabels = {\n week: [\"hafta\", \"hafta\"],\n day: [\"gün\", \"gün\"],\n hour: [\"saat\", \"saat\"],\n minute: [\"dakika\", \"dakika\"],\n second: [\"saniye\", \"saniye\"],\n separator: \" \",\n zero: \"0 saniye\",\n};\n\nconst LABELS: Record<string, UnitLabels> = {\n en: EN,\n \"en-US\": EN,\n \"en-GB\": EN,\n tr: TR,\n \"tr-TR\": TR,\n};\n\nconst UNIT_MS: Record<DurationUnit, number> = {\n week: 7 * 86_400_000,\n day: 86_400_000,\n hour: 3_600_000,\n minute: 60_000,\n second: 1000,\n};\n\nconst UNIT_ORDER: DurationUnit[] = [\"week\", \"day\", \"hour\", \"minute\", \"second\"];\n\n/** Options for {@link formatDuration}. */\nexport interface FormatDurationOptions {\n /** Locale label set: `\"en\"`, `\"en-US\"`, `\"tr\"`, `\"tr-TR\"`, or a custom set. */\n locale?: string | UnitLabels;\n /** How many non-zero units to keep. Default `2`. Pass `Infinity` to keep all. */\n largest?: number;\n /** Subset of units to consider (in order: week → second). */\n units?: readonly DurationUnit[];\n}\n\nfunction resolveLabels(locale: FormatDurationOptions[\"locale\"]): UnitLabels {\n if (typeof locale === \"object\" && locale !== null) return locale;\n if (locale === undefined) return EN;\n return LABELS[locale] ?? LABELS[locale.split(\"-\")[0] ?? \"\"] ?? EN;\n}\n\n/**\n * Format a millisecond duration into human-readable text.\n *\n * @example\n * ```ts\n * formatDuration(3_725_000); // \"1 hour 2 minutes\"\n * formatDuration(3_725_000, { locale: \"tr\" }); // \"1 saat 2 dakika\"\n * formatDuration(86_400_000 * 9, { largest: 3 }); // \"1 week 2 days\"\n * ```\n */\nexport function formatDuration(ms: number, options: FormatDurationOptions = {}): string {\n const labels = resolveLabels(options.locale);\n if (!Number.isFinite(ms) || ms <= 0) return labels.zero;\n const limit = options.largest ?? 2;\n const units = options.units ?? UNIT_ORDER;\n const parts: string[] = [];\n let remaining = Math.floor(ms);\n for (const unit of units) {\n if (parts.length >= limit) break;\n const size = UNIT_MS[unit];\n if (remaining < size) continue;\n const value = Math.floor(remaining / size);\n remaining -= value * size;\n const word = value === 1 ? labels[unit][0] : labels[unit][1];\n parts.push(`${value} ${word}`);\n }\n return parts.length > 0 ? parts.join(labels.separator) : labels.zero;\n}\n\nconst DURATION_PATTERN = /(\\d+(?:\\.\\d+)?)\\s*(milliseconds|millisecond|seconds|minutes|saniye|dakika|minute|second|weeks|hours|hafta|saat|week|hour|days|day|gün|gun|min|sec|ms|wk|hr|dk|m|s|h|d|w)/gi;\nconst SHORT_TO_MS: Record<string, number> = {\n ms: 1,\n millisecond: 1,\n milliseconds: 1,\n s: 1000,\n sec: 1000,\n second: 1000,\n seconds: 1000,\n saniye: 1000,\n m: 60_000,\n min: 60_000,\n minute: 60_000,\n minutes: 60_000,\n dakika: 60_000,\n dk: 60_000,\n h: 3_600_000,\n hr: 3_600_000,\n hour: 3_600_000,\n hours: 3_600_000,\n saat: 3_600_000,\n d: 86_400_000,\n day: 86_400_000,\n days: 86_400_000,\n gün: 86_400_000,\n gun: 86_400_000,\n w: 604_800_000,\n wk: 604_800_000,\n week: 604_800_000,\n weeks: 604_800_000,\n hafta: 604_800_000,\n};\n\n/**\n * Parse a human duration like `\"1h30m\"`, `\"2 days\"`, `\"1 saat 30 dakika\"` or\n * `\"5000ms\"` into milliseconds. Returns `null` if nothing parseable was found.\n *\n * @example\n * ```ts\n * parseDuration(\"1h30m\"); // 5_400_000\n * parseDuration(\"1 saat\"); // 3_600_000\n * parseDuration(\"oops\"); // null\n * ```\n */\nexport function parseDuration(input: string): number | null {\n const trimmed = input.trim().toLowerCase();\n if (trimmed.length === 0) return null;\n DURATION_PATTERN.lastIndex = 0;\n let total = 0;\n let matched = false;\n for (;;) {\n const match = DURATION_PATTERN.exec(trimmed);\n if (match === null) break;\n matched = true;\n const value = Number(match[1]);\n const unit = match[2] ?? \"\";\n const ms = SHORT_TO_MS[unit];\n if (ms !== undefined && Number.isFinite(value)) total += value * ms;\n }\n return matched ? total : null;\n}\n\nfunction toEpochSeconds(date: Date | number): number {\n return Math.floor((date instanceof Date ? date.getTime() : date) / 1000);\n}\n\n/**\n * Render a Discord-flavoured timestamp tag (`<t:1234:R>`).\n *\n * Styles: `t` short time, `T` long time, `d` short date, `D` long date,\n * `f` short date/time (default), `F` long date/time, `R` relative.\n *\n * @example\n * ```ts\n * discordTimestamp(date); // <t:1234:f>\n * discordTimestamp(date, \"R\"); // <t:1234:R>\n * discordTimestamp(Date.now() + 60_000, \"R\"); // <t:..:R>\n * ```\n */\nexport function discordTimestamp(date: Date | number, style: DiscordTimestampStyle = \"f\"): string {\n return `<t:${toEpochSeconds(date)}:${style}>`;\n}\n\n/** Short-hand for the relative Discord timestamp (`R` style). */\nexport function relativeTimestamp(date: Date | number): string {\n return discordTimestamp(date, \"R\");\n}\n\n/** The hard cap Discord enforces on a single message's `content`. */\nexport const MESSAGE_CHARACTER_LIMIT = 2000;\n\n/**\n * Truncate `text` to at most `max` characters, appending `suffix` (default `…`)\n * when it had to cut. The result — suffix included — never exceeds `max`.\n *\n * @example\n * ```ts\n * truncate(\"a very long reason\", 10); // → \"a very lo…\"\n * ```\n */\nexport function truncate(text: string, max: number, suffix = \"…\"): string {\n if (max <= 0) return \"\";\n if (text.length <= max) return text;\n if (suffix.length >= max) return suffix.slice(0, max);\n return text.slice(0, max - suffix.length) + suffix;\n}\n\n/** Options for {@link chunkMessage}. */\nexport interface ChunkOptions {\n /** Maximum characters per chunk. Default {@link MESSAGE_CHARACTER_LIMIT} (2000). */\n max?: number;\n}\n\nfunction hardSplit(text: string, max: number): string[] {\n const out: string[] = [];\n let rest = text;\n while (rest.length > max) {\n const space = rest.lastIndexOf(\" \", max);\n const cut = space > Math.floor(max / 2) ? space : max;\n out.push(rest.slice(0, cut));\n rest = rest.slice(cut).replace(/^ /, \"\");\n }\n if (rest.length > 0) out.push(rest);\n return out;\n}\n\n/**\n * Split `text` into chunks that each fit within Discord's per-message limit,\n * breaking on line boundaries (and word boundaries for over-long lines) so you\n * never silently lose the tail of a long reply.\n *\n * @example\n * ```ts\n * for (const part of chunkMessage(hugeLog)) await ctx.followUp(part);\n * ```\n */\nexport function chunkMessage(text: string, options: ChunkOptions = {}): string[] {\n const max = options.max ?? MESSAGE_CHARACTER_LIMIT;\n if (max <= 0) throw new RangeError(\"spearkit: chunkMessage max must be positive\");\n if (text.length === 0) return [];\n if (text.length <= max) return [text];\n\n const chunks: string[] = [];\n let current = \"\";\n const flush = (): void => {\n if (current.length > 0) {\n chunks.push(current);\n current = \"\";\n }\n };\n for (const line of text.split(\"\\n\")) {\n if (line.length > max) {\n flush();\n const pieces = hardSplit(line, max);\n for (let i = 0; i < pieces.length - 1; i++) chunks.push(pieces[i] as string);\n current = pieces[pieces.length - 1] as string;\n continue;\n }\n const candidate = current.length > 0 ? `${current}\\n${line}` : line;\n if (candidate.length > max) {\n flush();\n current = line;\n } else {\n current = candidate;\n }\n }\n flush();\n return chunks;\n}\n","/**\n * Pluggable cache abstraction with TTL, counters and rate-limit primitives.\n *\n * The {@link CacheStore} interface lets you swap a {@link MemoryCache} for any\n * external backend (Redis, Memcached, your DB) without changing call sites —\n * production bots commonly start with memory and graduate to Redis as load\n * grows. Counters and fixed-window rate limits live on the same surface so the\n * three patterns repeated in real bots (TTL cache, daily counter, per-user\n * rate limit) share one API.\n */\n\n/** Result of a fixed-window {@link CacheStore.rateLimit} hit. */\nexport interface RateLimitResult {\n /** `true` if this hit was within the window's budget. */\n allowed: boolean;\n /** Remaining hits in the current window (`0` once `allowed` is false). */\n remaining: number;\n /** Epoch ms at which the current window resets. */\n resetAt: number;\n}\n\n/** Options accepted by every write helper. */\nexport interface CacheSetOptions {\n /** Time-to-live in milliseconds. `undefined` means never expire. */\n ttl?: number;\n}\n\n/** A swappable cache backend. All operations are async to allow remote stores. */\nexport interface CacheStore {\n /** Read a previously set value, or `undefined` if missing/expired. */\n get<T = unknown>(key: string): Promise<T | undefined>;\n /** Write a value, optionally with a TTL in ms. */\n set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void>;\n /** Remove a key. Resolves to `true` if it existed. */\n delete(key: string): Promise<boolean>;\n /** Whether a non-expired key is present. */\n has(key: string): Promise<boolean>;\n /** Atomically increment a numeric counter. Returns the new value. */\n increment(key: string, delta?: number, options?: CacheSetOptions): Promise<number>;\n /** Fixed-window rate limit hit. Atomic per key. */\n rateLimit(key: string, options: { limit: number; windowMs: number }): Promise<RateLimitResult>;\n /** Drop every entry. */\n clear(): Promise<void>;\n}\n\ninterface Entry<T> {\n value: T;\n expiresAt?: number;\n}\n\n/** In-memory implementation of {@link CacheStore}. Lazy TTL expiration. */\nexport class MemoryCache implements CacheStore {\n private readonly store = new Map<string, Entry<unknown>>();\n\n /** Total number of stored (possibly expired) entries — primarily for tests. */\n get size(): number {\n return this.store.size;\n }\n\n async get<T = unknown>(key: string): Promise<T | undefined> {\n const entry = this.store.get(key);\n if (entry === undefined) return undefined;\n if (entry.expiresAt !== undefined && entry.expiresAt <= Date.now()) {\n this.store.delete(key);\n return undefined;\n }\n return entry.value as T;\n }\n\n async set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void> {\n const ttl = options?.ttl;\n this.store.set(key, {\n value,\n expiresAt: ttl !== undefined && ttl > 0 ? Date.now() + ttl : undefined,\n });\n }\n\n async delete(key: string): Promise<boolean> {\n return this.store.delete(key);\n }\n\n async has(key: string): Promise<boolean> {\n return (await this.get(key)) !== undefined;\n }\n\n async increment(key: string, delta: number = 1, options?: CacheSetOptions): Promise<number> {\n const current = (await this.get<number>(key)) ?? 0;\n const next = current + delta;\n const existing = this.store.get(key);\n // Preserve an existing expiry unless caller overrides it.\n const ttl = options?.ttl;\n if (ttl !== undefined && ttl > 0) {\n await this.set(key, next, { ttl });\n } else if (existing?.expiresAt !== undefined) {\n this.store.set(key, { value: next, expiresAt: existing.expiresAt });\n } else {\n await this.set(key, next);\n }\n return next;\n }\n\n async rateLimit(key: string, options: { limit: number; windowMs: number }): Promise<RateLimitResult> {\n const now = Date.now();\n const bucketKey = `__rl__:${key}`;\n const entry = this.store.get(bucketKey) as Entry<number> | undefined;\n const expired = entry === undefined || entry.expiresAt === undefined || entry.expiresAt <= now;\n if (expired) {\n const resetAt = now + options.windowMs;\n this.store.set(bucketKey, { value: 1, expiresAt: resetAt });\n return { allowed: true, remaining: Math.max(0, options.limit - 1), resetAt };\n }\n const count = entry.value;\n const resetAt = entry.expiresAt ?? now;\n if (count >= options.limit) {\n return { allowed: false, remaining: 0, resetAt };\n }\n this.store.set(bucketKey, { value: count + 1, expiresAt: resetAt });\n return { allowed: true, remaining: Math.max(0, options.limit - count - 1), resetAt };\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n}\n\n/** Convenience factory: returns a default in-memory {@link CacheStore}. */\nexport function createCache(): CacheStore {\n return new MemoryCache();\n}\n","/**\n * Tiny, dependency-free typed config loader for JSON files.\n *\n * Pass a `parser` to support JSON5 / YAML / TOML without dragging those\n * packages into spearkit, and a `schema` to validate (zod, valibot, custom) so\n * a typo in your config blows up at startup instead of at the first user\n * interaction. Pairs naturally with `lookup()` for typed role/channel maps.\n */\nimport { readFile, readFileSync } from \"node:fs\";\nimport { promisify } from \"node:util\";\n\nconst readFileAsync = promisify(readFile);\n\n/** Options accepted by {@link loadConfig} / {@link loadConfigAsync}. */\nexport interface LoadConfigOptions<T> {\n /** Absolute or cwd-relative path to the config file. */\n file: string;\n /** Custom parser. Default `JSON.parse`. Pass `JSON5.parse` (etc.) for other formats. */\n parser?: (text: string) => unknown;\n /** Validation function — receives the parsed value, returns the typed config. */\n schema?: (value: unknown) => T;\n /** File encoding. Default `\"utf8\"`. */\n encoding?: BufferEncoding;\n}\n\n/** Synchronously read + parse + (optionally) validate a config file. */\nexport function loadConfig<T = unknown>(options: LoadConfigOptions<T>): T {\n const text = readFileSync(options.file, options.encoding ?? \"utf8\");\n const parser = options.parser ?? JSON.parse;\n const parsed = parser(text);\n return options.schema !== undefined ? options.schema(parsed) : (parsed as T);\n}\n\n/** Asynchronous variant of {@link loadConfig}. */\nexport async function loadConfigAsync<T = unknown>(options: LoadConfigOptions<T>): Promise<T> {\n const text = await readFileAsync(options.file, options.encoding ?? \"utf8\");\n const parser = options.parser ?? JSON.parse;\n const parsed = parser(text);\n return options.schema !== undefined ? options.schema(parsed) : (parsed as T);\n}\n\n/**\n * Build a typed lookup over a `Record<key, value>` table. Throws on missing\n * keys so config typos surface at startup, not at use.\n *\n * @example\n * ```ts\n * const roles = lookup(config.roles, \"role\");\n * const modId = roles(\"moderator\"); // string; throws if \"moderator\" is absent\n * ```\n */\nexport function lookup<K extends string, V>(\n table: Readonly<Record<K, V>>,\n resourceName: string = \"key\",\n): (key: K) => V {\n return (key) => {\n const value = table[key];\n if (value === undefined) {\n throw new Error(`spearkit: ${resourceName} \"${String(key)}\" not found in config`);\n }\n return value;\n };\n}\n\n/** Build a non-throwing lookup that returns `undefined` for missing keys. */\nexport function lookupOptional<K extends string, V>(\n table: Readonly<Record<K, V>>,\n): (key: K) => V | undefined {\n return (key) => table[key];\n}\n","/**\n * Tiny persistent key-value storage and a typed per-guild settings helper.\n *\n * Almost every community bot needs to remember *something* per guild — a custom\n * prefix, a mod-log channel, a welcome message — and reaches for a database on\n * day one. spearkit ships a dependency-free {@link KeyValueStore} interface with\n * two backends ({@link MemoryStore} for tests, {@link JsonStore} for a durable\n * JSON file) plus {@link createSettings} for merged-with-defaults guild config.\n * Swap in your own store (Redis, SQL, …) by implementing the interface.\n *\n * @example\n * ```ts\n * const settings = createSettings({\n * store: new JsonStore(\"data/guilds.json\"),\n * defaults: { prefix: \"!\", modLogChannelId: null as string | null },\n * });\n * const cfg = await settings.get(guildId); // always fully populated\n * await settings.set(guildId, { prefix: \"?\" }); // shallow-merged + persisted\n * ```\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\n/**\n * A minimal async key-value store. Values must be JSON-serialisable. All\n * backends share these semantics so you can develop against {@link MemoryStore}\n * and ship with {@link JsonStore} (or your own) without code changes.\n */\nexport interface KeyValueStore {\n /** Resolve the value for `key`, or `undefined` if absent. */\n get<T>(key: string): Promise<T | undefined>;\n /** Store `value` under `key`, overwriting any previous value. */\n set<T>(key: string, value: T): Promise<void>;\n /** Whether `key` currently has a value. */\n has(key: string): Promise<boolean>;\n /** Remove `key`. Resolves `true` if it existed. */\n delete(key: string): Promise<boolean>;\n /** Every key currently stored. */\n keys(): Promise<string[]>;\n /** Remove every key. */\n clear(): Promise<void>;\n}\n\nfunction clone<T>(value: T): T {\n if (value === undefined || value === null) return value;\n if (typeof structuredClone === \"function\") return structuredClone(value);\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\n/**\n * In-memory {@link KeyValueStore}. Values are deep-cloned on read and write so\n * callers can't accidentally mutate stored state — matching what a persistent\n * backend would do. Ideal for tests and ephemeral data.\n */\nexport class MemoryStore implements KeyValueStore {\n private readonly map = new Map<string, unknown>();\n\n async get<T>(key: string): Promise<T | undefined> {\n return this.map.has(key) ? clone(this.map.get(key) as T) : undefined;\n }\n async set<T>(key: string, value: T): Promise<void> {\n this.map.set(key, clone(value));\n }\n async has(key: string): Promise<boolean> {\n return this.map.has(key);\n }\n async delete(key: string): Promise<boolean> {\n return this.map.delete(key);\n }\n async keys(): Promise<string[]> {\n return [...this.map.keys()];\n }\n async clear(): Promise<void> {\n this.map.clear();\n }\n}\n\n/**\n * File-backed {@link KeyValueStore} persisting the whole map as one JSON object.\n * Reads are served from an in-memory cache (loaded once, lazily); writes are\n * serialised through a queue and committed atomically (temp file + rename) so a\n * crash mid-write can never corrupt the file.\n */\nexport class JsonStore implements KeyValueStore {\n private readonly cache = new Map<string, unknown>();\n private loading?: Promise<void>;\n private writeChain: Promise<void> = Promise.resolve();\n\n constructor(private readonly path: string) {}\n\n private ensureLoaded(): Promise<void> {\n if (this.loading === undefined) this.loading = this.load();\n return this.loading;\n }\n\n private async load(): Promise<void> {\n try {\n const raw = await readFile(this.path, \"utf8\");\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n for (const [key, value] of Object.entries(parsed)) this.cache.set(key, value);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n }\n\n /** Queue an atomic write of the current cache; serialised against prior writes. */\n private persist(): Promise<void> {\n this.writeChain = this.writeChain.then(async () => {\n const body = JSON.stringify(Object.fromEntries(this.cache), null, 2);\n await mkdir(dirname(this.path), { recursive: true });\n const tmp = `${this.path}.${process.pid}.${Date.now()}.tmp`;\n await writeFile(tmp, body, \"utf8\");\n await rename(tmp, this.path);\n });\n return this.writeChain;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n await this.ensureLoaded();\n return this.cache.has(key) ? clone(this.cache.get(key) as T) : undefined;\n }\n async set<T>(key: string, value: T): Promise<void> {\n await this.ensureLoaded();\n this.cache.set(key, clone(value));\n await this.persist();\n }\n async has(key: string): Promise<boolean> {\n await this.ensureLoaded();\n return this.cache.has(key);\n }\n async delete(key: string): Promise<boolean> {\n await this.ensureLoaded();\n const existed = this.cache.delete(key);\n if (existed) await this.persist();\n return existed;\n }\n async keys(): Promise<string[]> {\n await this.ensureLoaded();\n return [...this.cache.keys()];\n }\n async clear(): Promise<void> {\n await this.ensureLoaded();\n this.cache.clear();\n await this.persist();\n }\n}\n\n/**\n * Wrap a store so every key is transparently prefixed with `${prefix}:`. Lets\n * several features share one backing file without key collisions.\n */\nexport function namespaced(store: KeyValueStore, prefix: string): KeyValueStore {\n const tag = `${prefix}:`;\n return {\n get: (key) => store.get(tag + key),\n set: (key, value) => store.set(tag + key, value),\n has: (key) => store.has(tag + key),\n delete: (key) => store.delete(tag + key),\n async keys() {\n return (await store.keys()).filter((k) => k.startsWith(tag)).map((k) => k.slice(tag.length));\n },\n async clear() {\n for (const key of await this.keys()) await store.delete(tag + key);\n },\n };\n}\n\n/** A typed settings accessor returned by {@link createSettings}. */\nexport interface SettingsManager<T extends Record<string, unknown>> {\n /** The defaults merged into every {@link get}. */\n readonly defaults: T;\n /** The underlying store. */\n readonly store: KeyValueStore;\n /** Read `id`'s settings, always fully populated from {@link defaults}. */\n get(id: string): Promise<T>;\n /** Shallow-merge `patch` into `id`'s stored settings and persist; returns the merged result. */\n set(id: string, patch: Partial<T>): Promise<T>;\n /** Restore `id` to defaults by removing its stored overrides. */\n reset(id: string): Promise<void>;\n}\n\n/** Options for {@link createSettings}. */\nexport interface CreateSettingsOptions<T extends Record<string, unknown>> {\n /** Backing store (e.g. `new JsonStore(path)`). */\n store: KeyValueStore;\n /** Default values applied to ids with no (or partial) stored settings. */\n defaults: T;\n /** Key prefix; lets one store hold several settings groups. Default `\"settings\"`. */\n namespace?: string;\n}\n\n/**\n * Build a typed, defaults-merged settings accessor over a {@link KeyValueStore}.\n * `get` always returns a complete object (stored overrides on top of defaults),\n * and `set` only persists the overrides — so widening `defaults` later is safe.\n */\nexport function createSettings<T extends Record<string, unknown>>(\n options: CreateSettingsOptions<T>,\n): SettingsManager<T> {\n const { store, defaults } = options;\n const ns = options.namespace ?? \"settings\";\n const keyFor = (id: string): string => `${ns}:${id}`;\n return {\n defaults,\n store,\n async get(id) {\n const stored = await store.get<Partial<T>>(keyFor(id));\n return { ...defaults, ...(stored ?? {}) };\n },\n async set(id, patch) {\n const stored = (await store.get<Partial<T>>(keyFor(id))) ?? {};\n const merged = { ...stored, ...patch };\n await store.set(keyFor(id), merged);\n return { ...defaults, ...merged };\n },\n async reset(id) {\n await store.delete(keyFor(id));\n },\n };\n}\n","/**\n * Declarative preconditions (\"guards\") that run before a command, component\n * or prefix-command handler. Replaces the role/permission/guild-only/owner\n * checks repeated 127+ times across production bots — `member.roles.cache.some(...)`,\n * `member.permissions.has(...)`, `if (!message.guild) return`, ownership and\n * target-hierarchy checks — with a composable predicate pipeline.\n *\n * Attach guards on a command (`command({ guards: [...] })`), on a component\n * (`button({ guards: [...] })`), on a prefix command, or once on the client\n * for everything (`new SpearClient({ guards: [...] })`). On denial, spearkit\n * replies with an ephemeral error embed and skips the handler.\n */\nimport {\n PermissionsBitField,\n type APIInteractionGuildMember,\n type Awaitable,\n type Client,\n type Guild,\n type GuildMember,\n type PermissionResolvable,\n type User,\n} from \"discord.js\";\n\n/**\n * Minimal context a guard reads. Every spearkit handler (slash/prefix/component\n * /modal) already exposes these — guards work uniformly across all of them.\n */\nexport interface GuardContext {\n readonly client: Client;\n readonly user: User;\n readonly member: GuildMember | APIInteractionGuildMember | null;\n readonly guild: Guild | null;\n readonly guildId: string | null;\n readonly channelId: string | null;\n}\n\n/** A guard's outcome. `true` = pass; `false`/`{ allowed: false, reason? }` = deny. */\nexport type GuardResult = boolean | { allowed: false; reason?: string };\n\n/** A precondition evaluated before a handler runs. */\nexport type Guard<TCtx extends GuardContext = GuardContext> = (ctx: TCtx) => Awaitable<GuardResult>;\n\n/** Sugar: build a denial result with an explanation. */\nexport function denied(reason?: string): GuardResult {\n return { allowed: false, reason };\n}\n\n/** The resolved outcome of running a list of guards. */\nexport type RunGuardsResult = { allowed: true } | { allowed: false; reason: string | undefined };\n\n/** Run guards in order, short-circuiting on the first denial. */\nexport async function runGuards<TCtx extends GuardContext>(\n ctx: TCtx,\n guards: readonly Guard<TCtx>[] | undefined,\n): Promise<RunGuardsResult> {\n if (guards === undefined || guards.length === 0) return { allowed: true };\n for (const guard of guards) {\n const result = await guard(ctx);\n if (result === true) continue;\n if (result === false) return { allowed: false, reason: undefined };\n if (result.allowed === false) return { allowed: false, reason: result.reason };\n }\n return { allowed: true };\n}\n\n// --- built-in predicates --------------------------------------------------\n\n/** Require the interaction/message to come from inside a guild. */\nexport function guildOnly(reason: string = \"This can only be used in a server.\"): Guard {\n return (ctx) => (ctx.guildId !== null ? true : denied(reason));\n}\n\n/** Require the interaction/message to come from a DM. */\nexport function dmOnly(reason: string = \"This can only be used in DMs.\"): Guard {\n return (ctx) => (ctx.guildId === null ? true : denied(reason));\n}\n\nfunction memberRoleIds(member: GuildMember | APIInteractionGuildMember | null): string[] {\n if (member === null) return [];\n const roles = member.roles;\n if (Array.isArray(roles)) return roles;\n return [...roles.cache.keys()];\n}\n\nfunction memberPermissionsBitField(\n member: GuildMember | APIInteractionGuildMember | null,\n): PermissionsBitField | null {\n if (member === null) return null;\n const perms = member.permissions;\n if (perms instanceof PermissionsBitField) return perms;\n if (typeof perms === \"string\") return new PermissionsBitField(BigInt(perms));\n return null;\n}\n\n/** Require the invoking member to hold ANY of these role ids. */\nexport function requireAnyRole(\n roleIds: readonly string[],\n reason: string = \"You don't have permission to use this.\",\n): Guard {\n const set = new Set(roleIds);\n return (ctx) => {\n const ids = memberRoleIds(ctx.member);\n return ids.some((id) => set.has(id)) ? true : denied(reason);\n };\n}\n\n/** Require the invoking member to hold EVERY one of these role ids. */\nexport function requireAllRoles(\n roleIds: readonly string[],\n reason: string = \"You're missing one of the required roles.\",\n): Guard {\n return (ctx) => {\n const ids = new Set(memberRoleIds(ctx.member));\n return roleIds.every((id) => ids.has(id)) ? true : denied(reason);\n };\n}\n\n/** Require the invoking user to be one of `ownerIds` (\"bot owners\"). */\nexport function requireOwner(\n ownerIds: readonly string[],\n reason: string = \"This is owner-only.\",\n): Guard {\n const set = new Set(ownerIds);\n return (ctx) => (set.has(ctx.user.id) ? true : denied(reason));\n}\n\n/** Require the invoking member to hold a Discord permission flag. */\nexport function requireUserPermissions(\n permission: PermissionResolvable,\n reason: string = \"You don't have permission to use this.\",\n): Guard {\n return (ctx) => {\n const bits = memberPermissionsBitField(ctx.member);\n if (bits === null) return denied(reason);\n return bits.has(permission) ? true : denied(reason);\n };\n}\n\n/** Require the BOT's own member to hold a Discord permission flag. */\nexport function requireBotPermissions(\n permission: PermissionResolvable,\n reason: string = \"I don't have permission to do that here.\",\n): Guard {\n return async (ctx) => {\n const guild = ctx.guild;\n if (guild === null) return denied(reason);\n const me = guild.members.me ?? (await guild.members.fetchMe().catch(() => null));\n if (me === null) return denied(reason);\n return me.permissions.has(permission) ? true : denied(reason);\n };\n}\n\n/** Inline custom predicate; sugar so a one-off check still types as a Guard. */\nexport function guard<TCtx extends GuardContext = GuardContext>(predicate: Guard<TCtx>): Guard<TCtx> {\n return predicate;\n}\n","/**\n * Permission and role-hierarchy preflight helpers for moderation-style actions.\n *\n * Two failures dominate moderation bots: doing work and *then* hitting a\n * `Missing Permissions` (50013) error, and trying to ban/kick/timeout a member\n * who is above the bot (or above the moderator) in the role list. Both are\n * checkable up front. These helpers compute exactly what's missing so you can\n * bail out with a clear message before touching the API.\n *\n * @example\n * ```ts\n * const missing = botMissingPermissions(ctx.channel, [PermissionFlagsBits.ManageMessages]);\n * if (missing.length) return ctx.error(`I need: ${formatPermissions(missing)}`);\n *\n * const check = moderationCheck({ moderator: ctx.member, target, action: \"ban\" });\n * if (!check.ok) return ctx.error(check.reason);\n * await target.ban();\n * ```\n */\nimport {\n PermissionsBitField,\n type GuildBasedChannel,\n type GuildMember,\n type PermissionResolvable,\n type PermissionsString,\n type Role,\n} from \"discord.js\";\n\n/** A member or role whose permissions are being resolved in a channel. */\nexport type PermissionHolder = GuildMember | Role;\n\n/**\n * Return the names of the `required` permissions that `who` does NOT have in\n * `channel` (taking channel overwrites and Administrator into account). An empty\n * array means every required permission is granted. When permissions can't be\n * resolved (e.g. the member isn't cached) every required permission is reported\n * missing.\n */\nexport function missingPermissions(\n channel: GuildBasedChannel,\n who: PermissionHolder,\n required: PermissionResolvable,\n): PermissionsString[] {\n const held = channel.permissionsFor(who);\n if (held === null) return new PermissionsBitField(required).toArray();\n return held.missing(required);\n}\n\n/**\n * Like {@link missingPermissions} but for the bot's own member in `channel`.\n * Resolves `channel.guild.members.me`; if that isn't available, every required\n * permission is reported missing.\n */\nexport function botMissingPermissions(\n channel: GuildBasedChannel,\n required: PermissionResolvable,\n): PermissionsString[] {\n const me = channel.guild.members.me;\n if (me === null) return new PermissionsBitField(required).toArray();\n return missingPermissions(channel, me, required);\n}\n\n/** Whether `who` has all of `required` in `channel`. */\nexport function hasPermissions(\n channel: GuildBasedChannel,\n who: PermissionHolder,\n required: PermissionResolvable,\n): boolean {\n return missingPermissions(channel, who, required).length === 0;\n}\n\n/**\n * Compare two members by their highest role position. Returns a positive number\n * when `a` is above `b`, negative when below, `0` when equal. This is the raw\n * comparison Discord enforces for moderation actions.\n */\nexport function compareRoles(a: GuildMember, b: GuildMember): number {\n return a.roles.highest.comparePositionTo(b.roles.highest);\n}\n\n/**\n * Whether `actor` outranks `target` enough to act on them: not the same member,\n * `target` isn't the guild owner, and `actor` is either the owner or holds a\n * higher top role.\n */\nexport function canActOn(actor: GuildMember, target: GuildMember): boolean {\n if (actor.id === target.id) return false;\n if (target.id === target.guild.ownerId) return false;\n if (actor.id === actor.guild.ownerId) return true;\n return compareRoles(actor, target) > 0;\n}\n\n/** The result of a {@link moderationCheck}: pass, or fail with a reason. */\nexport type ModerationCheckResult = { ok: true } | { ok: false; reason: string };\n\n/** Options for {@link moderationCheck}. */\nexport interface ModerationCheckOptions {\n /** The member attempting the action. */\n moderator: GuildMember;\n /** The member the action targets. */\n target: GuildMember;\n /**\n * The bot's own member. Defaults to `target.guild.members.me`. Pass `null` to\n * skip the bot-hierarchy check (e.g. when the action doesn't need it).\n */\n me?: GuildMember | null;\n /** Verb used in the failure messages, e.g. `\"ban\"`. Default `\"moderate\"`. */\n action?: string;\n}\n\n/**\n * Validate that both the moderator and the bot may act on `target`, returning a\n * ready-to-show reason on the first failing rule. Checks, in order: acting on\n * self, acting on the server owner, moderator role hierarchy, and bot role\n * hierarchy.\n */\nexport function moderationCheck(options: ModerationCheckOptions): ModerationCheckResult {\n const { moderator, target } = options;\n const action = options.action ?? \"moderate\";\n const me = options.me === undefined ? target.guild.members.me : options.me;\n const name = target.user.username;\n\n if (moderator.id === target.id) return { ok: false, reason: `You can't ${action} yourself.` };\n if (target.id === target.guild.ownerId) {\n return { ok: false, reason: `You can't ${action} the server owner.` };\n }\n if (moderator.id !== moderator.guild.ownerId && compareRoles(moderator, target) <= 0) {\n return {\n ok: false,\n reason: `You can't ${action} **${name}** — their highest role is above or equal to yours.`,\n };\n }\n if (me !== null) {\n if (me.id === target.id) return { ok: false, reason: `I can't ${action} myself.` };\n if (me.id !== me.guild.ownerId && compareRoles(me, target) <= 0) {\n return {\n ok: false,\n reason: `I can't ${action} **${name}** — move my role above theirs and try again.`,\n };\n }\n }\n return { ok: true };\n}\n\nconst PERMISSION_LABELS: Partial<Record<PermissionsString, string>> = {\n CreateInstantInvite: \"Create Invite\",\n KickMembers: \"Kick Members\",\n BanMembers: \"Ban Members\",\n Administrator: \"Administrator\",\n ManageChannels: \"Manage Channels\",\n ManageGuild: \"Manage Server\",\n AddReactions: \"Add Reactions\",\n ViewAuditLog: \"View Audit Log\",\n PrioritySpeaker: \"Priority Speaker\",\n Stream: \"Video\",\n ViewChannel: \"View Channel\",\n SendMessages: \"Send Messages\",\n SendTTSMessages: \"Send TTS Messages\",\n ManageMessages: \"Manage Messages\",\n EmbedLinks: \"Embed Links\",\n AttachFiles: \"Attach Files\",\n ReadMessageHistory: \"Read Message History\",\n MentionEveryone: \"Mention Everyone\",\n UseExternalEmojis: \"Use External Emojis\",\n ViewGuildInsights: \"View Server Insights\",\n Connect: \"Connect\",\n Speak: \"Speak\",\n MuteMembers: \"Mute Members\",\n DeafenMembers: \"Deafen Members\",\n MoveMembers: \"Move Members\",\n UseVAD: \"Use Voice Activity\",\n ChangeNickname: \"Change Nickname\",\n ManageNicknames: \"Manage Nicknames\",\n ManageRoles: \"Manage Roles\",\n ManageWebhooks: \"Manage Webhooks\",\n ManageGuildExpressions: \"Manage Expressions\",\n UseApplicationCommands: \"Use Application Commands\",\n RequestToSpeak: \"Request to Speak\",\n ManageEvents: \"Manage Events\",\n ManageThreads: \"Manage Threads\",\n CreatePublicThreads: \"Create Public Threads\",\n CreatePrivateThreads: \"Create Private Threads\",\n UseExternalStickers: \"Use External Stickers\",\n SendMessagesInThreads: \"Send Messages in Threads\",\n UseEmbeddedActivities: \"Use Activities\",\n ModerateMembers: \"Timeout Members\",\n};\n\n/**\n * Render permission flag names into a human, comma-separated string. Accepts a\n * {@link PermissionsString} array (the output of {@link missingPermissions}) or\n * anything {@link PermissionResolvable}.\n *\n * @example\n * ```ts\n * formatPermissions(botMissingPermissions(ctx.channel, [PermissionFlagsBits.BanMembers]));\n * // → \"Ban Members\"\n * ```\n */\nexport function formatPermissions(permissions: PermissionResolvable): string {\n const names = new PermissionsBitField(permissions).toArray();\n if (names.length === 0) return \"none\";\n return names.map((flag) => PERMISSION_LABELS[flag] ?? flag).join(\", \");\n}\n","/**\n * Discord API error helpers — turn opaque `DiscordAPIError` throws into\n * something you can branch on and show to users.\n *\n * discord.js surfaces REST failures as {@link DiscordAPIError} with a numeric\n * `code` (e.g. `10062` \"Unknown interaction\", `50013` \"Missing permissions\").\n * Memorising those numbers is a chore, and `try/catch` blocks that re-throw\n * everything turn small, recoverable failures (a deleted message, a closed DM)\n * into crashes or scary stack traces. This module gives you named codes, a\n * type-narrowing predicate, and a friendly, end-user-appropriate explanation.\n *\n * @example\n * ```ts\n * try {\n * await message.delete();\n * } catch (err) {\n * if (isDiscordError(err, DiscordErrorCode.UnknownMessage)) return; // already gone\n * throw err;\n * }\n * ```\n */\nimport { DiscordAPIError, HTTPError, RESTJSONErrorCodes } from \"discord.js\";\n\n/**\n * The Discord JSON error codes spearkit cares about most, by readable name.\n * This is a curated subset of discord.js' {@link RESTJSONErrorCodes} covering\n * the failures bots actually hit and can recover from. Values are the numeric\n * codes Discord returns on `DiscordAPIError.code`.\n */\nexport const DiscordErrorCode = {\n /** A referenced channel no longer exists or is invisible to the bot. */\n UnknownChannel: RESTJSONErrorCodes.UnknownChannel, // 10003\n /** The targeted guild is gone or the bot was removed from it. */\n UnknownGuild: RESTJSONErrorCodes.UnknownGuild, // 10004\n /** The referenced member is not in the guild. */\n UnknownMember: RESTJSONErrorCodes.UnknownMember, // 10007\n /** The message was deleted (or never existed) before the action ran. */\n UnknownMessage: RESTJSONErrorCodes.UnknownMessage, // 10008\n /** The user could not be resolved. */\n UnknownUser: RESTJSONErrorCodes.UnknownUser, // 10013\n /** The interaction token expired (the classic 3-second-window failure). */\n UnknownInteraction: RESTJSONErrorCodes.UnknownInteraction, // 10062\n /** The bot lacks access to the resource entirely (not just one permission). */\n MissingAccess: RESTJSONErrorCodes.MissingAccess, // 50001\n /** Action attempted on a DM channel that does not support it. */\n CannotExecuteActionOnDMChannel: RESTJSONErrorCodes.CannotExecuteActionOnDMChannel, // 50003\n /** The target user has DMs closed or blocked the bot. */\n CannotSendMessagesToThisUser: RESTJSONErrorCodes.CannotSendMessagesToThisUser, // 50007\n /** The bot is missing one or more permissions required for the action. */\n MissingPermissions: RESTJSONErrorCodes.MissingPermissions, // 50013\n /** The request body failed Discord's validation. */\n InvalidFormBodyOrContentType:\n RESTJSONErrorCodes.InvalidFormBodyOrContentType, // 50035\n /** The interaction was already acknowledged elsewhere. */\n InteractionHasAlreadyBeenAcknowledged:\n RESTJSONErrorCodes.InteractionHasAlreadyBeenAcknowledged, // 40060\n /** The bot reached the maximum number of guilds it may join. */\n MaximumNumberOfGuildsReached: RESTJSONErrorCodes.MaximumNumberOfGuildsReached, // 30001\n /** Too many active reactions / pins / etc. of this kind. */\n MaximumNumberOfReactionsReached:\n RESTJSONErrorCodes.MaximumNumberOfReactionsReached, // 30010\n} as const;\n\n/** A numeric Discord JSON error code value. */\nexport type DiscordErrorCodeValue =\n (typeof DiscordErrorCode)[keyof typeof DiscordErrorCode];\n\n/**\n * Narrow an unknown thrown value to a {@link DiscordAPIError}. Pass a `code`\n * (or several) to also assert the specific failure — ideal for \"ignore this\n * one error, re-throw the rest\" recovery.\n *\n * @example\n * ```ts\n * if (isDiscordError(err, [DiscordErrorCode.UnknownMessage, DiscordErrorCode.UnknownChannel])) return;\n * ```\n */\nexport function isDiscordError(\n error: unknown,\n code?: number | string | readonly (number | string)[],\n): error is DiscordAPIError {\n if (!(error instanceof DiscordAPIError)) return false;\n if (code === undefined) return true;\n const codes = Array.isArray(code) ? code : [code];\n return codes.includes(error.code);\n}\n\n/**\n * Narrow to a transport-level {@link HTTPError} (timeouts, 5xx, aborted\n * requests) — failures with an HTTP status but no Discord JSON code.\n */\nexport function isHTTPError(error: unknown): error is HTTPError {\n return error instanceof HTTPError;\n}\n\n/** Whether the thrown value is a Discord rate-limit (HTTP 429) response. */\nexport function isRateLimitError(error: unknown): boolean {\n return error instanceof DiscordAPIError && error.status === 429;\n}\n\nconst FRIENDLY: Partial<Record<number, string>> = {\n [DiscordErrorCode.UnknownChannel]: \"That channel no longer exists.\",\n [DiscordErrorCode.UnknownMessage]: \"That message no longer exists.\",\n [DiscordErrorCode.UnknownMember]: \"That member isn't in this server.\",\n [DiscordErrorCode.UnknownUser]: \"I couldn't find that user.\",\n [DiscordErrorCode.UnknownInteraction]:\n \"This took too long and expired — please run it again.\",\n [DiscordErrorCode.InteractionHasAlreadyBeenAcknowledged]:\n \"This took too long and expired — please run it again.\",\n [DiscordErrorCode.MissingAccess]: \"I don't have access to do that here.\",\n [DiscordErrorCode.CannotSendMessagesToThisUser]:\n \"I can't DM that user — they may have DMs disabled.\",\n [DiscordErrorCode.CannotExecuteActionOnDMChannel]:\n \"That can't be done in a DM.\",\n [DiscordErrorCode.MissingPermissions]:\n \"I'm missing the permissions needed to do that.\",\n};\n\n/**\n * Render an end-user-appropriate sentence for a Discord error, or `null` if the\n * error isn't a recognised, explainable Discord failure (in which case you\n * should fall back to a generic \"something went wrong\" message and log it).\n *\n * @example\n * ```ts\n * catch (err) { await ctx.error(explainDiscordError(err) ?? \"Something went wrong.\"); }\n * ```\n */\nexport function explainDiscordError(error: unknown): string | null {\n if (isRateLimitError(error)) {\n return \"I'm being rate-limited right now — please try again in a moment.\";\n }\n if (!(error instanceof DiscordAPIError)) return null;\n if (typeof error.code === \"number\") {\n const known = FRIENDLY[error.code];\n if (known !== undefined) return known;\n }\n return null;\n}\n","/**\n * Graceful shutdown — close the bot cleanly on `SIGINT`/`SIGTERM`.\n *\n * A `Ctrl-C` or a container stop sends a signal; if you don't handle it the\n * process dies mid-flight, leaving the gateway connection, scheduler timers and\n * any open handles to be reaped abruptly. {@link gracefulShutdown} runs an\n * optional hook, calls `client.destroy()` (which also stops spearkit's\n * scheduler), and exits — with a hard timeout so a wedged shutdown can't hang\n * forever.\n *\n * @example\n * ```ts\n * gracefulShutdown(client, { onShutdown: () => db.close() });\n * // or, on a SpearClient:\n * client.enableGracefulShutdown({ onShutdown: () => db.close() });\n * ```\n */\nimport type { Awaitable } from \"discord.js\";\n\n/** Anything with an async-or-sync `destroy()` — a discord.js `Client` qualifies. */\nexport interface Destroyable {\n destroy(): Awaitable<void>;\n}\n\n/** Minimal logger shape used for shutdown progress (your `client.logger` fits). */\nexport interface ShutdownLogger {\n info?(message: string): void;\n error?(message: string, meta?: unknown): void;\n}\n\n/** Options for {@link gracefulShutdown}. */\nexport interface GracefulShutdownOptions {\n /** Signals to listen for. Default `[\"SIGINT\", \"SIGTERM\"]`. */\n signals?: readonly NodeJS.Signals[];\n /** Force-exit if shutdown takes longer than this many ms. Default `10000`. */\n timeoutMs?: number;\n /** Call `process.exit()` when done. Default `true`. Set `false` in tests. */\n exit?: boolean;\n /** Runs before `client.destroy()` — flush databases, close connections, etc. */\n onShutdown?: (signal: NodeJS.Signals) => Awaitable<void>;\n /** Optional progress logger. */\n logger?: ShutdownLogger;\n}\n\n/**\n * Wire signal handlers that gracefully tear `client` down once, then exit.\n * Returns a disposer that removes the handlers (handy for tests/hot-reload).\n */\nexport function gracefulShutdown(\n client: Destroyable,\n options: GracefulShutdownOptions = {},\n): () => void {\n const signals = options.signals ?? ([\"SIGINT\", \"SIGTERM\"] as const);\n const timeoutMs = options.timeoutMs ?? 10_000;\n const exit = options.exit ?? true;\n let shuttingDown = false;\n\n const handler = (signal: NodeJS.Signals): void => {\n if (shuttingDown) return;\n shuttingDown = true;\n options.logger?.info?.(`received ${signal}, shutting down`);\n const force = setTimeout(() => {\n options.logger?.error?.(\"shutdown timed out — forcing exit\");\n if (exit) process.exit(1);\n }, timeoutMs);\n if (typeof force.unref === \"function\") force.unref();\n void (async () => {\n try {\n await options.onShutdown?.(signal);\n await client.destroy();\n clearTimeout(force);\n options.logger?.info?.(\"shutdown complete\");\n if (exit) process.exit(0);\n } catch (error) {\n clearTimeout(force);\n options.logger?.error?.(\"shutdown failed\", error);\n if (exit) process.exit(1);\n }\n })();\n };\n\n for (const signal of signals) process.on(signal, handler);\n return () => {\n for (const signal of signals) process.off(signal, handler);\n };\n}\n","/**\n * Collector ergonomics — wait for a reply, a click, or a modal without the\n * boilerplate (and footguns) of raw discord.js collectors.\n *\n * discord.js collectors are powerful but fiddly: you wire an event emitter, set\n * a `time`, write a `filter`, remember that modal submissions can be dismissed\n * (so they need their own timeout), and translate the \"timed out\" rejection into\n * something your code can branch on. These helpers collapse the common cases to\n * a single `await` that resolves to the result — or `null` on timeout.\n *\n * @example\n * ```ts\n * await ctx.reply(\"What's your favourite colour?\");\n * const reply = await ctx.awaitMessageFrom(); // same user, same channel\n * if (reply === null) return ctx.followUp(\"Timed out.\");\n * await ctx.followUp(`Nice — ${reply.content}!`);\n * ```\n */\nimport type {\n APIModalInteractionResponseCallbackData,\n ChatInputCommandInteraction,\n ComponentType,\n JSONEncodable,\n Message,\n MessageComponentInteraction,\n MessageContextMenuCommandInteraction,\n ModalBuilder,\n ModalComponentData,\n ModalSubmitInteraction,\n PartialGroupDMChannel,\n TextBasedChannel,\n UserContextMenuCommandInteraction,\n} from \"discord.js\";\n\n/** Options for {@link awaitMessage}. */\nexport interface AwaitMessageOptions {\n /** Only accept messages passing this predicate. */\n filter?: (message: Message) => boolean;\n /** How long to wait, in ms. Default `60000`. */\n time?: number;\n}\n\n/**\n * A text-based channel that can collect messages — every {@link TextBasedChannel}\n * except `PartialGroupDMChannel` (which has no message manager).\n */\nexport type CollectableChannel = Exclude<TextBasedChannel, PartialGroupDMChannel>;\n\n/**\n * Wait for the next message in `channel` that matches `filter`, resolving to the\n * `Message` or `null` if none arrives before `time` elapses.\n */\nexport async function awaitMessage(\n channel: CollectableChannel,\n options: AwaitMessageOptions = {},\n): Promise<Message | null> {\n const { filter, time = 60_000 } = options;\n try {\n const collected = await channel.awaitMessages({\n filter,\n max: 1,\n time,\n errors: [\"time\"],\n });\n return collected.first() ?? null;\n } catch {\n return null;\n }\n}\n\n/** Options for {@link awaitComponent}. */\nexport interface AwaitComponentOptions {\n /** Only accept interactions passing this predicate. */\n filter?: (interaction: MessageComponentInteraction) => boolean;\n /** How long to wait, in ms. Default `60000`. */\n time?: number;\n /** Restrict to one component kind (e.g. `ComponentType.Button`). */\n componentType?: ComponentType;\n}\n\n/**\n * Wait for the next component interaction (button/select click) on `message`,\n * resolving to it or `null` on timeout. Note: you must still acknowledge the\n * returned interaction (`update`/`deferUpdate`/`reply`).\n */\nexport async function awaitComponent(\n message: Message,\n options: AwaitComponentOptions = {},\n): Promise<MessageComponentInteraction | null> {\n const { filter, time = 60_000, componentType } = options;\n try {\n return await message.awaitMessageComponent({\n time,\n filter: (interaction) =>\n (componentType === undefined || interaction.componentType === componentType) &&\n (filter?.(interaction) ?? true),\n });\n } catch {\n return null;\n }\n}\n\n/** A modal in any of the forms discord.js' `showModal` accepts. */\nexport type ModalLike =\n | JSONEncodable<APIModalInteractionResponseCallbackData>\n | ModalComponentData\n | ModalBuilder;\n\n/** Interactions that can open a modal and await its submission. */\nexport type ModalShowingInteraction =\n | ChatInputCommandInteraction\n | MessageComponentInteraction\n | UserContextMenuCommandInteraction\n | MessageContextMenuCommandInteraction;\n\n/** Options for {@link showAndAwaitModal}. */\nexport interface AwaitModalOptions {\n /** How long to wait for submission, in ms. Default `120000`. */\n time?: number;\n /** Extra predicate on the submitted modal (already scoped to this user + modal). */\n filter?: (interaction: ModalSubmitInteraction) => boolean;\n}\n\nfunction resolveModalCustomId(modal: ModalLike): string | undefined {\n const m = modal as {\n data?: { custom_id?: string };\n custom_id?: string;\n customId?: string;\n };\n return m.data?.custom_id ?? m.custom_id ?? m.customId;\n}\n\n/**\n * Show `modal` on `interaction`, then wait for its submission — scoped to the\n * same user and the modal's own custom-id — resolving to the\n * {@link ModalSubmitInteraction} or `null` if the user dismisses it / it times\n * out. Sidesteps the \"Unknown interaction after cancelling a modal\" trap by\n * always bounding the wait.\n */\nexport async function showAndAwaitModal(\n interaction: ModalShowingInteraction,\n modal: ModalLike,\n options: AwaitModalOptions = {},\n): Promise<ModalSubmitInteraction | null> {\n const customId = resolveModalCustomId(modal);\n await interaction.showModal(modal);\n const { time = 120_000, filter } = options;\n try {\n return await interaction.awaitModalSubmit({\n time,\n filter: (submitted) =>\n submitted.user.id === interaction.user.id &&\n (customId === undefined || submitted.customId === customId) &&\n (filter?.(submitted) ?? true),\n });\n } catch {\n return null;\n }\n}\n","/**\n * Auto-defer — the antidote to `DiscordAPIError[10062]: Unknown interaction`.\n *\n * An interaction token is only valid for 3 seconds before the *first* response.\n * Any handler that awaits a database query, an HTTP call, or anything else slow\n * blows past that window and the interaction dies. The fix is always the same:\n * `deferReply()` early. Auto-defer does it for you — it arms a timer when the\n * handler starts and, if the handler hasn't responded in time, defers\n * automatically. Cancelled the instant your handler replies/defers itself.\n *\n * Enable per command (`command({ autoDefer: true })`) or globally\n * (`new SpearClient({ autoDefer: true })`). With it on, respond via\n * `ctx.send(...)` / `ctx.editReply(...)` rather than `ctx.reply(...)`, since the\n * reply slot may already be taken by the auto-defer.\n */\nimport {\n MessageFlags,\n type ChatInputCommandInteraction,\n type MessageContextMenuCommandInteraction,\n type UserContextMenuCommandInteraction,\n} from \"discord.js\";\n\n/** How a handler opts into auto-defer: `true` for defaults, or fine-tuning. */\nexport type AutoDeferInput = boolean | { ephemeral?: boolean; delayMs?: number };\n\n/** Resolved auto-defer settings. */\nexport interface AutoDeferConfig {\n /** Defer as an ephemeral (\"thinking…\" hidden) response. */\n ephemeral: boolean;\n /** Delay before the safety defer fires, in ms. Kept under Discord's 3s window. */\n delayMs: number;\n}\n\n/** Default safety margin: defer at 2s, leaving headroom before the 3s cutoff. */\nexport const DEFAULT_AUTO_DEFER_DELAY_MS = 2000;\n\n/** Normalise an {@link AutoDeferInput} (or `undefined`) into a config, or `undefined` when disabled. */\nexport function normalizeAutoDefer(input: AutoDeferInput | undefined): AutoDeferConfig | undefined {\n if (input === undefined || input === false) return undefined;\n if (input === true) return { ephemeral: false, delayMs: DEFAULT_AUTO_DEFER_DELAY_MS };\n return {\n ephemeral: input.ephemeral ?? false,\n delayMs: input.delayMs ?? DEFAULT_AUTO_DEFER_DELAY_MS,\n };\n}\n\n/** Interactions auto-defer supports (those answered with `deferReply`). */\nexport type AutoDeferrableInteraction =\n | ChatInputCommandInteraction\n | UserContextMenuCommandInteraction\n | MessageContextMenuCommandInteraction;\n\n/**\n * Arm a one-shot timer that calls `deferReply()` if the interaction is still\n * un-acknowledged when it fires. Returns a cancel function — always call it\n * once your handler settles (e.g. in a `finally`) to disarm the timer.\n */\nexport function armAutoDefer(\n interaction: AutoDeferrableInteraction,\n config: AutoDeferConfig,\n): () => void {\n const timer = setTimeout(() => {\n if (!interaction.replied && !interaction.deferred) {\n void interaction\n .deferReply(config.ephemeral ? { flags: MessageFlags.Ephemeral } : {})\n .catch(() => undefined);\n }\n }, config.delayMs);\n if (typeof timer.unref === \"function\") timer.unref();\n return () => clearTimeout(timer);\n}\n","import {\n MessageFlags,\n PermissionsBitField,\n type InteractionEditReplyOptions,\n type InteractionReplyOptions,\n type InteractionResponse,\n type Message,\n type PermissionResolvable,\n type PermissionsString,\n type RepliableInteraction,\n} from \"discord.js\";\nimport type { Client } from \"discord.js\";\nimport { awaitMessage, type AwaitMessageOptions } from \"./collectors.js\";\nimport { Embeds, defaultEmbeds, type EmbedLevel, type EmbedPresetInput } from \"./embeds.js\";\n\n/** A client (or anything client-shaped) that may expose a configured {@link Embeds}. */\ntype EmbedHost = Client & { embeds?: Embeds };\n\n/** Reply options with an ergonomic `ephemeral` shortcut (mapped to flags). */\nexport type ReplyData = InteractionReplyOptions & { ephemeral?: boolean };\n\n/** Either a plain string or full reply options. */\nexport type ReplyInput = string | ReplyData;\n\ntype Flags = InteractionReplyOptions[\"flags\"];\n\nfunction withEphemeralFlag(flags: Flags): Flags {\n if (flags == null) return MessageFlags.Ephemeral;\n if (typeof flags === \"number\" || typeof flags === \"bigint\") {\n return Number(flags) | MessageFlags.Ephemeral;\n }\n if (Array.isArray(flags)) return [...flags, MessageFlags.Ephemeral] as Flags;\n return [flags, MessageFlags.Ephemeral] as Flags;\n}\n\n/** Normalises spearkit reply input into a discord.js reply payload. */\nexport function normalizeReply(input: ReplyInput): InteractionReplyOptions {\n if (typeof input === \"string\") return { content: input };\n const { ephemeral, ...rest } = input;\n if (ephemeral) return { ...rest, flags: withEphemeralFlag(rest.flags) };\n return rest;\n}\n\nfunction normalizeEdit(input: ReplyInput): InteractionEditReplyOptions {\n if (typeof input === \"string\") return { content: input };\n const { ephemeral: _ephemeral, flags: _flags, ...rest } = input;\n return rest;\n}\n\n/** Marks an input as ephemeral, regardless of how it was passed. */\nexport function asEphemeral(input: ReplyInput): ReplyData {\n if (typeof input === \"string\") return { content: input, ephemeral: true };\n return { ...input, ephemeral: true };\n}\n\n/**\n * Ergonomic base wrapper shared by every interaction context (commands,\n * buttons, selects, modals). Exposes the common actor/location accessors plus\n * reply helpers that smooth over discord.js' state machine.\n */\nexport abstract class BaseContext<I extends RepliableInteraction = RepliableInteraction> {\n constructor(readonly interaction: I) {}\n\n get client(): I[\"client\"] {\n return this.interaction.client;\n }\n get user() {\n return this.interaction.user;\n }\n get member() {\n return this.interaction.member;\n }\n get guild() {\n return this.interaction.guild;\n }\n get guildId() {\n return this.interaction.guildId;\n }\n get channel() {\n return this.interaction.channel;\n }\n get channelId() {\n return this.interaction.channelId;\n }\n get locale() {\n return this.interaction.locale;\n }\n /** Whether the interaction is already deferred. */\n get deferred() {\n return this.interaction.deferred;\n }\n /** Whether the interaction already received an initial response. */\n get replied() {\n return this.interaction.replied;\n }\n\n /** Send the initial response to the interaction. */\n reply(input: ReplyInput): Promise<InteractionResponse<boolean>> {\n return this.interaction.reply(normalizeReply(input));\n }\n\n /** Reply, but always hidden to everyone except the invoking user. */\n replyEphemeral(input: ReplyInput): Promise<InteractionResponse<boolean>> {\n return this.reply(asEphemeral(input));\n }\n\n /** Acknowledge now and respond later via {@link editReply}. */\n defer(options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.interaction.deferReply(\n options.ephemeral ? { flags: MessageFlags.Ephemeral } : {},\n );\n }\n\n /** Edit the original (or deferred) response. */\n editReply(input: ReplyInput): Promise<Message> {\n return this.interaction.editReply(normalizeEdit(input));\n }\n\n /** Add an additional message after the initial response. */\n followUp(input: ReplyInput): Promise<Message> {\n return this.interaction.followUp(normalizeReply(input));\n }\n\n /**\n * State-aware send: replies, edits a deferred response, or follows up —\n * whichever is valid given the current interaction state. The single method\n * most handlers ever need.\n */\n async send(input: ReplyInput): Promise<void> {\n if (this.interaction.deferred) {\n await this.editReply(input);\n } else if (this.interaction.replied) {\n await this.followUp(input);\n } else {\n await this.reply(input);\n }\n }\n\n /** The bot's resolved permissions in the current channel. */\n get botPermissions(): Readonly<PermissionsBitField> {\n return this.interaction.appPermissions;\n }\n\n /**\n * Permission flag names the BOT is missing in the current channel — empty when\n * it has them all. Zero-fetch: reads the permissions Discord attached to the\n * interaction. Use before an action that needs elevated permissions.\n */\n botMissing(required: PermissionResolvable): PermissionsString[] {\n return this.interaction.appPermissions.missing(required);\n }\n\n /** Permission flag names the invoking USER is missing in the current channel. */\n userMissing(required: PermissionResolvable): PermissionsString[] {\n const held = this.interaction.memberPermissions;\n if (held === null) return new PermissionsBitField(required).toArray();\n return held.missing(required);\n }\n\n /**\n * Wait for the next message in this channel from `userId` (defaults to the\n * invoking user), resolving to it or `null` on timeout. The \"type your answer\"\n * flow without hand-rolling a collector.\n */\n awaitMessageFrom(\n userId: string = this.user.id,\n options: AwaitMessageOptions = {},\n ): Promise<Message | null> {\n const channel = this.interaction.channel;\n if (channel === null || !(\"awaitMessages\" in channel)) return Promise.resolve(null);\n const extra = options.filter;\n return awaitMessage(channel, {\n time: options.time,\n filter: (message) => message.author.id === userId && (extra?.(message) ?? true),\n });\n }\n\n /** Get the configured {@link Embeds} factory — `client.embeds` or the default. */\n protected getEmbeds(): Embeds {\n return (this.interaction.client as EmbedHost).embeds ?? defaultEmbeds;\n }\n\n /** State-aware send of a red error embed. Defaults to ephemeral. */\n error(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"error\", input, { ephemeral: options.ephemeral ?? true });\n }\n\n /** State-aware send of a green success embed. */\n success(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"success\", input, options);\n }\n\n /** State-aware send of a blue info embed. */\n info(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"info\", input, options);\n }\n\n /** State-aware send of a yellow warn embed. */\n warn(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"warn\", input, options);\n }\n\n /** Initial-reply variant of {@link error} (always `reply`, never `editReply`/`followUp`). */\n replyError(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"error\", input, { ephemeral: options.ephemeral ?? true });\n }\n\n /** Initial-reply variant of {@link success}. */\n replySuccess(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"success\", input, options);\n }\n\n /** Initial-reply variant of {@link info}. */\n replyInfo(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"info\", input, options);\n }\n\n /** Initial-reply variant of {@link warn}. */\n replyWarn(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"warn\", input, options);\n }\n\n private sendPreset(level: EmbedLevel, input: EmbedPresetInput, options: { ephemeral?: boolean }): Promise<void> {\n const embed = this.getEmbeds().build(level, input);\n return this.send({ embeds: [embed], ephemeral: options.ephemeral });\n }\n\n private replyPreset(level: EmbedLevel, input: EmbedPresetInput, options: { ephemeral?: boolean }): Promise<InteractionResponse<boolean>> {\n const embed = this.getEmbeds().build(level, input);\n return this.reply({ embeds: [embed], ephemeral: options.ephemeral });\n }\n}\n","/**\n * Rate-limit commands per user, per role, per guild, per channel or globally.\n *\n * A cooldown is described by a {@link CooldownConfig}: a base `duration`, the\n * `scope` it is keyed on, an `exempt` set (users/roles that never wait) and\n * per-user / per-role `overrides` (different durations for specific ids). Set a\n * default on the client (applies to every command) and/or per command.\n */\n\n/** What a cooldown is bucketed against. Default `\"user\"`. */\nexport type CooldownScope = \"user\" | \"guild\" | \"channel\" | \"global\";\n\n/** Users and roles that bypass a cooldown entirely. */\nexport interface CooldownExemptions {\n /** User ids that never wait. */\n users?: readonly string[];\n /** Role ids whose members never wait. */\n roles?: readonly string[];\n}\n\n/** Per-user and per-role duration overrides (milliseconds; `0` disables). */\nexport interface CooldownOverrides {\n /** `userId -> duration ms`. */\n users?: Readonly<Record<string, number>>;\n /** `roleId -> duration ms`. The most lenient matching role wins. */\n roles?: Readonly<Record<string, number>>;\n}\n\n/** Full cooldown description. */\nexport interface CooldownConfig {\n /** Base cooldown in milliseconds. */\n duration: number;\n /** What the cooldown is keyed on. Default `\"user\"`. */\n scope?: CooldownScope;\n /** Users/roles that bypass the cooldown. */\n exempt?: CooldownExemptions;\n /** Per-user / per-role duration overrides. */\n overrides?: CooldownOverrides;\n /** Message shown when blocked. A function receives the remaining ms. */\n message?: string | ((remainingMs: number) => string);\n}\n\n/** A `CooldownConfig`, or a bare duration in milliseconds. */\nexport type CooldownInput = number | CooldownConfig;\n\n/** Normalise a {@link CooldownInput} to a full {@link CooldownConfig}. */\nexport function normalizeCooldown(input: CooldownInput): CooldownConfig {\n return typeof input === \"number\" ? { duration: input } : input;\n}\n\n/** The actor a cooldown is evaluated for. */\nexport interface CooldownActor {\n userId: string;\n roleIds: readonly string[];\n guildId: string | null;\n channelId: string | null;\n}\n\n/** Whether an action is allowed now, and if not, how long remains. */\nexport type CooldownResult = { allowed: true } | { allowed: false; remaining: number };\n\nfunction scopeKey(scope: CooldownScope, actor: CooldownActor): string {\n switch (scope) {\n case \"guild\":\n return `g:${actor.guildId ?? \"dm\"}`;\n case \"channel\":\n return `c:${actor.channelId ?? \"dm\"}`;\n case \"global\":\n return \"global\";\n case \"user\":\n return `u:${actor.userId}`;\n }\n}\n\n/**\n * Resolve the cooldown an actor should serve. `null` means exempt (no\n * cooldown). Otherwise a duration in milliseconds (which may be `0`).\n */\nexport function effectiveDuration(config: CooldownConfig, actor: CooldownActor): number | null {\n if (config.exempt?.users?.includes(actor.userId) === true) return null;\n if (config.exempt?.roles?.some((roleId) => actor.roleIds.includes(roleId)) === true) return null;\n\n const userOverride = config.overrides?.users?.[actor.userId];\n if (userOverride !== undefined) return userOverride;\n\n const roleOverrides = config.overrides?.roles;\n if (roleOverrides !== undefined) {\n let best: number | undefined;\n for (const roleId of actor.roleIds) {\n const candidate = roleOverrides[roleId];\n if (candidate !== undefined) best = best === undefined ? candidate : Math.min(best, candidate);\n }\n if (best !== undefined) return best;\n }\n\n return config.duration;\n}\n\nfunction keyFor(bucket: string, config: CooldownConfig, actor: CooldownActor): string {\n return `${bucket}|${scopeKey(config.scope ?? \"user\", actor)}`;\n}\n\n/**\n * Tracks last-use timestamps and decides whether an action is allowed.\n * Stateful but dependency-free; one instance is shared on `client.cooldowns`.\n */\nexport class CooldownManager {\n private readonly hits = new Map<string, number>();\n\n /** Number of tracked buckets. */\n get size(): number {\n return this.hits.size;\n }\n\n /**\n * Check whether `actor` may use `bucket`, recording the use when allowed.\n * Exempt actors and non-positive durations are always allowed (no record).\n */\n consume(bucket: string, input: CooldownInput, actor: CooldownActor, now: number = Date.now()): CooldownResult {\n const config = normalizeCooldown(input);\n const duration = effectiveDuration(config, actor);\n if (duration === null || duration <= 0) return { allowed: true };\n const key = keyFor(bucket, config, actor);\n const last = this.hits.get(key);\n if (last !== undefined && now - last < duration) {\n return { allowed: false, remaining: duration - (now - last) };\n }\n this.hits.set(key, now);\n return { allowed: true };\n }\n\n /** Like {@link consume} but never records — a read-only check. */\n peek(bucket: string, input: CooldownInput, actor: CooldownActor, now: number = Date.now()): CooldownResult {\n const config = normalizeCooldown(input);\n const duration = effectiveDuration(config, actor);\n if (duration === null || duration <= 0) return { allowed: true };\n const last = this.hits.get(keyFor(bucket, config, actor));\n if (last !== undefined && now - last < duration) {\n return { allowed: false, remaining: duration - (now - last) };\n }\n return { allowed: true };\n }\n\n /** Clear a single actor's cooldown for a bucket. Returns whether one existed. */\n reset(bucket: string, actor: CooldownActor, scope: CooldownScope = \"user\"): boolean {\n return this.hits.delete(`${bucket}|${scopeKey(scope, actor)}`);\n }\n\n /** Drop every tracked cooldown. */\n clear(): void {\n this.hits.clear();\n }\n}\n\n/** Build the user-facing message for a blocked action. */\nexport function formatCooldownMessage(config: CooldownConfig, remainingMs: number): string {\n if (typeof config.message === \"function\") return config.message(remainingMs);\n if (typeof config.message === \"string\") return config.message;\n const seconds = Math.max(1, Math.ceil(remainingMs / 1000));\n return `You're on cooldown — try again in ${seconds}s.`;\n}\n","/**\n * User- and message-context-menu commands (\"Apps\") as first-class spearkit\n * citizens. The bot studied for spearkit hand-rolls these with raw\n * `ContextMenuCommandBuilder` + manual modal hand-offs and lives them under\n * the slash loader — context menus need their own type, target accessor, and\n * dispatch path, and the deploy payload needs to be merged with slash\n * commands.\n *\n * Use {@link userCommand} / {@link messageCommand} to define one, then\n * register with `client.register(...)`. Cooldowns, guards and usage tracking\n * compose exactly like slash commands.\n */\nimport {\n ApplicationCommandType,\n InteractionContextType,\n MessageFlags,\n PermissionsBitField,\n type Awaitable,\n type LocalizationMap,\n type MessageContextMenuCommandInteraction,\n type PermissionResolvable,\n type RESTPostAPIContextMenuApplicationCommandsJSONBody,\n type UserContextMenuCommandInteraction,\n} from \"discord.js\";\nimport { BaseContext } from \"./context.js\";\nimport {\n normalizeCooldown,\n formatCooldownMessage,\n type CooldownActor,\n type CooldownConfig,\n type CooldownInput,\n type CooldownManager,\n} from \"./cooldown.js\";\nimport { runGuards, type Guard } from \"./guards.js\";\nimport { defaultEmbeds, type Embeds } from \"./embeds.js\";\nimport type { Logger } from \"./logger.js\";\nimport type { UsageEvent } from \"./usage.js\";\nimport {\n armAutoDefer,\n normalizeAutoDefer,\n type AutoDeferConfig,\n type AutoDeferInput,\n} from \"./auto-defer.js\";\nimport { explainDiscordError } from \"./discord-errors.js\";\n\n/** Metadata accepted by both context-menu kinds. */\ninterface ContextMenuMeta {\n defaultMemberPermissions?: PermissionResolvable | null;\n nsfw?: boolean;\n guildOnly?: boolean;\n nameLocalizations?: LocalizationMap;\n cooldown?: CooldownInput;\n guards?: readonly Guard[];\n /** Auto-`deferReply()` if the handler is slow, preventing `Unknown interaction`. */\n autoDefer?: AutoDeferInput;\n}\n\n/** Configuration for {@link userCommand}. */\nexport interface UserCommandConfig<R = void> extends ContextMenuMeta {\n name: string;\n run: (ctx: UserContextMenuContext) => Awaitable<R>;\n}\n\n/** Configuration for {@link messageCommand}. */\nexport interface MessageCommandConfig<R = void> extends ContextMenuMeta {\n name: string;\n run: (ctx: MessageContextMenuContext) => Awaitable<R>;\n}\n/** Common shape for any context-menu command (user or message). */\nexport interface BaseContextMenuCommand {\n readonly name: string;\n readonly cooldown?: CooldownConfig;\n readonly guards?: readonly Guard[];\n readonly autoDefer?: AutoDeferConfig;\n toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody;\n}\n\n/** A user-target context-menu command. */\nexport interface UserContextMenu extends BaseContextMenuCommand {\n readonly kind: \"userMenu\";\n execute(interaction: UserContextMenuCommandInteraction): Promise<void>;\n}\n\n/** A message-target context-menu command. */\nexport interface MessageContextMenu extends BaseContextMenuCommand {\n readonly kind: \"messageMenu\";\n execute(interaction: MessageContextMenuCommandInteraction): Promise<void>;\n}\n\n/** A registered context-menu command — discriminated by `kind`. */\nexport type ContextMenuCommand = UserContextMenu | MessageContextMenu;\n\n\n/** Handler context for a user-target context menu. */\nexport class UserContextMenuContext extends BaseContext<UserContextMenuCommandInteraction> {\n /** The user the menu was invoked on. */\n get targetUser() {\n return this.interaction.targetUser;\n }\n /** The member version of the target, if available. */\n get targetMember() {\n return this.interaction.targetMember;\n }\n}\n\n/** Handler context for a message-target context menu. */\nexport class MessageContextMenuContext extends BaseContext<MessageContextMenuCommandInteraction> {\n /** The message the menu was invoked on. */\n get targetMessage() {\n return this.interaction.targetMessage;\n }\n}\n\nfunction baseJSON(\n meta: ContextMenuMeta & { name: string },\n type: ApplicationCommandType.User | ApplicationCommandType.Message,\n): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n return {\n type,\n name: meta.name,\n name_localizations: meta.nameLocalizations,\n nsfw: meta.nsfw,\n default_member_permissions:\n meta.defaultMemberPermissions == null\n ? meta.defaultMemberPermissions\n : new PermissionsBitField(meta.defaultMemberPermissions).bitfield.toString(),\n contexts: meta.guildOnly ? [InteractionContextType.Guild] : undefined,\n };\n}\n\n/** Define a user-target (\"Apps → user\") context-menu command. */\nexport function userCommand<R = void>(config: UserCommandConfig<R>): UserContextMenu {\n const cooldown = config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined;\n return {\n kind: \"userMenu\",\n name: config.name,\n cooldown,\n guards: config.guards,\n autoDefer: normalizeAutoDefer(config.autoDefer),\n toJSON: () => baseJSON(config, ApplicationCommandType.User),\n execute: async (interaction) => {\n await config.run(new UserContextMenuContext(interaction));\n },\n };\n}\n\n/** Define a message-target (\"Apps → message\") context-menu command. */\nexport function messageCommand<R = void>(config: MessageCommandConfig<R>): MessageContextMenu {\n const cooldown = config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined;\n return {\n kind: \"messageMenu\",\n name: config.name,\n cooldown,\n guards: config.guards,\n autoDefer: normalizeAutoDefer(config.autoDefer),\n toJSON: () => baseJSON(config, ApplicationCommandType.Message),\n execute: async (interaction) => {\n await config.run(new MessageContextMenuContext(interaction));\n },\n };\n}\n\n/** Holds context-menu commands and routes incoming interactions to them. */\nexport class ContextMenuRegistry {\n private readonly users = new Map<string, UserContextMenu>();\n private readonly messages = new Map<string, MessageContextMenu>();\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private defaultGuards: readonly Guard[] = [];\n private onUsage?: (event: UsageEvent) => void;\n private defaultAutoDefer?: AutoDeferConfig;\n\n /** Register one or more context-menu commands. */\n add(...commands: readonly ContextMenuCommand[]): this {\n for (const command of commands) {\n if (command.kind === \"userMenu\") this.users.set(command.name, command as UserContextMenu);\n else this.messages.set(command.name, command as MessageContextMenu);\n }\n return this;\n }\n\n /** Total number of registered context-menu commands. */\n get size(): number {\n return this.users.size + this.messages.size;\n }\n\n /** Every registered command, both kinds. */\n all(): ContextMenuCommand[] {\n return [...this.users.values(), ...this.messages.values()];\n }\n\n /** Serialise every command for the REST `applicationCommands` PUT body. */\n toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody[] {\n return this.all().map((c) => c.toJSON());\n }\n\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Default auto-defer applied to menus that don't set their own. */\n setAutoDefer(config?: AutoDeferConfig): this {\n this.defaultAutoDefer = config;\n return this;\n }\n\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Dispatch a user-target interaction. */\n async handleUser(interaction: UserContextMenuCommandInteraction): Promise<void> {\n const command = this.users.get(interaction.commandName);\n if (command === undefined) return;\n await this.dispatch(command, interaction);\n }\n\n /** Dispatch a message-target interaction. */\n async handleMessage(interaction: MessageContextMenuCommandInteraction): Promise<void> {\n const command = this.messages.get(interaction.commandName);\n if (command === undefined) return;\n await this.dispatch(command, interaction);\n }\n\n private async dispatch(\n command: UserContextMenu | MessageContextMenu,\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n ): Promise<void> {\n this.logger?.debug(\"contextMenu\", {\n data: { kind: command.kind, name: command.name, user: interaction.user.id },\n });\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(\n `${command.kind}:${command.name}`,\n cooldown,\n actorOf(interaction),\n );\n if (!result.allowed) {\n await replyCooldown(interaction, cooldown, result.remaining);\n return;\n }\n }\n const guards = combineGuards(this.defaultGuards, command.guards);\n if (guards.length > 0) {\n const guardResult = await runGuards(interaction, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"contextMenu denied\", {\n data: { name: command.name, user: interaction.user.id, reason: guardResult.reason ?? \"\" },\n });\n await replyDenied(interaction, guardResult.reason);\n return;\n }\n }\n const autoDefer = command.autoDefer ?? this.defaultAutoDefer;\n const cancelAutoDefer = autoDefer !== undefined ? armAutoDefer(interaction, autoDefer) : undefined;\n const start = Date.now();\n try {\n if (command.kind === \"userMenu\") {\n await command.execute(interaction as UserContextMenuCommandInteraction);\n } else {\n await command.execute(interaction as MessageContextMenuCommandInteraction);\n }\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n detail: command.kind,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n detail: command.kind,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n interaction.client.emit(\"error\", err);\n const content = explainDiscordError(err) ?? \"Something went wrong.\";\n try {\n if (interaction.deferred) {\n await interaction.editReply({ content });\n } else if (interaction.replied) {\n await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n } else {\n await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n }\n } catch {\n // Interaction likely expired.\n }\n } finally {\n cancelAutoDefer?.();\n }\n }\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction actorOf(\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n): CooldownActor {\n const member = interaction.member;\n let roleIds: readonly string[] = [];\n if (member !== null) {\n const roles = member.roles;\n roleIds = Array.isArray(roles) ? roles : [...roles.cache.keys()];\n }\n return {\n userId: interaction.user.id,\n roleIds,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n };\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\nasync function replyCooldown(\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n config: CooldownConfig,\n remaining: number,\n): Promise<void> {\n const content = formatCooldownMessage(config, remaining);\n try {\n if (interaction.deferred) await interaction.editReply({ content });\n else if (interaction.replied) await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n else await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n } catch {\n // Interaction likely expired.\n }\n}\n\nasync function replyDenied(\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n reason: string | undefined,\n): Promise<void> {\n const embeds = clientEmbeds(interaction.client);\n const text = reason ?? \"You don't have permission to use this.\";\n try {\n const payload = { embeds: [embeds.error(text)], flags: MessageFlags.Ephemeral } as const;\n if (interaction.deferred) await interaction.editReply({ embeds: payload.embeds });\n else if (interaction.replied) await interaction.followUp(payload);\n else await interaction.reply(payload);\n } catch {\n // Interaction likely expired.\n }\n}\n","/**\n * Typed argument parsing for prefix commands.\n *\n * Real bots reimplement the same mention-or-snowflake / ms-duration /\n * \"rest is the reason\" parsing in every prefix command (44+ hand-rolled sites\n * is normal). spearkit lets you declare what you want once and receive a\n * typed `ctx.options` shaped exactly like a slash command's.\n *\n * @example\n * ```ts\n * prefixCommand({\n * name: \"mute\",\n * args: (a) => a.snowflake(\"target\").duration(\"duration\").rest(\"reason\"),\n * run: (ctx) => {\n * ctx.options.target; // string (snowflake id)\n * ctx.options.duration; // number (ms)\n * ctx.options.reason; // string\n * },\n * });\n * ```\n */\nimport { parseDuration } from \"./format.js\";\n\ntype Resolved = {\n string: string;\n integer: number;\n number: number;\n boolean: boolean;\n snowflake: string;\n duration: number;\n rest: string;\n};\n\n/** A single argument's runtime spec; recorded by {@link PrefixArgsBuilder}. */\nexport interface PrefixArgSpec {\n readonly name: string;\n readonly kind: keyof Resolved;\n readonly required: boolean;\n readonly defaultValue?: string | number | boolean;\n}\n\n/** A failed parse, returned by {@link PrefixArgsParser.parse}. */\nexport interface PrefixArgError {\n readonly ok: false;\n readonly arg: string;\n readonly reason: string;\n}\n\n/** A successful parse, returned by {@link PrefixArgsParser.parse}. */\nexport interface PrefixArgsOk<T> {\n readonly ok: true;\n readonly values: T;\n}\n\n/** The compiled parser produced by {@link PrefixArgsBuilder.compile}. */\nexport interface PrefixArgsParser<T> {\n readonly specs: readonly PrefixArgSpec[];\n parse(tokens: readonly string[], rest: string): PrefixArgsOk<T> | PrefixArgError;\n}\n\ntype AddField<TShape, K extends string, T, Req extends boolean> = Req extends true\n ? TShape & { [P in K]: T }\n : TShape & { [P in K]?: T };\n\nconst SNOWFLAKE_RE = /^\\d{15,21}$/;\nconst USER_MENTION_RE = /^<@!?(\\d{15,21})>$/;\nconst CHANNEL_MENTION_RE = /^<#(\\d{15,21})>$/;\nconst ROLE_MENTION_RE = /^<@&(\\d{15,21})>$/;\n\nfunction extractSnowflake(input: string): string | null {\n if (SNOWFLAKE_RE.test(input)) return input;\n const m = USER_MENTION_RE.exec(input) ?? CHANNEL_MENTION_RE.exec(input) ?? ROLE_MENTION_RE.exec(input);\n return m === null ? null : (m[1] ?? null);\n}\n\ninterface BaseOpts {\n /** Mark the arg required. Default `false`. */\n required?: boolean;\n}\n\ninterface StringOpts extends BaseOpts {\n minLength?: number;\n maxLength?: number;\n /** Default value when the token is missing. Makes the arg effectively optional. */\n default?: string;\n}\n\ninterface NumericOpts extends BaseOpts {\n minValue?: number;\n maxValue?: number;\n default?: number;\n}\n\ninterface BooleanOpts extends BaseOpts {\n default?: boolean;\n}\n\ninterface RestOpts extends BaseOpts {\n default?: string;\n}\n\n/**\n * Build a typed argument schema for {@link prefixCommand}. Chain calls\n * positionally — first token → first arg, second → second arg, etc.\n */\nexport class PrefixArgsBuilder<TShape extends Record<string, unknown> = {}> {\n private readonly specs: readonly PrefixArgSpec[];\n\n /** @internal */\n constructor(specs: readonly PrefixArgSpec[] = []) {\n this.specs = specs;\n }\n\n /** A raw string token. */\n string<K extends string, Req extends boolean = false>(\n name: K,\n options?: StringOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, string, Req>> {\n return this.push({ name, kind: \"string\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A whole integer. */\n integer<K extends string, Req extends boolean = false>(\n name: K,\n options?: NumericOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, number, Req>> {\n return this.push({ name, kind: \"integer\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A floating-point number. */\n number<K extends string, Req extends boolean = false>(\n name: K,\n options?: NumericOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, number, Req>> {\n return this.push({ name, kind: \"number\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A boolean (`true`/`yes`/`1`/`on` vs `false`/`no`/`0`/`off`). */\n boolean<K extends string, Req extends boolean = false>(\n name: K,\n options?: BooleanOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, boolean, Req>> {\n return this.push({ name, kind: \"boolean\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A Discord snowflake id — accepts raw ids and `<@u>` / `<#c>` / `<@&r>` mentions. */\n snowflake<K extends string, Req extends boolean = false>(\n name: K,\n options?: BaseOpts & { required?: Req; default?: string },\n ): PrefixArgsBuilder<AddField<TShape, K, string, Req>> {\n return this.push({ name, kind: \"snowflake\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A duration like `\"1h30m\"` or `\"1 saat\"` parsed to milliseconds. */\n duration<K extends string, Req extends boolean = false>(\n name: K,\n options?: BaseOpts & { required?: Req; default?: number },\n ): PrefixArgsBuilder<AddField<TShape, K, number, Req>> {\n return this.push({ name, kind: \"duration\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** The remainder of the message (everything after previous args). */\n rest<K extends string, Req extends boolean = false>(\n name: K,\n options?: RestOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, string, Req>> {\n return this.push({ name, kind: \"rest\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n private push<TNew extends Record<string, unknown>>(spec: PrefixArgSpec): PrefixArgsBuilder<TNew> {\n return new PrefixArgsBuilder<TNew>([...this.specs, spec]);\n }\n\n /** Compile this builder into a parser. */\n compile(): PrefixArgsParser<TShape> {\n const specs = this.specs;\n return {\n specs,\n parse(tokens, rest) {\n const out: Record<string, string | number | boolean | undefined> = {};\n let idx = 0;\n for (let i = 0; i < specs.length; i++) {\n const spec = specs[i] as PrefixArgSpec;\n if (spec.kind === \"rest\") {\n const tail = idx === 0 ? rest : tokens.slice(idx).join(\" \");\n if (tail.length === 0) {\n if (spec.required) return { ok: false, arg: spec.name, reason: `missing required argument \"${spec.name}\"` };\n out[spec.name] = spec.defaultValue as string | undefined;\n } else {\n out[spec.name] = tail;\n }\n idx = tokens.length;\n continue;\n }\n const token = tokens[idx];\n if (token === undefined) {\n if (spec.required) {\n return { ok: false, arg: spec.name, reason: `missing required argument \"${spec.name}\"` };\n }\n out[spec.name] = spec.defaultValue;\n continue;\n }\n const parsed = coerce(spec, token);\n if (parsed.ok === false) return { ok: false, arg: spec.name, reason: parsed.reason };\n out[spec.name] = parsed.value;\n idx += 1;\n }\n return { ok: true, values: out as TShape };\n },\n };\n }\n}\n\nfunction coerce(\n spec: PrefixArgSpec,\n token: string,\n): { ok: true; value: string | number | boolean } | { ok: false; reason: string } {\n switch (spec.kind) {\n case \"string\":\n return { ok: true, value: token };\n case \"integer\": {\n const n = Number(token);\n if (!Number.isInteger(n)) return { ok: false, reason: `\"${token}\" is not an integer` };\n return { ok: true, value: n };\n }\n case \"number\": {\n const n = Number(token);\n if (!Number.isFinite(n)) return { ok: false, reason: `\"${token}\" is not a number` };\n return { ok: true, value: n };\n }\n case \"boolean\": {\n const low = token.toLowerCase();\n if ([\"true\", \"1\", \"yes\", \"on\"].includes(low)) return { ok: true, value: true };\n if ([\"false\", \"0\", \"no\", \"off\"].includes(low)) return { ok: true, value: false };\n return { ok: false, reason: `\"${token}\" is not a boolean` };\n }\n case \"snowflake\": {\n const id = extractSnowflake(token);\n if (id === null) return { ok: false, reason: `\"${token}\" is not a snowflake or mention` };\n return { ok: true, value: id };\n }\n case \"duration\": {\n const ms = parseDuration(token);\n if (ms === null) return { ok: false, reason: `\"${token}\" is not a duration` };\n return { ok: true, value: ms };\n }\n default:\n return { ok: false, reason: `unknown arg kind for \"${spec.name}\"` };\n }\n}\n\n/** Start a fresh args builder. Pass to `prefixCommand({ args })`. */\nexport function prefixArgs(): PrefixArgsBuilder<{}> {\n return new PrefixArgsBuilder();\n}\n","/**\n * Paginated embed replies driven by buttons.\n *\n * Real bots reimplement the same {page state, prev/next buttons, user-only\n * filter, disable-on-timeout} dance per command. {@link paginate} handles it:\n * pass an item list and a render function, and you get an interactive,\n * timeout-aware paginator in one call. {@link buildPaginatorPage} exposes the\n * same logic without the collector, for tests or custom flows.\n */\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ComponentType,\n type BaseMessageOptions,\n type ButtonInteraction,\n type EmbedBuilder,\n type RepliableInteraction,\n} from \"discord.js\";\n\n/** Result of {@link PaginateOptions.render}: a builder OR a full message payload. */\nexport type PaginateRender =\n | EmbedBuilder\n | readonly EmbedBuilder[]\n | BaseMessageOptions;\n\n/** Options for {@link paginate} / {@link buildPaginatorPage}. */\nexport interface PaginateOptions<T> {\n /** Items per page. Default `10`. */\n pageSize?: number;\n /** Build the body for one page. */\n render: (\n slice: readonly T[],\n state: { page: number; pages: number },\n ) => PaginateRender | Promise<PaginateRender>;\n /** When set, only this user id can click. Defaults to the invoker. */\n user?: string;\n /** Time (ms) before buttons are disabled. Default `5 * 60_000`. */\n timeoutMs?: number;\n /** Custom-id prefix to avoid clashes with other components. Default `\"spk-page\"`. */\n namespace?: string;\n /** Make the initial reply ephemeral. Default `false`. */\n ephemeral?: boolean;\n /** Button labels. Defaults: `‹` Prev / `›` Next / `«` First / `»` Last. */\n labels?: {\n first?: string;\n prev?: string;\n next?: string;\n last?: string;\n };\n /** Which buttons to show. Default `\"prev-next\"`. */\n controls?: \"prev-next\" | \"first-prev-next-last\";\n}\n\nfunction normalisePayload(render: PaginateRender): BaseMessageOptions {\n if (\n typeof (render as EmbedBuilder).setColor === \"function\" &&\n typeof (render as EmbedBuilder).toJSON === \"function\"\n ) {\n return { embeds: [render as EmbedBuilder] };\n }\n if (Array.isArray(render)) {\n return { embeds: render as EmbedBuilder[] };\n }\n return render as BaseMessageOptions;\n}\n\nfunction controlsRow(\n page: number,\n pages: number,\n ns: string,\n controls: \"prev-next\" | \"first-prev-next-last\",\n labels: Required<NonNullable<PaginateOptions<unknown>[\"labels\"]>>,\n): ActionRowBuilder<ButtonBuilder> {\n const buttons: ButtonBuilder[] = [];\n if (controls === \"first-prev-next-last\") {\n buttons.push(\n new ButtonBuilder()\n .setCustomId(`${ns}:first`)\n .setStyle(ButtonStyle.Secondary)\n .setLabel(labels.first)\n .setDisabled(page === 0),\n );\n }\n buttons.push(\n new ButtonBuilder()\n .setCustomId(`${ns}:prev`)\n .setStyle(ButtonStyle.Primary)\n .setLabel(labels.prev)\n .setDisabled(page === 0),\n new ButtonBuilder()\n .setCustomId(`${ns}:next`)\n .setStyle(ButtonStyle.Primary)\n .setLabel(labels.next)\n .setDisabled(page >= pages - 1),\n );\n if (controls === \"first-prev-next-last\") {\n buttons.push(\n new ButtonBuilder()\n .setCustomId(`${ns}:last`)\n .setStyle(ButtonStyle.Secondary)\n .setLabel(labels.last)\n .setDisabled(page >= pages - 1),\n );\n }\n return new ActionRowBuilder<ButtonBuilder>().addComponents(...buttons);\n}\n\nfunction resolveLabels(input: PaginateOptions<unknown>[\"labels\"]): Required<NonNullable<PaginateOptions<unknown>[\"labels\"]>> {\n return {\n first: input?.first ?? \"«\",\n prev: input?.prev ?? \"‹\",\n next: input?.next ?? \"›\",\n last: input?.last ?? \"»\",\n };\n}\n\n/**\n * Build the payload for a single paginator page (embeds + button row), without\n * any interaction or collector wiring. Useful for tests, web previews and\n * custom UIs that want spearkit's slicing/controls but their own send path.\n */\nexport async function buildPaginatorPage<T>(\n items: readonly T[],\n page: number,\n options: PaginateOptions<T>,\n): Promise<{ payload: BaseMessageOptions; pages: number }> {\n const pageSize = options.pageSize ?? 10;\n const pages = Math.max(1, Math.ceil(items.length / pageSize));\n const ns = options.namespace ?? \"spk-page\";\n const controls = options.controls ?? \"prev-next\";\n const labels = resolveLabels(options.labels);\n const slice = items.slice(page * pageSize, page * pageSize + pageSize);\n const body = await options.render(slice, { page, pages });\n const payload = normalisePayload(body);\n const components = pages > 1 ? [controlsRow(page, pages, ns, controls, labels)] : [];\n return { payload: { ...payload, components }, pages };\n}\n\n/**\n * Send an item list across paginated, button-controlled embeds.\n *\n * The first page is replied to {@link interaction} (or `editReply`d when\n * already deferred), then a button-component collector handles prev/next\n * clicks until the timeout fires — at which point the buttons are disabled.\n */\nexport async function paginate<T>(\n interaction: RepliableInteraction,\n items: readonly T[],\n options: PaginateOptions<T>,\n): Promise<void> {\n const pageSize = options.pageSize ?? 10;\n const ns = options.namespace ?? \"spk-page\";\n const controls = options.controls ?? \"prev-next\";\n const labels = resolveLabels(options.labels);\n const allowedUser = options.user ?? interaction.user.id;\n let page = 0;\n\n const buildPage = async (): Promise<{ payload: BaseMessageOptions; pages: number }> => {\n return buildPaginatorPage(items, page, { ...options, pageSize, namespace: ns, controls, labels });\n };\n\n const { payload: initial, pages } = await buildPage();\n const sent = interaction.deferred\n ? await interaction.editReply(initial)\n : (await interaction.reply({\n ...initial,\n flags: options.ephemeral === true ? 64 : undefined,\n } as never),\n await interaction.fetchReply());\n\n if (pages <= 1) return;\n\n const collector = sent.createMessageComponentCollector({\n componentType: ComponentType.Button,\n time: options.timeoutMs ?? 5 * 60_000,\n filter: (i: ButtonInteraction) => i.user.id === allowedUser && i.customId.startsWith(`${ns}:`),\n });\n\n collector.on(\"collect\", async (button) => {\n const action = button.customId.slice(ns.length + 1);\n if (action === \"first\") page = 0;\n else if (action === \"prev\") page = Math.max(0, page - 1);\n else if (action === \"next\") page = Math.min(pages - 1, page + 1);\n else if (action === \"last\") page = pages - 1;\n const next = await buildPage();\n await button.update(next.payload).catch(() => undefined);\n });\n\n collector.on(\"end\", async () => {\n const disabledRow = controlsRow(page, pages, ns, controls, labels);\n for (const c of disabledRow.components) c.setDisabled(true);\n const { payload: final } = await buildPage();\n await interaction.editReply({ ...final, components: [disabledRow] }).catch(() => undefined);\n });\n}\n","/**\n * Yes/no confirmation prompts: a one-line API for the \"are you sure?\" flow\n * Yes/no confirmation prompts: a one-line API for the \"are you sure?\" flow\n * that bots reimplement every time (reaction-based, button-based, or modal).\n *\n * @example\n * ```ts\n * const ok = await confirm(interaction, {\n * body: `Reset **${role.name}** for **${members}** members?`,\n * confirm: { label: \"Reset\", style: \"Danger\" },\n * cancel: { label: \"Cancel\" },\n * timeoutMs: 30_000,\n * });\n * if (!ok.confirmed) return ctx.error(\"Cancelled.\");\n * ```\n */\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ComponentType,\n type ButtonInteraction,\n type RepliableInteraction,\n} from \"discord.js\";\nimport { defaultEmbeds, type Embeds } from \"./embeds.js\";\n\n/** Visual style for a confirm/cancel button. */\nexport type ConfirmButtonStyle = \"Primary\" | \"Secondary\" | \"Success\" | \"Danger\";\n\n/** One of the two buttons. */\nexport interface ConfirmButtonOptions {\n /** Visible label. */\n label?: string;\n /** Visual style. */\n style?: ConfirmButtonStyle;\n}\n\n/** Options for {@link confirm}. */\nexport interface ConfirmOptions {\n /** Embed title. */\n title?: string;\n /** Embed body. */\n body: string;\n /** Confirm button config. Defaults: label `\"Confirm\"`, style `\"Success\"`. */\n confirm?: ConfirmButtonOptions;\n /** Cancel button config. Defaults: label `\"Cancel\"`, style `\"Secondary\"`. */\n cancel?: ConfirmButtonOptions;\n /** Only this user id can click. Defaults to the invoker. */\n user?: string;\n /** Time (ms) before the prompt times out as cancelled. Default `30_000`. */\n timeoutMs?: number;\n /** Make the prompt ephemeral. Default `true`. */\n ephemeral?: boolean;\n /** Custom-id prefix to avoid clashes. Default `\"spk-confirm\"`. */\n namespace?: string;\n}\n\n/** Result of {@link confirm}. */\nexport interface ConfirmResult {\n /** Whether the user confirmed (clicked the confirm button before timeout). */\n confirmed: boolean;\n /** How the prompt ended. */\n reason: \"confirm\" | \"cancel\" | \"timeout\";\n /** The triggering button interaction when `reason !== \"timeout\"`. */\n interaction?: ButtonInteraction;\n}\n\nconst STYLE_MAP: Record<ConfirmButtonStyle, ButtonStyle> = {\n Primary: ButtonStyle.Primary,\n Secondary: ButtonStyle.Secondary,\n Success: ButtonStyle.Success,\n Danger: ButtonStyle.Danger,\n};\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\n/**\n * Show a yes/no confirmation prompt and wait for the user's choice.\n *\n * Resolves once a button is clicked or the timeout fires. The clicked button\n * is automatically acknowledged via `deferUpdate`, and the original message's\n * buttons are disabled. Returns `{ confirmed, reason, interaction? }`.\n */\nexport async function confirm(\n interaction: RepliableInteraction,\n options: ConfirmOptions,\n): Promise<ConfirmResult> {\n const ns = options.namespace ?? \"spk-confirm\";\n const confirmLabel = options.confirm?.label ?? \"Confirm\";\n const cancelLabel = options.cancel?.label ?? \"Cancel\";\n const confirmStyle = STYLE_MAP[options.confirm?.style ?? \"Success\"];\n const cancelStyle = STYLE_MAP[options.cancel?.style ?? \"Secondary\"];\n const user = options.user ?? interaction.user.id;\n const ephemeral = options.ephemeral !== false; // default true\n\n const embeds = clientEmbeds(interaction.client);\n const promptEmbed = embeds.info(\n options.title !== undefined\n ? { title: options.title, description: options.body }\n : options.body,\n );\n\n const row = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder().setCustomId(`${ns}:yes`).setLabel(confirmLabel).setStyle(confirmStyle),\n new ButtonBuilder().setCustomId(`${ns}:no`).setLabel(cancelLabel).setStyle(cancelStyle),\n );\n\n const payload = { embeds: [promptEmbed], components: [row] };\n const sent = interaction.deferred\n ? await interaction.editReply(payload)\n : (await interaction.reply({\n ...payload,\n flags: ephemeral ? 64 : undefined,\n } as never),\n await interaction.fetchReply());\n\n return new Promise<ConfirmResult>((resolve) => {\n const collector = sent.createMessageComponentCollector({\n componentType: ComponentType.Button,\n time: options.timeoutMs ?? 30_000,\n max: 1,\n filter: (i: ButtonInteraction) => i.user.id === user && i.customId.startsWith(`${ns}:`),\n });\n\n let outcome: ConfirmResult | null = null;\n\n collector.on(\"collect\", async (button) => {\n const action = button.customId.slice(ns.length + 1);\n outcome = {\n confirmed: action === \"yes\",\n reason: action === \"yes\" ? \"confirm\" : \"cancel\",\n interaction: button,\n };\n await button.deferUpdate().catch(() => undefined);\n });\n\n collector.on(\"end\", async () => {\n // Disable both buttons regardless of outcome.\n for (const c of row.components) c.setDisabled(true);\n await interaction\n .editReply({ embeds: [promptEmbed], components: [row] })\n .catch(() => undefined);\n resolve(outcome ?? { confirmed: false, reason: \"timeout\" });\n });\n });\n}\n","/**\n * A small, dependency-free structured logger used across spearkit so every\n * problem (command/component/event failures, gateway errors, your own code)\n * lands in one consistent, debuggable place.\n *\n * Pluggable transports — the default writes to the console, but you can also\n * stream to a JSONL file ({@link jsonlSink}), POST high-severity entries to a\n * Discord webhook ({@link webhookSink}), or write your own. Setting\n * `transports: [...]` replaces the default; otherwise pass a single `sink`.\n */\nimport { appendFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\n/** Severity of a log entry, lowest to highest. */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\n/** A minimum severity to emit, or `\"silent\"` to suppress everything. */\nexport type LogThreshold = LogLevel | \"silent\";\n\n/** A primitive metadata value attached to a log entry. */\nexport type LogValue = string | number | boolean | bigint | null | undefined;\n\n/** Extra context passed alongside a log message. */\nexport interface LogOptions {\n /** An error to attach; the default sink renders its stack. */\n error?: Error;\n /** Structured key/value metadata. */\n data?: Record<string, LogValue>;\n}\n\n/** A fully-resolved record handed to a {@link LogSink}. */\nexport interface LogEntry {\n readonly level: LogLevel;\n readonly message: string;\n readonly scope?: string;\n readonly timestamp: Date;\n readonly error?: Error;\n readonly data?: Readonly<Record<string, LogValue>>;\n}\n\n/** Receives every entry at or above the configured threshold. */\nexport type LogSink = (entry: LogEntry) => void;\n\n/** Construction options for a {@link Logger}. */\nexport interface LoggerOptions {\n /** Minimum level to emit. Default `\"info\"`. */\n level?: LogThreshold;\n /** Single transport — shorthand for `transports: [sink]`. */\n sink?: LogSink;\n /** Multiple transports. If set, takes precedence over `sink`. */\n transports?: readonly LogSink[];\n /** A scope prefix for every entry (e.g. `\"commands\"`). */\n scope?: string;\n}\n\nconst RANK: Record<LogThreshold, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n silent: Number.POSITIVE_INFINITY,\n};\n\nfunction formatValue(value: LogValue): string {\n return typeof value === \"string\" ? value : String(value);\n}\n\n/** Default sink: human-readable lines to the console (stderr for warn/error). */\nexport function consoleSink(entry: LogEntry): void {\n const scope = entry.scope !== undefined ? ` [${entry.scope}]` : \"\";\n let suffix = \"\";\n if (entry.data !== undefined) {\n const parts = Object.entries(entry.data).map(([k, v]) => `${k}=${formatValue(v)}`);\n if (parts.length > 0) suffix = ` ${parts.join(\" \")}`;\n }\n const line = `${entry.timestamp.toISOString()} ${entry.level.toUpperCase()}${scope} ${entry.message}${suffix}`;\n const write = entry.level === \"warn\" || entry.level === \"error\" ? console.error : console.log;\n write(line);\n if (entry.error !== undefined) write(entry.error.stack ?? String(entry.error));\n}\n\n/**\n * JSON-lines sink: appends one JSON object per entry to `path`. Fire-and-forget;\n * filesystem errors are swallowed so logging never crashes the bot.\n */\nexport function jsonlSink(path: string, options: { minLevel?: LogLevel } = {}): LogSink {\n const min = options.minLevel ?? \"debug\";\n let dirReady = false;\n let chain: Promise<void> = Promise.resolve();\n return (entry) => {\n if (RANK[entry.level] < RANK[min]) return;\n const record = {\n ...entry,\n timestamp: entry.timestamp.toISOString(),\n error: entry.error\n ? { name: entry.error.name, message: entry.error.message, stack: entry.error.stack }\n : undefined,\n };\n const line = `${JSON.stringify(record)}\\n`;\n chain = chain.then(async () => {\n try {\n if (!dirReady) {\n await mkdir(dirname(path), { recursive: true });\n dirReady = true;\n }\n await appendFile(path, line, \"utf8\");\n } catch {\n // Swallow — log file unwritable shouldn't kill the bot.\n }\n });\n };\n}\n\n\n/**\n * Discord-webhook sink: POSTs an embed to a webhook URL for entries at or\n * above `minLevel` (default `\"warn\"`). Useful for sending errors to a private\n * `#bot-errors` channel.\n */\nexport function webhookSink(options: { url: string; minLevel?: LogLevel; username?: string }): LogSink {\n const min = options.minLevel ?? \"warn\";\n return (entry) => {\n if (RANK[entry.level] < RANK[min]) return;\n const color = entry.level === \"error\" ? 0xf04a47 : entry.level === \"warn\" ? 0xf9a825 : 0x3498db;\n const fields: { name: string; value: string; inline?: boolean }[] = [];\n if (entry.scope !== undefined) fields.push({ name: \"Scope\", value: entry.scope, inline: true });\n if (entry.data !== undefined) {\n for (const [k, v] of Object.entries(entry.data)) {\n fields.push({ name: k, value: formatValue(v).slice(0, 1000), inline: true });\n }\n }\n const desc = entry.error?.stack !== undefined\n ? `${entry.message}\\n\\`\\`\\`\\n${entry.error.stack.slice(0, 1800)}\\n\\`\\`\\``\n : entry.message;\n const body = {\n username: options.username ?? \"spearkit\",\n embeds: [\n {\n title: `[${entry.level.toUpperCase()}] ${entry.message.slice(0, 240)}`,\n description: desc.slice(0, 4000),\n color,\n timestamp: entry.timestamp.toISOString(),\n fields: fields.slice(0, 25),\n },\n ],\n };\n void fetch(options.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n }).catch(() => undefined);\n };\n}\n\ninterface SharedState {\n threshold: LogThreshold;\n transports: readonly LogSink[];\n}\n\nfunction resolveTransports(options: LoggerOptions): readonly LogSink[] {\n if (options.transports !== undefined && options.transports.length > 0) return options.transports;\n if (options.sink !== undefined) return [options.sink];\n return [consoleSink];\n}\n\n/**\n * A leveled, scoped logger. Create one directly or read `client.logger`.\n * {@link child} loggers share the parent's threshold and transports, so calling\n * {@link setLevel} on any of them affects the whole tree.\n *\n * @example\n * ```ts\n * const log = new Logger({ level: \"debug\", transports: [consoleSink, jsonlSink(\"./logs/bot.jsonl\")] });\n * log.info(\"ready\", { data: { shard: 0 } });\n * log.child(\"commands\").error(\"handler failed\", { error });\n * ```\n */\nexport class Logger {\n private state: SharedState;\n /** The scope prefix applied to every entry, if any. */\n readonly scope?: string;\n\n constructor(options: LoggerOptions = {}) {\n this.state = {\n threshold: options.level ?? \"info\",\n transports: resolveTransports(options),\n };\n this.scope = options.scope;\n }\n\n /** The current minimum threshold. */\n get level(): LogThreshold {\n return this.state.threshold;\n }\n\n /** Change the threshold for this logger and every child sharing its state. */\n setLevel(level: LogThreshold): this {\n this.state.threshold = level;\n return this;\n }\n\n /** Replace the transport list for this logger and every child sharing its state. */\n setTransports(transports: readonly LogSink[]): this {\n this.state.transports = transports;\n return this;\n }\n\n /** Append a transport to the existing list. */\n addTransport(sink: LogSink): this {\n this.state.transports = [...this.state.transports, sink];\n return this;\n }\n\n /** Whether an entry of `level` would currently be emitted. */\n enabled(level: LogLevel): boolean {\n return RANK[level] >= RANK[this.state.threshold];\n }\n\n /** A child logger with an extra scope segment, sharing this logger's state. */\n child(scope: string): Logger {\n const combined = this.scope !== undefined ? `${this.scope}:${scope}` : scope;\n const child = new Logger({ scope: combined });\n child.state = this.state;\n return child;\n }\n\n /** Emit an entry at an explicit level. */\n log(level: LogLevel, message: string, options?: LogOptions): void {\n if (!this.enabled(level)) return;\n const entry: LogEntry = {\n level,\n message,\n scope: this.scope,\n timestamp: new Date(),\n error: options?.error,\n data: options?.data,\n };\n for (const sink of this.state.transports) {\n try {\n sink(entry);\n } catch {\n // Never let a broken transport kill the dispatcher.\n }\n }\n }\n\n /** Verbose diagnostics, off by default. */\n debug(message: string, options?: LogOptions): void {\n this.log(\"debug\", message, options);\n }\n\n /** Normal operational messages. */\n info(message: string, options?: LogOptions): void {\n this.log(\"info\", message, options);\n }\n\n /** Recoverable problems worth attention. */\n warn(message: string, options?: LogOptions): void {\n this.log(\"warn\", message, options);\n }\n\n /** Failures. Attach the cause via `{ error }`. */\n error(message: string, options?: LogOptions): void {\n this.log(\"error\", message, options);\n }\n}\n\n/** Coerce an unknown thrown value into an {@link Error}. */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n","/**\n * A tiny, dependency-free `.env` loader plus a typed reader for\n * `process.env`. Pulls your existing environment in directly — no `dotenv`\n * package required — and parses values the way `dotenv` does (quotes, `export`\n * prefixes, `#` comments, `\\n` escapes in double quotes).\n */\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/** The flat key/value map parsed from a `.env` file. */\nexport type ParsedEnv = Record<string, string>;\n\n/** Options for {@link loadEnv}. */\nexport interface LoadEnvOptions {\n /** File to read. Default `.env` in the current working directory. */\n path?: string;\n /** Overwrite variables already present in `process.env`. Default `false`. */\n override?: boolean;\n}\n\nfunction stripInlineComment(value: string): string {\n // A `#` that starts a comment must be preceded by whitespace (or be the\n // whole value); `pass#1` is a literal, `value # note` is not.\n const match = /\\s#/.exec(value);\n return match !== null ? value.slice(0, match.index).trimEnd() : value;\n}\n\nfunction unquote(raw: string): string {\n if (raw.length >= 2) {\n const quote = raw[0];\n if ((quote === '\"' || quote === \"'\") && raw.endsWith(quote)) {\n const inner = raw.slice(1, -1);\n return quote === '\"'\n ? inner.replace(/\\\\n/g, \"\\n\").replace(/\\\\r/g, \"\\r\").replace(/\\\\t/g, \"\\t\")\n : inner;\n }\n }\n return stripInlineComment(raw);\n}\n\n/** Parse `.env`-formatted text into a flat object. Does not touch `process.env`. */\nexport function parseEnv(content: string): ParsedEnv {\n const out: ParsedEnv = {};\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line.length === 0 || line.startsWith(\"#\")) continue;\n const body = line.startsWith(\"export \") ? line.slice(7).trimStart() : line;\n const eq = body.indexOf(\"=\");\n if (eq <= 0) continue;\n const key = body.slice(0, eq).trim();\n if (key.length === 0) continue;\n out[key] = unquote(body.slice(eq + 1).trim());\n }\n return out;\n}\n\n/**\n * Read a `.env` file and merge it into `process.env`. Existing variables win\n * unless `override` is set. Missing files are ignored (returns `{}`), so it is\n * safe to call unconditionally.\n *\n * @returns the parsed key/value pairs from the file.\n */\nexport function loadEnv(options: LoadEnvOptions = {}): ParsedEnv {\n const path = options.path ?? join(process.cwd(), \".env\");\n let content: string;\n try {\n content = readFileSync(path, \"utf8\");\n } catch {\n return {};\n }\n const parsed = parseEnv(content);\n for (const [key, value] of Object.entries(parsed)) {\n if (options.override === true || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n return parsed;\n}\n\nconst TRUTHY = new Set([\"true\", \"1\", \"yes\", \"on\"]);\nconst FALSY = new Set([\"false\", \"0\", \"no\", \"off\"]);\n\nfunction read(key: string): string | undefined {\n const value = process.env[key];\n return value !== undefined && value !== \"\" ? value : undefined;\n}\n\nfunction envString(key: string): string | undefined;\nfunction envString(key: string, fallback: string): string;\nfunction envString(key: string, fallback?: string): string | undefined {\n return read(key) ?? fallback;\n}\n\nfunction envNumber(key: string): number | undefined;\nfunction envNumber(key: string, fallback: number): number;\nfunction envNumber(key: string, fallback?: number): number | undefined {\n const value = read(key);\n if (value === undefined) return fallback;\n const parsed = Number(value);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\nfunction envBoolean(key: string): boolean | undefined;\nfunction envBoolean(key: string, fallback: boolean): boolean;\nfunction envBoolean(key: string, fallback?: boolean): boolean | undefined {\n const value = read(key)?.toLowerCase();\n if (value === undefined) return fallback;\n if (TRUTHY.has(value)) return true;\n if (FALSY.has(value)) return false;\n return fallback;\n}\n\nfunction envRequire(key: string): string {\n const value = read(key);\n if (value === undefined) {\n throw new Error(`spearkit: required environment variable \"${key}\" is missing or empty`);\n }\n return value;\n}\n\n/** Typed, ergonomic reader over `process.env`. */\nexport interface EnvReader {\n /** A string value (empty strings count as missing), or `undefined`/`fallback`. */\n string(key: string): string | undefined;\n string(key: string, fallback: string): string;\n /** A numeric value, or `undefined`/`fallback` when missing or non-numeric. */\n number(key: string): number | undefined;\n number(key: string, fallback: number): number;\n /** A boolean (`true/1/yes/on` vs `false/0/no/off`), or `undefined`/`fallback`. */\n boolean(key: string): boolean | undefined;\n boolean(key: string, fallback: boolean): boolean;\n /** A string value, throwing if the variable is missing or empty. */\n require(key: string): string;\n}\n\n/**\n * Typed accessor over `process.env`.\n *\n * @example\n * ```ts\n * loadEnv();\n * const token = env.require(\"DISCORD_TOKEN\");\n * const port = env.number(\"PORT\", 3000);\n * const debug = env.boolean(\"DEBUG\", false);\n * ```\n */\nexport const env: EnvReader = {\n string: envString,\n number: envNumber,\n boolean: envBoolean,\n require: envRequire,\n};\n","/**\n * Scheduled tasks: run work on a cron schedule or a fixed interval.\n *\n * Dependency-free. Includes a standard 5-field cron parser (`*`, ranges,\n * lists, steps, `@daily` style aliases) evaluated in local time, plus a\n * {@link TaskScheduler} that the client starts on ready and stops on destroy.\n */\nimport type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\n\nconst ALIASES: Record<string, string> = {\n \"@yearly\": \"0 0 1 1 *\",\n \"@annually\": \"0 0 1 1 *\",\n \"@monthly\": \"0 0 1 * *\",\n \"@weekly\": \"0 0 * * 0\",\n \"@daily\": \"0 0 * * *\",\n \"@midnight\": \"0 0 * * *\",\n \"@hourly\": \"0 * * * *\",\n};\n\nfunction parseField(spec: string, min: number, max: number, label: string): Set<number> {\n const set = new Set<number>();\n for (const part of spec.split(\",\")) {\n let range = part;\n let step = 1;\n const slash = part.indexOf(\"/\");\n if (slash >= 0) {\n step = Number(part.slice(slash + 1));\n range = part.slice(0, slash);\n if (!Number.isInteger(step) || step <= 0) {\n throw new Error(`spearkit: invalid step in cron ${label} field \"${part}\"`);\n }\n }\n let lo: number;\n let hi: number;\n if (range === \"*\") {\n lo = min;\n hi = max;\n } else if (range.includes(\"-\")) {\n const dash = range.indexOf(\"-\");\n lo = Number(range.slice(0, dash));\n hi = Number(range.slice(dash + 1));\n } else {\n lo = Number(range);\n hi = lo;\n }\n if (!Number.isInteger(lo) || !Number.isInteger(hi) || lo < min || hi > max || lo > hi) {\n throw new Error(`spearkit: cron ${label} field out of range ${min}-${max}: \"${part}\"`);\n }\n for (let value = lo; value <= hi; value += step) set.add(value);\n }\n return set;\n}\n\n/**\n * A parsed cron expression. Evaluates in the host's local time.\n *\n * @example\n * ```ts\n * cron(\"*\\u200b/5 * * * *\").next(); // next 5-minute boundary\n * cron(\"@daily\").next(new Date()); // next midnight\n * ```\n */\nexport class CronExpression {\n /** The original expression string. */\n readonly source: string;\n private readonly minutes: Set<number>;\n private readonly hours: Set<number>;\n private readonly daysOfMonth: Set<number>;\n private readonly months: Set<number>;\n private readonly daysOfWeek: Set<number>;\n private readonly domRestricted: boolean;\n private readonly dowRestricted: boolean;\n\n constructor(expression: string) {\n const trimmed = expression.trim();\n const normalized = ALIASES[trimmed] ?? trimmed;\n const parts = normalized.split(/\\s+/);\n if (parts.length !== 5) {\n throw new Error(`spearkit: cron expression must have 5 fields, got \"${expression}\"`);\n }\n const [minute, hour, dom, month, dow] = parts;\n if (\n minute === undefined ||\n hour === undefined ||\n dom === undefined ||\n month === undefined ||\n dow === undefined\n ) {\n throw new Error(`spearkit: invalid cron expression \"${expression}\"`);\n }\n this.source = expression;\n this.minutes = parseField(minute, 0, 59, \"minute\");\n this.hours = parseField(hour, 0, 23, \"hour\");\n this.daysOfMonth = parseField(dom, 1, 31, \"day-of-month\");\n this.months = parseField(month, 1, 12, \"month\");\n const weekdays = parseField(dow, 0, 7, \"day-of-week\");\n if (weekdays.has(7)) {\n weekdays.delete(7);\n weekdays.add(0);\n }\n this.daysOfWeek = weekdays;\n this.domRestricted = dom !== \"*\";\n this.dowRestricted = dow !== \"*\";\n }\n\n private dayMatches(date: Date): boolean {\n const dom = this.daysOfMonth.has(date.getDate());\n const dow = this.daysOfWeek.has(date.getDay());\n if (this.domRestricted && this.dowRestricted) return dom || dow;\n if (this.domRestricted) return dom;\n if (this.dowRestricted) return dow;\n return true;\n }\n\n /** The next time strictly after `from` (default now) that matches. */\n next(from: Date = new Date()): Date {\n const date = new Date(from.getTime());\n date.setSeconds(0, 0);\n date.setMinutes(date.getMinutes() + 1);\n for (let guard = 0; guard < 100_000; guard++) {\n if (!this.months.has(date.getMonth() + 1)) {\n date.setMonth(date.getMonth() + 1, 1);\n date.setHours(0, 0, 0, 0);\n continue;\n }\n if (!this.dayMatches(date)) {\n date.setDate(date.getDate() + 1);\n date.setHours(0, 0, 0, 0);\n continue;\n }\n if (!this.hours.has(date.getHours())) {\n date.setHours(date.getHours() + 1, 0, 0, 0);\n continue;\n }\n if (!this.minutes.has(date.getMinutes())) {\n date.setMinutes(date.getMinutes() + 1, 0, 0);\n continue;\n }\n return new Date(date.getTime());\n }\n throw new Error(`spearkit: cron expression \"${this.source}\" has no upcoming match`);\n }\n}\n\n/** Compile a cron expression. Throws on malformed input. */\nexport function cron(expression: string): CronExpression {\n return new CronExpression(expression);\n}\n\n/** Configuration for a scheduled task. Provide exactly one of `cron`/`interval`. */\nexport interface TaskConfig {\n /** Unique task name. */\n name: string;\n /** A cron expression (local time). */\n cron?: string;\n /** A fixed interval in milliseconds. */\n interval?: number;\n /** Also run once immediately when the scheduler starts. Default `false`. */\n runOnStart?: boolean;\n /** The work to perform. */\n run: (client: SpearClient) => Awaitable<void>;\n}\n\n/** A compiled, registrable scheduled task. Build it with {@link task}. */\nexport interface ScheduledTask {\n readonly kind: \"task\";\n readonly name: string;\n readonly interval?: number;\n readonly cron?: CronExpression;\n readonly runOnStart: boolean;\n readonly run: (client: SpearClient) => Awaitable<void>;\n}\n\n/** Define a scheduled task. Throws if neither `cron` nor `interval` is given. */\nexport function task(config: TaskConfig): ScheduledTask {\n if (config.cron === undefined && config.interval === undefined) {\n throw new Error(`spearkit: task \"${config.name}\" needs a cron expression or an interval`);\n }\n if (config.interval !== undefined && config.interval <= 0) {\n throw new Error(`spearkit: task \"${config.name}\" interval must be positive`);\n }\n return {\n kind: \"task\",\n name: config.name,\n interval: config.interval,\n cron: config.cron !== undefined ? new CronExpression(config.cron) : undefined,\n runOnStart: config.runOnStart ?? false,\n run: config.run,\n };\n}\n\nconst MAX_TIMEOUT = 2_147_483_647;\n\n/**\n * Runs {@link ScheduledTask}s. The client owns one as `client.scheduler`,\n * starts it on `clientReady` and stops it on `destroy`. Tasks added while\n * running are scheduled immediately.\n */\nexport class TaskScheduler {\n private readonly tasks = new Map<string, ScheduledTask>();\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private running = false;\n private client?: SpearClient;\n private logger?: Logger;\n private readonly reconcilers: { name: string; run: (client: SpearClient) => Awaitable<void> }[] = [];\n\n /** Number of registered tasks. */\n get size(): number {\n return this.tasks.size;\n }\n\n /** Whether the scheduler is currently running. */\n get active(): boolean {\n return this.running;\n }\n\n /** Every registered task. */\n list(): ScheduledTask[] {\n return [...this.tasks.values()];\n }\n\n /** Attach a logger for task error reporting. */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Register one or more tasks. If already running, they are scheduled now. */\n add(...tasks: ScheduledTask[]): this {\n for (const task of tasks) {\n this.tasks.set(task.name, task);\n if (this.running) this.begin(task);\n }\n return this;\n }\n\n /** Remove a task and cancel its timer. */\n remove(name: string): boolean {\n this.cancel(name);\n return this.tasks.delete(name);\n }\n\n /**\n * Schedule a one-shot job: run `fn` once after `ms` milliseconds, then forget.\n * Returns a cancel handle. Replaces hand-rolled `setTimeout` calls for things\n * like \"remind the moderator in 10 minutes if no claim happened\".\n */\n delay(name: string, ms: number, fn: () => Awaitable<void>): { cancel: () => boolean } {\n const key = `delay:${name}`;\n this.cancel(key);\n const timer = setTimeout(async () => {\n this.timers.delete(key);\n try {\n await fn();\n } catch (error) {\n this.logger?.error(`delay \"${name}\" failed`, { error: toError(error) });\n }\n }, Math.max(0, ms));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(key, timer);\n return {\n cancel: () => {\n const had = this.timers.has(key);\n this.cancel(key);\n return had;\n },\n };\n }\n\n /**\n * Schedule a series of follow-up fires from a single start point. Each\n * delay is measured from \"now\"; the callback receives the index of the\n * fire. Generalises the 10s/30s/60s retry pattern in real bots.\n */\n followUp(\n name: string,\n delays: readonly number[],\n fn: (index: number) => Awaitable<void>,\n ): { cancel: () => boolean } {\n const keys = delays.map((_, i) => `followUp:${name}:${i}`);\n for (const key of keys) this.cancel(key);\n delays.forEach((delay, i) => {\n const key = keys[i] as string;\n const timer = setTimeout(async () => {\n this.timers.delete(key);\n try {\n await fn(i);\n } catch (error) {\n this.logger?.error(`followUp \"${name}\" fire ${i} failed`, { error: toError(error) });\n }\n }, Math.max(0, delay));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(key, timer);\n });\n return {\n cancel: () => {\n let any = false;\n for (const key of keys) {\n if (this.timers.has(key)) any = true;\n this.cancel(key);\n }\n return any;\n },\n };\n }\n\n /**\n * Register a once-on-ready reconciler — runs the first time the scheduler\n * starts (typically when the client becomes ready) and never again. Use\n * for restart-recovery work like closing orphaned voice sessions or\n * reapplying cached channel state.\n */\n reconcile(name: string, fn: (client: SpearClient) => Awaitable<void>): void {\n if (this.running && this.client !== undefined) {\n void this.runReconciler(name, fn, this.client);\n } else {\n this.reconcilers.push({ name, run: fn });\n }\n }\n\n private async runReconciler(\n name: string,\n run: (client: SpearClient) => Awaitable<void>,\n client: SpearClient,\n ): Promise<void> {\n this.logger?.debug(\"reconcile\", { data: { name } });\n try {\n await run(client);\n } catch (error) {\n this.logger?.error(`reconciler \"${name}\" failed`, { error: toError(error) });\n }\n }\n\n /** Start every task. Safe to call once; later calls are ignored. */\n start(client: SpearClient): void {\n if (this.running) return;\n this.client = client;\n this.running = true;\n for (const task of this.tasks.values()) this.begin(task);\n const pending = this.reconcilers.splice(0);\n for (const { name, run } of pending) void this.runReconciler(name, run, client);\n }\n\n /** Stop the scheduler and cancel every pending timer. */\n stop(): void {\n this.running = false;\n for (const name of [...this.timers.keys()]) this.cancel(name);\n }\n\n private cancel(name: string): void {\n const timer = this.timers.get(name);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.timers.delete(name);\n }\n }\n\n private begin(task: ScheduledTask): void {\n if (task.runOnStart) void this.runTask(task);\n this.scheduleNext(task);\n }\n\n private delayFor(task: ScheduledTask): number {\n if (task.interval !== undefined) return task.interval;\n if (task.cron !== undefined) return Math.max(0, task.cron.next().getTime() - Date.now());\n return MAX_TIMEOUT;\n }\n\n private scheduleNext(task: ScheduledTask): void {\n if (!this.running) return;\n this.arm(task.name, this.delayFor(task), () => {\n void this.runTask(task);\n this.scheduleNext(task);\n });\n }\n\n private arm(name: string, delay: number, fire: () => void): void {\n if (delay > MAX_TIMEOUT) {\n // setTimeout caps at ~24.8 days — chain until the remainder fits.\n const timer = setTimeout(() => this.arm(name, delay - MAX_TIMEOUT, fire), MAX_TIMEOUT);\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(name, timer);\n return;\n }\n const timer = setTimeout(fire, Math.max(0, delay));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(name, timer);\n }\n\n private async runTask(task: ScheduledTask): Promise<void> {\n if (this.client === undefined) return;\n this.logger?.debug(\"task\", { data: { task: task.name } });\n try {\n await task.run(this.client);\n } catch (error) {\n this.logger?.error(`task \"${task.name}\" failed`, { error: toError(error) });\n }\n }\n}\n","/**\n * Classic text/prefix commands (e.g. `!ping`) alongside slash commands.\n *\n * Reading other users' message content requires the privileged\n * `MessageContent` intent (use `Intents.messages`). The client listens on\n * `messageCreate`, matches a configured prefix (or a bot mention), parses the\n * command name + arguments and dispatches. Cooldowns are shared with slash\n * commands via the same {@link CooldownManager}.\n */\nimport type {\n Awaitable,\n Message,\n MessageCreateOptions,\n MessagePayload,\n MessageReplyOptions,\n} from \"discord.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\nimport type { UsageEvent } from \"./usage.js\";\nimport { runGuards, type Guard, type GuardContext } from \"./guards.js\";\nimport { defaultEmbeds, type Embeds } from \"./embeds.js\";\nimport { PrefixArgsBuilder, prefixArgs, type PrefixArgsParser } from \"./prefix-args.js\";\nimport {\n formatCooldownMessage,\n normalizeCooldown,\n type CooldownActor,\n type CooldownConfig,\n type CooldownInput,\n type CooldownManager,\n} from \"./cooldown.js\";\n\n/** Options controlling how prefix messages are recognised. */\nexport interface PrefixOptions {\n /** One or more command prefixes (e.g. `\"!\"` or `[\"!\", \"?\"]`). */\n prefix?: string | readonly string[];\n /** Also accept a leading bot mention as a prefix. Default `true`. */\n mention?: boolean;\n /** Ignore messages authored by bots. Default `true`. */\n ignoreBots?: boolean;\n /** Match command names case-insensitively. Default `true`. */\n caseInsensitive?: boolean;\n /**\n * Resolve extra prefix(es) per message — e.g. a custom per-guild prefix from a\n * database or {@link createSettings}. Returned prefixes are tried in addition\n * to any static `prefix`. Return `null`/`undefined` for none. Keep it fast\n * (and cached): it runs on every candidate message.\n */\n dynamic?: (message: Message) => Awaitable<string | readonly string[] | null | undefined>;\n}\n\n/** Configuration for a prefix command. */\nexport interface PrefixCommandConfig<\n TArgs extends Record<string, unknown> = Record<string, never>,\n R = void,\n> {\n /** Primary command name (the word after the prefix). */\n name: string;\n /** Alternative names that also trigger the command. */\n aliases?: readonly string[];\n /** Human description (for your own help command). */\n description?: string;\n /** Rate-limit this command. A number is a duration in ms. */\n cooldown?: CooldownInput;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n /** Typed argument schema; `ctx.options` will be shaped from this. */\n args?: (builder: PrefixArgsBuilder<{}>) => PrefixArgsBuilder<TArgs>;\n /** Handler invoked with a {@link PrefixContext} typed by `args`. */\n run: (ctx: PrefixContext<TArgs>) => Awaitable<R>;\n}\n\n/** A registrable prefix command. Build it with {@link prefixCommand}. */\nexport interface PrefixCommand {\n readonly kind: \"prefixCommand\";\n readonly name: string;\n readonly aliases: readonly string[];\n readonly description?: string;\n readonly cooldown?: CooldownConfig;\n readonly guards?: readonly Guard[];\n readonly parser?: PrefixArgsParser<Record<string, unknown>>;\n readonly run: (ctx: PrefixContext) => Promise<void>;\n}\n\n/** Define a prefix command. */\nexport function prefixCommand<\n TArgs extends Record<string, unknown> = Record<string, never>,\n R = void,\n>(config: PrefixCommandConfig<TArgs, R>): PrefixCommand {\n const parser =\n config.args !== undefined\n ? (config.args(prefixArgs()).compile() as PrefixArgsParser<Record<string, unknown>>)\n : undefined;\n return {\n kind: \"prefixCommand\",\n name: config.name,\n aliases: config.aliases ?? [],\n description: config.description,\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n guards: config.guards,\n parser,\n run: async (ctx) => {\n await config.run(ctx as PrefixContext<TArgs>);\n },\n };\n}\n\n/** The handler argument for a prefix command: the message plus parsed args. */\nexport class PrefixContext<\n TArgs extends Record<string, unknown> = Record<string, never>,\n> {\n constructor(\n /** The triggering message. */\n readonly message: Message,\n /** The matched command name (as typed). */\n readonly commandName: string,\n /** Whitespace-split arguments after the command name. */\n readonly args: string[],\n /** The raw text after the command name. */\n readonly rest: string,\n /** Typed parsed arguments from `args` schema, or `{}` if none. */\n readonly options: TArgs = {} as TArgs,\n ) {}\n\n get client(): Message[\"client\"] {\n return this.message.client;\n }\n get author() {\n return this.message.author;\n }\n get member() {\n return this.message.member;\n }\n get guild() {\n return this.message.guild;\n }\n get guildId(): string | null {\n return this.message.guildId;\n }\n get channel() {\n return this.message.channel;\n }\n get channelId(): string {\n return this.message.channelId;\n }\n\n /** Reply to the triggering message. */\n reply(content: string | MessagePayload | MessageReplyOptions): Promise<Message> {\n return this.message.reply(content);\n }\n\n /** Send a message to the same channel (no reply reference). */\n async send(content: string | MessagePayload | MessageCreateOptions): Promise<Message | undefined> {\n const channel = this.message.channel;\n if (\"send\" in channel) return channel.send(content);\n return undefined;\n }\n}\n\n/** Error hook invoked when a prefix command handler throws. */\nexport type PrefixErrorHandler = (error: Error, message: Message) => Awaitable<void>;\n\ninterface ResolvedPrefixOptions {\n prefixes: string[];\n mention: boolean;\n ignoreBots: boolean;\n caseInsensitive: boolean;\n dynamic?: (message: Message) => Awaitable<string | readonly string[] | null | undefined>;\n}\n\nfunction resolveOptions(input: string | readonly string[] | PrefixOptions): ResolvedPrefixOptions {\n if (typeof input === \"string\") return { prefixes: [input], mention: true, ignoreBots: true, caseInsensitive: true };\n if (Array.isArray(input)) {\n return { prefixes: [...input], mention: true, ignoreBots: true, caseInsensitive: true };\n }\n const options = input as PrefixOptions;\n const prefix = options.prefix ?? [];\n return {\n prefixes: typeof prefix === \"string\" ? [prefix] : [...prefix],\n mention: options.mention ?? true,\n ignoreBots: options.ignoreBots ?? true,\n caseInsensitive: options.caseInsensitive ?? true,\n dynamic: options.dynamic,\n };\n}\n\nfunction actorFromMessage(message: Message): CooldownActor {\n const member = message.member;\n const roleIds = member !== null ? [...member.roles.cache.keys()] : [];\n return {\n userId: message.author.id,\n roleIds,\n guildId: message.guildId,\n channelId: message.channelId,\n };\n}\n\n/** Holds prefix commands and dispatches matching messages to them. */\nexport class PrefixRegistry {\n private readonly commands = new Map<string, PrefixCommand>();\n private readonly lookup = new Map<string, PrefixCommand>();\n private options: ResolvedPrefixOptions = {\n prefixes: [],\n mention: true,\n ignoreBots: true,\n caseInsensitive: true,\n };\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private errorHandler?: PrefixErrorHandler;\n private defaultGuards: readonly Guard[] = [];\n private onUsage?: (event: UsageEvent) => void;\n\n /** Configure prefixes and matching behaviour. */\n setOptions(input: string | readonly string[] | PrefixOptions): this {\n this.options = resolveOptions(input);\n return this;\n }\n\n /** Attach a logger for dispatch tracing and error reporting. */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Attach a hook called after each successful prefix command run. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Share a cooldown manager and an optional default cooldown. */\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n /** Guards that run before every prefix command's own guards. */\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Set the handler used when a prefix command throws. */\n onError(handler: PrefixErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Register one or more prefix commands (and their aliases). */\n add(...commands: PrefixCommand[]): this {\n for (const command of commands) {\n this.commands.set(command.name, command);\n this.index(command.name, command);\n for (const alias of command.aliases) this.index(alias, command);\n }\n return this;\n }\n\n private index(key: string, command: PrefixCommand): void {\n this.lookup.set(this.options.caseInsensitive ? key.toLowerCase() : key, command);\n }\n\n /** Look up a command by name or alias. */\n get(nameOrAlias: string): PrefixCommand | undefined {\n return this.lookup.get(this.options.caseInsensitive ? nameOrAlias.toLowerCase() : nameOrAlias);\n }\n\n /** Number of registered commands (excluding aliases). */\n get size(): number {\n return this.commands.size;\n }\n\n /** Every registered command. */\n list(): PrefixCommand[] {\n return [...this.commands.values()];\n }\n\n /** Strip a matching prefix (or bot mention) from `content`, or return `null`. */\n private stripPrefix(\n content: string,\n botId: string | undefined,\n prefixes: readonly string[],\n ): string | null {\n for (const prefix of prefixes) {\n if (prefix.length > 0 && content.startsWith(prefix)) return content.slice(prefix.length);\n }\n if (this.options.mention && botId !== undefined) {\n const match = /^<@!?(\\d+)>\\s*/.exec(content);\n if (match !== null && match[1] === botId) return content.slice(match[0].length);\n }\n return null;\n }\n\n /** Resolve the effective prefixes for a message: static plus any dynamic ones. */\n private async resolvePrefixes(message: Message): Promise<string[]> {\n if (this.options.dynamic === undefined) return this.options.prefixes;\n const extra = await this.options.dynamic(message);\n if (extra === null || extra === undefined) return this.options.prefixes;\n const list = typeof extra === \"string\" ? [extra] : extra;\n return [...this.options.prefixes, ...list];\n }\n\n /**\n * Parse and dispatch a message. Returns `true` when a command ran (or was\n * blocked by a cooldown), `false` when the message was not a prefix command.\n */\n async handle(message: Message): Promise<boolean> {\n const hasMatcher =\n this.options.prefixes.length > 0 || this.options.mention || this.options.dynamic !== undefined;\n if (!hasMatcher) return false;\n if (this.options.ignoreBots && message.author.bot) return false;\n\n const prefixes = await this.resolvePrefixes(message);\n const stripped = this.stripPrefix(message.content, message.client.user?.id, prefixes);\n if (stripped === null) return false;\n\n const trimmed = stripped.trimStart();\n const match = /^(\\S+)\\s*([\\s\\S]*)$/.exec(trimmed);\n if (match === null) return false;\n const name = match[1] ?? \"\";\n const rest = match[2] ?? \"\";\n const command = this.get(name);\n if (command === undefined) return false;\n\n this.logger?.debug(\"prefix\", { data: { command: command.name, user: message.author.id } });\n\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(`prefix:${command.name}`, cooldown, actorFromMessage(message));\n if (!result.allowed) {\n await message.reply(formatCooldownMessage(cooldown, result.remaining)).catch(() => undefined);\n return true;\n }\n }\n const guards = combineGuards(this.defaultGuards, command.guards);\n if (guards.length > 0) {\n const guardCtx = guardContextFromMessage(message);\n const guardResult = await runGuards(guardCtx, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"prefix denied\", {\n data: {\n command: command.name,\n user: message.author.id,\n reason: guardResult.reason ?? \"\",\n },\n });\n await replyDeniedMessage(message, guardResult.reason);\n return true;\n }\n }\n\n const args = rest.length > 0 ? rest.split(/\\s+/) : [];\n let options: Record<string, unknown> = {};\n if (command.parser !== undefined) {\n const parsed = command.parser.parse(args, rest);\n if (!parsed.ok) {\n this.logger?.debug(\"prefix arg error\", {\n data: { command: command.name, user: message.author.id, arg: parsed.arg, reason: parsed.reason },\n });\n const embeds = clientEmbeds(message.client);\n await message.reply({ embeds: [embeds.error(`Argument \\`${parsed.arg}\\`: ${parsed.reason}`)] }).catch(() => undefined);\n return true;\n }\n options = parsed.values as Record<string, unknown>;\n }\n const start = Date.now();\n try {\n await command.run(new PrefixContext(message, name, args, rest, options) as PrefixContext);\n this.onUsage?.({\n type: \"prefix\",\n name: command.name,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: message.author.id,\n userTag: message.author.tag,\n guildId: message.guildId,\n channelId: message.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = toError(error);\n this.logger?.error(`prefix command \"${command.name}\" failed`, { error: err });\n this.onUsage?.({\n type: \"prefix\",\n name: command.name,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: message.author.id,\n userTag: message.author.tag,\n guildId: message.guildId,\n channelId: message.channelId,\n timestamp: new Date(),\n });\n if (this.errorHandler !== undefined) await this.errorHandler(err, message);\n }\n return true;\n }\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction guardContextFromMessage(message: Message): GuardContext {\n return {\n client: message.client,\n user: message.author,\n member: message.member,\n guild: message.guild,\n guildId: message.guildId,\n channelId: message.channelId,\n };\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\nasync function replyDeniedMessage(message: Message, reason: string | undefined): Promise<void> {\n const embeds = clientEmbeds(message.client);\n const text = reason ?? \"You don't have permission to use this.\";\n await message.reply({ embeds: [embeds.error(text)] }).catch(() => undefined);\n}","/**\n * Usage tracking — record *who used what*. Two independent sinks:\n *\n * - a {@link UsageStore} (a database) that persists every use, and\n * - a Discord-channel reporter that posts a human-readable line per use.\n *\n * This is deliberately separate from the {@link Logger}: the logger is for\n * problems/diagnostics, this is an audit trail of command/component usage that\n * you can keep in a store and/or mirror into a channel.\n */\nimport { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\n\n/** What kind of interaction was used. */\nexport type UsageType = \"command\" | \"prefix\" | \"component\" | \"event\";\n\n/** Outcome of a tracked use — `\"success\"` if the handler returned without throwing. */\nexport type UsageOutcome = \"success\" | \"error\";\n\n/** A primitive metadata value attached to a usage event. */\nexport type UsageMetaValue = string | number | boolean | null;\n\n/** A single recorded use. */\nexport interface UsageEvent {\n readonly type: UsageType;\n /** Command/component name (or event name). */\n readonly name: string;\n readonly userId?: string;\n readonly userTag?: string;\n readonly guildId?: string | null;\n readonly channelId?: string | null;\n /** Free-form extra detail. */\n readonly detail?: string;\n readonly timestamp: Date;\n /** Outcome of the handler — `\"success\"` or `\"error\"`. */\n readonly outcome?: UsageOutcome;\n /** Wall-clock duration of the handler in milliseconds. */\n readonly durationMs?: number;\n /** Snapshot of the typed options the handler ran with. */\n readonly options?: Readonly<Record<string, UsageMetaValue>>;\n /** Error message if `outcome === \"error\"`. */\n readonly errorMessage?: string;\n}\n\n/** A pluggable persistence backend for {@link UsageEvent}s. */\nexport interface UsageStore {\n /** Persist one event. */\n record(event: UsageEvent): Awaitable<void>;\n /** Read every persisted event. */\n all(): Awaitable<readonly UsageEvent[]>;\n}\n\n/** In-memory store; great for tests and dashboards. Optionally capped. */\nexport class MemoryUsageStore implements UsageStore {\n private readonly events: UsageEvent[] = [];\n\n constructor(private readonly limit: number = Number.POSITIVE_INFINITY) {}\n\n record(event: UsageEvent): void {\n this.events.push(event);\n if (this.events.length > this.limit) this.events.splice(0, this.events.length - this.limit);\n }\n\n all(): readonly UsageEvent[] {\n return this.events;\n }\n\n /** Total recorded events. */\n get size(): number {\n return this.events.length;\n }\n\n /** Events recorded for a given user id. */\n byUser(userId: string): UsageEvent[] {\n return this.events.filter((event) => event.userId === userId);\n }\n\n /** Forget everything. */\n clear(): void {\n this.events.length = 0;\n }\n}\n\ninterface SerializedEvent {\n type: UsageType;\n name: string;\n userId?: string;\n userTag?: string;\n guildId?: string | null;\n channelId?: string | null;\n detail?: string;\n timestamp: string;\n}\n\n/**\n * File-backed store using newline-delimited JSON (`.jsonl`). Appends one line\n * per event — durable, human-inspectable, and dependency-free.\n */\nexport class JsonFileUsageStore implements UsageStore {\n constructor(private readonly path: string) {}\n\n async record(event: UsageEvent): Promise<void> {\n const line = `${JSON.stringify({ ...event, timestamp: event.timestamp.toISOString() })}\\n`;\n await mkdir(dirname(this.path), { recursive: true });\n await appendFile(this.path, line, \"utf8\");\n }\n\n async all(): Promise<readonly UsageEvent[]> {\n let content: string;\n try {\n content = await readFile(this.path, \"utf8\");\n } catch {\n return [];\n }\n const events: UsageEvent[] = [];\n for (const line of content.split(\"\\n\")) {\n if (line.trim().length === 0) continue;\n const parsed = JSON.parse(line) as SerializedEvent;\n events.push({ ...parsed, timestamp: new Date(parsed.timestamp) });\n }\n return events;\n }\n}\n\n/** Default one-line rendering of a usage event for a Discord channel. */\nexport function formatUsage(event: UsageEvent): string {\n const who = event.userTag ?? (event.userId !== undefined ? `<@${event.userId}>` : \"unknown\");\n const where =\n event.channelId !== undefined && event.channelId !== null ? ` in <#${event.channelId}>` : \"\";\n const detail = event.detail !== undefined ? ` — ${event.detail}` : \"\";\n return `\\`${event.type}\\` **${event.name}** by ${who}${where}${detail}`;\n}\n\n/** Client-level usage configuration (the `usage` option). */\nexport interface UsageOptions {\n /** Persist events to this store (a database). */\n store?: UsageStore;\n /** Mirror events into this Discord channel id. */\n channel?: string;\n /** Custom channel-line formatter. */\n format?: (event: UsageEvent) => string;\n}\ninterface Reporter {\n channelId: string;\n format: (event: UsageEvent) => string;\n}\n\n/**\n * Routes each {@link UsageEvent} to a store and/or a Discord channel. The\n * client owns one as `client.usage`. Tracking is fire-and-forget: a slow store\n * or channel never blocks command handling, and failures are logged.\n */\nexport class UsageTracker {\n /** The configured store, if any. Directly queryable. */\n store?: UsageStore;\n private reporter?: Reporter;\n private client?: SpearClient;\n private logger?: Logger;\n\n /** Whether anything will happen on {@link track}. */\n get enabled(): boolean {\n return this.store !== undefined || this.reporter !== undefined;\n }\n\n /** @internal Used by the client to resolve report channels. */\n setClient(client: SpearClient): this {\n this.client = client;\n return this;\n }\n\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Persist events to a store (a database). */\n setStore(store: UsageStore): this {\n this.store = store;\n return this;\n }\n\n /** Mirror events into a Discord channel. */\n reportTo(channelId: string, format: (event: UsageEvent) => string = formatUsage): this {\n this.reporter = { channelId, format };\n return this;\n }\n\n /** Record a use. Returns immediately; storing/reporting happen in the background. */\n track(event: UsageEvent): void {\n if (!this.enabled) return;\n void this.run(event);\n }\n\n private async run(event: UsageEvent): Promise<void> {\n if (this.store !== undefined) {\n try {\n await this.store.record(event);\n } catch (error) {\n this.logger?.error(\"usage store failed\", { error: toError(error) });\n }\n }\n if (this.reporter !== undefined && this.client !== undefined) {\n try {\n const cache = this.client.channels.cache.get(this.reporter.channelId);\n const channel = cache ?? (await this.client.channels.fetch(this.reporter.channelId));\n if (channel !== null && \"send\" in channel) {\n await channel.send(this.reporter.format(event));\n }\n } catch (error) {\n this.logger?.error(\"usage report failed\", { error: toError(error) });\n }\n }\n }\n}\n","import {\n ApplicationCommandOptionType,\n type APIApplicationCommandBasicOption,\n type APIApplicationCommandChannelOption,\n type APIApplicationCommandOptionChoice,\n type Attachment,\n type Awaitable,\n type ChatInputCommandInteraction,\n type CommandInteractionOption,\n type LocalizationMap,\n} from \"discord.js\";\nimport type { AutocompleteContext } from \"./context.js\";\n\n/**\n * Resolved runtime value types, derived directly from discord.js' option\n * resolver so spearkit stays exactly in lockstep with the underlying getters.\n */\ntype Opt = CommandInteractionOption;\ntype UserValue = NonNullable<Opt[\"user\"]>;\ntype ChannelValue = NonNullable<Opt[\"channel\"]>;\ntype RoleValue = NonNullable<Opt[\"role\"]>;\ntype MentionableValue = NonNullable<Opt[\"user\" | \"role\" | \"member\"]>;\ntype AttachmentValue = Attachment;\n\n/** The discord-allowed channel types for a channel option. */\nexport type AllowedChannelType = NonNullable<APIApplicationCommandChannelOption[\"channel_types\"]>[number];\n\n/** The reader surface spearkit needs off a chat-input interaction. */\ntype OptionReader = ChatInputCommandInteraction[\"options\"];\n\n/** The closed set of values a slash option can resolve to. */\nexport type OptionValue =\n | string\n | number\n | boolean\n | UserValue\n | ChannelValue\n | RoleValue\n | MentionableValue\n | AttachmentValue;\n\n/** A single choice for string/integer/number options. */\nexport interface OptionChoice<V extends string | number = string | number> {\n readonly name: string;\n readonly value: V;\n readonly nameLocalizations?: LocalizationMap;\n}\n\n/** Provides autocomplete suggestions for an option as the user types. */\nexport type AutocompleteHandler<V extends string | number = string | number> = (\n ctx: AutocompleteContext,\n) => Awaitable<OptionChoice<V>[]>;\n\n/**\n * A fully-described slash command option. The two type parameters are phantom\n * markers used purely for compile-time inference of the resolved value:\n * - `TValue` is the type produced for the command handler.\n * - `TRequired` controls nullability (`true` => value, `false` => `| undefined`).\n */\nexport interface OptionDef<TValue extends OptionValue, TRequired extends boolean> {\n readonly type: ApplicationCommandOptionType;\n readonly description: string;\n readonly required: TRequired;\n readonly choices?: readonly OptionChoice[];\n readonly minValue?: number;\n readonly maxValue?: number;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly channelTypes?: readonly AllowedChannelType[];\n readonly autocomplete?: AutocompleteHandler;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n /** Phantom-only marker. Never populated at runtime. */\n readonly __value?: TValue;\n}\n\n/** Any option definition, regardless of value/required type. */\nexport type AnyOptionDef = OptionDef<OptionValue, boolean>;\n\n/** A map of option name => definition. */\nexport type OptionMap = Record<string, AnyOptionDef>;\n\n/** Maps an {@link OptionDef} to the value passed into the command handler. */\nexport type ResolvedOption<O extends AnyOptionDef> = O extends OptionDef<infer V, infer Req>\n ? Req extends true\n ? V\n : V | undefined\n : never;\n\n/** Resolves a whole {@link OptionMap} into the handler's `options` object. */\nexport type ResolvedOptions<O extends OptionMap> = {\n [K in keyof O]: ResolvedOption<O[K]>;\n};\n\n// --- builder config shapes -------------------------------------------------\n\ninterface BaseConfig {\n readonly description: string;\n readonly required?: boolean;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n}\n\ntype IsRequired<C extends BaseConfig> = C[\"required\"] extends true ? true : false;\n\ninterface StringConfig extends BaseConfig {\n readonly choices?: readonly OptionChoice<string>[];\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly autocomplete?: AutocompleteHandler<string>;\n}\n\ninterface NumericConfig extends BaseConfig {\n readonly choices?: readonly OptionChoice<number>[];\n readonly minValue?: number;\n readonly maxValue?: number;\n readonly autocomplete?: AutocompleteHandler<number>;\n}\n\ninterface ChannelConfig extends BaseConfig {\n readonly channelTypes?: readonly AllowedChannelType[];\n}\n\ntype ChoiceValue<C, Fallback extends string | number> = C extends {\n readonly choices: readonly { value: infer V }[];\n}\n ? [V] extends [string | number]\n ? V\n : Fallback\n : Fallback;\n\n/**\n * The single boundary assertion in the option system: the runtime `required`\n * value is a wide `boolean`, but the public type narrows it to the literal the\n * caller supplied. Centralised so every builder stays otherwise cast-free.\n */\nfunction makeOption<TValue extends OptionValue, C extends BaseConfig>(\n type: ApplicationCommandOptionType,\n config: C,\n): OptionDef<TValue, IsRequired<C>> {\n return { type, ...config, required: (config.required ?? false) as IsRequired<C> };\n}\n\n/**\n * Type-safe slash command option builders.\n *\n * @example\n * ```ts\n * options: {\n * target: option.user({ description: \"Who to greet\", required: true }),\n * loud: option.boolean({ description: \"Shout it\" }),\n * }\n * ```\n */\nexport const option = {\n string<const C extends StringConfig>(config: C): OptionDef<ChoiceValue<C, string>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.String, config);\n },\n integer<const C extends NumericConfig>(config: C): OptionDef<ChoiceValue<C, number>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Integer, config);\n },\n number<const C extends NumericConfig>(config: C): OptionDef<ChoiceValue<C, number>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Number, config);\n },\n boolean<const C extends BaseConfig>(config: C): OptionDef<boolean, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Boolean, config);\n },\n user<const C extends BaseConfig>(config: C): OptionDef<UserValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.User, config);\n },\n channel<const C extends ChannelConfig>(config: C): OptionDef<ChannelValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Channel, config);\n },\n role<const C extends BaseConfig>(config: C): OptionDef<RoleValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Role, config);\n },\n mentionable<const C extends BaseConfig>(config: C): OptionDef<MentionableValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Mentionable, config);\n },\n attachment<const C extends BaseConfig>(config: C): OptionDef<AttachmentValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Attachment, config);\n },\n} as const;\n\nfunction mapChoices<V extends string | number>(\n choices: readonly OptionChoice[] | undefined,\n): APIApplicationCommandOptionChoice<V>[] | undefined {\n return choices?.map((c) => ({\n name: c.name,\n value: c.value as V,\n name_localizations: c.nameLocalizations,\n }));\n}\n\n/** Converts a spearkit option definition into the discord REST option payload. */\nexport function toAPIOption(name: string, def: AnyOptionDef): APIApplicationCommandBasicOption {\n const shared = {\n name,\n description: def.description,\n required: def.required,\n name_localizations: def.nameLocalizations,\n description_localizations: def.descriptionLocalizations,\n };\n\n switch (def.type) {\n case ApplicationCommandOptionType.String: {\n const base = { ...shared, min_length: def.minLength, max_length: def.maxLength };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.String, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.String, choices: mapChoices<string>(def.choices) };\n }\n case ApplicationCommandOptionType.Integer: {\n const base = { ...shared, min_value: def.minValue, max_value: def.maxValue };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.Integer, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.Integer, choices: mapChoices<number>(def.choices) };\n }\n case ApplicationCommandOptionType.Number: {\n const base = { ...shared, min_value: def.minValue, max_value: def.maxValue };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.Number, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.Number, choices: mapChoices<number>(def.choices) };\n }\n case ApplicationCommandOptionType.Channel:\n return {\n ...shared,\n type: ApplicationCommandOptionType.Channel,\n channel_types: def.channelTypes ? [...def.channelTypes] : undefined,\n };\n case ApplicationCommandOptionType.User:\n return { ...shared, type: ApplicationCommandOptionType.User };\n case ApplicationCommandOptionType.Boolean:\n return { ...shared, type: ApplicationCommandOptionType.Boolean };\n case ApplicationCommandOptionType.Role:\n return { ...shared, type: ApplicationCommandOptionType.Role };\n case ApplicationCommandOptionType.Mentionable:\n return { ...shared, type: ApplicationCommandOptionType.Mentionable };\n case ApplicationCommandOptionType.Attachment:\n return { ...shared, type: ApplicationCommandOptionType.Attachment };\n default:\n return { ...shared, type: ApplicationCommandOptionType.String };\n }\n}\n\n/** Reads a resolved option value off a discord.js option resolver. */\nexport function readOption(\n resolver: OptionReader,\n name: string,\n def: AnyOptionDef,\n): OptionValue | undefined {\n switch (def.type) {\n case ApplicationCommandOptionType.String:\n return resolver.getString(name) ?? undefined;\n case ApplicationCommandOptionType.Integer:\n return resolver.getInteger(name) ?? undefined;\n case ApplicationCommandOptionType.Number:\n return resolver.getNumber(name) ?? undefined;\n case ApplicationCommandOptionType.Boolean:\n return resolver.getBoolean(name) ?? undefined;\n case ApplicationCommandOptionType.User:\n return resolver.getUser(name) ?? undefined;\n case ApplicationCommandOptionType.Channel:\n return resolver.getChannel(name) ?? undefined;\n case ApplicationCommandOptionType.Role:\n return resolver.getRole(name) ?? undefined;\n case ApplicationCommandOptionType.Mentionable:\n return resolver.getMentionable(name) ?? undefined;\n case ApplicationCommandOptionType.Attachment:\n return resolver.getAttachment(name) ?? undefined;\n default:\n return undefined;\n }\n}\n\n/** True if any option in the map declares an autocomplete handler. */\nexport function optionsHaveAutocomplete(options: OptionMap): boolean {\n for (const def of Object.values(options)) {\n if (def.autocomplete !== undefined) return true;\n }\n return false;\n}\n","import type {\n AutocompleteInteraction,\n ChatInputCommandInteraction,\n JSONEncodable,\n ModalComponentData,\n ModalBuilder,\n APIModalInteractionResponseCallbackData,\n} from \"discord.js\";\nimport { BaseContext } from \"../context.js\";\nimport {\n showAndAwaitModal,\n type AwaitModalOptions,\n type ModalLike,\n} from \"../collectors.js\";\nimport type { ModalSubmitInteraction } from \"discord.js\";\nimport type { OptionChoice, OptionMap, ResolvedOptions } from \"./options.js\";\n\n/**\n * The handler argument for a slash command. Wraps the discord.js interaction\n * and exposes the resolved, fully-typed {@link options}.\n */\nexport class CommandContext<O extends OptionMap = OptionMap> extends BaseContext<ChatInputCommandInteraction> {\n constructor(\n interaction: ChatInputCommandInteraction,\n /** Resolved option values, typed from the command's `options` map. */\n readonly options: ResolvedOptions<O>,\n ) {\n super(interaction);\n }\n\n get commandName(): string {\n return this.interaction.commandName;\n }\n\n /** The invoked subcommand name, if any. */\n get subcommand(): string | null {\n return this.interaction.options.getSubcommand(false);\n }\n\n /** Present a modal to the user in response to this command. */\n async showModal(\n modal: JSONEncodable<APIModalInteractionResponseCallbackData> | ModalComponentData | ModalBuilder,\n ): Promise<void> {\n await this.interaction.showModal(modal);\n }\n\n /**\n * Show a modal and wait for the user to submit it, resolving to the submission\n * or `null` if they dismiss it / it times out. Scoped to this user and modal.\n */\n awaitModal(modal: ModalLike, options?: AwaitModalOptions): Promise<ModalSubmitInteraction | null> {\n return showAndAwaitModal(this.interaction, modal, options);\n }\n}\n\n/**\n * The handler argument for autocomplete requests. Provides the focused value\n * and a typed {@link respond} helper.\n */\nexport class AutocompleteContext {\n constructor(readonly interaction: AutocompleteInteraction) {}\n\n get client() {\n return this.interaction.client;\n }\n get user() {\n return this.interaction.user;\n }\n get guild() {\n return this.interaction.guild;\n }\n get guildId() {\n return this.interaction.guildId;\n }\n get commandName(): string {\n return this.interaction.commandName;\n }\n\n /** Name of the option currently being completed. */\n get focusedName(): string {\n return this.interaction.options.getFocused(true).name;\n }\n\n /** Current partial value typed by the user. */\n get value(): string {\n return this.interaction.options.getFocused();\n }\n\n /** Send autocomplete suggestions (capped at the discord limit of 25). */\n respond(choices: OptionChoice<string | number>[]): Promise<void> {\n return this.interaction.respond(\n choices.slice(0, 25).map((c) => ({\n name: c.name,\n value: c.value,\n name_localizations: c.nameLocalizations,\n })),\n );\n }\n}\n","import {\n ApplicationCommandOptionType,\n ApplicationCommandType,\n InteractionContextType,\n PermissionsBitField,\n type APIApplicationCommandSubcommandGroupOption,\n type APIApplicationCommandSubcommandOption,\n type AutocompleteInteraction,\n type Awaitable,\n type ChatInputCommandInteraction,\n type LocalizationMap,\n type PermissionResolvable,\n type RESTPostAPIChatInputApplicationCommandsJSONBody,\n} from \"discord.js\";\nimport { AutocompleteContext, CommandContext } from \"./context.js\";\nimport {\n optionsHaveAutocomplete,\n readOption,\n toAPIOption,\n type OptionMap,\n type OptionValue,\n type ResolvedOptions,\n} from \"./options.js\";\nimport { normalizeCooldown, type CooldownConfig, type CooldownInput } from \"../cooldown.js\";\nimport {\n normalizeAutoDefer,\n type AutoDeferConfig,\n type AutoDeferInput,\n} from \"../auto-defer.js\";\nimport type { Guard } from \"../guards.js\";\n\n/** Metadata shared by every kind of command. */\ninterface CommonMeta {\n /** Permissions a member must have by default to see/use the command. */\n defaultMemberPermissions?: PermissionResolvable | null;\n /** Mark the command NSFW (age-restricted). */\n nsfw?: boolean;\n /** Restrict invocation to guilds only. */\n guildOnly?: boolean;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n /** Rate-limit this command. A number is a duration in ms; see {@link CooldownConfig}. */\n cooldown?: CooldownInput;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n /**\n * Auto-`deferReply()` if the handler hasn't responded within ~2s, preventing\n * `Unknown interaction` (10062) on slow work. `true` for defaults, or\n * `{ ephemeral, delayMs }`. With it on, respond via `ctx.send`/`ctx.editReply`.\n */\n autoDefer?: AutoDeferInput;\n}\n\n/** Configuration for a leaf (non-subcommand) slash command. */\nexport interface CommandConfig<O extends OptionMap, R> extends CommonMeta {\n name: string;\n description: string;\n options?: O;\n run: (ctx: CommandContext<O>) => Awaitable<R>;\n}\n\n/** Configuration for one subcommand. */\nexport interface SubcommandConfig<O extends OptionMap, R> {\n description: string;\n options?: O;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n run: (ctx: CommandContext<O>) => Awaitable<R>;\n}\n\n/** A type-erased, ready-to-run subcommand created with {@link subcommand}. */\nexport interface Subcommand {\n readonly kind: \"subcommand\";\n readonly description: string;\n readonly options: OptionMap;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n readonly hasAutocomplete: boolean;\n readonly execute: (interaction: ChatInputCommandInteraction) => Promise<void>;\n readonly autocomplete: (interaction: AutocompleteInteraction) => Promise<void>;\n}\n\n/** Configuration for a subcommand group (a folder of subcommands). */\nexport interface SubcommandGroupConfig {\n description: string;\n subcommands: Record<string, Subcommand>;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n}\n\n/** A subcommand group created with {@link subcommandGroup}. */\nexport interface SubcommandGroup extends SubcommandGroupConfig {\n readonly kind: \"group\";\n}\n\n/** Configuration for a command that contains subcommands and/or groups. */\nexport interface CommandGroupConfig extends CommonMeta {\n name: string;\n description: string;\n subcommands?: Record<string, Subcommand>;\n groups?: Record<string, SubcommandGroup>;\n}\n\n/** Everything {@link SlashCommand} needs, pre-built by the factories. */\ninterface SlashCommandSpec {\n name: string;\n json: RESTPostAPIChatInputApplicationCommandsJSONBody;\n hasAutocomplete: boolean;\n executor: (interaction: ChatInputCommandInteraction) => Promise<void>;\n autocompleter: (interaction: AutocompleteInteraction) => Promise<void>;\n cooldown?: CooldownConfig;\n guards?: readonly Guard[];\n autoDefer?: AutoDeferConfig;\n}\n\n/**\n * A registered slash command. Serialises itself for the discord REST API and\n * executes its matching interactions. Construct via {@link command} or\n * {@link commandGroup} rather than directly.\n */\nexport class SlashCommand {\n /** The top-level command name (used as the registry lookup key). */\n readonly name: string;\n /** Whether any option declares an autocomplete handler. */\n readonly hasAutocomplete: boolean;\n private readonly json: RESTPostAPIChatInputApplicationCommandsJSONBody;\n private readonly executor: (interaction: ChatInputCommandInteraction) => Promise<void>;\n private readonly autocompleter: (interaction: AutocompleteInteraction) => Promise<void>;\n /** Resolved cooldown configuration for this command, if any. */\n readonly cooldown?: CooldownConfig;\n /** Resolved guard list for this command, if any. */\n readonly guards?: readonly Guard[];\n /** Resolved auto-defer configuration for this command, if any. */\n readonly autoDefer?: AutoDeferConfig;\n\n /** @internal */\n constructor(spec: SlashCommandSpec) {\n this.name = spec.name;\n this.hasAutocomplete = spec.hasAutocomplete;\n this.json = spec.json;\n this.executor = spec.executor;\n this.autocompleter = spec.autocompleter;\n this.cooldown = spec.cooldown;\n this.guards = spec.guards;\n this.autoDefer = spec.autoDefer;\n }\n\n /** Serialise to the discord REST chat-input command payload. */\n toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n return this.json;\n }\n\n /** Execute the command for an incoming chat-input interaction. */\n execute(interaction: ChatInputCommandInteraction): Promise<void> {\n return this.executor(interaction);\n }\n\n /** Execute autocomplete for the focused option. */\n autocomplete(interaction: AutocompleteInteraction): Promise<void> {\n return this.autocompleter(interaction);\n }\n}\n\nfunction resolveOptions(\n interaction: ChatInputCommandInteraction,\n options: OptionMap,\n): Record<string, OptionValue | undefined> {\n const resolved: Record<string, OptionValue | undefined> = {};\n for (const [name, def] of Object.entries(options)) {\n resolved[name] = readOption(interaction.options, name, def);\n }\n return resolved;\n}\n\nfunction makeAutocompleter(\n options: OptionMap,\n): (interaction: AutocompleteInteraction) => Promise<void> {\n return async (interaction) => {\n const focused = interaction.options.getFocused(true);\n const def = options[focused.name];\n if (def?.autocomplete === undefined) {\n if (!interaction.responded) await interaction.respond([]);\n return;\n }\n const ctx = new AutocompleteContext(interaction);\n const choices = await def.autocomplete(ctx);\n if (!interaction.responded) await ctx.respond(choices);\n };\n}\n\nfunction baseJSON(\n meta: CommonMeta & { name: string; description: string },\n options: RESTPostAPIChatInputApplicationCommandsJSONBody[\"options\"],\n): RESTPostAPIChatInputApplicationCommandsJSONBody {\n return {\n type: ApplicationCommandType.ChatInput,\n name: meta.name,\n description: meta.description,\n name_localizations: meta.nameLocalizations,\n description_localizations: meta.descriptionLocalizations,\n nsfw: meta.nsfw,\n default_member_permissions:\n meta.defaultMemberPermissions == null\n ? meta.defaultMemberPermissions\n : new PermissionsBitField(meta.defaultMemberPermissions).bitfield.toString(),\n contexts: meta.guildOnly ? [InteractionContextType.Guild] : undefined,\n options,\n };\n}\n\nfunction leafOptionsJSON(options: OptionMap): RESTPostAPIChatInputApplicationCommandsJSONBody[\"options\"] {\n return Object.entries(options).map(([name, def]) => toAPIOption(name, def));\n}\n\nfunction subcommandJSON(name: string, sub: Subcommand): APIApplicationCommandSubcommandOption {\n return {\n type: ApplicationCommandOptionType.Subcommand,\n name,\n description: sub.description,\n name_localizations: sub.nameLocalizations,\n description_localizations: sub.descriptionLocalizations,\n options: Object.entries(sub.options).map(([n, def]) => toAPIOption(n, def)),\n };\n}\n\nfunction routeSubcommand(\n groupName: string | null,\n subName: string | null,\n subcommands: Record<string, Subcommand> | undefined,\n groups: Record<string, SubcommandGroup> | undefined,\n): Subcommand | undefined {\n if (groupName !== null) return groups?.[groupName]?.subcommands[subName ?? \"\"];\n if (subName !== null) return subcommands?.[subName];\n return undefined;\n}\n\n/**\n * Define a slash command with type-safe options and a co-located handler.\n *\n * @example\n * ```ts\n * export default command({\n * name: \"echo\",\n * description: \"Repeat a message\",\n * options: { msg: option.string({ description: \"Text\", required: true }) },\n * run: (ctx) => ctx.reply(ctx.options.msg),\n * });\n * ```\n */\nexport function command<O extends OptionMap = Record<string, never>, R = void>(\n config: CommandConfig<O, R>,\n): SlashCommand {\n const options: OptionMap = config.options ?? {};\n const { run } = config;\n const executor = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const resolved = resolveOptions(interaction, options) as ResolvedOptions<O>;\n await run(new CommandContext<O>(interaction, resolved));\n };\n return new SlashCommand({\n name: config.name,\n json: baseJSON(config, leafOptionsJSON(options)),\n hasAutocomplete: optionsHaveAutocomplete(options),\n executor,\n autocompleter: makeAutocompleter(options),\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n guards: config.guards,\n autoDefer: normalizeAutoDefer(config.autoDefer),\n });\n}\n\n/** Define a single subcommand with type-safe options and a handler. */\nexport function subcommand<O extends OptionMap = Record<string, never>, R = void>(\n config: SubcommandConfig<O, R>,\n): Subcommand {\n const options: OptionMap = config.options ?? {};\n const { run } = config;\n const execute = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const resolved = resolveOptions(interaction, options) as ResolvedOptions<O>;\n await run(new CommandContext<O>(interaction, resolved));\n };\n return {\n kind: \"subcommand\",\n description: config.description,\n options,\n nameLocalizations: config.nameLocalizations,\n descriptionLocalizations: config.descriptionLocalizations,\n hasAutocomplete: optionsHaveAutocomplete(options),\n execute,\n autocomplete: makeAutocompleter(options),\n };\n}\n\n/** Group several subcommands under a shared name. */\nexport function subcommandGroup(config: SubcommandGroupConfig): SubcommandGroup {\n return { kind: \"group\", ...config };\n}\n\n/** Define a command that routes to subcommands and/or subcommand groups. */\nexport function commandGroup(config: CommandGroupConfig): SlashCommand {\n const { subcommands, groups } = config;\n\n const options: (APIApplicationCommandSubcommandOption | APIApplicationCommandSubcommandGroupOption)[] =\n [];\n for (const [name, sub] of Object.entries(subcommands ?? {})) {\n options.push(subcommandJSON(name, sub));\n }\n for (const [name, group] of Object.entries(groups ?? {})) {\n options.push({\n type: ApplicationCommandOptionType.SubcommandGroup,\n name,\n description: group.description,\n name_localizations: group.nameLocalizations,\n description_localizations: group.descriptionLocalizations,\n options: Object.entries(group.subcommands).map(([n, s]) => subcommandJSON(n, s)),\n });\n }\n\n const hasAutocomplete =\n Object.values(subcommands ?? {}).some((s) => s.hasAutocomplete) ||\n Object.values(groups ?? {}).some((g) => Object.values(g.subcommands).some((s) => s.hasAutocomplete));\n\n const executor = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const target = routeSubcommand(\n interaction.options.getSubcommandGroup(false),\n interaction.options.getSubcommand(false),\n subcommands,\n groups,\n );\n if (target === undefined) {\n throw new Error(`spearkit: no subcommand handler for /${config.name}`);\n }\n await target.execute(interaction);\n };\n\n const autocompleter = async (interaction: AutocompleteInteraction): Promise<void> => {\n const target = routeSubcommand(\n interaction.options.getSubcommandGroup(false),\n interaction.options.getSubcommand(false),\n subcommands,\n groups,\n );\n if (target === undefined) {\n if (!interaction.responded) await interaction.respond([]);\n return;\n }\n await target.autocomplete(interaction);\n };\n\n return new SlashCommand({\n name: config.name,\n json: baseJSON(config, options),\n hasAutocomplete,\n executor,\n autocompleter,\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n guards: config.guards,\n autoDefer: normalizeAutoDefer(config.autoDefer),\n });\n}\n","import {\n MessageFlags,\n REST,\n Routes,\n type AutocompleteInteraction,\n type Awaitable,\n type ChatInputCommandInteraction,\n type RESTPostAPIApplicationCommandsJSONBody,\n type RESTPutAPIApplicationCommandsResult,\n type RESTPutAPIApplicationGuildCommandsResult,\n} from \"discord.js\";\nimport type { SlashCommand } from \"./command.js\";\nimport type { Logger } from \"../logger.js\";\nimport { runGuards, type Guard } from \"../guards.js\";\nimport { defaultEmbeds, type Embeds } from \"../embeds.js\";\nimport {\n CooldownManager,\n formatCooldownMessage,\n type CooldownActor,\n type CooldownConfig,\n} from \"../cooldown.js\";\nimport type { UsageEvent } from \"../usage.js\";\nimport { armAutoDefer, type AutoDeferConfig } from \"../auto-defer.js\";\nimport { explainDiscordError } from \"../discord-errors.js\";\n\n/** Error hook invoked when a command handler throws. */\nexport type CommandErrorHandler = (\n error: Error,\n interaction: ChatInputCommandInteraction,\n) => Awaitable<void>;\n\n/** Options for pushing commands to discord. */\nexport interface DeployOptions {\n /** Bot token. Falls back to the client token when omitted. */\n token?: string;\n /** Application (client) id. */\n applicationId: string;\n /** Deploy to a single guild (updates instantly) instead of globally. */\n guildId?: string;\n /** Reuse an existing REST instance instead of creating one. */\n rest?: REST;\n}\n\n/** Result of a {@link CommandRegistry.deploy} call. */\nexport type DeployResult =\n | RESTPutAPIApplicationCommandsResult\n | RESTPutAPIApplicationGuildCommandsResult;\n\n/** Holds every slash command and routes interactions to them. */\nexport class CommandRegistry {\n private readonly commands = new Map<string, SlashCommand>();\n private errorHandler?: CommandErrorHandler;\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private defaultGuards: readonly Guard[] = [];\n private onUsage?: (event: UsageEvent) => void;\n private defaultAutoDefer?: AutoDeferConfig;\n\n /** Register one or more commands. Later registrations override by name. */\n add(...commands: SlashCommand[]): this {\n for (const command of commands) this.commands.set(command.name, command);\n return this;\n }\n\n /** Remove a command by name. */\n remove(name: string): boolean {\n return this.commands.delete(name);\n }\n\n /** Look up a command by name. */\n get(name: string): SlashCommand | undefined {\n return this.commands.get(name);\n }\n\n /** All registered commands. */\n all(): SlashCommand[] {\n return [...this.commands.values()];\n }\n\n /** All registered command names. */\n get names(): string[] {\n return [...this.commands.keys()];\n }\n\n /** Number of registered commands. */\n get size(): number {\n return this.commands.size;\n }\n\n /** Set the handler used when a command throws. */\n onError(handler: CommandErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Attach a logger used for dispatch tracing (debug level). */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Wire a shared cooldown manager and an optional default cooldown for every command. */\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n /** Guards that run before every command's own guards. */\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Default auto-defer applied to commands that don't set their own. */\n setAutoDefer(config?: AutoDeferConfig): this {\n this.defaultAutoDefer = config;\n return this;\n }\n\n /** Attach a hook called after each successful command execution. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Serialise every command to discord REST payloads. */\n toJSON(): RESTPostAPIApplicationCommandsJSONBody[] {\n return this.all().map((c) => c.toJSON());\n }\n\n /** Dispatch an incoming chat-input interaction to its command. */\n async handle(interaction: ChatInputCommandInteraction): Promise<void> {\n const command = this.commands.get(interaction.commandName);\n if (command === undefined) return;\n this.logger?.debug(\"command\", {\n data: { command: interaction.commandName, user: interaction.user.id },\n });\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(command.name, cooldown, actorOf(interaction));\n if (!result.allowed) {\n await this.replyCooldown(interaction, cooldown, result.remaining);\n return;\n }\n }\n const guards = combineGuards(this.defaultGuards, command.guards);\n if (guards.length > 0) {\n const guardResult = await runGuards(interaction, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"command denied\", {\n data: {\n command: command.name,\n user: interaction.user.id,\n reason: guardResult.reason ?? \"\",\n },\n });\n await this.replyDenied(interaction, guardResult.reason);\n return;\n }\n }\n const autoDefer = command.autoDefer ?? this.defaultAutoDefer;\n const cancelAutoDefer = autoDefer !== undefined ? armAutoDefer(interaction, autoDefer) : undefined;\n const start = Date.now();\n try {\n await command.execute(interaction);\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n if (this.errorHandler !== undefined) {\n await this.errorHandler(err, interaction);\n } else {\n await this.defaultErrorReply(err, interaction);\n }\n } finally {\n cancelAutoDefer?.();\n }\n }\n\n /** Dispatch an autocomplete interaction to its command. */\n async handleAutocomplete(interaction: AutocompleteInteraction): Promise<void> {\n const command = this.commands.get(interaction.commandName);\n if (command === undefined) return;\n try {\n await command.autocomplete(interaction);\n } catch {\n if (!interaction.responded) await interaction.respond([]).catch(() => undefined);\n }\n }\n\n /**\n * Push the registered commands to discord. Returns the API response.\n *\n * Guild deploys apply instantly and are ideal during development; global\n * deploys can take up to an hour to propagate.\n */\n async deploy(options: DeployOptions): Promise<DeployResult> {\n let rest = options.rest;\n if (rest === undefined) {\n if (options.token === undefined) {\n throw new Error(\"spearkit: deploy() requires a token or a pre-configured REST instance\");\n }\n rest = new REST().setToken(options.token);\n }\n const body = this.toJSON();\n const route =\n options.guildId !== undefined\n ? Routes.applicationGuildCommands(options.applicationId, options.guildId)\n : Routes.applicationCommands(options.applicationId);\n return (await rest.put(route, { body })) as DeployResult;\n }\n\n private async defaultErrorReply(\n error: Error,\n interaction: ChatInputCommandInteraction,\n ): Promise<void> {\n interaction.client.emit(\"error\", error);\n const content = explainDiscordError(error) ?? \"Something went wrong while running that command.\";\n try {\n if (interaction.deferred) {\n await interaction.editReply({ content });\n } else if (interaction.replied) {\n await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n } else {\n await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n }\n } catch {\n // Interaction likely expired; nothing actionable left to do.\n }\n }\n\n private async replyCooldown(\n interaction: ChatInputCommandInteraction,\n config: CooldownConfig,\n remaining: number,\n ): Promise<void> {\n this.logger?.debug(\"cooldown\", {\n data: { command: interaction.commandName, user: interaction.user.id, remaining },\n });\n const content = formatCooldownMessage(config, remaining);\n try {\n if (interaction.deferred) await interaction.editReply({ content });\n else if (interaction.replied) await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n else await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n } catch {\n // Interaction likely expired.\n }\n }\n\n private async replyDenied(\n interaction: ChatInputCommandInteraction,\n reason: string | undefined,\n ): Promise<void> {\n const embeds = clientEmbeds(interaction.client);\n const text = reason ?? \"You don't have permission to use this.\";\n try {\n const payload = { embeds: [embeds.error(text)], flags: MessageFlags.Ephemeral } as const;\n if (interaction.deferred) await interaction.editReply({ embeds: payload.embeds });\n else if (interaction.replied) await interaction.followUp(payload);\n else await interaction.reply(payload);\n } catch {\n // Interaction likely expired.\n }\n }\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n const host = client as { embeds?: Embeds };\n return host.embeds ?? defaultEmbeds;\n}\n\nfunction actorOf(interaction: ChatInputCommandInteraction): CooldownActor {\n const member = interaction.member;\n let roleIds: readonly string[] = [];\n if (member !== null) {\n const roles = member.roles;\n roleIds = Array.isArray(roles) ? roles : [...roles.cache.keys()];\n }\n return {\n userId: interaction.user.id,\n roleIds,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n };\n}\n","import type { Awaitable, Client, ClientEvents } from \"discord.js\";\n\n/** A typed handler for a discord.js client event. */\nexport type EventHandler<E extends keyof ClientEvents> = (\n ...args: ClientEvents[E]\n) => Awaitable<void>;\n\n/** Object form accepted by {@link event}. */\nexport interface EventConfig<E extends keyof ClientEvents> {\n name: E;\n /** Run the handler at most once, then auto-detach. */\n once?: boolean;\n run: EventHandler<E>;\n}\n\n/**\n * A type-erased, ready-to-attach event listener. Built by {@link event}; the\n * concrete event type is captured in the closures so binding stays type-safe.\n */\nexport interface EventDef {\n readonly name: keyof ClientEvents;\n readonly once: boolean;\n /** Attach the listener to a client. */\n attach(client: Client): void;\n /** Remove the listener from a client it was attached to. */\n detach(client: Client): void;\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction build<E extends keyof ClientEvents>(name: E, once: boolean, run: EventHandler<E>): EventDef {\n const listeners = new WeakMap<Client, (...args: ClientEvents[E]) => void>();\n return {\n name,\n once,\n attach(client) {\n const listener = (...args: ClientEvents[E]): void => {\n try {\n const result = run(...args);\n if (result instanceof Promise) {\n result.catch((error: unknown) => client.emit(\"error\", toError(error)));\n }\n } catch (error) {\n client.emit(\"error\", toError(error));\n }\n };\n listeners.set(client, listener);\n if (once) client.once(name, listener);\n else client.on(name, listener);\n },\n detach(client) {\n const listener = listeners.get(client);\n if (listener !== undefined) {\n client.off(name, listener);\n listeners.delete(client);\n }\n },\n };\n}\n\n/**\n * Define a discord.js event listener with a fully-typed handler. Thrown errors\n * and rejected promises are routed to the client's `error` event instead of\n * crashing the process.\n *\n * @example\n * ```ts\n * export default event(\"messageCreate\", (message) => {\n * if (message.author.bot) return;\n * // message is fully typed as Message\n * });\n * ```\n */\nexport function event<E extends keyof ClientEvents>(name: E, run: EventHandler<E>): EventDef;\nexport function event<E extends keyof ClientEvents>(config: EventConfig<E>): EventDef;\nexport function event<E extends keyof ClientEvents>(\n nameOrConfig: E | EventConfig<E>,\n run?: EventHandler<E>,\n): EventDef {\n if (typeof nameOrConfig === \"object\") {\n return build(nameOrConfig.name, nameOrConfig.once ?? false, nameOrConfig.run);\n }\n if (run === undefined) {\n throw new Error(\"spearkit: event(name, run) requires a handler\");\n }\n return build(nameOrConfig, false, run);\n}\n\n/** Holds event listeners and attaches them to clients in bulk. */\nexport class EventRegistry {\n private readonly events: EventDef[] = [];\n private readonly attached = new Set<Client>();\n\n /** Register one or more event definitions. */\n add(...defs: EventDef[]): this {\n this.events.push(...defs);\n for (const client of this.attached) {\n for (const def of defs) def.attach(client);\n }\n return this;\n }\n\n /** Number of registered listeners. */\n get size(): number {\n return this.events.length;\n }\n\n /** Attach every registered listener to the client. */\n attachAll(client: Client): void {\n this.attached.add(client);\n for (const def of this.events) def.attach(client);\n }\n\n /** Detach every registered listener from the client. */\n detachAll(client: Client): void {\n this.attached.delete(client);\n for (const def of this.events) def.detach(client);\n }\n}\n","/**\n * Typed custom-id codec.\n *\n * Patterns follow the grammar `namespace(:{param})*`, e.g. `\"vote\"` or\n * `\"vote:{choice}\"` or `\"page:{id}:{dir}\"`. The `namespace` is the routing key;\n * each `{param}` becomes a positional, percent-escaped value in the encoded id.\n * Param names are recovered at the type level so handlers get a typed `params`\n * object and `build()` requires exactly the right params.\n */\n\n/** Names of the `{param}` placeholders inside a pattern. */\nexport type ParamNames<S extends string> = S extends `${string}{${infer Name}}${infer Rest}`\n ? Name | ParamNames<Rest>\n : never;\n\n/** The params object a pattern resolves to (every value is a string). */\nexport type Params<S extends string> = { [K in ParamNames<S>]: string };\n\n/** Arguments `build()` accepts: none when the pattern has no params. */\nexport type BuildArgs<S extends string> = [ParamNames<S>] extends [never]\n ? []\n : [params: Params<S>];\n\n/** The discord custom-id length limit. */\nexport const MAX_CUSTOM_ID_LENGTH = 100;\n\nconst PARAM_SEGMENT = /^\\{([A-Za-z0-9_]+)\\}$/;\n\n/** A compiled pattern: its routing namespace and ordered param names. */\nexport interface CompiledPattern {\n readonly pattern: string;\n readonly namespace: string;\n readonly paramNames: readonly string[];\n}\n\n/** Compile and validate a custom-id pattern. Throws on malformed input. */\nexport function compilePattern(pattern: string): CompiledPattern {\n const segments = pattern.split(\":\");\n const namespace = segments[0] ?? \"\";\n if (namespace.length === 0 || /[{}]/.test(namespace)) {\n throw new Error(\n `spearkit: invalid custom-id pattern \"${pattern}\". Expected \"namespace\" or \"namespace:{param}\".`,\n );\n }\n const paramNames: string[] = [];\n for (let i = 1; i < segments.length; i++) {\n const match = PARAM_SEGMENT.exec(segments[i] ?? \"\");\n if (match === null) {\n throw new Error(\n `spearkit: invalid custom-id pattern \"${pattern}\". Segment \"${segments[i]}\" must be \"{param}\".`,\n );\n }\n paramNames.push(match[1] as string);\n }\n return { pattern, namespace, paramNames };\n}\n\nfunction encodeValue(value: string): string {\n return value.replace(/%/g, \"%25\").replace(/:/g, \"%3A\");\n}\n\nfunction decodeValue(value: string): string {\n return value.replace(/%3A/g, \":\").replace(/%25/g, \"%\");\n}\n\n/** Build a concrete custom-id from a compiled pattern and its params. */\nexport function buildCustomId(\n compiled: CompiledPattern,\n params: Readonly<Record<string, string>>,\n): string {\n const parts = [compiled.namespace];\n for (const name of compiled.paramNames) {\n const value = params[name];\n if (value === undefined) {\n throw new Error(`spearkit: missing param \"${name}\" for custom-id \"${compiled.pattern}\"`);\n }\n parts.push(encodeValue(value));\n }\n const id = parts.join(\":\");\n if (id.length > MAX_CUSTOM_ID_LENGTH) {\n throw new Error(\n `spearkit: custom-id \"${id}\" exceeds the ${MAX_CUSTOM_ID_LENGTH}-character discord limit`,\n );\n }\n return id;\n}\n\n/** The namespace + raw values parsed out of an incoming custom-id. */\nexport interface ParsedCustomId {\n readonly namespace: string;\n readonly values: readonly string[];\n}\n\n/** Parse an incoming custom-id into its namespace and decoded values. */\nexport function parseCustomId(customId: string): ParsedCustomId {\n const segments = customId.split(\":\");\n const namespace = segments[0] ?? \"\";\n const values = segments.slice(1).map(decodeValue);\n return { namespace, values };\n}\n\n/** Map ordered values onto their param names. */\nexport function paramsFromValues(\n paramNames: readonly string[],\n values: readonly string[],\n): Record<string, string> {\n const params: Record<string, string> = {};\n for (let i = 0; i < paramNames.length; i++) {\n params[paramNames[i] as string] = values[i] ?? \"\";\n }\n return params;\n}\n","import type {\n APIModalInteractionResponseCallbackData,\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n InteractionUpdateOptions,\n JSONEncodable,\n MentionableSelectMenuInteraction,\n ModalBuilder,\n ModalComponentData,\n ModalSubmitInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserSelectMenuInteraction,\n} from \"discord.js\";\nimport { BaseContext } from \"../context.js\";\nimport {\n showAndAwaitModal,\n type AwaitModalOptions,\n type ModalLike,\n} from \"../collectors.js\";\n\ntype UpdateInput = string | InteractionUpdateOptions;\n/** The concrete message-component interaction types (button + every select). */\nexport type AnyComponentInteraction =\n | ButtonInteraction\n | StringSelectMenuInteraction\n | UserSelectMenuInteraction\n | RoleSelectMenuInteraction\n | ChannelSelectMenuInteraction\n | MentionableSelectMenuInteraction;\n\n/**\n * Base context for message-component interactions (buttons and selects).\n * Adds the component-only `update`/`deferUpdate`/`showModal` helpers and the\n * routed, typed {@link params}.\n */\nexport class MessageComponentContext<\n P,\n I extends AnyComponentInteraction = AnyComponentInteraction,\n> extends BaseContext<I> {\n constructor(\n interaction: I,\n /** Params extracted from the custom-id pattern. */\n readonly params: P,\n ) {\n super(interaction);\n }\n\n /** The raw custom-id that triggered this interaction. */\n get customId(): string {\n return this.interaction.customId;\n }\n\n /** The message the component lives on. */\n get message() {\n return this.interaction.message;\n }\n\n /** Edit the message this component belongs to. */\n async update(input: UpdateInput): Promise<void> {\n await this.interaction.update(input);\n }\n\n /** Acknowledge the interaction without editing the message yet. */\n async deferUpdate(): Promise<void> {\n await this.interaction.deferUpdate();\n }\n\n /** Open a modal in response to this component. */\n async showModal(\n modal: JSONEncodable<APIModalInteractionResponseCallbackData> | ModalComponentData | ModalBuilder,\n ): Promise<void> {\n await this.interaction.showModal(modal);\n }\n\n /**\n * Show a modal and wait for the user to submit it, resolving to the submission\n * or `null` if they dismiss it / it times out. Scoped to this user and modal.\n */\n awaitModal(modal: ModalLike, options?: AwaitModalOptions): Promise<ModalSubmitInteraction | null> {\n return showAndAwaitModal(this.interaction, modal, options);\n }\n}\n\n/** Context for a button click. */\nexport class ButtonContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n ButtonInteraction\n> {}\n\n/** Context for a string select; exposes the chosen {@link values}. */\nexport class StringSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n StringSelectMenuInteraction\n> {\n /** All selected values. */\n get values(): string[] {\n return this.interaction.values;\n }\n /** The first selected value, or `undefined` if none. */\n get value(): string | undefined {\n return this.interaction.values[0];\n }\n}\n\n/** Context for a user select; exposes selected ids, users and members. */\nexport class UserSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n UserSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get users() {\n return this.interaction.users;\n }\n get members() {\n return this.interaction.members;\n }\n}\n\n/** Context for a role select. */\nexport class RoleSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n RoleSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get roles() {\n return this.interaction.roles;\n }\n}\n\n/** Context for a channel select. */\nexport class ChannelSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n ChannelSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get channels() {\n return this.interaction.channels;\n }\n}\n\n/** Context for a mentionable (user + role) select. */\nexport class MentionableSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n MentionableSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get users() {\n return this.interaction.users;\n }\n get roles() {\n return this.interaction.roles;\n }\n get members() {\n return this.interaction.members;\n }\n}\n\n/**\n * Context for a submitted modal. Exposes the routed {@link params} plus the\n * resolved text-input {@link fields}, keyed by the field names you declared.\n */\nexport class ModalContext<P, F extends string = string> extends BaseContext<ModalSubmitInteraction> {\n constructor(\n interaction: ModalSubmitInteraction,\n readonly params: P,\n /** Submitted values, keyed by the field names from your modal definition. */\n readonly fields: Record<F, string>,\n ) {\n super(interaction);\n }\n\n /** The raw custom-id that triggered this modal submission. */\n get customId(): string {\n return this.interaction.customId;\n }\n}\n","import type {\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n Interaction,\n MentionableSelectMenuInteraction,\n ModalSubmitInteraction,\n RepliableInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserSelectMenuInteraction,\n Awaitable,\n} from \"discord.js\";\nimport { MessageFlags } from \"discord.js\";\nimport { parseCustomId, paramsFromValues } from \"./customId.js\";\nimport type { Logger } from \"../logger.js\";\nimport type { UsageEvent } from \"../usage.js\";\nimport { runGuards, type Guard } from \"../guards.js\";\nimport { defaultEmbeds, type Embeds } from \"../embeds.js\";\nimport { explainDiscordError } from \"../discord-errors.js\";\n\n/** Shared shape of every routed component. */\ninterface RouteBase {\n readonly namespace: string;\n readonly paramNames: readonly string[];\n readonly guards?: readonly Guard[];\n}\n\n/** Routing entry for a button. */\nexport interface ButtonRoute extends RouteBase {\n readonly kind: \"button\";\n handle(interaction: ButtonInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a string select. */\nexport interface StringSelectRoute extends RouteBase {\n readonly kind: \"stringSelect\";\n handle(interaction: StringSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a user select. */\nexport interface UserSelectRoute extends RouteBase {\n readonly kind: \"userSelect\";\n handle(interaction: UserSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a role select. */\nexport interface RoleSelectRoute extends RouteBase {\n readonly kind: \"roleSelect\";\n handle(interaction: RoleSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a channel select. */\nexport interface ChannelSelectRoute extends RouteBase {\n readonly kind: \"channelSelect\";\n handle(interaction: ChannelSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a mentionable select. */\nexport interface MentionableSelectRoute extends RouteBase {\n readonly kind: \"mentionableSelect\";\n handle(\n interaction: MentionableSelectMenuInteraction,\n params: Record<string, string>,\n ): Promise<void>;\n}\n/** Routing entry for a modal submission. */\nexport interface ModalRoute extends RouteBase {\n readonly kind: \"modal\";\n handle(interaction: ModalSubmitInteraction, params: Record<string, string>): Promise<void>;\n}\n\n/** Any registrable component routing entry. */\nexport type ComponentDef =\n | ButtonRoute\n | StringSelectRoute\n | UserSelectRoute\n | RoleSelectRoute\n | ChannelSelectRoute\n | MentionableSelectRoute\n | ModalRoute;\n\n/** Error hook invoked when a component handler throws. */\nexport type ComponentErrorHandler = (\n error: Error,\n interaction: RepliableInteraction,\n) => Awaitable<void>;\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\n/**\n * Routes button, select and modal interactions to the handlers registered for\n * their custom-id namespace. Decodes the custom-id, extracts typed params, and\n * invokes the matching handler.\n */\nexport class ComponentRegistry {\n private readonly buttons = new Map<string, ButtonRoute>();\n private readonly stringSelects = new Map<string, StringSelectRoute>();\n private readonly userSelects = new Map<string, UserSelectRoute>();\n private readonly roleSelects = new Map<string, RoleSelectRoute>();\n private readonly channelSelects = new Map<string, ChannelSelectRoute>();\n private readonly mentionableSelects = new Map<string, MentionableSelectRoute>();\n private readonly modals = new Map<string, ModalRoute>();\n private errorHandler?: ComponentErrorHandler;\n private logger?: Logger;\n private onUsage?: (event: UsageEvent) => void;\n private defaultGuards: readonly Guard[] = [];\n\n /** Register one or more components. Later registrations override by namespace. */\n add(...defs: ComponentDef[]): this {\n for (const def of defs) {\n switch (def.kind) {\n case \"button\":\n this.buttons.set(def.namespace, def);\n break;\n case \"stringSelect\":\n this.stringSelects.set(def.namespace, def);\n break;\n case \"userSelect\":\n this.userSelects.set(def.namespace, def);\n break;\n case \"roleSelect\":\n this.roleSelects.set(def.namespace, def);\n break;\n case \"channelSelect\":\n this.channelSelects.set(def.namespace, def);\n break;\n case \"mentionableSelect\":\n this.mentionableSelects.set(def.namespace, def);\n break;\n case \"modal\":\n this.modals.set(def.namespace, def);\n break;\n }\n }\n return this;\n }\n\n /** Set the handler used when a component throws. */\n onError(handler: ComponentErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Attach a logger used for dispatch tracing (debug level). */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Attach a hook called after each successful component handler run. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Guards that run before every component's own guards. */\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Total number of registered components. */\n get size(): number {\n return (\n this.buttons.size +\n this.stringSelects.size +\n this.userSelects.size +\n this.roleSelects.size +\n this.channelSelects.size +\n this.mentionableSelects.size +\n this.modals.size\n );\n }\n\n /**\n * Dispatch an interaction to its component handler. Returns `true` if a\n * handler matched and ran, `false` otherwise.\n */\n async handle(interaction: Interaction): Promise<boolean> {\n if (interaction.isButton()) {\n return this.exec(this.buttons.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isStringSelectMenu()) {\n return this.exec(this.stringSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isUserSelectMenu()) {\n return this.exec(this.userSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isRoleSelectMenu()) {\n return this.exec(this.roleSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isChannelSelectMenu()) {\n return this.exec(this.channelSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isMentionableSelectMenu()) {\n return this.exec(this.mentionableSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isModalSubmit()) {\n return this.exec(this.modals.get(namespaceOf(interaction.customId)), interaction);\n }\n return false;\n }\n\n private async exec<I extends RepliableInteraction & { customId: string }>(\n route: (RouteBase & { handle(interaction: I, params: Record<string, string>): Promise<void> }) | undefined,\n interaction: I,\n ): Promise<boolean> {\n if (route === undefined) return false;\n this.logger?.debug(\"component\", { data: { customId: interaction.customId } });\n const guards = combineGuards(this.defaultGuards, route.guards);\n if (guards.length > 0) {\n const guardResult = await runGuards(interaction, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"component denied\", {\n data: { customId: interaction.customId, reason: guardResult.reason ?? \"\" },\n });\n await replyDeniedComponent(interaction, guardResult.reason);\n return true;\n }\n }\n const { values } = parseCustomId(interaction.customId);\n const params = paramsFromValues(route.paramNames, values);\n const start = Date.now();\n try {\n await route.handle(interaction, params);\n this.onUsage?.({\n type: \"component\",\n name: route.namespace,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = toError(error);\n this.onUsage?.({\n type: \"component\",\n name: route.namespace,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n if (this.errorHandler !== undefined) {\n await this.errorHandler(err, interaction);\n } else {\n interaction.client.emit(\"error\", err);\n const content = explainDiscordError(err) ?? \"Something went wrong.\";\n if (interaction.deferred) {\n await interaction.editReply({ content }).catch(() => undefined);\n } else if (interaction.replied) {\n await interaction.followUp({ content, flags: MessageFlags.Ephemeral }).catch(() => undefined);\n } else {\n await interaction.reply({ content, flags: MessageFlags.Ephemeral }).catch(() => undefined);\n }\n }\n }\n return true;\n }\n}\n\nfunction namespaceOf(customId: string): string {\n return parseCustomId(customId).namespace;\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\nasync function replyDeniedComponent(\n interaction: RepliableInteraction,\n reason: string | undefined,\n): Promise<void> {\n const embeds = clientEmbeds(interaction.client);\n const text = reason ?? \"You don't have permission to use this.\";\n try {\n const payload = { embeds: [embeds.error(text)], flags: MessageFlags.Ephemeral } as const;\n if (interaction.deferred) await interaction.editReply({ embeds: payload.embeds });\n else if (interaction.replied) await interaction.followUp(payload);\n else await interaction.reply(payload);\n } catch {\n // Interaction likely expired.\n }\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ChannelSelectMenuBuilder,\n MentionableSelectMenuBuilder,\n ModalBuilder,\n RoleSelectMenuBuilder,\n StringSelectMenuBuilder,\n TextInputBuilder,\n TextInputStyle,\n UserSelectMenuBuilder,\n type Awaitable,\n type ChannelType,\n type ComponentEmojiResolvable,\n type SelectMenuComponentOptionData,\n} from \"discord.js\";\nimport {\n ButtonContext,\n ChannelSelectContext,\n MentionableSelectContext,\n ModalContext,\n RoleSelectContext,\n StringSelectContext,\n UserSelectContext,\n} from \"./context.js\";\nimport {\n buildCustomId,\n compilePattern,\n type BuildArgs,\n type Params,\n} from \"./customId.js\";\nimport type {\n ButtonRoute,\n ChannelSelectRoute,\n MentionableSelectRoute,\n ModalRoute,\n RoleSelectRoute,\n StringSelectRoute,\n UserSelectRoute,\n} from \"./registry.js\";\nimport type { Guard } from \"../guards.js\";\n\n// --- buttons ---------------------------------------------------------------\n\n/** Accepted button styles for an interactive (custom-id) button. */\nexport type ButtonStyleInput =\n | \"Primary\"\n | \"Secondary\"\n | \"Success\"\n | \"Danger\"\n | ButtonStyle.Primary\n | ButtonStyle.Secondary\n | ButtonStyle.Success\n | ButtonStyle.Danger;\n\nfunction resolveButtonStyle(input: ButtonStyleInput | undefined): ButtonStyle {\n if (input === undefined) return ButtonStyle.Secondary;\n return typeof input === \"number\" ? input : ButtonStyle[input];\n}\n\n/** Config for an interactive button created with {@link button}. */\nexport interface ButtonConfig<P extends string, R> {\n /** Custom-id pattern, e.g. `\"vote\"` or `\"vote:{choice}\"`. */\n id: P;\n label?: string;\n style?: ButtonStyleInput;\n emoji?: ComponentEmojiResolvable;\n disabled?: boolean;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n run: (ctx: ButtonContext<Params<P>>) => Awaitable<R>;\n}\n\n/** A registrable button with a typed {@link build}. */\nexport interface Button<P extends string> extends ButtonRoute {\n build(...args: BuildArgs<P>): ButtonBuilder;\n}\n\n/**\n * Define an interactive button: its appearance, its custom-id pattern and its\n * click handler, all in one place. Register it with `client.components.add`.\n *\n * @example\n * ```ts\n * const vote = button({\n * id: \"vote:{choice}\",\n * label: \"Yes\",\n * style: \"Success\",\n * run: (ctx) => ctx.reply(`You chose ${ctx.params.choice}`),\n * });\n * row(vote.build({ choice: \"yes\" }));\n * ```\n */\nexport function button<const P extends string, R = void>(config: ButtonConfig<P, R>): Button<P> {\n const compiled = compilePattern(config.id);\n const style = resolveButtonStyle(config.style);\n return { kind: \"button\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new ButtonContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): ButtonBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ButtonBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .setStyle(style);\n if (config.label !== undefined) builder.setLabel(config.label);\n if (config.emoji !== undefined) builder.setEmoji(config.emoji);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n return builder;\n }, };\n}\n\n/** Config for a link button (no handler — just opens a URL). */\nexport interface LinkButtonConfig {\n url: string;\n label?: string;\n emoji?: ComponentEmojiResolvable;\n disabled?: boolean;\n}\n\n/** Build a link button. Link buttons have no custom-id and run no handler. */\nexport function linkButton(config: LinkButtonConfig): ButtonBuilder {\n const builder = new ButtonBuilder().setStyle(ButtonStyle.Link).setURL(config.url);\n if (config.label !== undefined) builder.setLabel(config.label);\n if (config.emoji !== undefined) builder.setEmoji(config.emoji);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n return builder;\n}\n\n// --- selects ---------------------------------------------------------------\n\ninterface SelectConfigBase {\n placeholder?: string;\n minValues?: number;\n maxValues?: number;\n disabled?: boolean;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n}\n\n/** Any of the select-menu builders that share the base configuration setters. */\ntype AnySelectBuilder =\n | StringSelectMenuBuilder\n | UserSelectMenuBuilder\n | RoleSelectMenuBuilder\n | ChannelSelectMenuBuilder\n | MentionableSelectMenuBuilder;\nfunction applySelectBase(builder: AnySelectBuilder, config: SelectConfigBase): void {\n if (config.placeholder !== undefined) builder.setPlaceholder(config.placeholder);\n if (config.minValues !== undefined) builder.setMinValues(config.minValues);\n if (config.maxValues !== undefined) builder.setMaxValues(config.maxValues);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n}\n\n/** Config for a string select created with {@link stringSelect}. */\nexport interface StringSelectConfig<P extends string, R> extends SelectConfigBase {\n id: P;\n options: readonly SelectMenuComponentOptionData[];\n run: (ctx: StringSelectContext<Params<P>>) => Awaitable<R>;\n}\n\n/** A registrable string select with a typed {@link build}. */\nexport interface StringSelect<P extends string> extends StringSelectRoute {\n build(...args: BuildArgs<P>): StringSelectMenuBuilder;\n}\n\n/** Define a string select menu, its custom-id pattern and its handler. */\nexport function stringSelect<const P extends string, R = void>(\n config: StringSelectConfig<P, R>,\n): StringSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"stringSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new StringSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): StringSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new StringSelectMenuBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .addOptions(...config.options);\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** Config shared by the entity-select builders (user/role/channel/mentionable). */\nexport interface EntitySelectConfig<P extends string> extends SelectConfigBase {\n id: P;\n}\n\n/** A registrable user select. */\nexport interface UserSelect<P extends string> extends UserSelectRoute {\n build(...args: BuildArgs<P>): UserSelectMenuBuilder;\n}\n\n/** Define a user select menu. */\nexport function userSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & { run: (ctx: UserSelectContext<Params<P>>) => Awaitable<R> },\n): UserSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"userSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new UserSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): UserSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new UserSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** A registrable role select. */\nexport interface RoleSelect<P extends string> extends RoleSelectRoute {\n build(...args: BuildArgs<P>): RoleSelectMenuBuilder;\n}\n\n/** Define a role select menu. */\nexport function roleSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & { run: (ctx: RoleSelectContext<Params<P>>) => Awaitable<R> },\n): RoleSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"roleSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new RoleSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): RoleSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new RoleSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** A registrable channel select. */\nexport interface ChannelSelect<P extends string> extends ChannelSelectRoute {\n build(...args: BuildArgs<P>): ChannelSelectMenuBuilder;\n}\n\n/** Define a channel select menu, optionally restricted to channel types. */\nexport function channelSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & {\n channelTypes?: readonly ChannelType[];\n run: (ctx: ChannelSelectContext<Params<P>>) => Awaitable<R>;\n },\n): ChannelSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"channelSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new ChannelSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): ChannelSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ChannelSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n if (config.channelTypes !== undefined) builder.setChannelTypes(...config.channelTypes);\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** A registrable mentionable select. */\nexport interface MentionableSelect<P extends string> extends MentionableSelectRoute {\n build(...args: BuildArgs<P>): MentionableSelectMenuBuilder;\n}\n\n/** Define a mentionable (user + role) select menu. */\nexport function mentionableSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & {\n run: (ctx: MentionableSelectContext<Params<P>>) => Awaitable<R>;\n },\n): MentionableSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"mentionableSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new MentionableSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): MentionableSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new MentionableSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n// --- modals ----------------------------------------------------------------\n\n/** Accepted text-input styles. */\nexport type TextInputStyleInput = \"Short\" | \"Paragraph\" | TextInputStyle;\n\nfunction resolveTextInputStyle(input: TextInputStyleInput | undefined): TextInputStyle {\n if (input === undefined) return TextInputStyle.Short;\n return typeof input === \"number\" ? input : TextInputStyle[input];\n}\n\n/** A resolved text-input field definition. */\nexport interface TextInputDef {\n readonly label: string;\n readonly style: TextInputStyle;\n readonly placeholder?: string;\n readonly required?: boolean;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly value?: string;\n}\n\n/** Define a single modal text-input field. */\nexport function textInput(config: {\n label: string;\n style?: TextInputStyleInput;\n placeholder?: string;\n required?: boolean;\n minLength?: number;\n maxLength?: number;\n value?: string;\n}): TextInputDef {\n return {\n label: config.label,\n style: resolveTextInputStyle(config.style),\n placeholder: config.placeholder,\n required: config.required,\n minLength: config.minLength,\n maxLength: config.maxLength,\n value: config.value,\n };\n}\n\n/** Config for a modal created with {@link modal}. */\nexport interface ModalConfig<P extends string, F extends Record<string, TextInputDef>, R> {\n id: P;\n title: string;\n fields: F;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n run: (ctx: ModalContext<Params<P>, keyof F & string>) => Awaitable<R>;\n}\n\n/** A registrable modal with a typed {@link build}. */\nexport interface Modal<P extends string> extends ModalRoute {\n build(...args: BuildArgs<P>): ModalBuilder;\n}\n\nfunction buildTextInput(customId: string, def: TextInputDef): TextInputBuilder {\n const input = new TextInputBuilder()\n .setCustomId(customId)\n .setLabel(def.label)\n .setStyle(def.style);\n if (def.placeholder !== undefined) input.setPlaceholder(def.placeholder);\n if (def.required !== undefined) input.setRequired(def.required);\n if (def.minLength !== undefined) input.setMinLength(def.minLength);\n if (def.maxLength !== undefined) input.setMaxLength(def.maxLength);\n if (def.value !== undefined) input.setValue(def.value);\n return input;\n}\n\n/**\n * Define a modal: its title, its custom-id pattern, its text-input fields and\n * a submit handler. The handler receives the submitted values keyed by field\n * name in `ctx.fields`.\n *\n * @example\n * ```ts\n * const feedback = modal({\n * id: \"feedback:{ticket}\",\n * title: \"Feedback\",\n * fields: { comment: textInput({ label: \"Comment\", style: \"Paragraph\" }) },\n * run: (ctx) => ctx.reply(`Thanks! (${ctx.params.ticket}): ${ctx.fields.comment}`),\n * });\n * ```\n */\nexport function modal<const P extends string, F extends Record<string, TextInputDef>, R = void>(\n config: ModalConfig<P, F, R>,\n): Modal<P> {\n const compiled = compilePattern(config.id);\n const fieldKeys = Object.keys(config.fields);\n return { kind: \"modal\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n const fields: Record<string, string> = {};\n for (const key of fieldKeys) {\n try {\n fields[key] = interaction.fields.getTextInputValue(key);\n } catch {\n fields[key] = \"\";\n }\n }\n await config.run(\n new ModalContext(interaction, params as Params<P>, fields as Record<keyof F & string, string>),\n );\n },\n build(...args: BuildArgs<P>): ModalBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ModalBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .setTitle(config.title);\n for (const [key, def] of Object.entries(config.fields)) {\n builder.addComponents(\n new ActionRowBuilder<TextInputBuilder>().addComponents(buildTextInput(key, def)),\n );\n }\n return builder;\n }, };\n}\n","import { ActionRowBuilder, type MessageActionRowComponentBuilder } from \"discord.js\";\n\n/**\n * Wrap one or more component builders in an action row.\n *\n * A row holds up to five buttons, or exactly one select menu.\n *\n * @example\n * ```ts\n * const components = [row(yes.build(), no.build())];\n * await channel.send({ content: \"Vote:\", components });\n * ```\n */\nexport function row<C extends MessageActionRowComponentBuilder>(\n ...components: C[]\n): ActionRowBuilder<C> {\n return new ActionRowBuilder<C>().addComponents(...components);\n}\n","import { readdir } from \"node:fs/promises\";\nimport { extname, join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { SlashCommand } from \"./commands/command.js\";\nimport type { Registerable, SpearClient } from \"./client.js\";\n\n/** Options for the directory loader. */\nexport interface LoadOptions {\n /** File extensions to import. Default: `.js`, `.mjs`, `.cjs`. */\n extensions?: readonly string[];\n /** Recurse into subdirectories. Default: `true`. */\n recursive?: boolean;\n}\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\", \".cjs\"] as const;\n\n/** Structural guard: is this exported value something spearkit can register? */\nfunction isRegisterable(value: unknown): value is Registerable {\n if (value instanceof SlashCommand) return true;\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Record<string, unknown>;\n if (typeof record[\"attach\"] === \"function\" && typeof record[\"detach\"] === \"function\") {\n return true;\n }\n if (typeof record[\"kind\"] === \"string\" && typeof record[\"handle\"] === \"function\") {\n return true;\n }\n if (\n (record[\"kind\"] === \"task\" || record[\"kind\"] === \"prefixCommand\") &&\n typeof record[\"run\"] === \"function\"\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Recursively import a directory and collect every spearkit-registrable export\n * (commands, events, components) found in default or named exports.\n */\nexport async function collectModules(\n dir: string,\n options: LoadOptions = {},\n): Promise<Registerable[]> {\n const extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n const recursive = options.recursive ?? true;\n const found: Registerable[] = [];\n\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (recursive) found.push(...(await collectModules(fullPath, options)));\n continue;\n }\n if (!extensions.includes(extname(entry.name))) continue;\n\n const mod: Record<string, unknown> = await import(pathToFileURL(fullPath).href);\n for (const value of Object.values(mod)) {\n if (isRegisterable(value)) found.push(value);\n }\n }\n return found;\n}\n\n/**\n * Load a directory and register everything it exports into the client.\n * Returns the number of items registered.\n */\nexport async function loadInto(\n client: SpearClient,\n dir: string,\n options?: LoadOptions,\n): Promise<number> {\n const items = await collectModules(dir, options);\n client.register(...items);\n return items.length;\n}\n","import {\n Client,\n GatewayIntentBits,\n Routes,\n type ClientOptions,\n type Interaction,\n} from \"discord.js\";\nimport { SlashCommand } from \"./commands/command.js\";\nimport { CommandRegistry, type DeployResult } from \"./commands/registry.js\";\nimport { EventRegistry, type EventDef } from \"./events.js\";\nimport { ComponentRegistry, type ComponentDef } from \"./components/registry.js\";\nimport type { SpearPlugin } from \"./plugin.js\";\nimport { loadInto, type LoadOptions } from \"./loader.js\";\nimport { Logger, type LoggerOptions, toError } from \"./logger.js\";\nimport { loadEnv, type LoadEnvOptions } from \"./env.js\";\nimport { CooldownManager, normalizeCooldown, type CooldownInput } from \"./cooldown.js\";\nimport { TaskScheduler, task, type ScheduledTask, type TaskConfig } from \"./scheduler.js\";\nimport { PrefixRegistry, type PrefixCommand, type PrefixOptions } from \"./prefix.js\";\nimport { UsageTracker, type UsageEvent, type UsageOptions } from \"./usage.js\";\nimport { Embeds, type EmbedsOptions } from \"./embeds.js\";\nimport type { Guard } from \"./guards.js\";\nimport { ContextMenuRegistry, type ContextMenuCommand } from \"./context-menus.js\";\nimport { normalizeAutoDefer, type AutoDeferInput } from \"./auto-defer.js\";\nimport { gracefulShutdown, type GracefulShutdownOptions } from \"./shutdown.js\";\n\n/** Anything that can be handed to {@link SpearClient.register}. */\nexport type Registerable =\n | SlashCommand\n | EventDef\n | ComponentDef\n | ScheduledTask\n | PrefixCommand\n | ContextMenuCommand;\n\nconst allIntents = Object.values(GatewayIntentBits).filter(\n (value): value is GatewayIntentBits => typeof value === \"number\",\n);\n\n/**\n * Ready-made intent presets. Pass one to {@link SpearClient} as `intents`.\n * `all` includes privileged intents — enable them in the developer portal.\n */\nexport const Intents = {\n /** No intents. */\n none: [] as GatewayIntentBits[],\n /** Just `Guilds` — enough for slash commands and interactions. */\n default: [GatewayIntentBits.Guilds],\n /** Guild + member gateway data. */\n guilds: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],\n /** Read message content (privileged) alongside guild messages. */\n messages: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n ],\n /** Every intent, including privileged ones. */\n all: allIntents,\n} as const;\n\n/** spearkit-specific client options layered on top of discord.js {@link ClientOptions}. */\nexport interface SpearOptions {\n /** A {@link Logger} instance, or options to build one. Exposed as `client.logger`. */\n logger?: Logger | LoggerOptions;\n /**\n * Auto-load a `.env` file into `process.env` on {@link SpearClient.start}.\n * `true` (default) loads `.env` from the cwd; pass {@link LoadEnvOptions} for\n * a custom path or override behaviour, or `false` to disable.\n */\n dotenv?: boolean | LoadEnvOptions;\n /** A default cooldown applied to every command. A command's own cooldown overrides it. */\n cooldown?: CooldownInput;\n /** Enable prefix (text) commands. A string/array sets prefixes; an object configures matching. */\n prefix?: string | readonly string[] | PrefixOptions;\n /** Track command/component/prefix usage to a store and/or a Discord channel. */\n usage?: UsageOptions;\n /** Default {@link Embeds} factory for preset replies. Pass an instance or options. */\n embeds?: Embeds | EmbedsOptions;\n /** Default guards (preconditions) applied before every command/component/prefix handler. */\n guards?: readonly Guard[];\n /**\n * Default auto-defer for every slash command and context menu (each handler\n * may override). Prevents `Unknown interaction` (10062) on slow handlers by\n * deferring automatically just before Discord's 3-second window closes.\n */\n autoDefer?: AutoDeferInput;\n}\n\n/** Options for {@link SpearClient}: discord.js options plus {@link SpearOptions}. `intents` may be omitted. */\nexport type SpearClientOptions = Partial<ClientOptions> & SpearOptions;\n\n/**\n * A discord.js {@link Client} with batteries included: command, event,\n * component, prefix-command, scheduler and context-menu registries plus\n * interaction routing wired up automatically.\n *\n * @example\n * ```ts\n * const client = new SpearClient({ intents: Intents.default });\n * client.register(ping, onReady, voteButton);\n * await client.start(process.env.TOKEN);\n * await client.deployAllCommands({ guildId: \"123\" });\n * ```\n */\nexport class SpearClient extends Client {\n /** Slash command registry and dispatcher. */\n readonly commands = new CommandRegistry();\n /** Event listener registry. */\n readonly events = new EventRegistry();\n /** Button / select / modal registry and router. */\n readonly components = new ComponentRegistry();\n /** Structured logger shared across spearkit and available to your code. */\n readonly logger: Logger;\n /** Shared cooldown manager used by command dispatch; also usable directly. */\n readonly cooldowns = new CooldownManager();\n /** Cron/interval task scheduler; started on ready and stopped on destroy. */\n readonly scheduler = new TaskScheduler();\n /** Prefix (text) command registry, dispatched from `messageCreate`. */\n readonly prefix = new PrefixRegistry();\n /** Usage tracker: records who used what to a store and/or a Discord channel. */\n readonly usage = new UsageTracker();\n /** Preset embed factory used by `ctx.error/success/info/warn` and available to your code. */\n readonly embeds: Embeds;\n /** User- and message-context-menu command registry. */\n readonly contextMenus = new ContextMenuRegistry();\n private readonly envConfig: false | LoadEnvOptions;\n\n constructor(options: SpearClientOptions = {}) {\n const { intents, logger, dotenv, cooldown, prefix, usage, embeds, guards, autoDefer, ...rest } = options;\n super({ ...rest, intents: intents ?? Intents.default });\n this.embeds = embeds instanceof Embeds ? embeds : new Embeds(embeds);\n this.envConfig = dotenv === false ? false : dotenv === undefined || dotenv === true ? {} : dotenv;\n this.logger = logger instanceof Logger ? logger : new Logger(logger);\n const defaultCooldown = cooldown !== undefined ? normalizeCooldown(cooldown) : undefined;\n const defaultAutoDefer = normalizeAutoDefer(autoDefer);\n\n this.commands.setLogger(this.logger.child(\"commands\"));\n this.commands.setCooldowns(this.cooldowns, defaultCooldown);\n this.commands.setAutoDefer(defaultAutoDefer);\n this.components.setLogger(this.logger.child(\"components\"));\n this.contextMenus.setLogger(this.logger.child(\"contextMenus\"));\n this.contextMenus.setCooldowns(this.cooldowns, defaultCooldown);\n this.contextMenus.setAutoDefer(defaultAutoDefer);\n this.prefix.setLogger(this.logger.child(\"prefix\"));\n this.prefix.setCooldowns(this.cooldowns, defaultCooldown);\n if (prefix !== undefined) this.prefix.setOptions(prefix);\n this.scheduler.setLogger(this.logger.child(\"scheduler\"));\n\n if (guards !== undefined && guards.length > 0) {\n this.commands.setDefaultGuards(guards);\n this.contextMenus.setDefaultGuards(guards);\n this.components.setDefaultGuards(guards);\n this.prefix.setDefaultGuards(guards);\n }\n\n this.usage.setClient(this).setLogger(this.logger.child(\"usage\"));\n if (usage !== undefined) {\n if (usage.store !== undefined) this.usage.setStore(usage.store);\n if (usage.channel !== undefined) this.usage.reportTo(usage.channel, usage.format);\n const onUsage = (event: UsageEvent): void => this.usage.track(event);\n this.commands.setUsageHook(onUsage);\n this.contextMenus.setUsageHook(onUsage);\n this.components.setUsageHook(onUsage);\n this.prefix.setUsageHook(onUsage);\n }\n\n this.events.attachAll(this);\n this.on(\"interactionCreate\", (interaction) => this.route(interaction));\n this.on(\"error\", (error) => this.logger.error(\"client error\", { error: toError(error) }));\n this.once(\"clientReady\", () => this.scheduler.start(this));\n this.on(\"messageCreate\", (message) => {\n void this.prefix.handle(message);\n });\n }\n\n /**\n * Register commands, events, components, scheduled tasks, prefix commands\n * and context menus in one call. Each item is routed to its matching registry.\n */\n register(...items: Registerable[]): this {\n for (const item of items) {\n if (item instanceof SlashCommand) {\n this.commands.add(item);\n } else if (\"attach\" in item) {\n this.events.add(item);\n } else if (item.kind === \"task\") {\n this.scheduler.add(item);\n } else if (item.kind === \"prefixCommand\") {\n this.prefix.add(item);\n } else if (item.kind === \"userMenu\") {\n this.contextMenus.add(item);\n } else if (item.kind === \"messageMenu\") {\n this.contextMenus.add(item);\n } else {\n this.components.add(item);\n }\n }\n return this;\n }\n\n /** Install one or more plugins, running each plugin's `setup`. */\n async use(...plugins: SpearPlugin[]): Promise<this> {\n for (const plugin of plugins) {\n await plugin.setup(this);\n }\n return this;\n }\n\n /**\n * Recursively load a directory and register every command, event and\n * component it exports. Returns the number of items registered.\n */\n load(dir: string, options?: LoadOptions): Promise<number> {\n return loadInto(this, dir, options);\n }\n\n /**\n * Log in. Falls back to the `DISCORD_TOKEN` environment variable when no\n * token is passed.\n */\n async start(token?: string): Promise<this> {\n if (this.envConfig !== false) loadEnv(this.envConfig);\n const resolved = token ?? process.env.DISCORD_TOKEN;\n if (resolved === undefined || resolved.length === 0) {\n throw new Error(\"spearkit: start() needs a token (pass one or set DISCORD_TOKEN)\");\n }\n await this.login(resolved);\n return this;\n }\n\n /**\n * Push the registered slash commands to Discord using the client's REST\n * connection. Slash-only — use {@link deployAllCommands} to include context\n * menus in the same request.\n */\n async deployCommands(options: { guildId?: string } = {}): Promise<DeployResult> {\n const applicationId = this.application?.id ?? this.user?.id;\n if (applicationId == null) {\n throw new Error(\"spearkit: deployCommands() must run after the client is ready\");\n }\n return this.commands.deploy({ rest: this.rest, applicationId, guildId: options.guildId });\n }\n\n /**\n * Deploy slash commands AND context menus together to Discord in a single\n * PUT. Use this once you mix `userCommand` / `messageCommand` with `command`.\n */\n /**\n * Deploy slash commands AND context menus together. Supports a `diff`\n * strategy that fetches the remote set first and skips the PUT when\n * nothing changed, and a `dryRun` flag that returns the body without\n * touching Discord (perfect for CI deploy gates).\n *\n * @returns the API's DeployResult on PUT, or a skipped report when\n * `dryRun: true` is set OR `strategy: \"diff\"` finds no changes.\n */\n async deployAllCommands(options: {\n guildId?: string;\n dryRun?: boolean;\n strategy?: \"always\" | \"diff\";\n /** Override the application id (default reads from the ready client). */\n applicationId?: string;\n } = {}): Promise<DeployResult | { skipped: true; reason: \"dry-run\" | \"no-changes\"; body: readonly unknown[] }> {\n const applicationId = options.applicationId ?? this.application?.id ?? this.user?.id;\n if (applicationId == null) {\n throw new Error(\"spearkit: deployAllCommands() must run after the client is ready\");\n }\n const body = [...this.commands.toJSON(), ...this.contextMenus.toJSON()];\n const route =\n options.guildId !== undefined\n ? Routes.applicationGuildCommands(applicationId, options.guildId)\n : Routes.applicationCommands(applicationId);\n if (options.dryRun === true) {\n return { skipped: true, reason: \"dry-run\", body };\n }\n if (options.strategy === \"diff\") {\n const remote = (await this.rest.get(route)) as readonly unknown[];\n if (commandsEqual(body, remote)) {\n return { skipped: true, reason: \"no-changes\", body };\n }\n }\n return (await this.rest.put(route, { body })) as DeployResult;\n }\n\n /** Define and register a scheduled task in one call. */\n schedule(config: TaskConfig): ScheduledTask {\n const scheduled = task(config);\n this.scheduler.add(scheduled);\n return scheduled;\n }\n\n /** Stop the scheduler, then tear down the discord.js client. */\n override async destroy(): Promise<void> {\n this.scheduler.stop();\n await super.destroy();\n }\n\n /**\n * Close the bot cleanly on `SIGINT`/`SIGTERM`: run an optional hook, then\n * `destroy()` (stopping the scheduler and gateway), then exit. Returns a\n * disposer that removes the signal handlers. Logs progress via `client.logger`.\n */\n enableGracefulShutdown(options: GracefulShutdownOptions = {}): () => void {\n const log = this.logger.child(\"shutdown\");\n return gracefulShutdown(this, {\n logger: {\n info: (message) => log.info(message),\n error: (message, meta) => log.error(message, { error: toError(meta) }),\n },\n ...options,\n });\n }\n\n private async route(interaction: Interaction): Promise<void> {\n if (interaction.isChatInputCommand()) {\n await this.commands.handle(interaction);\n } else if (interaction.isAutocomplete()) {\n await this.commands.handleAutocomplete(interaction);\n } else if (interaction.isUserContextMenuCommand()) {\n await this.contextMenus.handleUser(interaction);\n } else if (interaction.isMessageContextMenuCommand()) {\n await this.contextMenus.handleMessage(interaction);\n } else {\n await this.components.handle(interaction);\n }\n }\n}\n\n/** Structural equality check used by deployAllCommands' diff strategy. */\nfunction commandsEqual(local: readonly unknown[], remote: readonly unknown[]): boolean {\n if (local.length !== remote.length) return false;\n const lset = new Set(local.map(commandHash));\n for (const r of remote) {\n if (!lset.has(commandHash(r))) return false;\n }\n return true;\n}\n\nfunction commandHash(cmd: unknown): string {\n const c = cmd as Record<string, unknown>;\n return JSON.stringify({\n name: c.name,\n type: c.type ?? 1,\n description: c.description ?? \"\",\n nsfw: c.nsfw === true,\n default_member_permissions: c.default_member_permissions ?? null,\n contexts: Array.isArray(c.contexts) ? [...(c.contexts as number[])].sort((a, b) => a - b) : null,\n options: normaliseOptions(c.options),\n });\n}\n\nfunction normaliseOptions(options: unknown): readonly unknown[] {\n if (!Array.isArray(options)) return [];\n return options\n .map((o) => {\n const opt = o as Record<string, unknown>;\n return {\n name: opt.name,\n type: opt.type,\n description: opt.description ?? \"\",\n required: opt.required === true,\n choices: Array.isArray(opt.choices)\n ? [...(opt.choices as { name: string; value: unknown }[])]\n .map((ch) => ({ name: ch.name, value: ch.value }))\n .sort((a, b) => String(a.name).localeCompare(String(b.name)))\n : null,\n options: normaliseOptions(opt.options),\n channel_types: Array.isArray(opt.channel_types)\n ? [...(opt.channel_types as number[])].sort((a, b) => a - b)\n : null,\n min_value: opt.min_value ?? null,\n max_value: opt.max_value ?? null,\n min_length: opt.min_length ?? null,\n max_length: opt.max_length ?? null,\n autocomplete: opt.autocomplete === true,\n };\n })\n .sort((a, b) => String(a.name).localeCompare(String(b.name)));\n}","import type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\n\n/**\n * A spearkit plugin: a named, reusable bundle of commands, events and components.\n * Its {@link setup} runs once when added to a client via `client.use(plugin)`.\n */\nexport interface SpearPlugin {\n readonly name: string;\n setup(client: SpearClient): Awaitable<void>;\n}\n\n/** Identity helper that gives a plugin object its type and editor hints. */\nexport function definePlugin(plugin: SpearPlugin): SpearPlugin {\n return plugin;\n}\n"]}