agent-slack 0.4.4 → 0.5.1
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/README.md +7 -2
- package/dist/index.js +1214 -2190
- package/dist/index.js.map +22 -15
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/lib/version.ts", "../src/auth/brave.ts", "../src/auth/chrome.ts", "../src/auth/curl.ts", "../src/auth/desktop.ts", "../src/lib/leveldb-reader.ts", "../src/auth/firefox.ts", "../src/auth/paths.ts", "../src/lib/fs.ts", "../src/auth/schema.ts", "../src/auth/keychain.ts", "../src/auth/store.ts", "../src/
|
|
3
|
+
"sources": ["../src/index.ts", "../src/lib/version.ts", "../src/auth/brave.ts", "../src/auth/firefox-profile.ts", "../src/auth/chrome.ts", "../src/auth/curl.ts", "../src/auth/desktop.ts", "../src/lib/leveldb-reader.ts", "../src/auth/firefox.ts", "../src/auth/paths.ts", "../src/lib/fs.ts", "../src/auth/schema.ts", "../src/auth/keychain.ts", "../src/auth/store.ts", "../src/lib/object-type-guards.ts", "../src/slack/channels.ts", "../src/cli/workspace-selector.ts", "../src/slack/client.ts", "../src/cli/context-client-resolver.ts", "../src/cli/context.ts", "../src/lib/compact-json.ts", "../src/lib/redact.ts", "../src/cli/auth-command.ts", "../src/slack/files.ts", "../src/slack/html-to-md.ts", "../src/lib/tmp-paths.ts", "../src/lib/app-dir.ts", "../src/slack/canvas.ts", "../src/cli/canvas-command.ts", "../src/slack/emoji.ts", "../src/slack/mrkdwn.ts", "../src/slack/message-api-parsing.ts", "../src/slack/render-rich-text.ts", "../src/slack/render.ts", "../src/slack/message-compact.ts", "../src/slack/messages.ts", "../src/slack/url.ts", "../src/cli/targets.ts", "../src/cli/message-url-warning.ts", "../src/slack/rich-text.ts", "../src/slack/upload.ts", "../src/cli/message-file-downloads.ts", "../src/cli/message-thread-info.ts", "../src/cli/message-read-actions.ts", "../src/cli/message-actions.ts", "../src/cli/draft-server.ts", "../src/cli/draft-actions.ts", "../src/cli/message-command.ts", "../src/slack/search-query.ts", "../src/slack/search-raw.ts", "../src/slack/search-file-ext.ts", "../src/slack/search-files.ts", "../src/slack/search-messages.ts", "../src/slack/search.ts", "../src/cli/search-command.ts", "../src/lib/update.ts", "../src/cli/update-command.ts", "../src/slack/users.ts", "../src/cli/user-command.ts", "../src/slack/channel-admin.ts", "../src/cli/channel-command.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import { Command } from \"commander\";\nimport { getPackageVersion } from \"./lib/version.ts\";\nimport { createCliContext } from \"./cli/context.ts\";\nimport { registerAuthCommand } from \"./cli/auth-command.ts\";\nimport { registerCanvasCommand } from \"./cli/canvas-command.ts\";\nimport { registerMessageCommand } from \"./cli/message-command.ts\";\nimport { registerSearchCommand } from \"./cli/search-command.ts\";\nimport { registerUpdateCommand } from \"./cli/update-command.ts\";\nimport { registerUserCommand } from \"./cli/user-command.ts\";\nimport { registerChannelCommand } from \"./cli/channel-command.ts\";\nimport { backgroundUpdateCheck } from \"./lib/update.ts\";\n\nconst program = new Command();\nprogram\n .name(\"agent-slack\")\n .description(\"Slack automation CLI for AI agents\")\n .version(getPackageVersion());\n\nconst ctx = createCliContext();\n\nregisterAuthCommand({ program, ctx });\nregisterMessageCommand({ program, ctx });\nregisterCanvasCommand({ program, ctx });\nregisterSearchCommand({ program, ctx });\nregisterUpdateCommand({ program });\nregisterUserCommand({ program, ctx });\nregisterChannelCommand({ program, ctx });\n\nprogram.parse(process.argv);\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n}\n\n// Fire-and-forget background update check (throttled to once/24h, stderr only).\n// Skip for the update command itself to avoid duplicate output.\nconst [subcommand] = process.argv.slice(2);\nif (subcommand && subcommand !== \"update\") {\n backgroundUpdateCheck();\n}\n",
|
|
6
6
|
"import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// Injected at build time via --define AGENT_SLACK_BUILD_VERSION='\"x.y.z\"'\ndeclare const AGENT_SLACK_BUILD_VERSION: string | undefined;\n\nlet cachedVersion: string | undefined;\n\nexport function getPackageVersion(): string {\n if (cachedVersion !== undefined) {\n return cachedVersion;\n }\n\n // 1. Check build-time injected version (for compiled binaries)\n if (typeof AGENT_SLACK_BUILD_VERSION === \"string\" && AGENT_SLACK_BUILD_VERSION) {\n cachedVersion = AGENT_SLACK_BUILD_VERSION;\n return cachedVersion;\n }\n\n // 2. Check environment variables\n const envVersion =\n process.env.AGENT_SLACK_VERSION?.trim() || process.env.npm_package_version?.trim();\n if (envVersion) {\n cachedVersion = envVersion;\n return cachedVersion;\n }\n\n // 3. Try to read from package.json (for development)\n try {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n const candidate = join(dir, \"package.json\");\n if (existsSync(candidate)) {\n const raw = readFileSync(candidate, \"utf8\");\n const pkg = JSON.parse(raw) as { version?: unknown };\n const v = typeof pkg.version === \"string\" ? pkg.version.trim() : \"\";\n cachedVersion = v || \"0.0.0\";\n return cachedVersion;\n }\n const next = dirname(dir);\n if (next === dir) {\n break;\n }\n dir = next;\n }\n } catch {\n // fall through\n }\n\n cachedVersion = \"0.0.0\";\n return cachedVersion;\n}\n\nexport function getUserAgent(): string {\n return `agent-slack/${getPackageVersion()}`;\n}\n",
|
|
7
|
-
"import {
|
|
7
|
+
"import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { pbkdf2Sync, createDecipheriv } from \"node:crypto\";\nimport { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport { queryReadonlySqlite } from \"./firefox-profile.ts\";\n\ntype BraveExtractedTeam = { url: string; name?: string; token: string };\n\nexport type BraveExtracted = {\n cookie_d: string;\n teams: BraveExtractedTeam[];\n};\n\nconst IS_MACOS = platform() === \"darwin\";\n\n// --- AppleScript helpers (for extracting teams from Brave tabs) ---\n\nfunction osascript(script: string): string {\n return execFileSync(\"osascript\", [\"-e\", script], {\n encoding: \"utf8\",\n timeout: 7000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n}\n\nconst TEAM_JSON_PATHS = [\n \"JSON.stringify(JSON.parse(localStorage.localConfig_v2).teams)\",\n \"JSON.stringify(JSON.parse(localStorage.localConfig_v3).teams)\",\n \"JSON.stringify(JSON.parse(localStorage.getItem('reduxPersist:localConfig'))?.teams || {})\",\n \"JSON.stringify(window.boot_data?.teams || {})\",\n];\n\nfunction teamsScript(): string {\n const tryPaths = TEAM_JSON_PATHS.map(\n (expr) => `try { var v = ${expr}; if (v && v !== '{}' && v !== 'null') return v; } catch(e) {}`,\n );\n return `\n tell application \"Brave Browser\"\n repeat with w in windows\n repeat with t in tabs of w\n if URL of t contains \"slack.com\" then\n return execute t javascript \"(function(){ ${tryPaths.join(\" \")} return '{}'; })()\"\n end if\n end repeat\n end repeat\n return \"{}\"\n end tell\n `;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction toBraveTeam(value: unknown): BraveExtractedTeam | null {\n if (!isRecord(value)) {\n return null;\n }\n const token = typeof value.token === \"string\" ? value.token : null;\n const url = typeof value.url === \"string\" ? value.url : null;\n if (!token || !url || !token.startsWith(\"xoxc-\")) {\n return null;\n }\n const name = typeof value.name === \"string\" ? value.name : undefined;\n return { url, name, token };\n}\n\nfunction extractTeamsFromBraveTab(): BraveExtractedTeam[] {\n const teamsRaw = osascript(teamsScript());\n let teamsObj: unknown = {};\n try {\n teamsObj = JSON.parse(teamsRaw || \"{}\");\n } catch {\n teamsObj = {};\n }\n\n const teamsRecord = isRecord(teamsObj) ? teamsObj : {};\n return Object.values(teamsRecord)\n .map((t) => toBraveTeam(t))\n .filter((t): t is BraveExtractedTeam => t !== null);\n}\n\n// --- Cookie extraction from Brave's SQLite database ---\n\nconst BRAVE_COOKIES_DB = join(\n homedir(),\n \"Library\",\n \"Application Support\",\n \"BraveSoftware\",\n \"Brave-Browser\",\n \"Default\",\n \"Cookies\",\n);\n\nfunction getSafeStoragePasswords(): string[] {\n const services = [\n \"Brave Safe Storage\",\n \"Brave Browser Safe Storage\",\n \"Chrome Safe Storage\",\n \"Chromium Safe Storage\",\n ];\n const passwords: string[] = [];\n for (const service of services) {\n try {\n const out = execFileSync(\"security\", [\"find-generic-password\", \"-w\", \"-s\", service], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n if (out) {\n passwords.push(out);\n }\n } catch {\n // continue\n }\n }\n return passwords;\n}\n\nfunction decryptChromiumCookieValue(data: Buffer, password: string): string {\n if (!data || data.length === 0) {\n return \"\";\n }\n\n const salt = Buffer.from(\"saltysalt\", \"utf8\");\n const iv = Buffer.alloc(16, \" \");\n const key = pbkdf2Sync(password, salt, 1003, 16, \"sha1\");\n\n const decipher = createDecipheriv(\"aes-128-cbc\", key, iv);\n decipher.setAutoPadding(true);\n const plain = Buffer.concat([decipher.update(data), decipher.final()]);\n const marker = Buffer.from(\"xoxd-\");\n const idx = plain.indexOf(marker);\n if (idx === -1) {\n return plain.toString(\"utf8\");\n }\n\n let end = idx;\n while (end < plain.length) {\n const b = plain[end]!;\n if (b < 0x21 || b > 0x7e) {\n break;\n }\n end++;\n }\n const rawToken = plain.subarray(idx, end).toString(\"utf8\");\n try {\n return decodeURIComponent(rawToken);\n } catch {\n return rawToken;\n }\n}\n\nasync function extractCookieDFromBrave(): Promise<string> {\n if (!existsSync(BRAVE_COOKIES_DB)) {\n throw new Error(`Brave Cookies DB not found: ${BRAVE_COOKIES_DB}`);\n }\n\n const rows = (await queryReadonlySqlite(\n BRAVE_COOKIES_DB,\n \"select host_key, name, value, encrypted_value from cookies where name = 'd' and host_key like '%slack.com' order by length(encrypted_value) desc\",\n )) as {\n host_key: string;\n name: string;\n value: string;\n encrypted_value: Uint8Array;\n }[];\n\n if (!rows || rows.length === 0) {\n throw new Error(\"No Slack 'd' cookie found in Brave\");\n }\n const row = rows[0]!;\n if (row.value && row.value.startsWith(\"xoxd-\")) {\n return row.value;\n }\n\n const encrypted = Buffer.from(row.encrypted_value || []);\n if (encrypted.length === 0) {\n throw new Error(\"Brave Slack 'd' cookie had no encrypted_value\");\n }\n\n const prefix = encrypted.subarray(0, 3).toString(\"utf8\");\n const data = prefix === \"v10\" || prefix === \"v11\" ? encrypted.subarray(3) : encrypted;\n const passwords = getSafeStoragePasswords();\n\n for (const password of passwords) {\n try {\n const decrypted = decryptChromiumCookieValue(data, password);\n const match = decrypted.match(/xoxd-[A-Za-z0-9%/+_=.-]+/);\n if (match) {\n return match[0]!;\n }\n } catch {\n // continue\n }\n }\n\n throw new Error(\"Could not decrypt Slack 'd' cookie from Brave\");\n}\n\n// --- Main export ---\n\nexport async function extractFromBrave(): Promise<BraveExtracted | null> {\n if (!IS_MACOS) {\n return null;\n }\n try {\n const teams = extractTeamsFromBraveTab();\n if (teams.length === 0) {\n return null;\n }\n\n const cookie_d = await extractCookieDFromBrave();\n if (!cookie_d || !cookie_d.startsWith(\"xoxd-\")) {\n return null;\n }\n\n return { cookie_d, teams };\n } catch {\n return null;\n }\n}\n",
|
|
8
|
+
"import { copyFile, mkdtemp, readdir, readFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport type SqliteRow = Record<string, unknown>;\n\nexport type ProfileCandidate = {\n name?: string;\n path: string;\n isDefault: boolean;\n};\n\nconst PLATFORM = platform();\nconst IS_MACOS = PLATFORM === \"darwin\";\nconst IS_LINUX = PLATFORM === \"linux\";\n\nexport function isMissingBunSqliteModule(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n const err = error as { code?: unknown; message?: unknown };\n const code = typeof err.code === \"string\" ? err.code : \"\";\n const message = typeof err.message === \"string\" ? err.message : \"\";\n\n if (code === \"ERR_MODULE_NOT_FOUND\" || code === \"ERR_UNSUPPORTED_ESM_URL_SCHEME\") {\n return true;\n }\n if (!message.includes(\"bun:sqlite\")) {\n return false;\n }\n return (\n message.includes(\"Cannot find module\") ||\n message.includes(\"Unknown builtin module\") ||\n message.includes(\"unsupported URL scheme\") ||\n message.includes(\"Only URLs with a scheme in\")\n );\n}\n\nexport async function queryReadonlySqlite(dbPath: string, sql: string): Promise<SqliteRow[]> {\n try {\n const { Database } = await import(\"bun:sqlite\");\n const db = new Database(dbPath, { readonly: true });\n try {\n return db.query(sql).all() as SqliteRow[];\n } finally {\n db.close();\n }\n } catch (error) {\n if (!isMissingBunSqliteModule(error)) {\n throw error;\n }\n const { DatabaseSync } = await import(\"node:sqlite\");\n const db = new DatabaseSync(dbPath, { readOnly: true });\n try {\n return db.prepare(sql).all() as SqliteRow[];\n } finally {\n db.close();\n }\n }\n}\n\nexport function getFirefoxBaseDir(): string {\n if (IS_LINUX) {\n return join(homedir(), \".mozilla\", \"firefox\");\n }\n if (IS_MACOS) {\n return join(homedir(), \"Library\", \"Application Support\", \"Firefox\");\n }\n throw new Error(`Firefox extraction is not supported on ${PLATFORM}.`);\n}\n\nexport function parseProfilesIni(raw: string, baseDir: string): ProfileCandidate[] {\n const lines = raw.split(/\\r?\\n/);\n const profiles: {\n name?: string;\n path?: string;\n isRelative: boolean;\n isDefault: boolean;\n }[] = [];\n // Firefox can mark defaults either in [Profile*] (Default=1) or [Install*] sections.\n const installDefaults = new Set<string>();\n\n let section = \"\";\n let current: { name?: string; path?: string; isRelative: boolean; isDefault: boolean } | null =\n null;\n\n for (const lineRaw of lines) {\n const line = lineRaw.trim();\n if (!line || line.startsWith(\";\") || line.startsWith(\"#\")) {\n continue;\n }\n if (line.startsWith(\"[\") && line.endsWith(\"]\")) {\n if (current) {\n profiles.push(current);\n current = null;\n }\n section = line.slice(1, -1);\n if (section.startsWith(\"Profile\")) {\n current = { isRelative: true, isDefault: false };\n }\n continue;\n }\n\n const idx = line.indexOf(\"=\");\n if (idx === -1) {\n continue;\n }\n const key = line.slice(0, idx).trim();\n const value = line.slice(idx + 1).trim();\n\n if (section.startsWith(\"Profile\") && current) {\n if (key === \"Name\") {\n current.name = value;\n } else if (key === \"Path\") {\n current.path = value;\n } else if (key === \"IsRelative\") {\n current.isRelative = value !== \"0\";\n } else if (key === \"Default\") {\n current.isDefault = value === \"1\";\n }\n continue;\n }\n\n if (section.startsWith(\"Install\") && key === \"Default\" && value) {\n installDefaults.add(value);\n }\n }\n\n if (current) {\n profiles.push(current);\n }\n\n return profiles\n .filter((p) => Boolean(p.path))\n .map((p) => {\n const profilePath = p.isRelative ? join(baseDir, p.path!) : p.path!;\n return {\n name: p.name,\n path: profilePath,\n isDefault: p.isDefault || installDefaults.has(p.path!),\n };\n });\n}\n\nexport async function listProfileCandidates(): Promise<ProfileCandidate[]> {\n const baseDir = getFirefoxBaseDir();\n const iniPath = join(baseDir, \"profiles.ini\");\n const candidates: ProfileCandidate[] = [];\n\n if (existsSync(iniPath)) {\n const raw = await readFile(iniPath, \"utf8\");\n candidates.push(...parseProfilesIni(raw, baseDir));\n }\n\n // profiles.ini can be stale, so also scan profile directories as a fallback source.\n const dirName = IS_MACOS ? \"Profiles\" : baseDir;\n if (existsSync(dirName)) {\n const entries = await readdir(dirName, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const profilePath = join(dirName, entry.name);\n if (!candidates.some((c) => c.path === profilePath)) {\n candidates.push({ path: profilePath, isDefault: false });\n }\n }\n }\n\n const existing = candidates.filter((c) => existsSync(c.path));\n existing.sort((a, b) => Number(b.isDefault) - Number(a.isDefault));\n return existing;\n}\n\nexport function pickCandidatesByProfile(\n candidates: ProfileCandidate[],\n profile?: string,\n): ProfileCandidate[] {\n const selector = profile?.trim();\n if (!selector) {\n return candidates;\n }\n const normalized = selector.toLowerCase();\n const matched = candidates.filter((c) => {\n const name = c.name?.toLowerCase() ?? \"\";\n const base = c.path.split(\"/\").pop()?.toLowerCase() ?? \"\";\n const full = c.path.toLowerCase();\n return name === normalized || base === normalized || full.includes(normalized);\n });\n return matched;\n}\n\nexport async function copySqliteForRead(\n dbPath: string,\n): Promise<{ copyPath: string; cleanup: () => Promise<void> }> {\n const tmpPath = await mkdtemp(join(tmpdir(), \"agent-slack-firefox-\"));\n const base = dbPath.split(\"/\").pop() || \"db.sqlite\";\n const copyPath = join(tmpPath, base);\n await copyFile(dbPath, copyPath);\n\n // Firefox keeps recent commits in WAL/SHM while running; copy them with the DB snapshot.\n for (const suffix of [\"-wal\", \"-shm\"]) {\n const sidecar = `${dbPath}${suffix}`;\n if (!existsSync(sidecar)) {\n continue;\n }\n try {\n await copyFile(sidecar, `${copyPath}${suffix}`);\n } catch {}\n }\n\n return {\n copyPath,\n cleanup: async () => {\n try {\n await rm(tmpPath, { recursive: true, force: true });\n } catch {}\n },\n };\n}\n",
|
|
8
9
|
"import { execSync } from \"node:child_process\";\nimport { platform } from \"node:os\";\n\ntype ChromeExtractedTeam = { url: string; name?: string; token: string };\n\nexport type ChromeExtracted = {\n cookie_d: string;\n teams: ChromeExtractedTeam[];\n};\n\nconst IS_MACOS = platform() === \"darwin\";\n\nfunction escapeOsaScript(script: string): string {\n // osascript -e '...'\n return script.replace(/'/g, `'\"'\"'`);\n}\n\nfunction osascript(script: string): string {\n return execSync(`osascript -e '${escapeOsaScript(script)}'`, {\n encoding: \"utf8\",\n timeout: 7000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n}\n\nfunction cookieScript(): string {\n return `\n tell application \"Google Chrome\"\n repeat with w in windows\n repeat with t in tabs of w\n if URL of t contains \"slack.com\" then\n return execute t javascript \"document.cookie.split('; ').find(c => c.startsWith('d='))?.split('=')[1] || ''\"\n end if\n end repeat\n end repeat\n return \"\"\n end tell\n `;\n}\n\nconst TEAM_JSON_PATHS = [\n // Current known storage\n \"JSON.stringify(JSON.parse(localStorage.localConfig_v2).teams)\",\n \"JSON.stringify(JSON.parse(localStorage.localConfig_v3).teams)\",\n \"JSON.stringify(JSON.parse(localStorage.getItem('reduxPersist:localConfig'))?.teams || {})\",\n \"JSON.stringify(window.boot_data?.teams || {})\",\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction toChromeTeam(value: unknown): ChromeExtractedTeam | null {\n if (!isRecord(value)) {\n return null;\n }\n const token = typeof value.token === \"string\" ? value.token : null;\n const url = typeof value.url === \"string\" ? value.url : null;\n if (!token || !url || !token.startsWith(\"xoxc-\")) {\n return null;\n }\n const name = typeof value.name === \"string\" ? value.name : undefined;\n return { url, name, token };\n}\n\nfunction teamsScript(): string {\n const tryPaths = TEAM_JSON_PATHS.map(\n (expr) => `try { var v = ${expr}; if (v && v !== '{}' && v !== 'null') return v; } catch(e) {}`,\n );\n return `\n tell application \"Google Chrome\"\n repeat with w in windows\n repeat with t in tabs of w\n if URL of t contains \"slack.com\" then\n return execute t javascript \"(function(){ ${tryPaths.join(\" \")} return '{}'; })()\"\n end if\n end repeat\n end repeat\n return \"{}\"\n end tell\n `;\n}\n\nexport function extractFromChrome(): ChromeExtracted | null {\n if (!IS_MACOS) {\n return null;\n }\n try {\n const cookie = osascript(cookieScript());\n if (!cookie || !cookie.startsWith(\"xoxd-\")) {\n return null;\n }\n\n const teamsRaw = osascript(teamsScript());\n let teamsObj: unknown = {};\n try {\n teamsObj = JSON.parse(teamsRaw || \"{}\");\n } catch {\n teamsObj = {};\n }\n\n const teamsRecord = isRecord(teamsObj) ? teamsObj : {};\n const teams: ChromeExtractedTeam[] = Object.values(teamsRecord)\n .map((t) => toChromeTeam(t))\n .filter((t): t is ChromeExtractedTeam => t !== null);\n\n if (teams.length === 0) {\n return null;\n }\n return { cookie_d: cookie, teams };\n } catch {\n return null;\n }\n}\n",
|
|
9
10
|
"export type ParsedCurlTokens = {\n workspace_url: string;\n xoxc_token: string;\n xoxd_cookie: string;\n};\n\nexport function parseSlackCurlCommand(curlInput: string): ParsedCurlTokens {\n const urlMatch = curlInput.match(/curl\\s+['\"]?(https?:\\/\\/([^.]+)\\.slack\\.com[^'\"\\s]*)/i);\n if (!urlMatch) {\n throw new Error(\"Could not find Slack workspace URL in cURL command\");\n }\n const workspace_url = `https://${urlMatch[2]}.slack.com`;\n\n const cookieMatch = curlInput.match(\n /(?:-b|--cookie)\\s+\\$?'([^']+)'|(?:-b|--cookie)\\s+\\$?\"([^\"]+)\"|-H\\s+\\$?'[Cc]ookie:\\s*([^']+)'|-H\\s+\\$?\"[Cc]ookie:\\s*([^\"]+)\"/,\n );\n const cookieHeader = cookieMatch\n ? cookieMatch[1] || cookieMatch[2] || cookieMatch[3] || cookieMatch[4] || \"\"\n : \"\";\n const xoxdMatch = cookieHeader.match(/(?:^|;\\s*)d=(xoxd-[^;]+)/);\n if (!xoxdMatch) {\n throw new Error(\"Could not find xoxd cookie (d=xoxd-...) in cURL command\");\n }\n const xoxd_cookie = decodeURIComponent(xoxdMatch[1]!);\n\n // Token can appear in various forms: token=..., \"token\":\"...\", or name=\"token\"... in form bodies.\n // Try common patterns first, then fall back to the first xoxc-* we can find.\n const tokenPatterns: RegExp[] = [\n /(?:^|[?&\\s])token=(xoxc-[A-Za-z0-9-]+)/,\n /\"token\"\\s*:\\s*\"(xoxc-[A-Za-z0-9-]+)\"/,\n /name=\"token\"[^x]*?(xoxc-[A-Za-z0-9-]+)/,\n /\\b(xoxc-[A-Za-z0-9-]+)\\b/,\n ];\n\n let xoxc_token: string | null = null;\n for (const re of tokenPatterns) {\n const m = curlInput.match(re);\n if (m?.[1]) {\n const [, token] = m;\n xoxc_token = token ?? null;\n break;\n }\n }\n if (!xoxc_token) {\n throw new Error(\"Could not find xoxc token in cURL command\");\n }\n\n return { workspace_url, xoxc_token, xoxd_cookie };\n}\n",
|
|
10
11
|
"// Desktop auth extraction approach inspired by:\n// - slacktokens: https://github.com/hraftery/slacktokens\nimport { cp, mkdir, rm, unlink } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport { pbkdf2Sync, createDecipheriv } from \"node:crypto\";\nimport { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport { findKeysContaining } from \"../lib/leveldb-reader.js\";\n\ntype SqliteRow = Record<string, unknown>;\n\nfunction isMissingBunSqliteModule(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n const err = error as { code?: unknown; message?: unknown };\n const code = typeof err.code === \"string\" ? err.code : \"\";\n const message = typeof err.message === \"string\" ? err.message : \"\";\n\n if (code === \"ERR_MODULE_NOT_FOUND\" || code === \"ERR_UNSUPPORTED_ESM_URL_SCHEME\") {\n return true;\n }\n if (!message.includes(\"bun:sqlite\")) {\n return false;\n }\n return (\n message.includes(\"Cannot find module\") ||\n message.includes(\"Unknown builtin module\") ||\n message.includes(\"unsupported URL scheme\") ||\n message.includes(\"Only URLs with a scheme in\")\n );\n}\n\n/**\n * Query a SQLite database in read-only mode.\n * Uses bun:sqlite when running under Bun, falls back to node:sqlite (Node >= 22.5).\n */\nasync function queryReadonlySqlite(dbPath: string, sql: string): Promise<SqliteRow[]> {\n try {\n const { Database } = await import(\"bun:sqlite\");\n const db = new Database(dbPath, { readonly: true });\n try {\n return db.query(sql).all() as SqliteRow[];\n } finally {\n db.close();\n }\n } catch (error) {\n if (!isMissingBunSqliteModule(error)) {\n throw error;\n }\n const { DatabaseSync } = await import(\"node:sqlite\");\n const db = new DatabaseSync(dbPath, { readOnly: true });\n try {\n return db.prepare(sql).all() as SqliteRow[];\n } finally {\n db.close();\n }\n }\n}\n\ntype DesktopTeam = { url: string; name?: string; token: string };\n\nexport type DesktopExtracted = {\n cookie_d: string;\n teams: DesktopTeam[];\n source: { leveldb_path: string; cookies_path: string };\n};\n\nconst PLATFORM = platform();\nconst IS_MACOS = PLATFORM === \"darwin\";\nconst IS_LINUX = PLATFORM === \"linux\";\n\n// Electron (direct download) paths\nconst SLACK_SUPPORT_DIR_ELECTRON = join(homedir(), \"Library\", \"Application Support\", \"Slack\");\n// Mac App Store paths (sandboxed container)\nconst SLACK_SUPPORT_DIR_APPSTORE = join(\n homedir(),\n \"Library\",\n \"Containers\",\n \"com.tinyspeck.slackmacgap\",\n \"Data\",\n \"Library\",\n \"Application Support\",\n \"Slack\",\n);\n\nconst SLACK_SUPPORT_DIR_LINUX = join(homedir(), \".config\", \"Slack\");\n\nconst SLACK_SUPPORT_DIR_LINUX_FLATPAK = join(\n homedir(),\n \".var\",\n \"app\",\n \"com.slack.Slack\",\n \"config\",\n \"Slack\",\n);\n\nfunction getSlackPaths(): { leveldbDir: string; cookiesDb: string } {\n const candidates = IS_MACOS\n ? [SLACK_SUPPORT_DIR_ELECTRON, SLACK_SUPPORT_DIR_APPSTORE]\n : IS_LINUX\n ? [SLACK_SUPPORT_DIR_LINUX_FLATPAK, SLACK_SUPPORT_DIR_LINUX]\n : [];\n\n if (candidates.length === 0) {\n throw new Error(`Slack Desktop extraction is not supported on ${PLATFORM}.`);\n }\n\n for (const dir of candidates) {\n const leveldbDir = join(dir, \"Local Storage\", \"leveldb\");\n if (existsSync(leveldbDir)) {\n const cookiesDbCandidates = [join(dir, \"Network\", \"Cookies\"), join(dir, \"Cookies\")];\n const cookiesDb =\n cookiesDbCandidates.find((candidate) => existsSync(candidate)) || cookiesDbCandidates[0]!;\n return { leveldbDir, cookiesDb };\n }\n }\n\n throw new Error(\n `Slack Desktop data not found. Checked:\\n - ${candidates.map((d) => join(d, \"Local Storage\", \"leveldb\")).join(\"\\n - \")}`,\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction toDesktopTeam(value: unknown): DesktopTeam | null {\n if (!isRecord(value)) {\n return null;\n }\n const url = typeof value.url === \"string\" ? value.url : null;\n const token = typeof value.token === \"string\" ? value.token : null;\n if (!url || !token) {\n return null;\n }\n const name = typeof value.name === \"string\" ? value.name : undefined;\n return { url, name, token };\n}\n\nasync function snapshotLevelDb(srcDir: string): Promise<string> {\n const base = join(homedir(), \".config\", \"agent-slack\", \"cache\", \"leveldb-snapshots\");\n const dest = join(base, `${Date.now()}`);\n await mkdir(base, { recursive: true });\n let useNodeCopy = !IS_MACOS;\n if (IS_MACOS) {\n try {\n execFileSync(\"cp\", [\"-cR\", srcDir, dest], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n } catch {\n useNodeCopy = true;\n }\n }\n if (useNodeCopy) {\n await cp(srcDir, dest, { recursive: true, force: true });\n }\n\n try {\n await unlink(join(dest, \"LOCK\"));\n } catch {\n // ignore\n }\n return dest;\n}\n\nfunction parseLocalConfig(raw: Buffer): unknown {\n if (!raw || raw.length === 0) {\n throw new Error(\"localConfig is empty\");\n }\n\n const [first] = raw;\n const data = first === 0x00 || first === 0x01 || first === 0x02 ? raw.subarray(1) : raw;\n\n let nulCount = 0;\n for (const b of data) {\n if (b === 0) {\n nulCount++;\n }\n }\n\n const encodings: BufferEncoding[] =\n nulCount > data.length / 4 ? ([\"utf16le\", \"utf8\"] as const) : ([\"utf8\", \"utf16le\"] as const);\n\n let lastErr: unknown;\n for (const enc of encodings) {\n try {\n const text = data.toString(enc);\n try {\n return JSON.parse(text);\n } catch (err1) {\n lastErr = err1;\n }\n\n const start = text.indexOf(\"{\");\n const end = text.lastIndexOf(\"}\");\n if (start !== -1 && end !== -1 && end > start) {\n try {\n return JSON.parse(text.slice(start, end + 1));\n } catch (err2) {\n lastErr = err2;\n }\n }\n } catch (err) {\n lastErr = err;\n }\n }\n\n throw lastErr || new Error(\"localConfig not parseable\");\n}\n\nasync function extractTeamsFromSlackLevelDb(leveldbDir: string): Promise<DesktopTeam[]> {\n if (!existsSync(leveldbDir)) {\n throw new Error(`Slack LevelDB not found: ${leveldbDir}`);\n }\n\n const snap = await snapshotLevelDb(leveldbDir);\n\n try {\n // Use pure JS LevelDB reader - search for localConfig entries\n const localConfigV2 = Buffer.from(\"localConfig_v2\");\n const localConfigV3 = Buffer.from(\"localConfig_v3\");\n\n const entries = await findKeysContaining(snap, Buffer.from(\"localConfig_v\"));\n\n let configBuf: Buffer | null = null;\n let configRank = -1n;\n for (const entry of entries) {\n if (entry.key.includes(localConfigV2) || entry.key.includes(localConfigV3)) {\n if (entry.value && entry.value.length > 0) {\n let rank = 0n;\n if (entry.key.length >= 8) {\n rank = entry.key.readBigUInt64LE(entry.key.length - 8);\n }\n if (!configBuf || rank >= configRank) {\n configBuf = entry.value;\n configRank = rank;\n }\n }\n }\n }\n\n if (!configBuf) {\n throw new Error(\"Slack LevelDB did not contain localConfig_v2/v3\");\n }\n\n const cfg = parseLocalConfig(configBuf);\n const teamsValue = isRecord(cfg) ? cfg.teams : undefined;\n const teamsObj = isRecord(teamsValue) ? teamsValue : {};\n const teams: DesktopTeam[] = Object.values(teamsObj)\n .map((t) => toDesktopTeam(t))\n .filter((t): t is DesktopTeam => t !== null)\n .filter((t) => t.token.startsWith(\"xoxc-\"));\n\n if (teams.length === 0) {\n throw new Error(\"No xoxc tokens found in Slack localConfig\");\n }\n return teams;\n } finally {\n try {\n await rm(snap, { recursive: true, force: true });\n } catch {\n // ignore\n }\n }\n}\n\nfunction getSafeStoragePasswords(prefix: string): string[] {\n if (IS_MACOS) {\n const services = [\"Slack Safe Storage\", \"Chrome Safe Storage\", \"Chromium Safe Storage\"];\n const passwords: string[] = [];\n for (const service of services) {\n try {\n const out = execFileSync(\"security\", [\"find-generic-password\", \"-w\", \"-s\", service], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n if (out) {\n passwords.push(out);\n }\n } catch {\n // continue\n }\n }\n if (passwords.length > 0) {\n return passwords;\n }\n }\n\n if (IS_LINUX) {\n const attributes: string[][] = [\n [\"application\", \"com.slack.Slack\"],\n [\"application\", \"Slack\"],\n [\"application\", \"slack\"],\n [\"service\", \"Slack Safe Storage\"],\n ];\n const passwords: string[] = [];\n for (const pair of attributes) {\n try {\n const out = execFileSync(\"secret-tool\", [\"lookup\", ...pair], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n if (out) {\n passwords.push(out);\n }\n } catch {\n // continue\n }\n }\n\n // Chromium Linux OSCrypt v10 fallback password (see os_crypt_linux.cc).\n if (prefix === \"v11\") {\n passwords.push(\"\");\n }\n passwords.push(\"peanuts\");\n\n return [...new Set(passwords)];\n }\n\n throw new Error(\"Could not read Safe Storage password from desktop keychain.\");\n}\n\nfunction decryptChromiumCookieValue(data: Buffer, password: string): string {\n if (!data || data.length === 0) {\n return \"\";\n }\n\n const salt = Buffer.from(\"saltysalt\", \"utf8\");\n const iv = Buffer.alloc(16, \" \");\n const key = pbkdf2Sync(password, salt, IS_LINUX ? 1 : 1003, 16, \"sha1\");\n\n const decipher = createDecipheriv(\"aes-128-cbc\", key, iv);\n decipher.setAutoPadding(true);\n const plain = Buffer.concat([decipher.update(data), decipher.final()]);\n const marker = Buffer.from(\"xoxd-\");\n const idx = plain.indexOf(marker);\n if (idx === -1) {\n return plain.toString(\"utf8\");\n }\n\n let end = idx;\n while (end < plain.length) {\n const b = plain[end]!;\n if (b < 0x21 || b > 0x7e) {\n break;\n }\n end++;\n }\n const rawToken = plain.subarray(idx, end).toString(\"utf8\");\n try {\n return decodeURIComponent(rawToken);\n } catch {\n return rawToken;\n }\n}\n\nasync function extractCookieDFromSlackCookiesDb(cookiesPath: string): Promise<string> {\n if (!existsSync(cookiesPath)) {\n throw new Error(`Slack Cookies DB not found: ${cookiesPath}`);\n }\n\n const rows = (await queryReadonlySqlite(\n cookiesPath,\n \"select host_key, name, value, encrypted_value from cookies where name = 'd' and host_key like '%slack.com' order by length(encrypted_value) desc\",\n )) as {\n host_key: string;\n name: string;\n value: string;\n encrypted_value: Uint8Array;\n }[];\n\n if (!rows || rows.length === 0) {\n throw new Error(\"No Slack 'd' cookie found\");\n }\n const row = rows[0]!;\n if (row.value && row.value.startsWith(\"xoxd-\")) {\n return row.value;\n }\n\n const encrypted = Buffer.from(row.encrypted_value || []);\n if (encrypted.length === 0) {\n throw new Error(\"Slack 'd' cookie had no encrypted_value\");\n }\n\n const prefix = encrypted.subarray(0, 3).toString(\"utf8\");\n const data = prefix === \"v10\" || prefix === \"v11\" ? encrypted.subarray(3) : encrypted;\n const passwords = getSafeStoragePasswords(prefix);\n\n for (const password of passwords) {\n try {\n const decrypted = decryptChromiumCookieValue(data, password);\n const match = decrypted.match(/xoxd-[A-Za-z0-9%/+_=.-]+/);\n if (match) {\n return match[0]!;\n }\n } catch {\n // continue\n }\n }\n\n throw new Error(\"Could not locate xoxd-* in decrypted Slack cookie\");\n}\n\nexport async function extractFromSlackDesktop(): Promise<DesktopExtracted> {\n const { leveldbDir, cookiesDb } = getSlackPaths();\n const teams = await extractTeamsFromSlackLevelDb(leveldbDir);\n const cookie_d = await extractCookieDFromSlackCookiesDb(cookiesDb);\n return {\n cookie_d,\n teams,\n source: { leveldb_path: leveldbDir, cookies_path: cookiesDb },\n };\n}\n",
|
|
11
12
|
"/**\n * Pure JavaScript LevelDB reader for Chromium Local Storage.\n * Reads SSTable (.ldb) and log (.log) files without native modules.\n *\n * This is a minimal implementation that only supports reading - no writes.\n * Designed for extracting Slack tokens from Chromium-based apps.\n */\n\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { snappyUncompress } from \"hysnappy\";\n\n// LevelDB magic number (little-endian): 0xdb4775248b80fb57\nconst LEVELDB_MAGIC = Buffer.from([0x57, 0xfb, 0x80, 0x8b, 0x24, 0x75, 0x47, 0xdb]);\n\n// Block compression types\nconst COMPRESSION_NONE = 0;\nconst COMPRESSION_SNAPPY = 1;\n\n// Log record types\nconst LOG_RECORD_FULL = 1;\nconst LOG_RECORD_FIRST = 2;\nconst LOG_RECORD_MIDDLE = 3;\nconst LOG_RECORD_LAST = 4;\n\nexport type LevelDBEntry = {\n key: Buffer;\n value: Buffer;\n};\n\n/**\n * Read a varint from buffer at offset. Returns [value, bytesRead].\n */\nfunction readVarint(buf: Buffer, offset: number): [number, number] {\n let result = 0;\n let shift = 0;\n let bytesRead = 0;\n\n while (offset + bytesRead < buf.length) {\n const byte = buf[offset + bytesRead]!;\n bytesRead++;\n result |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n return [result, bytesRead];\n }\n shift += 7;\n if (shift >= 35) {\n throw new Error(\"Varint too long\");\n }\n }\n throw new Error(\"Unexpected end of buffer reading varint\");\n}\n\n/**\n * Read a varint64 from buffer. For our use case, we only need 32-bit precision.\n */\nfunction readVarint64(buf: Buffer, offset: number): [number, number] {\n let result = 0;\n let shift = 0;\n let bytesRead = 0;\n\n while (offset + bytesRead < buf.length && bytesRead < 10) {\n const byte = buf[offset + bytesRead]!;\n bytesRead++;\n if (shift < 32) {\n result |= (byte & 0x7f) << shift;\n }\n if ((byte & 0x80) === 0) {\n return [result >>> 0, bytesRead];\n }\n shift += 7;\n }\n throw new Error(\"Unexpected end of buffer reading varint64\");\n}\n\n/**\n * Get uncompressed length from Snappy-compressed data.\n * Snappy format starts with uncompressed length as a varint.\n */\nfunction getSnappyUncompressedLength(compressed: Buffer): number {\n const [length] = readVarint(compressed, 0);\n return length;\n}\n\n/**\n * Parse a LevelDB block handle (offset + size as varints).\n */\nfunction parseBlockHandle(\n buf: Buffer,\n offset: number,\n): { offset: number; size: number; bytesRead: number } {\n const [blockOffset, n1] = readVarint64(buf, offset);\n const [blockSize, n2] = readVarint64(buf, offset + n1);\n return { offset: blockOffset, size: blockSize, bytesRead: n1 + n2 };\n}\n\n/**\n * Decompress a block if needed.\n */\nfunction decompressBlock(blockData: Buffer, compressionType: number): Buffer {\n if (compressionType === COMPRESSION_NONE) {\n return blockData;\n }\n if (compressionType === COMPRESSION_SNAPPY) {\n const uncompressedLength = getSnappyUncompressedLength(blockData);\n const result = snappyUncompress(blockData, uncompressedLength);\n return Buffer.from(result);\n }\n throw new Error(`Unknown compression type: ${compressionType}`);\n}\n\n/**\n * Parse entries from a data block.\n * LevelDB uses prefix compression within blocks.\n */\nfunction parseDataBlock(block: Buffer): LevelDBEntry[] {\n const entries: LevelDBEntry[] = [];\n\n if (block.length < 4) {\n return entries;\n }\n\n // Last 4 bytes are number of restart points\n const numRestarts = block.readUInt32LE(block.length - 4);\n // Restart array is numRestarts * 4 bytes before the count\n const restartsStart = block.length - 4 - numRestarts * 4;\n\n if (restartsStart < 0) {\n return entries;\n }\n\n let offset = 0;\n let prevKey = Buffer.alloc(0);\n\n while (offset < restartsStart) {\n try {\n const [shared, n1] = readVarint(block, offset);\n offset += n1;\n const [nonShared, n2] = readVarint(block, offset);\n offset += n2;\n const [valueLen, n3] = readVarint(block, offset);\n offset += n3;\n\n if (offset + nonShared + valueLen > restartsStart) {\n break;\n }\n\n // Build key from shared prefix + new bytes\n const keyDelta = block.subarray(offset, offset + nonShared);\n offset += nonShared;\n\n const key = Buffer.concat([prevKey.subarray(0, shared), keyDelta]);\n const value = block.subarray(offset, offset + valueLen);\n offset += valueLen;\n\n // Filter out deletion markers (keys starting with certain internal prefixes)\n // In LevelDB, user keys don't have the sequence number suffix for our read-only case\n entries.push({ key: Buffer.from(key), value: Buffer.from(value) });\n prevKey = key;\n } catch {\n break;\n }\n }\n\n return entries;\n}\n\n/**\n * Parse an SSTable (.ldb or .sst) file and extract all key-value pairs.\n */\nasync function parseSSTable(filePath: string): Promise<LevelDBEntry[]> {\n const entries: LevelDBEntry[] = [];\n\n let data: Buffer;\n try {\n data = await readFile(filePath);\n } catch {\n return entries;\n }\n\n if (data.length < 48) {\n return entries;\n }\n\n // Read footer (last 48 bytes)\n const footer = data.subarray(-48);\n\n // Verify magic number (last 8 bytes of footer)\n const magic = footer.subarray(40, 48);\n if (!magic.equals(LEVELDB_MAGIC)) {\n // Not a valid SSTable or different format\n return entries;\n }\n\n try {\n // Parse metaindex and index block handles from footer\n // Footer format: [metaindex_handle][index_handle][padding][magic]\n const { bytesRead: metaBytes } = parseBlockHandle(footer, 0);\n const indexHandle = parseBlockHandle(footer, metaBytes);\n\n // Read index block\n const indexBlockStart = indexHandle.offset;\n const indexBlockEnd = indexHandle.offset + indexHandle.size + 5; // +5 for type + crc\n\n if (indexBlockEnd > data.length - 48) {\n return entries;\n }\n\n const indexBlockRaw = data.subarray(indexBlockStart, indexBlockEnd);\n const indexCompressionType = indexBlockRaw.at(-5)!;\n const indexBlockData = indexBlockRaw.subarray(0, -5);\n const indexBlock = decompressBlock(indexBlockData, indexCompressionType);\n\n // Parse index block to get data block locations\n const indexEntries = parseDataBlock(indexBlock);\n\n // Read each data block\n for (const indexEntry of indexEntries) {\n try {\n // Index entry value contains a block handle\n const blockHandle = parseBlockHandle(indexEntry.value, 0);\n const blockStart = blockHandle.offset;\n const blockEnd = blockHandle.offset + blockHandle.size + 5; // +5 for type + crc\n\n if (blockEnd > data.length) {\n continue;\n }\n\n const blockRaw = data.subarray(blockStart, blockEnd);\n const compressionType = blockRaw.at(-5)!;\n const blockData = blockRaw.subarray(0, -5);\n const block = decompressBlock(blockData, compressionType);\n\n const blockEntries = parseDataBlock(block);\n entries.push(...blockEntries);\n } catch {\n // Skip malformed blocks\n continue;\n }\n }\n } catch {\n // If structured parsing fails, return empty\n return entries;\n }\n\n return entries;\n}\n\n/**\n * Parse a LevelDB log (.log) file for recent writes.\n * Log files contain records that haven't been compacted to SSTables yet.\n */\nasync function parseLogFile(filePath: string): Promise<LevelDBEntry[]> {\n const entries: LevelDBEntry[] = [];\n\n let data: Buffer;\n try {\n data = await readFile(filePath);\n } catch {\n return entries;\n }\n\n const BLOCK_SIZE = 32768;\n let offset = 0;\n let pendingRecord: Buffer[] = [];\n\n while (offset < data.length) {\n // Records are within 32KB blocks\n const blockOffset = offset % BLOCK_SIZE;\n const remaining = BLOCK_SIZE - blockOffset;\n\n // Skip to next block if not enough space for header\n if (remaining < 7) {\n offset += remaining;\n continue;\n }\n\n // Read record header: [crc32: 4][length: 2][type: 1]\n if (offset + 7 > data.length) {\n break;\n }\n\n const length = data.readUInt16LE(offset + 4);\n const type = data[offset + 6]!;\n\n if (length === 0 || offset + 7 + length > data.length) {\n offset += remaining;\n pendingRecord = [];\n continue;\n }\n\n const recordData = data.subarray(offset + 7, offset + 7 + length);\n offset += 7 + length;\n\n if (type === LOG_RECORD_FULL) {\n pendingRecord = [];\n parseLogBatch(recordData, entries);\n } else if (type === LOG_RECORD_FIRST) {\n pendingRecord = [recordData];\n } else if (type === LOG_RECORD_MIDDLE) {\n if (pendingRecord.length > 0) {\n pendingRecord.push(recordData);\n }\n } else if (type === LOG_RECORD_LAST) {\n if (pendingRecord.length > 0) {\n pendingRecord.push(recordData);\n const fullRecord = Buffer.concat(pendingRecord);\n parseLogBatch(fullRecord, entries);\n }\n pendingRecord = [];\n }\n }\n\n return entries;\n}\n\n/**\n * Parse a write batch from a log record.\n * Batch format: [sequence: 8][count: 4][records...]\n * Record format: [type: 1][key_len: varint][key][value_len: varint][value]\n */\nfunction parseLogBatch(batch: Buffer, entries: LevelDBEntry[]): void {\n if (batch.length < 12) {\n return;\n }\n\n // Skip sequence (8 bytes) and count (4 bytes)\n let offset = 12;\n\n while (offset < batch.length) {\n try {\n const recordType = batch[offset]!;\n offset++;\n\n if (recordType === 1) {\n // Value record\n const [keyLen, n1] = readVarint(batch, offset);\n offset += n1;\n const key = batch.subarray(offset, offset + keyLen);\n offset += keyLen;\n const [valueLen, n2] = readVarint(batch, offset);\n offset += n2;\n const value = batch.subarray(offset, offset + valueLen);\n offset += valueLen;\n\n entries.push({ key: Buffer.from(key), value: Buffer.from(value) });\n } else if (recordType === 0) {\n // Deletion record - skip\n const [keyLen, n1] = readVarint(batch, offset);\n offset += n1 + keyLen;\n } else {\n // Unknown record type\n break;\n }\n } catch {\n break;\n }\n }\n}\n\n/**\n * Read all key-value pairs from a Chromium LevelDB directory.\n * Scans both SSTable (.ldb) files and log (.log) files.\n */\nexport async function readChromiumLevelDB(dir: string): Promise<LevelDBEntry[]> {\n const entries: LevelDBEntry[] = [];\n\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n return entries;\n }\n\n // Parse all .ldb and .sst files\n const sstFiles = files.filter((f) => f.endsWith(\".ldb\") || f.endsWith(\".sst\"));\n for (const file of sstFiles) {\n const fileEntries = await parseSSTable(join(dir, file));\n entries.push(...fileEntries);\n }\n\n // Parse all .log files\n const logFiles = files.filter((f) => f.endsWith(\".log\"));\n for (const file of logFiles) {\n const fileEntries = await parseLogFile(join(dir, file));\n entries.push(...fileEntries);\n }\n\n return entries;\n}\n\n/**\n * Find all entries containing a substring in their key.\n */\nexport async function findKeysContaining(dir: string, substring: Buffer): Promise<LevelDBEntry[]> {\n const allEntries = await readChromiumLevelDB(dir);\n return allEntries.filter((entry) => entry.key.includes(substring));\n}\n",
|
|
12
|
-
"import { copyFile, mkdtemp, readdir, readFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\n\ntype SqliteRow = Record<string, unknown>;\n\ntype FirefoxTeam = { url: string; name?: string; token: string };\n\ntype ProfileCandidate = {\n name?: string;\n path: string;\n isDefault: boolean;\n};\n\nexport type FirefoxExtracted = {\n cookie_d: string;\n teams: FirefoxTeam[];\n source: { profile_path: string; cookies_path: string; localstorage_path: string };\n};\n\nconst PLATFORM = platform();\nconst IS_MACOS = PLATFORM === \"darwin\";\nconst IS_LINUX = PLATFORM === \"linux\";\n\nfunction isMissingBunSqliteModule(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n const err = error as { code?: unknown; message?: unknown };\n const code = typeof err.code === \"string\" ? err.code : \"\";\n const message = typeof err.message === \"string\" ? err.message : \"\";\n\n if (code === \"ERR_MODULE_NOT_FOUND\" || code === \"ERR_UNSUPPORTED_ESM_URL_SCHEME\") {\n return true;\n }\n if (!message.includes(\"bun:sqlite\")) {\n return false;\n }\n return (\n message.includes(\"Cannot find module\") ||\n message.includes(\"Unknown builtin module\") ||\n message.includes(\"unsupported URL scheme\") ||\n message.includes(\"Only URLs with a scheme in\")\n );\n}\n\nasync function queryReadonlySqlite(dbPath: string, sql: string): Promise<SqliteRow[]> {\n try {\n const { Database } = await import(\"bun:sqlite\");\n const db = new Database(dbPath, { readonly: true });\n try {\n return db.query(sql).all() as SqliteRow[];\n } finally {\n db.close();\n }\n } catch (error) {\n if (!isMissingBunSqliteModule(error)) {\n throw error;\n }\n const { DatabaseSync } = await import(\"node:sqlite\");\n const db = new DatabaseSync(dbPath, { readOnly: true });\n try {\n return db.prepare(sql).all() as SqliteRow[];\n } finally {\n db.close();\n }\n }\n}\n\nfunction getFirefoxBaseDir(): string {\n if (IS_LINUX) {\n return join(homedir(), \".mozilla\", \"firefox\");\n }\n if (IS_MACOS) {\n return join(homedir(), \"Library\", \"Application Support\", \"Firefox\");\n }\n throw new Error(`Firefox extraction is not supported on ${PLATFORM}.`);\n}\n\nfunction parseProfilesIni(raw: string, baseDir: string): ProfileCandidate[] {\n const lines = raw.split(/\\r?\\n/);\n const profiles: {\n name?: string;\n path?: string;\n isRelative: boolean;\n isDefault: boolean;\n }[] = [];\n // Firefox can mark defaults either in [Profile*] (Default=1) or [Install*] sections.\n const installDefaults = new Set<string>();\n\n let section = \"\";\n let current: { name?: string; path?: string; isRelative: boolean; isDefault: boolean } | null =\n null;\n\n for (const lineRaw of lines) {\n const line = lineRaw.trim();\n if (!line || line.startsWith(\";\") || line.startsWith(\"#\")) {\n continue;\n }\n if (line.startsWith(\"[\") && line.endsWith(\"]\")) {\n if (current) {\n profiles.push(current);\n current = null;\n }\n section = line.slice(1, -1);\n if (section.startsWith(\"Profile\")) {\n current = { isRelative: true, isDefault: false };\n }\n continue;\n }\n\n const idx = line.indexOf(\"=\");\n if (idx === -1) {\n continue;\n }\n const key = line.slice(0, idx).trim();\n const value = line.slice(idx + 1).trim();\n\n if (section.startsWith(\"Profile\") && current) {\n if (key === \"Name\") {\n current.name = value;\n } else if (key === \"Path\") {\n current.path = value;\n } else if (key === \"IsRelative\") {\n current.isRelative = value !== \"0\";\n } else if (key === \"Default\") {\n current.isDefault = value === \"1\";\n }\n continue;\n }\n\n if (section.startsWith(\"Install\") && key === \"Default\" && value) {\n installDefaults.add(value);\n }\n }\n\n if (current) {\n profiles.push(current);\n }\n\n return profiles\n .filter((p) => Boolean(p.path))\n .map((p) => {\n const profilePath = p.isRelative ? join(baseDir, p.path!) : p.path!;\n return {\n name: p.name,\n path: profilePath,\n isDefault: p.isDefault || installDefaults.has(p.path!),\n };\n });\n}\n\nasync function listProfileCandidates(): Promise<ProfileCandidate[]> {\n const baseDir = getFirefoxBaseDir();\n const iniPath = join(baseDir, \"profiles.ini\");\n const candidates: ProfileCandidate[] = [];\n\n if (existsSync(iniPath)) {\n const raw = await readFile(iniPath, \"utf8\");\n candidates.push(...parseProfilesIni(raw, baseDir));\n }\n\n // profiles.ini can be stale, so also scan profile directories as a fallback source.\n const dirName = IS_MACOS ? \"Profiles\" : baseDir;\n if (existsSync(dirName)) {\n const entries = await readdir(dirName, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const profilePath = join(dirName, entry.name);\n if (!candidates.some((c) => c.path === profilePath)) {\n candidates.push({ path: profilePath, isDefault: false });\n }\n }\n }\n\n const existing = candidates.filter((c) => existsSync(c.path));\n existing.sort((a, b) => Number(b.isDefault) - Number(a.isDefault));\n return existing;\n}\n\nfunction pickCandidatesByProfile(\n candidates: ProfileCandidate[],\n profile?: string,\n): ProfileCandidate[] {\n const selector = profile?.trim();\n if (!selector) {\n return candidates;\n }\n const normalized = selector.toLowerCase();\n const matched = candidates.filter((c) => {\n const name = c.name?.toLowerCase() ?? \"\";\n const base = c.path.split(\"/\").pop()?.toLowerCase() ?? \"\";\n const full = c.path.toLowerCase();\n return name === normalized || base === normalized || full.includes(normalized);\n });\n return matched;\n}\n\nasync function copySqliteForRead(\n dbPath: string,\n): Promise<{ copyPath: string; cleanup: () => Promise<void> }> {\n const tmpPath = await mkdtemp(join(tmpdir(), \"agent-slack-firefox-\"));\n const base = dbPath.split(\"/\").pop() || \"db.sqlite\";\n const copyPath = join(tmpPath, base);\n await copyFile(dbPath, copyPath);\n\n // Firefox keeps recent commits in WAL/SHM while running; copy them with the DB snapshot.\n for (const suffix of [\"-wal\", \"-shm\"]) {\n const sidecar = `${dbPath}${suffix}`;\n if (!existsSync(sidecar)) {\n continue;\n }\n try {\n await copyFile(sidecar, `${copyPath}${suffix}`);\n } catch {}\n }\n\n return {\n copyPath,\n cleanup: async () => {\n try {\n await rm(tmpPath, { recursive: true, force: true });\n } catch {}\n },\n };\n}\n\nfunction toStringValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value instanceof Uint8Array) {\n // localStorage blobs may include codec marker bytes and mixed UTF-8/UTF-16 payloads.\n const buf = Buffer.from(value);\n const strings: string[] = [];\n strings.push(buf.toString(\"utf8\"));\n strings.push(buf.toString(\"utf16le\"));\n const first = buf[0];\n if (first === 0x00 || first === 0x01 || first === 0x02) {\n const sliced = buf.subarray(1);\n strings.push(sliced.toString(\"utf8\"));\n strings.push(sliced.toString(\"utf16le\"));\n }\n return strings.sort((a, b) => b.length - a.length)[0] ?? \"\";\n }\n return String(value ?? \"\");\n}\n\nfunction parseJsonObjectFromValue(value: unknown): Record<string, unknown> | null {\n const raw = toStringValue(value);\n if (!raw) {\n return null;\n }\n\n const tryDecode = (text: string): Record<string, unknown> | null => {\n try {\n const parsed = JSON.parse(text) as unknown;\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n } catch {}\n return null;\n };\n\n const direct = tryDecode(raw);\n if (direct) {\n return direct;\n }\n\n // Control characters sometimes appear around serialized JSON in Firefox storage blobs.\n const stripped = raw.replace(/[\\u0000-\\u001F]/g, \"\");\n const strippedDirect = tryDecode(stripped);\n if (strippedDirect) {\n return strippedDirect;\n }\n\n const start = raw.indexOf(\"{\");\n const end = raw.lastIndexOf(\"}\");\n if (start === -1 || end === -1 || end <= start) {\n return null;\n }\n const sliced = raw.slice(start, end + 1);\n const slicedDirect = tryDecode(sliced);\n if (slicedDirect) {\n return slicedDirect;\n }\n return tryDecode(sliced.replace(/[\\u0000-\\u001F]/g, \"\"));\n}\n\nfunction toFirefoxTeam(value: unknown): FirefoxTeam | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n const record = value as Record<string, unknown>;\n const url = typeof record.url === \"string\" ? record.url : null;\n const token = typeof record.token === \"string\" ? record.token : null;\n if (!url || !token || !token.startsWith(\"xoxc-\")) {\n return null;\n }\n const name = typeof record.name === \"string\" ? record.name : undefined;\n return { url, name, token };\n}\n\nfunction extractTeamsFromRawText(raw: string): FirefoxTeam[] {\n const teams: FirefoxTeam[] = [];\n const seen = new Set<string>();\n\n // Fallback for partially damaged JSON: recover token/url/name triplets from raw text.\n const richPattern =\n /\"name\":\"([^\"]+)\".*?\"url\":\"(https:\\/\\/[^\"\\s]+slack\\.com\\/)\".*?\"token\":\"(xoxc-[^\"]+)\"/gs;\n for (const match of raw.matchAll(richPattern)) {\n const name = match[1];\n const url = match[2];\n const token = match[3];\n if (!name || !url || !token) {\n continue;\n }\n const key = `${url}::${token}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n teams.push({ name, url, token });\n }\n\n if (teams.length > 0) {\n return teams;\n }\n\n const urls = Array.from(raw.matchAll(/\"url\":\"(https:\\/\\/[^\"\\s]+slack\\.com\\/)\"/g)).map(\n (m) => m[1]!,\n );\n const tokens = Array.from(raw.matchAll(/\"token\":\"(xoxc-[^\"]+)\"/g)).map((m) => m[1]!);\n const count = Math.min(urls.length, tokens.length);\n for (let i = 0; i < count; i++) {\n const url = urls[i];\n const token = tokens[i];\n if (!url || !token) {\n continue;\n }\n const key = `${url}::${token}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n teams.push({ url, token });\n }\n\n return teams;\n}\n\nfunction getLocalStorageDirs(profilePath: string): string[] {\n const roots = [join(profilePath, \"storage\", \"default\")];\n const candidates: string[] = [];\n for (const root of roots) {\n if (!existsSync(root)) {\n continue;\n }\n candidates.push(join(root, \"https+++app.slack.com\", \"ls\"));\n }\n return candidates;\n}\n\nasync function extractTeamsFromProfile(\n profilePath: string,\n): Promise<{ teams: FirefoxTeam[]; sourcePath: string } | null> {\n const lsDirs = getLocalStorageDirs(profilePath);\n for (const lsDir of lsDirs) {\n const dbPath = join(lsDir, \"data.sqlite\");\n if (!existsSync(dbPath)) {\n continue;\n }\n\n const copied = await copySqliteForRead(dbPath);\n try {\n const rows = (await queryReadonlySqlite(\n copied.copyPath,\n \"select key, value from data where key in ('localConfig_v2', 'localConfig_v3') order by key desc\",\n )) as { key: string; value: unknown }[];\n\n for (const row of rows) {\n const cfg = parseJsonObjectFromValue(row.value);\n const teamsRaw =\n cfg && typeof cfg.teams === \"object\" && cfg.teams !== null ? cfg.teams : {};\n const parsedTeams = Object.values(teamsRaw)\n .map((t) => toFirefoxTeam(t))\n .filter((t): t is FirefoxTeam => t !== null);\n if (parsedTeams.length > 0) {\n return { teams: parsedTeams, sourcePath: dbPath };\n }\n\n const rawTeams = extractTeamsFromRawText(toStringValue(row.value));\n if (rawTeams.length > 0) {\n return { teams: rawTeams, sourcePath: dbPath };\n }\n }\n } finally {\n await copied.cleanup();\n }\n }\n return null;\n}\n\nasync function extractCookieDFromProfile(\n profilePath: string,\n): Promise<{ cookie_d: string; sourcePath: string } | null> {\n const dbPath = join(profilePath, \"cookies.sqlite\");\n if (!existsSync(dbPath)) {\n return null;\n }\n\n const copied = await copySqliteForRead(dbPath);\n try {\n const rows = (await queryReadonlySqlite(\n copied.copyPath,\n \"select value from moz_cookies where host like '%slack.com%' and name='d' order by length(value) desc\",\n )) as { value: string }[];\n\n for (const row of rows) {\n if (row.value?.startsWith(\"xoxd-\")) {\n return { cookie_d: decodeFirefoxCookieValue(row.value), sourcePath: dbPath };\n }\n }\n } finally {\n await copied.cleanup();\n }\n\n return null;\n}\n\nfunction decodeFirefoxCookieValue(cookie: string): string {\n let current = cookie;\n // Firefox can persist cookie values in percent-encoded form; normalize before storage.\n for (let i = 0; i < 3; i += 1) {\n try {\n const next = decodeURIComponent(current);\n if (next === current) {\n break;\n }\n current = next;\n } catch {\n break;\n }\n }\n return current;\n}\n\nexport async function extractFromFirefox(input?: {\n profile?: string;\n}): Promise<FirefoxExtracted | null> {\n // Profile selection flow (in order):\n // 1) Build candidates from profiles.ini and directory scan, with defaults first.\n // 2) Apply optional user selector (exact profile name, exact dir basename, or path substring).\n // 3) Walk candidates in that order and require BOTH artifacts from the same profile:\n // - teams/tokens from local storage\n // - xoxd cookie from cookies.sqlite\n // 4) Return the first profile that has both; otherwise return null.\n // This keeps behavior deterministic while preferring the active/default profile when possible,\n // but still allows fallback to another profile that has a complete Slack auth state.\n const allCandidates = await listProfileCandidates();\n const candidates = pickCandidatesByProfile(allCandidates, input?.profile);\n if (candidates.length === 0) {\n return null;\n }\n\n for (const candidate of candidates) {\n const teamsResult = await extractTeamsFromProfile(candidate.path);\n if (!teamsResult) {\n continue;\n }\n const cookieResult = await extractCookieDFromProfile(candidate.path);\n if (!cookieResult) {\n continue;\n }\n return {\n cookie_d: cookieResult.cookie_d,\n teams: teamsResult.teams,\n source: {\n profile_path: candidate.path,\n cookies_path: cookieResult.sourcePath,\n localstorage_path: teamsResult.sourcePath,\n },\n };\n }\n\n return null;\n}\n",
|
|
13
|
+
"import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport {\n copySqliteForRead,\n listProfileCandidates,\n pickCandidatesByProfile,\n queryReadonlySqlite,\n} from \"./firefox-profile.ts\";\n\ntype FirefoxTeam = { url: string; name?: string; token: string };\n\nexport type FirefoxExtracted = {\n cookie_d: string;\n teams: FirefoxTeam[];\n source: { profile_path: string; cookies_path: string; localstorage_path: string };\n};\n\n// eslint-disable-next-line no-control-regex\nconst CONTROL_CHAR_RE = /[\\u0000-\\u001F]/g;\n\nfunction toStringValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value instanceof Uint8Array) {\n // localStorage blobs may include codec marker bytes and mixed UTF-8/UTF-16 payloads.\n const buf = Buffer.from(value);\n const strings: string[] = [];\n strings.push(buf.toString(\"utf8\"));\n strings.push(buf.toString(\"utf16le\"));\n const [first] = buf;\n if (first === 0x00 || first === 0x01 || first === 0x02) {\n const sliced = buf.subarray(1);\n strings.push(sliced.toString(\"utf8\"));\n strings.push(sliced.toString(\"utf16le\"));\n }\n return strings.sort((a, b) => b.length - a.length)[0] ?? \"\";\n }\n return String(value ?? \"\");\n}\n\nfunction parseJsonObjectFromValue(value: unknown): Record<string, unknown> | null {\n const raw = toStringValue(value);\n if (!raw) {\n return null;\n }\n\n const tryDecode = (text: string): Record<string, unknown> | null => {\n try {\n const parsed = JSON.parse(text) as unknown;\n if (typeof parsed === \"object\" && parsed !== null) {\n return parsed as Record<string, unknown>;\n }\n } catch {}\n return null;\n };\n\n const direct = tryDecode(raw);\n if (direct) {\n return direct;\n }\n\n // Control characters sometimes appear around serialized JSON in Firefox storage blobs.\n const stripped = raw.replace(CONTROL_CHAR_RE, \"\");\n const strippedDirect = tryDecode(stripped);\n if (strippedDirect) {\n return strippedDirect;\n }\n\n const start = raw.indexOf(\"{\");\n const end = raw.lastIndexOf(\"}\");\n if (start === -1 || end === -1 || end <= start) {\n return null;\n }\n const sliced = raw.slice(start, end + 1);\n const slicedDirect = tryDecode(sliced);\n if (slicedDirect) {\n return slicedDirect;\n }\n return tryDecode(sliced.replace(CONTROL_CHAR_RE, \"\"));\n}\n\nfunction toFirefoxTeam(value: unknown): FirefoxTeam | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n const record = value as Record<string, unknown>;\n const url = typeof record.url === \"string\" ? record.url : null;\n const token = typeof record.token === \"string\" ? record.token : null;\n if (!url || !token || !token.startsWith(\"xoxc-\")) {\n return null;\n }\n const name = typeof record.name === \"string\" ? record.name : undefined;\n return { url, name, token };\n}\n\nfunction extractTeamsFromRawText(raw: string): FirefoxTeam[] {\n const teams: FirefoxTeam[] = [];\n const seen = new Set<string>();\n\n // Fallback for partially damaged JSON: recover token/url/name triplets from raw text.\n const richPattern =\n /\"name\":\"([^\"]+)\".*?\"url\":\"(https:\\/\\/[^\"\\s]+slack\\.com\\/)\".*?\"token\":\"(xoxc-[^\"]+)\"/gs;\n for (const match of raw.matchAll(richPattern)) {\n const [, name, url, token] = match;\n if (!name || !url || !token) {\n continue;\n }\n const key = `${url}::${token}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n teams.push({ name, url, token });\n }\n\n if (teams.length > 0) {\n return teams;\n }\n\n const urls = Array.from(raw.matchAll(/\"url\":\"(https:\\/\\/[^\"\\s]+slack\\.com\\/)\"/g)).map(\n (m) => m[1]!,\n );\n const tokens = Array.from(raw.matchAll(/\"token\":\"(xoxc-[^\"]+)\"/g)).map((m) => m[1]!);\n const count = Math.min(urls.length, tokens.length);\n for (let i = 0; i < count; i++) {\n const url = urls[i];\n const token = tokens[i];\n if (!url || !token) {\n continue;\n }\n const key = `${url}::${token}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n teams.push({ url, token });\n }\n\n return teams;\n}\n\nfunction getLocalStorageDirs(profilePath: string): string[] {\n const roots = [join(profilePath, \"storage\", \"default\")];\n const candidates: string[] = [];\n for (const root of roots) {\n if (!existsSync(root)) {\n continue;\n }\n candidates.push(join(root, \"https+++app.slack.com\", \"ls\"));\n }\n return candidates;\n}\n\nasync function extractTeamsFromProfile(\n profilePath: string,\n): Promise<{ teams: FirefoxTeam[]; sourcePath: string } | null> {\n const lsDirs = getLocalStorageDirs(profilePath);\n for (const lsDir of lsDirs) {\n const dbPath = join(lsDir, \"data.sqlite\");\n if (!existsSync(dbPath)) {\n continue;\n }\n\n const copied = await copySqliteForRead(dbPath);\n try {\n const rows = (await queryReadonlySqlite(\n copied.copyPath,\n \"select key, value from data where key in ('localConfig_v2', 'localConfig_v3') order by key desc\",\n )) as { key: string; value: unknown }[];\n\n for (const row of rows) {\n const cfg = parseJsonObjectFromValue(row.value);\n const teamsRaw =\n cfg && typeof cfg.teams === \"object\" && cfg.teams !== null ? cfg.teams : {};\n const parsedTeams = Object.values(teamsRaw)\n .map((t) => toFirefoxTeam(t))\n .filter((t): t is FirefoxTeam => t !== null);\n if (parsedTeams.length > 0) {\n return { teams: parsedTeams, sourcePath: dbPath };\n }\n\n const rawTeams = extractTeamsFromRawText(toStringValue(row.value));\n if (rawTeams.length > 0) {\n return { teams: rawTeams, sourcePath: dbPath };\n }\n }\n } finally {\n await copied.cleanup();\n }\n }\n return null;\n}\n\nasync function extractCookieDFromProfile(\n profilePath: string,\n): Promise<{ cookie_d: string; sourcePath: string } | null> {\n const dbPath = join(profilePath, \"cookies.sqlite\");\n if (!existsSync(dbPath)) {\n return null;\n }\n\n const copied = await copySqliteForRead(dbPath);\n try {\n const rows = (await queryReadonlySqlite(\n copied.copyPath,\n \"select value from moz_cookies where host like '%slack.com%' and name='d' order by length(value) desc\",\n )) as { value: string }[];\n\n for (const row of rows) {\n if (row.value?.startsWith(\"xoxd-\")) {\n return { cookie_d: decodeFirefoxCookieValue(row.value), sourcePath: dbPath };\n }\n }\n } finally {\n await copied.cleanup();\n }\n\n return null;\n}\n\nfunction decodeFirefoxCookieValue(cookie: string): string {\n let current = cookie;\n // Firefox can persist cookie values in percent-encoded form; normalize before storage.\n for (let i = 0; i < 3; i += 1) {\n try {\n const next = decodeURIComponent(current);\n if (next === current) {\n break;\n }\n current = next;\n } catch {\n break;\n }\n }\n return current;\n}\n\nexport async function extractFromFirefox(input?: {\n profile?: string;\n}): Promise<FirefoxExtracted | null> {\n // Profile selection flow (in order):\n // 1) Build candidates from profiles.ini and directory scan, with defaults first.\n // 2) Apply optional user selector (exact profile name, exact dir basename, or path substring).\n // 3) Walk candidates in that order and require BOTH artifacts from the same profile:\n // - teams/tokens from local storage\n // - xoxd cookie from cookies.sqlite\n // 4) Return the first profile that has both; otherwise return null.\n // This keeps behavior deterministic while preferring the active/default profile when possible,\n // but still allows fallback to another profile that has a complete Slack auth state.\n const allCandidates = await listProfileCandidates();\n const candidates = pickCandidatesByProfile(allCandidates, input?.profile);\n if (candidates.length === 0) {\n return null;\n }\n\n for (const candidate of candidates) {\n const teamsResult = await extractTeamsFromProfile(candidate.path);\n if (!teamsResult) {\n continue;\n }\n const cookieResult = await extractCookieDFromProfile(candidate.path);\n if (!cookieResult) {\n continue;\n }\n return {\n cookie_d: cookieResult.cookie_d,\n teams: teamsResult.teams,\n source: {\n profile_path: candidate.path,\n cookies_path: cookieResult.sourcePath,\n localstorage_path: teamsResult.sourcePath,\n },\n };\n }\n\n return null;\n}\n",
|
|
13
14
|
"import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const AGENT_SLACK_DIR = join(homedir(), \".config\", \"agent-slack\");\nexport const CREDENTIALS_FILE = join(AGENT_SLACK_DIR, \"credentials.json\");\nexport const KEYCHAIN_SERVICE = \"agent-slack\";\n",
|
|
14
15
|
"import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nexport async function readJsonFile<T>(path: string): Promise<T | null> {\n try {\n const raw = await readFile(path, \"utf8\");\n return JSON.parse(raw) as T;\n } catch (err: unknown) {\n if (isRecord(err) && err.code === \"ENOENT\") {\n return null;\n }\n // Corrupted JSON should not brick the CLI; treat as missing.\n if (err instanceof SyntaxError) {\n return null;\n }\n throw err;\n }\n}\n\nexport async function writeJsonFile(path: string, data: unknown): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(data, null, 2)}\\n`, { mode: 0o600 });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n",
|
|
15
16
|
"import { z } from \"zod\";\n\nexport const WorkspaceAuthSchema = z.union([\n z.object({\n auth_type: z.literal(\"standard\"),\n token: z.string().min(1),\n }),\n z.object({\n auth_type: z.literal(\"browser\"),\n xoxc_token: z.string().min(1),\n xoxd_cookie: z.string().min(1),\n }),\n]);\n\nexport type WorkspaceAuth = z.infer<typeof WorkspaceAuthSchema>;\n\nexport const WorkspaceSchema = z.object({\n workspace_url: z.string().url(),\n workspace_name: z.string().optional(),\n team_id: z.string().optional(),\n team_domain: z.string().optional(),\n auth: WorkspaceAuthSchema,\n});\n\nexport type Workspace = z.infer<typeof WorkspaceSchema>;\n\nexport const CredentialsSchema = z.object({\n version: z.literal(1),\n updated_at: z.string().optional(),\n default_workspace_url: z.string().url().optional(),\n workspaces: z.array(WorkspaceSchema).default([]),\n});\n\nexport type Credentials = z.infer<typeof CredentialsSchema>;\n",
|
|
16
17
|
"import { platform } from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\n\nconst IS_MACOS = platform() === \"darwin\";\n\nexport function keychainGet(account: string, service: string): string | null {\n if (!IS_MACOS) {\n return null;\n }\n try {\n const result = execFileSync(\n \"security\",\n [\"find-generic-password\", \"-s\", service, \"-a\", account, \"-w\"],\n { encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"ignore\"] },\n );\n return result.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport function keychainSet(input: { account: string; value: string; service: string }): boolean {\n if (!IS_MACOS) {\n return false;\n }\n const { account, value, service } = input;\n try {\n try {\n execFileSync(\"security\", [\"delete-generic-password\", \"-s\", service, \"-a\", account], {\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n } catch {\n // ignore\n }\n execFileSync(\"security\", [\"add-generic-password\", \"-s\", service, \"-a\", account, \"-w\", value], {\n stdio: \"pipe\",\n });\n return true;\n } catch {\n return false;\n }\n}\n",
|
|
17
18
|
"import { CREDENTIALS_FILE, KEYCHAIN_SERVICE } from \"./paths.ts\";\nimport { readJsonFile, writeJsonFile } from \"../lib/fs.ts\";\nimport { CredentialsSchema, type Credentials, type Workspace } from \"./schema.ts\";\nimport { keychainGet, keychainSet } from \"./keychain.ts\";\nimport { platform } from \"node:os\";\n\nconst KEYCHAIN_PLACEHOLDER = \"__KEYCHAIN__\";\nconst IS_MACOS = platform() === \"darwin\";\n\nfunction normalizeWorkspaceUrl(workspaceUrl: string): string {\n const u = new URL(workspaceUrl);\n return `${u.protocol}//${u.host}`;\n}\n\nfunction isPlaceholderSecret(value: string | undefined): boolean {\n return !value || value === KEYCHAIN_PLACEHOLDER;\n}\n\nexport async function loadCredentials(): Promise<Credentials> {\n const fromFile = await readJsonFile<unknown>(CREDENTIALS_FILE);\n const parsed = CredentialsSchema.safeParse(fromFile ?? { version: 1, workspaces: [] });\n if (!parsed.success) {\n return { version: 1, workspaces: [] };\n }\n\n // Optional: hydrate browser cookie/token from keychain for security.\n const creds = parsed.data;\n const hydrated = creds.workspaces.map((w) => {\n if (w.auth.auth_type === \"browser\") {\n const account = `xoxc:${normalizeWorkspaceUrl(w.workspace_url)}`;\n const xoxc = keychainGet(account, KEYCHAIN_SERVICE);\n const xoxd = keychainGet(\"xoxd\", KEYCHAIN_SERVICE);\n return {\n ...w,\n auth: {\n auth_type: \"browser\" as const,\n xoxc_token: xoxc ?? w.auth.xoxc_token,\n xoxd_cookie: xoxd ?? w.auth.xoxd_cookie,\n },\n };\n }\n if (w.auth.auth_type === \"standard\") {\n const account = `token:${normalizeWorkspaceUrl(w.workspace_url)}`;\n const token = keychainGet(account, KEYCHAIN_SERVICE);\n return {\n ...w,\n auth: {\n auth_type: \"standard\" as const,\n token: token ?? w.auth.token,\n },\n };\n }\n return w;\n });\n\n return { ...creds, workspaces: hydrated };\n}\n\nexport async function saveCredentials(credentials: Credentials): Promise<void> {\n const payload: Credentials = {\n ...credentials,\n updated_at: new Date().toISOString(),\n workspaces: credentials.workspaces.map((w) => ({\n ...w,\n workspace_url: normalizeWorkspaceUrl(w.workspace_url),\n })),\n };\n\n // Store secrets in keychain when possible and avoid writing plaintext tokens to disk.\n // If keychain writes fail (or non-macOS), fall back to storing secrets in the file.\n const filePayload: Credentials = structuredClone(payload);\n\n if (IS_MACOS) {\n // Browser auth: xoxd is shared across workspaces, xoxc is per-workspace.\n const firstBrowser = payload.workspaces.find((w) => w.auth.auth_type === \"browser\");\n let xoxdStored = false;\n if (\n firstBrowser?.auth.auth_type === \"browser\" &&\n !isPlaceholderSecret(firstBrowser.auth.xoxd_cookie)\n ) {\n const existing = keychainGet(\"xoxd\", KEYCHAIN_SERVICE);\n xoxdStored =\n existing === firstBrowser.auth.xoxd_cookie ||\n keychainSet({\n account: \"xoxd\",\n value: firstBrowser.auth.xoxd_cookie,\n service: KEYCHAIN_SERVICE,\n });\n }\n\n for (const w of filePayload.workspaces) {\n if (w.auth.auth_type === \"browser\") {\n const account = `xoxc:${normalizeWorkspaceUrl(w.workspace_url)}`;\n const tokenStored =\n isPlaceholderSecret(w.auth.xoxc_token) ||\n keychainGet(account, KEYCHAIN_SERVICE) === w.auth.xoxc_token ||\n keychainSet({ account, value: w.auth.xoxc_token, service: KEYCHAIN_SERVICE });\n\n if (tokenStored) {\n w.auth.xoxc_token = KEYCHAIN_PLACEHOLDER;\n }\n if (xoxdStored) {\n w.auth.xoxd_cookie = KEYCHAIN_PLACEHOLDER;\n }\n }\n\n if (w.auth.auth_type === \"standard\") {\n const account = `token:${normalizeWorkspaceUrl(w.workspace_url)}`;\n const tokenStored =\n isPlaceholderSecret(w.auth.token) ||\n keychainGet(account, KEYCHAIN_SERVICE) === w.auth.token ||\n keychainSet({ account, value: w.auth.token, service: KEYCHAIN_SERVICE });\n if (tokenStored) {\n w.auth.token = KEYCHAIN_PLACEHOLDER;\n }\n }\n }\n }\n\n await writeJsonFile(CREDENTIALS_FILE, filePayload);\n}\n\nexport async function upsertWorkspace(workspace: Workspace): Promise<Workspace> {\n const creds = await loadCredentials();\n const normalizedUrl = normalizeWorkspaceUrl(workspace.workspace_url);\n const next: Workspace = { ...workspace, workspace_url: normalizedUrl };\n\n const idx = creds.workspaces.findIndex(\n (w) => normalizeWorkspaceUrl(w.workspace_url) === normalizedUrl,\n );\n if (idx === -1) {\n creds.workspaces.push(next);\n } else {\n creds.workspaces[idx] = {\n ...creds.workspaces[idx],\n ...next,\n auth: next.auth,\n };\n }\n\n if (!creds.default_workspace_url) {\n creds.default_workspace_url = normalizedUrl;\n }\n await saveCredentials(creds);\n return next;\n}\n\nexport async function upsertWorkspaces(workspaces: Workspace[]): Promise<void> {\n if (workspaces.length === 0) {\n return;\n }\n const creds = await loadCredentials();\n\n for (const workspace of workspaces) {\n const normalizedUrl = normalizeWorkspaceUrl(workspace.workspace_url);\n const next: Workspace = { ...workspace, workspace_url: normalizedUrl };\n\n const idx = creds.workspaces.findIndex(\n (w) => normalizeWorkspaceUrl(w.workspace_url) === normalizedUrl,\n );\n if (idx === -1) {\n creds.workspaces.push(next);\n } else {\n creds.workspaces[idx] = {\n ...creds.workspaces[idx],\n ...next,\n auth: next.auth,\n };\n }\n\n if (!creds.default_workspace_url) {\n creds.default_workspace_url = normalizedUrl;\n }\n }\n\n await saveCredentials(creds);\n}\n\nexport async function setDefaultWorkspace(workspaceUrl: string): Promise<void> {\n const creds = await loadCredentials();\n creds.default_workspace_url = normalizeWorkspaceUrl(workspaceUrl);\n await saveCredentials(creds);\n}\n\nexport async function removeWorkspace(workspaceUrl: string): Promise<void> {\n const creds = await loadCredentials();\n const normalized = normalizeWorkspaceUrl(workspaceUrl);\n creds.workspaces = creds.workspaces.filter(\n (w) => normalizeWorkspaceUrl(w.workspace_url) !== normalized,\n );\n if (creds.default_workspace_url === normalized) {\n creds.default_workspace_url = creds.workspaces[0]?.workspace_url;\n }\n await saveCredentials(creds);\n}\n\nexport async function resolveWorkspaceForUrl(workspaceUrl: string): Promise<Workspace | null> {\n const creds = await loadCredentials();\n const normalized = normalizeWorkspaceUrl(workspaceUrl);\n return (\n creds.workspaces.find((w) => normalizeWorkspaceUrl(w.workspace_url) === normalized) ?? null\n );\n}\n\nexport async function resolveDefaultWorkspace(): Promise<Workspace | null> {\n const creds = await loadCredentials();\n if (creds.default_workspace_url) {\n const byDefault = creds.workspaces.find((w) => w.workspace_url === creds.default_workspace_url);\n if (byDefault) {\n return byDefault;\n }\n }\n return creds.workspaces[0] ?? null;\n}\n\n// (reserved for future non-secret per-workspace metadata)\n",
|
|
18
|
-
"import type { Workspace } from \"../auth/schema.ts\";\n\nexport type WorkspaceSelectorResult = {\n match: Workspace | null;\n ambiguous: Workspace[];\n};\n\nfunction normalizeUrl(u: string): string {\n const url = new URL(u);\n return `${url.protocol}//${url.host}`;\n}\n\nfunction normalizedWorkspaceCandidates(workspace: Workspace): string[] {\n let host = \"\";\n try {\n host = new URL(workspace.workspace_url).host.toLowerCase();\n } catch {\n host = \"\";\n }\n const hostWithoutSlackSuffix = host.replace(/\\.slack\\.com$/i, \"\");\n return [\n workspace.workspace_url.toLowerCase(),\n host,\n hostWithoutSlackSuffix,\n workspace.workspace_name?.toLowerCase() ?? \"\",\n workspace.team_domain?.toLowerCase() ?? \"\",\n ].filter(Boolean);\n}\n\nexport function resolveWorkspaceSelector(\n workspaces: Workspace[],\n selector: string,\n): WorkspaceSelectorResult {\n const raw = selector.trim();\n if (!raw) {\n return { match: null, ambiguous: [] };\n }\n\n try {\n const normalized = normalizeUrl(raw).toLowerCase();\n const exact = workspaces.find((w) => w.workspace_url.toLowerCase() === normalized);\n if (exact) {\n return { match: exact, ambiguous: [] };\n }\n } catch {\n // Not a URL selector; continue with fuzzy matching.\n }\n\n const needle = raw.toLowerCase();\n const matches = workspaces.filter((workspace) =>\n normalizedWorkspaceCandidates(workspace).some((candidate) => candidate.includes(needle)),\n );\n if (matches.length === 1) {\n return { match: matches[0]!, ambiguous: [] };\n }\n if (matches.length > 1) {\n return { match: null, ambiguous: matches };\n }\n return { match: null, ambiguous: [] };\n}\n",
|
|
19
19
|
"export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nexport function getString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function getNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n",
|
|
20
20
|
"import type { SlackApiClient } from \"./client.ts\";\nimport { asArray, getString, isRecord } from \"../lib/object-type-guards.ts\";\n\nconst DEFAULT_CONVERSATION_TYPES = \"public_channel,private_channel,im,mpim\";\n\nexport type ConversationsPage = {\n channels: Record<string, unknown>[];\n next_cursor?: string;\n};\n\nexport function isChannelId(input: string): boolean {\n return /^[CDG][A-Z0-9]{8,}$/.test(input);\n}\n\nexport function isUserId(input: string): boolean {\n return /^U[A-Z0-9]{8,}$/.test(input);\n}\n\n/**\n * Open (or reuse) a DM channel with a user via conversations.open.\n * Returns the DM channel ID.\n */\nexport async function openDmChannel(client: SlackApiClient, userId: string): Promise<string> {\n const resp = await client.api(\"conversations.open\", { users: userId });\n const channel = isRecord(resp) ? resp.channel : null;\n const channelId = isRecord(channel) ? getString(channel.id) : undefined;\n if (!channelId) {\n throw new Error(`Could not open DM channel for user: ${userId}`);\n }\n return channelId;\n}\n\nexport function normalizeChannelInput(input: string): {\n kind: \"id\" | \"name\";\n value: string;\n} {\n const trimmed = input.trim();\n if (trimmed.startsWith(\"#\")) {\n return { kind: \"name\", value: trimmed.slice(1) };\n }\n if (isChannelId(trimmed)) {\n return { kind: \"id\", value: trimmed };\n }\n return { kind: \"name\", value: trimmed };\n}\n\nexport async function resolveChannelId(client: SlackApiClient, input: string): Promise<string> {\n const normalized = normalizeChannelInput(input);\n if (normalized.kind === \"id\") {\n return normalized.value;\n }\n\n const name = normalized.value;\n if (!name) {\n throw new Error(\"Channel name is empty\");\n }\n\n // Slack has no name→ID lookup API. conversations.list paginates the entire\n // workspace (200 at a time), which is O(channels) API calls — 3+ minutes in\n // large workspaces. search.messages with `in:#name` resolves it in one call\n // by returning a message whose metadata includes the channel ID.\n try {\n const searchResp = await client.api(\"search.messages\", {\n query: `in:#${name}`,\n count: 1,\n sort: \"timestamp\",\n sort_dir: \"desc\",\n });\n const messages = isRecord(searchResp) ? searchResp.messages : null;\n const matches = isRecord(messages) ? asArray(messages.matches).filter(isRecord) : [];\n if (matches.length > 0) {\n const channel = isRecord(matches[0]!.channel) ? matches[0]!.channel : null;\n const channelId = channel ? getString(channel.id) : undefined;\n if (channelId) {\n return channelId;\n }\n }\n } catch {\n // search may fail (e.g. token lacks search:read scope) — fall through to pagination\n }\n\n // Fallback: paginate conversations.list until we find a match\n let cursor: string | undefined;\n for (;;) {\n const resp = await client.api(\"conversations.list\", {\n exclude_archived: true,\n limit: 200,\n cursor,\n types: \"public_channel,private_channel\",\n });\n const chans = asArray(resp.channels).filter(isRecord);\n for (const c of chans) {\n if (getString(c.name) === name && getString(c.id)) {\n return getString(c.id)!;\n }\n }\n\n const meta = isRecord(resp.response_metadata) ? resp.response_metadata : null;\n const next = meta ? getString(meta.next_cursor) : undefined;\n if (!next) {\n break;\n }\n cursor = next;\n }\n\n throw new Error(`Could not resolve channel name: #${name}`);\n}\n\n/**\n * Resolve a channel/DM ID to a human-readable name via conversations.info.\n * Returns the channel name (e.g. \"general\") or DM user's display name,\n * falling back to the raw ID on failure.\n */\nexport async function resolveChannelName(\n client: SlackApiClient,\n channelId: string,\n): Promise<string> {\n try {\n const resp = await client.api(\"conversations.info\", { channel: channelId });\n const channel = isRecord(resp) ? resp.channel : null;\n if (!isRecord(channel)) {\n return channelId;\n }\n\n // DM: resolve the other user's name\n if (channel.is_im) {\n const userId = getString(channel.user);\n if (userId) {\n try {\n const userResp = await client.api(\"users.info\", { user: userId });\n const user = isRecord(userResp) ? userResp.user : null;\n const profile = isRecord(user) ? user.profile : null;\n if (isRecord(profile)) {\n return getString(profile.display_name) || getString(profile.real_name) || channelId;\n }\n } catch {\n // fall through\n }\n }\n return channelId;\n }\n\n return getString(channel.name) || channelId;\n } catch {\n return channelId;\n }\n}\n\ntype ListConversationsOptions = {\n limit?: number;\n cursor?: string;\n types?: string;\n excludeArchived?: boolean;\n};\n\nexport async function listUserConversations(\n client: SlackApiClient,\n options?: ListConversationsOptions & { user?: string },\n): Promise<ConversationsPage> {\n const resp = await client.api(\"users.conversations\", {\n user: options?.user,\n limit: normalizeConversationsLimit(options?.limit),\n cursor: options?.cursor,\n types: options?.types ?? DEFAULT_CONVERSATION_TYPES,\n exclude_archived: options?.excludeArchived ?? true,\n });\n return normalizeConversationsPage(resp);\n}\n\nexport async function listAllConversations(\n client: SlackApiClient,\n options?: ListConversationsOptions,\n): Promise<ConversationsPage> {\n const resp = await client.api(\"conversations.list\", {\n limit: normalizeConversationsLimit(options?.limit),\n cursor: options?.cursor,\n types: options?.types ?? DEFAULT_CONVERSATION_TYPES,\n exclude_archived: options?.excludeArchived ?? true,\n });\n return normalizeConversationsPage(resp);\n}\n\nexport function normalizeConversationsPage(resp: Record<string, unknown>): ConversationsPage {\n const channels = asArray(resp.channels).filter(isRecord);\n const meta = isRecord(resp.response_metadata) ? resp.response_metadata : null;\n const next = meta ? getString(meta.next_cursor) : undefined;\n return { channels, next_cursor: next };\n}\n\nfunction normalizeConversationsLimit(value: number | undefined): number {\n return Math.min(Math.max(value ?? 100, 1), 1000);\n}\n",
|
|
21
|
-
"import
|
|
22
|
-
"import { extractFromBrave } from \"../auth/brave.ts\";\nimport { extractFromChrome } from \"../auth/chrome.ts\";\nimport { parseSlackCurlCommand } from \"../auth/curl.ts\";\nimport { extractFromSlackDesktop } from \"../auth/desktop.ts\";\nimport { extractFromFirefox } from \"../auth/firefox.ts\";\nimport {\n loadCredentials,\n resolveDefaultWorkspace,\n resolveWorkspaceForUrl,\n upsertWorkspace,\n upsertWorkspaces,\n} from \"../auth/store.ts\";\nimport { resolveWorkspaceSelector } from \"./workspace-selector.ts\";\nimport { normalizeChannelInput } from \"../slack/channels.ts\";\nimport { SlackApiClient, type SlackAuth } from \"../slack/client.ts\";\n\nexport type CliContext = {\n effectiveWorkspaceUrl: (flag?: string) => string | undefined;\n assertWorkspaceSpecifiedForChannelNames: (input: {\n workspaceUrl: string | undefined;\n channels: string[];\n }) => Promise<void>;\n withAutoRefresh: <T>(input: {\n workspaceUrl: string | undefined;\n work: () => Promise<T>;\n }) => Promise<T>;\n getClientForWorkspace: (workspaceUrl?: string) => Promise<{\n client: SlackApiClient;\n auth: SlackAuth;\n workspace_url?: string;\n }>;\n normalizeUrl: (u: string) => string;\n errorMessage: (err: unknown) => string;\n parseContentType: (value: unknown) => \"any\" | \"text\" | \"image\" | \"snippet\" | \"file\";\n parseCurl: (curl: string) => ReturnType<typeof parseSlackCurlCommand>;\n importDesktop: () => ReturnType<typeof extractFromSlackDesktop>;\n importChrome: () => ReturnType<typeof extractFromChrome>;\n importBrave: () => ReturnType<typeof extractFromBrave>;\n importFirefox: () => ReturnType<typeof extractFromFirefox>;\n};\n\nfunction isEnvAuthConfigured(): boolean {\n return Boolean(process.env.SLACK_TOKEN?.trim());\n}\n\nfunction effectiveWorkspaceUrl(flag?: string): string | undefined {\n return flag?.trim() || process.env.SLACK_WORKSPACE_URL?.trim() || undefined;\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction parseContentType(value: unknown): \"any\" | \"text\" | \"image\" | \"snippet\" | \"file\" {\n const raw = String(value ?? \"any\").toLowerCase();\n if (raw === \"text\" || raw === \"image\" || raw === \"snippet\" || raw === \"file\") {\n return raw;\n }\n return \"any\";\n}\n\nasync function assertWorkspaceSpecifiedForChannelNames(input: {\n workspaceUrl: string | undefined;\n channels: string[];\n}): Promise<void> {\n const hasName = input.channels.some((c) => normalizeChannelInput(c).kind === \"name\");\n if (!hasName) {\n return;\n }\n\n const creds = await loadCredentials();\n if ((creds.workspaces?.length ?? 0) <= 1) {\n return;\n }\n\n if (!input.workspaceUrl) {\n throw new Error(\n 'Ambiguous channel name across multiple workspaces. Pass --workspace \"<url-or-unique-substring>\" (or set SLACK_WORKSPACE_URL).',\n );\n }\n}\n\nfunction isAuthErrorMessage(message: string): boolean {\n return /(?:^|[^a-z])(invalid_auth|token_expired)(?:$|[^a-z])/i.test(message);\n}\n\nfunction normalizeUrl(u: string): string {\n const url = new URL(u);\n return `${url.protocol}//${url.host}`;\n}\n\nfunction tryNormalizeUrl(u: string): string | undefined {\n try {\n return normalizeUrl(u);\n } catch {\n return undefined;\n }\n}\n\nasync function refreshFromDesktopIfPossible(): Promise<boolean> {\n if (process.platform !== \"darwin\" && process.platform !== \"linux\") {\n return false;\n }\n try {\n const extracted = await extractFromSlackDesktop();\n await upsertWorkspaces(\n extracted.teams.map((team) => ({\n workspace_url: normalizeUrl(team.url),\n workspace_name: team.name,\n auth: {\n auth_type: \"browser\" as const,\n xoxc_token: team.token,\n xoxd_cookie: extracted.cookie_d,\n },\n })),\n );\n return true;\n } catch {\n return false;\n }\n}\n\nasync function withAutoRefresh<T>(input: {\n workspaceUrl: string | undefined;\n work: () => Promise<T>;\n}): Promise<T> {\n try {\n return await input.work();\n } catch (err: unknown) {\n const message = errorMessage(err);\n if (isEnvAuthConfigured()) {\n throw err;\n }\n if (!isAuthErrorMessage(message)) {\n throw err;\n }\n\n const refreshed = await refreshFromDesktopIfPossible();\n if (!refreshed) {\n throw err;\n }\n return await input.work();\n }\n}\n\nfunction pickAuthFromEnv(): SlackAuth | null {\n const token = process.env.SLACK_TOKEN?.trim();\n if (!token) {\n return null;\n }\n if (token.startsWith(\"xoxc-\")) {\n const cookie = (process.env.SLACK_COOKIE_D || process.env.SLACK_COOKIE || \"\").trim();\n if (!cookie) {\n throw new Error(\"SLACK_TOKEN looks like xoxc- but SLACK_COOKIE_D is missing\");\n }\n return { auth_type: \"browser\", xoxc_token: token, xoxd_cookie: cookie };\n }\n return { auth_type: \"standard\", token };\n}\n\nasync function getClientForWorkspace(workspaceUrl?: string): Promise<{\n client: SlackApiClient;\n auth: SlackAuth;\n workspace_url?: string;\n}> {\n const selector = workspaceUrl?.trim() || undefined;\n const normalizedSelectorUrl = selector ? tryNormalizeUrl(selector) : undefined;\n const selectorProvided = Boolean(selector);\n let resolvedWorkspaceUrl = normalizedSelectorUrl;\n if (selector) {\n const creds = await loadCredentials();\n const resolved = resolveWorkspaceSelector(creds.workspaces, selector);\n if (resolved.ambiguous.length > 0) {\n const options = resolved.ambiguous.map((w) => w.workspace_url).join(\", \");\n throw new Error(\n `Workspace selector \"${selector}\" is ambiguous. Matches: ${options}. Pass a more specific selector or full workspace URL.`,\n );\n }\n if (resolved.match) {\n resolvedWorkspaceUrl = resolved.match.workspace_url;\n } else if (!normalizedSelectorUrl) {\n resolvedWorkspaceUrl = undefined;\n }\n }\n\n const env = pickAuthFromEnv();\n if (env) {\n const envWorkspaceUrl = process.env.SLACK_WORKSPACE_URL?.trim();\n const urlForBrowser = resolvedWorkspaceUrl || envWorkspaceUrl;\n return {\n client: new SlackApiClient(env, { workspaceUrl: urlForBrowser }),\n auth: env,\n workspace_url: urlForBrowser,\n };\n }\n\n if (resolvedWorkspaceUrl) {\n const ws = await resolveWorkspaceForUrl(resolvedWorkspaceUrl);\n if (ws) {\n return {\n client: new SlackApiClient(ws.auth as SlackAuth, {\n workspaceUrl: ws.workspace_url,\n }),\n auth: ws.auth as SlackAuth,\n workspace_url: ws.workspace_url,\n };\n }\n }\n\n if (!selectorProvided) {\n const def = await resolveDefaultWorkspace();\n if (def) {\n return {\n client: new SlackApiClient(def.auth as SlackAuth, {\n workspaceUrl: def.workspace_url,\n }),\n auth: def.auth as SlackAuth,\n workspace_url: def.workspace_url,\n };\n }\n }\n\n try {\n const extracted = await extractFromSlackDesktop();\n await upsertWorkspaces(\n extracted.teams.map((team) => ({\n workspace_url: normalizeUrl(team.url),\n workspace_name: team.name,\n auth: {\n auth_type: \"browser\" as const,\n xoxc_token: team.token,\n xoxd_cookie: extracted.cookie_d,\n },\n })),\n );\n\n const desired = resolvedWorkspaceUrl\n ? await resolveWorkspaceForUrl(resolvedWorkspaceUrl)\n : selector\n ? resolveWorkspaceSelector((await loadCredentials()).workspaces, selector).match\n : await resolveDefaultWorkspace();\n const chosen = desired ?? (!selectorProvided ? await resolveDefaultWorkspace() : null);\n if (chosen) {\n return {\n client: new SlackApiClient(chosen.auth as SlackAuth, {\n workspaceUrl: chosen.workspace_url,\n }),\n auth: chosen.auth as SlackAuth,\n workspace_url: chosen.workspace_url,\n };\n }\n } catch {\n // Fall through to Chrome extraction.\n }\n\n // Fallback: try Chrome or Brave extraction (macOS).\n const chrome = extractFromChrome() ?? (await extractFromBrave());\n if (chrome && chrome.teams.length > 0) {\n let chosen = chrome.teams[0]!;\n if (selector) {\n const normalizedSelector = selector.toLowerCase();\n const matches = chrome.teams.filter((t) => {\n const normalizedUrl = normalizeUrl(t.url).toLowerCase();\n const host = new URL(t.url).host.toLowerCase();\n const hostWithoutSlackSuffix = host.replace(/\\.slack\\.com$/i, \"\");\n const name = t.name?.toLowerCase() ?? \"\";\n return (\n normalizedUrl.includes(normalizedSelector) ||\n host.includes(normalizedSelector) ||\n hostWithoutSlackSuffix.includes(normalizedSelector) ||\n name.includes(normalizedSelector)\n );\n });\n if (matches.length > 1) {\n throw new Error(\n `Workspace selector \"${selector}\" is ambiguous in Chrome workspaces. Matches: ${matches.map((t) => normalizeUrl(t.url)).join(\", \")}. Pass a more specific selector or full workspace URL.`,\n );\n }\n if (matches.length === 1) {\n chosen = matches[0]!;\n } else if (normalizedSelectorUrl) {\n try {\n chosen =\n chrome.teams.find((t) => normalizeUrl(t.url) === normalizeUrl(selector)) ?? chosen;\n } catch {\n // Keep default selection.\n }\n } else {\n throw new Error(\n `No configured workspace matches selector \"${selector}\". Run \"agent-slack auth whoami\" to list available workspaces.`,\n );\n }\n }\n const auth: SlackAuth = {\n auth_type: \"browser\",\n xoxc_token: chosen.token,\n xoxd_cookie: chrome.cookie_d,\n };\n await upsertWorkspace({\n workspace_url: normalizeUrl(chosen.url),\n workspace_name: chosen.name,\n auth: {\n auth_type: \"browser\",\n xoxc_token: chosen.token,\n xoxd_cookie: chrome.cookie_d,\n },\n });\n return {\n client: new SlackApiClient(auth, {\n workspaceUrl: normalizeUrl(chosen.url),\n }),\n auth,\n workspace_url: normalizeUrl(chosen.url),\n };\n }\n\n const firefox = await extractFromFirefox();\n if (firefox && firefox.teams.length > 0) {\n let chosen = firefox.teams[0]!;\n if (selector) {\n const normalizedSelector = selector.toLowerCase();\n const matches = firefox.teams.filter((t) => {\n const normalizedUrl = normalizeUrl(t.url).toLowerCase();\n const host = new URL(t.url).host.toLowerCase();\n const hostWithoutSlackSuffix = host.replace(/\\.slack\\.com$/i, \"\");\n const name = t.name?.toLowerCase() ?? \"\";\n return (\n normalizedUrl.includes(normalizedSelector) ||\n host.includes(normalizedSelector) ||\n hostWithoutSlackSuffix.includes(normalizedSelector) ||\n name.includes(normalizedSelector)\n );\n });\n if (matches.length > 1) {\n throw new Error(\n `Workspace selector \"${selector}\" is ambiguous in Firefox workspaces. Matches: ${matches.map((t) => normalizeUrl(t.url)).join(\", \")}. Pass a more specific selector or full workspace URL.`,\n );\n }\n if (matches.length === 1) {\n chosen = matches[0]!;\n } else if (normalizedSelectorUrl) {\n try {\n chosen =\n firefox.teams.find((t) => normalizeUrl(t.url) === normalizeUrl(selector)) ?? chosen;\n } catch {}\n } else {\n throw new Error(\n `No configured workspace matches selector \"${selector}\". Run \"agent-slack auth whoami\" to list available workspaces.`,\n );\n }\n }\n const auth: SlackAuth = {\n auth_type: \"browser\",\n xoxc_token: chosen.token,\n xoxd_cookie: firefox.cookie_d,\n };\n await upsertWorkspace({\n workspace_url: normalizeUrl(chosen.url),\n workspace_name: chosen.name,\n auth: {\n auth_type: \"browser\",\n xoxc_token: chosen.token,\n xoxd_cookie: firefox.cookie_d,\n },\n });\n return {\n client: new SlackApiClient(auth, {\n workspaceUrl: normalizeUrl(chosen.url),\n }),\n auth,\n workspace_url: normalizeUrl(chosen.url),\n };\n }\n\n if (selector && !normalizedSelectorUrl) {\n throw new Error(\n `No configured workspace matches selector \"${selector}\". Run \"agent-slack auth whoami\" to list available workspaces.`,\n );\n }\n\n throw new Error(\n 'No Slack credentials available. Try \"agent-slack auth import-desktop\", \"agent-slack auth import-chrome\", \"agent-slack auth import-brave\", \"agent-slack auth import-firefox\", or set SLACK_TOKEN / SLACK_COOKIE_D.',\n );\n}\n\nexport function createCliContext(): CliContext {\n return {\n effectiveWorkspaceUrl,\n assertWorkspaceSpecifiedForChannelNames,\n withAutoRefresh,\n getClientForWorkspace,\n normalizeUrl,\n errorMessage,\n parseContentType,\n parseCurl: parseSlackCurlCommand,\n importDesktop: extractFromSlackDesktop,\n importChrome: extractFromChrome,\n importBrave: extractFromBrave,\n importFirefox: extractFromFirefox,\n };\n}\n",
|
|
21
|
+
"import type { Workspace } from \"../auth/schema.ts\";\n\nexport type WorkspaceSelectorResult = {\n match: Workspace | null;\n ambiguous: Workspace[];\n};\n\nfunction normalizeUrl(u: string): string {\n const url = new URL(u);\n return `${url.protocol}//${url.host}`;\n}\n\nfunction normalizedWorkspaceCandidates(workspace: Workspace): string[] {\n let host = \"\";\n try {\n host = new URL(workspace.workspace_url).host.toLowerCase();\n } catch {\n host = \"\";\n }\n const hostWithoutSlackSuffix = host.replace(/\\.slack\\.com$/i, \"\");\n return [\n workspace.workspace_url.toLowerCase(),\n host,\n hostWithoutSlackSuffix,\n workspace.workspace_name?.toLowerCase() ?? \"\",\n workspace.team_domain?.toLowerCase() ?? \"\",\n ].filter(Boolean);\n}\n\nexport function resolveWorkspaceSelector(\n workspaces: Workspace[],\n selector: string,\n): WorkspaceSelectorResult {\n const raw = selector.trim();\n if (!raw) {\n return { match: null, ambiguous: [] };\n }\n\n try {\n const normalized = normalizeUrl(raw).toLowerCase();\n const exact = workspaces.find((w) => w.workspace_url.toLowerCase() === normalized);\n if (exact) {\n return { match: exact, ambiguous: [] };\n }\n } catch {\n // Not a URL selector; continue with fuzzy matching.\n }\n\n const needle = raw.toLowerCase();\n const matches = workspaces.filter((workspace) =>\n normalizedWorkspaceCandidates(workspace).some((candidate) => candidate.includes(needle)),\n );\n if (matches.length === 1) {\n return { match: matches[0]!, ambiguous: [] };\n }\n if (matches.length > 1) {\n return { match: null, ambiguous: matches };\n }\n return { match: null, ambiguous: [] };\n}\n",
|
|
22
|
+
"import { WebClient } from \"@slack/web-api\";\nimport { getUserAgent } from \"../lib/version.ts\";\n\nexport type SlackAuth =\n | { auth_type: \"standard\"; token: string }\n | { auth_type: \"browser\"; xoxc_token: string; xoxd_cookie: string };\n\nexport class SlackApiClient {\n private auth: SlackAuth;\n private web?: WebClient;\n private workspaceUrl?: string;\n\n constructor(auth: SlackAuth, options?: { workspaceUrl?: string }) {\n this.auth = auth;\n this.workspaceUrl = options?.workspaceUrl;\n if (auth.auth_type === \"standard\") {\n this.web = new WebClient(auth.token);\n }\n }\n\n async api(\n method: string,\n params: Record<string, unknown> = {},\n ): Promise<Record<string, unknown>> {\n if (this.auth.auth_type === \"standard\") {\n if (!this.web) {\n throw new Error(\"WebClient not initialized\");\n }\n return (await this.web.apiCall(method, params)) as unknown as Record<string, unknown>;\n }\n\n if (!this.workspaceUrl) {\n throw new Error(\n \"Browser auth requires workspace URL. Provide --workspace-url or set SLACK_WORKSPACE_URL, or call via a Slack message URL.\",\n );\n }\n const { auth } = this;\n if (auth.auth_type !== \"browser\") {\n throw new Error(\"Browser API requires browser auth\");\n }\n return this.browserApi({\n workspaceUrl: this.workspaceUrl,\n auth,\n method,\n params,\n });\n }\n\n private async browserApi(input: {\n workspaceUrl: string;\n auth: Extract<SlackAuth, { auth_type: \"browser\" }>;\n method: string;\n params: Record<string, unknown>;\n attempt?: number;\n }): Promise<Record<string, unknown>> {\n const attempt = input.attempt ?? 0;\n const url = `${input.workspaceUrl.replace(/\\/$/, \"\")}/api/${input.method}`;\n const cleanedEntries = Object.entries(input.params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [k, typeof v === \"object\" ? JSON.stringify(v) : String(v)]);\n const formBody = new URLSearchParams({\n token: input.auth.xoxc_token,\n ...Object.fromEntries(cleanedEntries),\n });\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Cookie: `d=${encodeURIComponent(input.auth.xoxd_cookie)}`,\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Origin: \"https://app.slack.com\",\n \"User-Agent\": getUserAgent(),\n },\n body: formBody,\n });\n\n if (response.status === 429 && attempt < 3) {\n const retryAfter = Number(response.headers.get(\"Retry-After\") ?? \"5\");\n const delayMs = Math.min(Math.max(retryAfter, 1) * 1000, 30000);\n await new Promise((r) => setTimeout(r, delayMs));\n return this.browserApi({\n ...input,\n attempt: attempt + 1,\n });\n }\n\n const data: unknown = await response.json().catch(() => ({}));\n if (!response.ok) {\n throw new Error(`Slack HTTP ${response.status} calling ${input.method}`);\n }\n if (!isRecord(data) || data.ok !== true) {\n const error = isRecord(data) && typeof data.error === \"string\" ? data.error : null;\n throw new Error(error || `Slack API error calling ${input.method}`);\n }\n return data;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n",
|
|
23
|
+
"import { extractFromBrave } from \"../auth/brave.ts\";\nimport { extractFromChrome } from \"../auth/chrome.ts\";\nimport { extractFromSlackDesktop } from \"../auth/desktop.ts\";\nimport { extractFromFirefox } from \"../auth/firefox.ts\";\nimport {\n loadCredentials,\n resolveDefaultWorkspace,\n resolveWorkspaceForUrl,\n upsertWorkspace,\n upsertWorkspaces,\n} from \"../auth/store.ts\";\nimport { resolveWorkspaceSelector } from \"./workspace-selector.ts\";\nimport { SlackApiClient, type SlackAuth } from \"../slack/client.ts\";\n\nexport function normalizeUrl(u: string): string {\n const url = new URL(u);\n return `${url.protocol}//${url.host}`;\n}\n\nfunction tryNormalizeUrl(u: string): string | undefined {\n try {\n return normalizeUrl(u);\n } catch {\n return undefined;\n }\n}\n\nfunction pickAuthFromEnv(): SlackAuth | null {\n const token = process.env.SLACK_TOKEN?.trim();\n if (!token) {\n return null;\n }\n if (token.startsWith(\"xoxc-\")) {\n const cookie = (process.env.SLACK_COOKIE_D || process.env.SLACK_COOKIE || \"\").trim();\n if (!cookie) {\n throw new Error(\"SLACK_TOKEN looks like xoxc- but SLACK_COOKIE_D is missing\");\n }\n return { auth_type: \"browser\", xoxc_token: token, xoxd_cookie: cookie };\n }\n return { auth_type: \"standard\", token };\n}\n\nexport async function getClientForWorkspace(workspaceUrl?: string): Promise<{\n client: SlackApiClient;\n auth: SlackAuth;\n workspace_url?: string;\n}> {\n const selector = workspaceUrl?.trim() || undefined;\n const normalizedSelectorUrl = selector ? tryNormalizeUrl(selector) : undefined;\n const selectorProvided = Boolean(selector);\n let resolvedWorkspaceUrl = normalizedSelectorUrl;\n if (selector) {\n const creds = await loadCredentials();\n const resolved = resolveWorkspaceSelector(creds.workspaces, selector);\n if (resolved.ambiguous.length > 0) {\n const options = resolved.ambiguous.map((w) => w.workspace_url).join(\", \");\n throw new Error(\n `Workspace selector \"${selector}\" is ambiguous. Matches: ${options}. Pass a more specific selector or full workspace URL.`,\n );\n }\n if (resolved.match) {\n resolvedWorkspaceUrl = resolved.match.workspace_url;\n } else if (!normalizedSelectorUrl) {\n resolvedWorkspaceUrl = undefined;\n }\n }\n\n const env = pickAuthFromEnv();\n if (env) {\n const envWorkspaceUrl = process.env.SLACK_WORKSPACE_URL?.trim();\n const urlForBrowser = resolvedWorkspaceUrl || envWorkspaceUrl;\n return {\n client: new SlackApiClient(env, { workspaceUrl: urlForBrowser }),\n auth: env,\n workspace_url: urlForBrowser,\n };\n }\n\n if (resolvedWorkspaceUrl) {\n const ws = await resolveWorkspaceForUrl(resolvedWorkspaceUrl);\n if (ws) {\n return {\n client: new SlackApiClient(ws.auth as SlackAuth, {\n workspaceUrl: ws.workspace_url,\n }),\n auth: ws.auth as SlackAuth,\n workspace_url: ws.workspace_url,\n };\n }\n }\n\n if (!selectorProvided) {\n const def = await resolveDefaultWorkspace();\n if (def) {\n return {\n client: new SlackApiClient(def.auth as SlackAuth, {\n workspaceUrl: def.workspace_url,\n }),\n auth: def.auth as SlackAuth,\n workspace_url: def.workspace_url,\n };\n }\n }\n\n try {\n const extracted = await extractFromSlackDesktop();\n await upsertWorkspaces(\n extracted.teams.map((team) => ({\n workspace_url: normalizeUrl(team.url),\n workspace_name: team.name,\n auth: {\n auth_type: \"browser\" as const,\n xoxc_token: team.token,\n xoxd_cookie: extracted.cookie_d,\n },\n })),\n );\n\n const desired = resolvedWorkspaceUrl\n ? await resolveWorkspaceForUrl(resolvedWorkspaceUrl)\n : selector\n ? resolveWorkspaceSelector((await loadCredentials()).workspaces, selector).match\n : await resolveDefaultWorkspace();\n const chosen = desired ?? (!selectorProvided ? await resolveDefaultWorkspace() : null);\n if (chosen) {\n return {\n client: new SlackApiClient(chosen.auth as SlackAuth, {\n workspaceUrl: chosen.workspace_url,\n }),\n auth: chosen.auth as SlackAuth,\n workspace_url: chosen.workspace_url,\n };\n }\n } catch {\n // Fall through to Chrome extraction.\n }\n\n // Fallback: try Chrome, Brave, then Firefox extraction.\n const browserSources: {\n cookie_d: string;\n teams: { url: string; name?: string; token: string }[];\n }[] = [];\n const chromeResult = extractFromChrome();\n if (chromeResult && chromeResult.teams.length > 0) {\n browserSources.push(chromeResult);\n }\n const braveResult = await extractFromBrave();\n if (braveResult && braveResult.teams.length > 0) {\n browserSources.push(braveResult);\n }\n const firefoxResult = await extractFromFirefox();\n if (firefoxResult && firefoxResult.teams.length > 0) {\n browserSources.push(firefoxResult);\n }\n\n for (const source of browserSources) {\n const result = await matchAndUpsertBrowserTeam({\n teams: source.teams,\n cookieD: source.cookie_d,\n selector,\n normalizedSelectorUrl,\n });\n if (result) {\n return result;\n }\n }\n\n if (selector && !normalizedSelectorUrl) {\n throw new Error(\n `No configured workspace matches selector \"${selector}\". Run \"agent-slack auth whoami\" to list available workspaces.`,\n );\n }\n\n throw new Error(\n 'No Slack credentials available. Try \"agent-slack auth import-desktop\", \"agent-slack auth import-chrome\", \"agent-slack auth import-brave\", \"agent-slack auth import-firefox\", or set SLACK_TOKEN / SLACK_COOKIE_D.',\n );\n}\n\nasync function matchAndUpsertBrowserTeam(input: {\n teams: { url: string; name?: string; token: string }[];\n cookieD: string;\n selector: string | undefined;\n normalizedSelectorUrl: string | undefined;\n}): Promise<{ client: SlackApiClient; auth: SlackAuth; workspace_url: string } | null> {\n const { teams, cookieD, selector, normalizedSelectorUrl } = input;\n let chosen = teams[0]!;\n\n if (selector) {\n const normalizedSelector = selector.toLowerCase();\n const matches = teams.filter((t) => {\n const normalizedUrl = normalizeUrl(t.url).toLowerCase();\n const host = new URL(t.url).host.toLowerCase();\n const hostWithoutSlackSuffix = host.replace(/\\.slack\\.com$/i, \"\");\n const name = t.name?.toLowerCase() ?? \"\";\n return (\n normalizedUrl.includes(normalizedSelector) ||\n host.includes(normalizedSelector) ||\n hostWithoutSlackSuffix.includes(normalizedSelector) ||\n name.includes(normalizedSelector)\n );\n });\n if (matches.length > 1) {\n throw new Error(\n `Workspace selector \"${selector}\" is ambiguous. Matches: ${matches.map((t) => normalizeUrl(t.url)).join(\", \")}. Pass a more specific selector or full workspace URL.`,\n );\n }\n if (matches.length === 1) {\n chosen = matches[0]!;\n } else if (normalizedSelectorUrl) {\n const exact = teams.find((t) => {\n try {\n return normalizeUrl(t.url) === normalizeUrl(selector);\n } catch {\n return false;\n }\n });\n if (exact) {\n chosen = exact;\n } else {\n return null;\n }\n } else {\n return null;\n }\n }\n\n const auth: SlackAuth = {\n auth_type: \"browser\",\n xoxc_token: chosen.token,\n xoxd_cookie: cookieD,\n };\n const workspaceUrl = normalizeUrl(chosen.url);\n await upsertWorkspace({\n workspace_url: workspaceUrl,\n workspace_name: chosen.name,\n auth: {\n auth_type: \"browser\",\n xoxc_token: chosen.token,\n xoxd_cookie: cookieD,\n },\n });\n return {\n client: new SlackApiClient(auth, { workspaceUrl }),\n auth,\n workspace_url: workspaceUrl,\n };\n}\n",
|
|
24
|
+
"import { extractFromBrave } from \"../auth/brave.ts\";\nimport { extractFromChrome } from \"../auth/chrome.ts\";\nimport { parseSlackCurlCommand } from \"../auth/curl.ts\";\nimport { extractFromSlackDesktop } from \"../auth/desktop.ts\";\nimport { extractFromFirefox } from \"../auth/firefox.ts\";\nimport {\n loadCredentials,\n resolveDefaultWorkspace,\n resolveWorkspaceForUrl,\n upsertWorkspace,\n upsertWorkspaces,\n} from \"../auth/store.ts\";\nimport { resolveWorkspaceSelector } from \"./workspace-selector.ts\";\nimport { normalizeChannelInput } from \"../slack/channels.ts\";\nimport type { SlackApiClient } from \"../slack/client.ts\";\nimport { type SlackAuth } from \"../slack/client.ts\";\nimport { getClientForWorkspace, normalizeUrl } from \"./context-client-resolver.ts\";\n\nexport type CliContext = {\n effectiveWorkspaceUrl: (flag?: string) => string | undefined;\n assertWorkspaceSpecifiedForChannelNames: (input: {\n workspaceUrl: string | undefined;\n channels: string[];\n }) => Promise<void>;\n withAutoRefresh: <T>(input: {\n workspaceUrl: string | undefined;\n work: () => Promise<T>;\n }) => Promise<T>;\n getClientForWorkspace: (workspaceUrl?: string) => Promise<{\n client: SlackApiClient;\n auth: SlackAuth;\n workspace_url?: string;\n }>;\n normalizeUrl: (u: string) => string;\n errorMessage: (err: unknown) => string;\n parseContentType: (value: unknown) => \"any\" | \"text\" | \"image\" | \"snippet\" | \"file\";\n parseCurl: (curl: string) => ReturnType<typeof parseSlackCurlCommand>;\n importDesktop: () => ReturnType<typeof extractFromSlackDesktop>;\n importChrome: () => ReturnType<typeof extractFromChrome>;\n importBrave: () => ReturnType<typeof extractFromBrave>;\n importFirefox: () => ReturnType<typeof extractFromFirefox>;\n};\n\nfunction isEnvAuthConfigured(): boolean {\n return Boolean(process.env.SLACK_TOKEN?.trim());\n}\n\nfunction effectiveWorkspaceUrl(flag?: string): string | undefined {\n return flag?.trim() || process.env.SLACK_WORKSPACE_URL?.trim() || undefined;\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction parseContentType(value: unknown): \"any\" | \"text\" | \"image\" | \"snippet\" | \"file\" {\n const raw = String(value ?? \"any\").toLowerCase();\n if (raw === \"text\" || raw === \"image\" || raw === \"snippet\" || raw === \"file\") {\n return raw;\n }\n return \"any\";\n}\n\nasync function assertWorkspaceSpecifiedForChannelNames(input: {\n workspaceUrl: string | undefined;\n channels: string[];\n}): Promise<void> {\n const hasName = input.channels.some((c) => normalizeChannelInput(c).kind === \"name\");\n if (!hasName) {\n return;\n }\n\n const creds = await loadCredentials();\n if ((creds.workspaces?.length ?? 0) <= 1) {\n return;\n }\n\n if (!input.workspaceUrl) {\n throw new Error(\n 'Ambiguous channel name across multiple workspaces. Pass --workspace \"<url-or-unique-substring>\" (or set SLACK_WORKSPACE_URL).',\n );\n }\n}\n\nfunction isAuthErrorMessage(message: string): boolean {\n return /(?:^|[^a-z])(invalid_auth|token_expired)(?:$|[^a-z])/i.test(message);\n}\n\nasync function refreshFromDesktopIfPossible(): Promise<boolean> {\n if (process.platform !== \"darwin\" && process.platform !== \"linux\") {\n return false;\n }\n try {\n const extracted = await extractFromSlackDesktop();\n await upsertWorkspaces(\n extracted.teams.map((team) => ({\n workspace_url: normalizeUrl(team.url),\n workspace_name: team.name,\n auth: {\n auth_type: \"browser\" as const,\n xoxc_token: team.token,\n xoxd_cookie: extracted.cookie_d,\n },\n })),\n );\n return true;\n } catch {\n return false;\n }\n}\n\nasync function withAutoRefresh<T>(input: {\n workspaceUrl: string | undefined;\n work: () => Promise<T>;\n}): Promise<T> {\n try {\n return await input.work();\n } catch (err: unknown) {\n const message = errorMessage(err);\n if (isEnvAuthConfigured()) {\n throw err;\n }\n if (!isAuthErrorMessage(message)) {\n throw err;\n }\n\n const refreshed = await refreshFromDesktopIfPossible();\n if (!refreshed) {\n throw err;\n }\n return await input.work();\n }\n}\n\nexport function createCliContext(): CliContext {\n return {\n effectiveWorkspaceUrl,\n assertWorkspaceSpecifiedForChannelNames,\n withAutoRefresh,\n getClientForWorkspace,\n normalizeUrl,\n errorMessage,\n parseContentType,\n parseCurl: parseSlackCurlCommand,\n importDesktop: extractFromSlackDesktop,\n importChrome: extractFromChrome,\n importBrave: extractFromBrave,\n importFirefox: extractFromFirefox,\n };\n}\n",
|
|
23
25
|
"export function pruneEmpty<T>(value: T): T {\n const pruned = pruneEmptyInternal(value);\n return (pruned === undefined ? ({} as T) : (pruned as T)) as T;\n}\n\nfunction pruneEmptyInternal(value: unknown): unknown {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n return value.trim() === \"\" ? undefined : value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n const next = value\n .map((v) => pruneEmptyInternal(v))\n .filter((v): v is Exclude<unknown, undefined> => v !== undefined);\n return next.length === 0 ? undefined : next;\n }\n\n if (typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const next = pruneEmptyInternal(v);\n if (next !== undefined) {\n out[k] = next;\n }\n }\n return Object.keys(out).length === 0 ? undefined : out;\n }\n\n return value;\n}\n",
|
|
24
26
|
"export function redactSecret(\n value: string,\n options?: { keepStart?: number; keepEnd?: number },\n): string {\n const keepStart = options?.keepStart ?? 6;\n const keepEnd = options?.keepEnd ?? 4;\n if (!value) {\n return value;\n }\n if (value.length <= keepStart + keepEnd + 3) {\n return \"[redacted]\";\n }\n return `${value.slice(0, keepStart)}…${value.slice(-keepEnd)}`;\n}\n",
|
|
25
27
|
"import type { Command } from \"commander\";\nimport type { CliContext } from \"./context.ts\";\nimport {\n loadCredentials,\n removeWorkspace,\n setDefaultWorkspace,\n upsertWorkspace,\n upsertWorkspaces,\n} from \"../auth/store.ts\";\nimport { pruneEmpty } from \"../lib/compact-json.ts\";\nimport { redactSecret } from \"../lib/redact.ts\";\n\nasync function runAuthTest(input: {\n ctx: CliContext;\n workspaceUrl?: string;\n}): Promise<Record<string, unknown>> {\n return input.ctx.withAutoRefresh({\n workspaceUrl: input.workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(input.workspaceUrl);\n return (await client.api(\"auth.test\", {})) as Record<string, unknown>;\n },\n });\n}\n\nexport function registerAuthCommand(input: { program: Command; ctx: CliContext }): void {\n const auth = input.program.command(\"auth\").description(\"Manage Slack authentication\");\n\n auth\n .command(\"whoami\")\n .description(\"Show configured workspaces and token sources\")\n .action(async () => {\n try {\n const creds = await loadCredentials();\n const sanitized = {\n ...creds,\n workspaces: creds.workspaces.map((w) => ({\n workspace_url: w.workspace_url,\n workspace_name: w.workspace_name,\n auth_type: w.auth.auth_type,\n token:\n w.auth.auth_type === \"standard\"\n ? redactSecret(w.auth.token)\n : redactSecret(w.auth.xoxc_token),\n cookie_d: w.auth.auth_type === \"browser\" ? redactSecret(w.auth.xoxd_cookie) : undefined,\n })),\n };\n console.log(JSON.stringify(pruneEmpty(sanitized), null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n auth\n .command(\"test\")\n .description(\"Verify credentials (calls Slack auth.test)\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when you have multiple workspaces)\",\n )\n .action(async (...args) => {\n const [options] = args as [{ workspace?: string }];\n try {\n const resp = await runAuthTest({\n ctx: input.ctx,\n workspaceUrl: input.ctx.effectiveWorkspaceUrl(options.workspace),\n });\n console.log(JSON.stringify(pruneEmpty(resp), null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n auth\n .command(\"import-chrome\")\n .description(\"Import xoxc/xoxd from a logged-in Slack tab in Google Chrome (macOS)\")\n .action(async () => {\n try {\n const extracted = input.ctx.importChrome();\n if (!extracted) {\n throw new Error(\n \"Could not extract tokens from Chrome. Open Slack in Chrome and ensure you're logged in.\",\n );\n }\n\n for (const team of extracted.teams) {\n await upsertWorkspace({\n workspace_url: input.ctx.normalizeUrl(team.url),\n workspace_name: team.name,\n auth: {\n auth_type: \"browser\",\n xoxc_token: team.token,\n xoxd_cookie: extracted.cookie_d,\n },\n });\n }\n console.log(`Imported ${extracted.teams.length} workspace token(s) from Chrome.`);\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n auth\n .command(\"import-brave\")\n .description(\"Import xoxc/xoxd from a logged-in Slack tab in Brave Browser (macOS)\")\n .action(async () => {\n try {\n const extracted = await input.ctx.importBrave();\n if (!extracted) {\n throw new Error(\n \"Could not extract tokens from Brave. Open Slack in Brave and ensure you're logged in.\",\n );\n }\n\n for (const team of extracted.teams) {\n await upsertWorkspace({\n workspace_url: input.ctx.normalizeUrl(team.url),\n workspace_name: team.name,\n auth: {\n auth_type: \"browser\",\n xoxc_token: team.token,\n xoxd_cookie: extracted.cookie_d,\n },\n });\n }\n console.log(`Imported ${extracted.teams.length} workspace token(s) from Brave.`);\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n auth\n .command(\"import-firefox\")\n .description(\"Import xoxc/xoxd from Firefox profile storage (macOS/Linux)\")\n .action(async () => {\n try {\n const extracted = await input.ctx.importFirefox();\n if (!extracted) {\n throw new Error(\n \"Could not extract tokens from Firefox. Open Slack in Firefox and ensure you're logged in.\",\n );\n }\n\n for (const team of extracted.teams) {\n await upsertWorkspace({\n workspace_url: input.ctx.normalizeUrl(team.url),\n workspace_name: team.name,\n auth: {\n auth_type: \"browser\",\n xoxc_token: team.token,\n xoxd_cookie: extracted.cookie_d,\n },\n });\n }\n console.log(`Imported ${extracted.teams.length} workspace token(s) from Firefox.`);\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n auth\n .command(\"parse-curl\")\n .description(\"Paste a Slack API request copied as cURL (extracts xoxc/xoxd and saves locally)\")\n .action(async () => {\n try {\n const curlInput = await new Response(process.stdin).text();\n if (!curlInput.trim()) {\n throw new Error(\"Expected cURL command on stdin\");\n }\n const parsed = input.ctx.parseCurl(curlInput);\n await upsertWorkspace({\n workspace_url: input.ctx.normalizeUrl(parsed.workspace_url),\n auth: {\n auth_type: \"browser\",\n xoxc_token: parsed.xoxc_token,\n xoxd_cookie: parsed.xoxd_cookie,\n },\n });\n console.log(`Imported tokens for ${input.ctx.normalizeUrl(parsed.workspace_url)}.`);\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n auth\n .command(\"import-desktop\")\n .description(\n \"Import xoxc token(s) + d cookie from Slack Desktop data (TypeScript; no need to quit Slack)\",\n )\n .action(async () => {\n try {\n const extracted = await input.ctx.importDesktop();\n await upsertWorkspaces(\n extracted.teams.map((team) => ({\n workspace_url: input.ctx.normalizeUrl(team.url),\n workspace_name: team.name,\n auth: {\n auth_type: \"browser\",\n xoxc_token: team.token,\n xoxd_cookie: extracted.cookie_d,\n },\n })),\n );\n const payload = {\n imported: extracted.teams.length,\n source: extracted.source,\n workspaces: extracted.teams.map((t) => ({\n workspace_url: input.ctx.normalizeUrl(t.url),\n workspace_name: t.name,\n })),\n };\n console.log(JSON.stringify(pruneEmpty(payload), null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n auth\n .command(\"add\")\n .description(\"Add credentials (standard token or browser xoxc/xoxd)\")\n .requiredOption(\"--workspace-url <url>\", \"Workspace URL like https://myteam.slack.com\")\n .option(\"--token <token>\", \"Standard Slack token (xoxb/xoxp)\")\n .option(\"--xoxc <token>\", \"Browser token (xoxc-...)\")\n .option(\"--xoxd <cookie>\", \"Browser cookie d (xoxd-...)\")\n .action(async (...args) => {\n const [options] = args as [\n { workspaceUrl: string; token?: string; xoxc?: string; xoxd?: string },\n ];\n try {\n const workspaceUrl = input.ctx.normalizeUrl(options.workspaceUrl);\n if (options.token) {\n await upsertWorkspace({\n workspace_url: workspaceUrl,\n auth: { auth_type: \"standard\", token: options.token },\n });\n console.log(\"Saved standard token.\");\n return;\n }\n if (options.xoxc && options.xoxd) {\n await upsertWorkspace({\n workspace_url: workspaceUrl,\n auth: {\n auth_type: \"browser\",\n xoxc_token: options.xoxc,\n xoxd_cookie: options.xoxd,\n },\n });\n console.log(\"Saved browser tokens.\");\n return;\n }\n throw new Error(\"Provide either --token or both --xoxc and --xoxd\");\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n auth\n .command(\"set-default\")\n .description(\"Set the default workspace URL\")\n .argument(\"<workspace-url>\", \"Workspace URL like https://myteam.slack.com\")\n .action(async (...args) => {\n const [workspaceUrl] = args as [string];\n try {\n await setDefaultWorkspace(workspaceUrl);\n console.log(\"Default workspace updated.\");\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n auth\n .command(\"remove\")\n .description(\"Remove a workspace from local config\")\n .argument(\"<workspace-url>\", \"Workspace URL like https://myteam.slack.com\")\n .action(async (...args) => {\n const [workspaceUrl] = args as [string];\n try {\n await removeWorkspace(workspaceUrl);\n console.log(\"Removed workspace.\");\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n}\n",
|
|
@@ -31,18 +33,23 @@
|
|
|
31
33
|
"import type { Command } from \"commander\";\nimport type { CliContext } from \"./context.ts\";\nimport { fetchCanvasMarkdown, parseSlackCanvasUrl } from \"../slack/canvas.ts\";\nimport { pruneEmpty } from \"../lib/compact-json.ts\";\n\nexport function registerCanvasCommand(input: { program: Command; ctx: CliContext }): void {\n const canvasCmd = input.program.command(\"canvas\").description(\"Work with Slack canvases\");\n\n canvasCmd\n .command(\"get\")\n .description(\"Fetch a Slack canvas and convert it to Markdown\")\n .argument(\"<canvas>\", \"Slack canvas URL (…/docs/…/F…) or canvas id (F…)\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; required if passing a canvas id across multiple workspaces)\",\n )\n .option(\n \"--max-chars <n>\",\n \"Max markdown characters to include (default 20000, -1 for unlimited)\",\n \"20000\",\n )\n .action(async (...args) => {\n const [value, options] = args as [string, { workspace?: string; maxChars: string }];\n try {\n let workspaceUrl: string | undefined;\n let canvasId: string;\n\n try {\n const ref = parseSlackCanvasUrl(value);\n workspaceUrl = ref.workspace_url;\n canvasId = ref.canvas_id;\n } catch {\n const trimmed = String(value).trim();\n if (!/^F[A-Z0-9]{8,}$/.test(trimmed)) {\n throw new Error(\n `Unsupported canvas input: ${value} (expected Slack canvas URL or id like F...)`,\n );\n }\n canvasId = trimmed;\n workspaceUrl = options.workspace?.trim() || undefined;\n }\n\n const payload = await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client, auth, workspace_url } =\n await input.ctx.getClientForWorkspace(workspaceUrl);\n const maxChars = Number.parseInt(options.maxChars, 10);\n return await fetchCanvasMarkdown(client, {\n auth,\n workspaceUrl: workspace_url ?? workspaceUrl ?? \"\",\n canvasId,\n options: { maxChars },\n });\n },\n });\n\n console.log(JSON.stringify(pruneEmpty(payload), null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n}\n",
|
|
32
34
|
"import * as emoji from \"node-emoji\";\n\nexport function slackEmojiShortcodesToUnicode(text: string): string {\n if (!text) {\n return \"\";\n }\n // Prefer Slack-style emoji shortcodes (node-emoji) since Slack uses names\n // that don't always match other shortcode sets.\n return emoji.emojify(text);\n}\n\nexport function normalizeSlackReactionName(input: string): string {\n const trimmed = String(input ?? \"\").trim();\n if (!trimmed) {\n throw new Error(\"Emoji is empty\");\n }\n\n // Accept :rocket:\n const shortcodeMatch = trimmed.match(/^:([^:\\s]+):$/);\n if (shortcodeMatch) {\n return shortcodeMatch[1]!;\n }\n\n // Accept already-normalized names (rocket, +1, white_check_mark, etc.)\n if (/^[A-Za-z0-9_+-]+$/.test(trimmed)) {\n return trimmed;\n }\n\n // Accept unicode emoji (🚀). Convert to :rocket: then strip colons.\n const viaNodeEmoji = emoji.which(trimmed);\n if (viaNodeEmoji) {\n return viaNodeEmoji;\n }\n\n throw new Error(\n `Unsupported emoji format: ${JSON.stringify(input)} (use :emoji: or unicode emoji)`,\n );\n}\n",
|
|
33
35
|
"import { slackEmojiShortcodesToUnicode } from \"./emoji.ts\";\n\nexport function slackMrkdwnToMarkdown(text: string): string {\n if (!text) {\n return \"\";\n }\n\n // Links: <http://x|label> or <http://x>\n let out = text.replace(/<((https?:\\/\\/)[^>|]+)\\|([^>]+)>/g, \"[$3]($1)\");\n out = out.replace(/<((https?:\\/\\/)[^>]+)>/g, \"$1\");\n\n // Channels: <#C123|name>\n out = out.replace(/<#[A-Z0-9]+\\|([^>]+)>/g, \"#$1\");\n\n // Users: <@U123> or <@U123|name>\n out = out.replace(/<@([A-Z0-9]+)\\|([^>]+)>/g, \"@$2\");\n out = out.replace(/<@([A-Z0-9]+)>/g, \"@$1\");\n\n // Special mentions: <!here>, <!channel>, <!everyone>\n out = out.replace(/<!([a-zA-Z]+)>/g, \"@$1\");\n\n // Decode basic HTML entities Slack sometimes includes\n out = out.replace(/</g, \"<\").replace(/>/g, \">\").replace(/&/g, \"&\");\n\n // Prefer unicode emoji for token efficiency (e.g. 🚀 vs :rocket:)\n out = slackEmojiShortcodesToUnicode(out);\n\n return out;\n}\n",
|
|
34
|
-
"import { slackMrkdwnToMarkdown } from \"./mrkdwn.ts\";\n\ntype UnknownRecord = Record<string, unknown>;\ntype RenderState = { depth: number; seen: WeakSet<object> };\nconst MAX_ATTACHMENT_DEPTH = 8;\n\nexport function renderSlackMessageContent(msg: unknown): string {\n const msgObj = isRecord(msg) ? msg : {};\n const blockMrkdwn = extractMrkdwnFromBlocks(msgObj.blocks);\n const attachmentMrkdwn = extractMrkdwnFromAttachments(msgObj.attachments, {\n depth: 0,\n seen: new WeakSet<object>(),\n });\n const combined = [blockMrkdwn.trim(), attachmentMrkdwn.trim()].filter(Boolean).join(\"\\n\\n\");\n if (combined) {\n return slackMrkdwnToMarkdown(combined).trim();\n }\n\n const text = getString(msgObj.text).trim();\n if (text) {\n return slackMrkdwnToMarkdown(text).trim();\n }\n\n return \"\";\n}\n\nfunction extractMrkdwnFromBlocks(blocks: unknown): string {\n if (!Array.isArray(blocks)) {\n return \"\";\n }\n\n const out: string[] = [];\n for (const b of blocks) {\n if (!isRecord(b)) {\n continue;\n }\n const type = getString(b.type);\n if (type === \"section\") {\n const text = isRecord(b.text) ? b.text : null;\n const textType = text ? getString(text.type) : \"\";\n if (textType === \"mrkdwn\" || textType === \"plain_text\") {\n out.push(getString(text?.text));\n }\n if (Array.isArray(b.fields)) {\n for (const f of b.fields) {\n if (!isRecord(f)) {\n continue;\n }\n const fieldType = getString(f.type);\n if (fieldType === \"mrkdwn\" || fieldType === \"plain_text\") {\n out.push(getString(f.text));\n }\n }\n }\n // Buttons often carry the only URL (e.g. \"View Progress\")\n const accessory = isRecord(b.accessory) ? b.accessory : null;\n if (getString(accessory?.type) === \"button\") {\n const label = getString((accessory?.text as UnknownRecord | undefined)?.text);\n const url = getString(accessory?.url);\n if (url) {\n out.push(label ? `${label}: ${url}` : url);\n }\n }\n continue;\n }\n if (type === \"actions\" && Array.isArray(b.elements)) {\n for (const el of b.elements) {\n if (!isRecord(el)) {\n continue;\n }\n if (getString(el.type) === \"button\") {\n const label = getString((el.text as UnknownRecord | undefined)?.text);\n const url = getString(el.url);\n if (url) {\n out.push(label ? `${label}: ${url}` : url);\n }\n }\n }\n continue;\n }\n if (type === \"context\" && Array.isArray(b.elements)) {\n for (const el of b.elements) {\n if (!isRecord(el)) {\n continue;\n }\n const elType = getString(el.type);\n if (elType === \"mrkdwn\") {\n out.push(getString(el.text));\n }\n if (elType === \"plain_text\") {\n out.push(getString(el.text));\n }\n }\n continue;\n }\n if (type === \"image\") {\n const alt = getString(b.alt_text);\n const url = getString(b.image_url);\n if (url) {\n out.push(alt ? `${alt}: ${url}` : url);\n }\n continue;\n }\n if (type === \"rich_text\") {\n const rich = extractMrkdwnFromRichTextBlock(b);\n if (rich.trim()) {\n out.push(rich);\n }\n continue;\n }\n }\n\n return out.join(\"\\n\\n\");\n}\n\nfunction extractMrkdwnFromRichTextBlock(block: unknown): string {\n if (!isRecord(block)) {\n return \"\";\n }\n const elements = Array.isArray(block.elements) ? block.elements : [];\n const out: string[] = [];\n for (const el of elements) {\n const txt = extractMrkdwnFromRichTextElement(el);\n if (txt.trim()) {\n out.push(txt);\n }\n }\n return out.join(\"\\n\\n\");\n}\n\nfunction extractMrkdwnFromRichTextElement(el: unknown): string {\n if (!isRecord(el)) {\n return \"\";\n }\n const t = getString(el.type);\n\n if (t === \"rich_text_section\") {\n const parts: string[] = [];\n for (const child of Array.isArray(el.elements) ? el.elements : []) {\n parts.push(extractMrkdwnFromRichTextElement(child));\n }\n return parts.join(\"\");\n }\n\n if (t === \"rich_text_preformatted\") {\n const parts: string[] = [];\n for (const child of Array.isArray(el.elements) ? el.elements : []) {\n parts.push(extractMrkdwnFromRichTextElement(child));\n }\n const text = parts.join(\"\");\n return text ? `\\`\\`\\`${text}\\`\\`\\`` : \"\";\n }\n\n if (t === \"rich_text_quote\") {\n const parts: string[] = [];\n for (const child of Array.isArray(el.elements) ? el.elements : []) {\n parts.push(extractMrkdwnFromRichTextElement(child));\n }\n const text = parts.join(\"\").trim();\n if (!text) {\n return \"\";\n }\n return text\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n }\n\n if (t === \"rich_text_list\") {\n const style = typeof el.style === \"string\" ? el.style : \"bullet\";\n const items: string[] = [];\n const itemEls = Array.isArray(el.elements) ? el.elements : [];\n for (let idx = 0; idx < itemEls.length; idx++) {\n const item = itemEls[idx];\n const txt = extractMrkdwnFromRichTextElement(item).trim();\n if (!txt) {\n continue;\n }\n const prefix = style === \"ordered\" ? `${idx + 1}. ` : \"- \";\n items.push(`${prefix}${txt}`);\n }\n return items.join(\"\\n\");\n }\n\n if (t === \"text\") {\n const raw = getString(el.text);\n const style = isRecord(el.style) ? el.style : null;\n if (!style) {\n return raw;\n }\n let text = raw;\n if (style.code) {\n text = `\\`${text}\\``;\n }\n if (style.bold) {\n text = `*${text}*`;\n }\n if (style.italic) {\n text = `_${text}_`;\n }\n if (style.strike) {\n text = `~${text}~`;\n }\n return text;\n }\n\n if (t === \"link\") {\n const url = getString(el.url);\n const text = getString(el.text);\n if (!url) {\n return text;\n }\n return text ? `<${url}|${text}>` : url;\n }\n\n if (t === \"emoji\") {\n const name = getString(el.name);\n return name ? `:${name}:` : \"\";\n }\n\n if (t === \"user\") {\n const userId = getString(el.user_id);\n return userId ? `<@${userId}>` : \"\";\n }\n\n if (t === \"channel\") {\n const channelId = getString(el.channel_id);\n return channelId ? `<#${channelId}>` : \"\";\n }\n\n return \"\";\n}\n\nfunction extractMrkdwnFromAttachments(attachments: unknown, state: RenderState): string {\n if (state.depth >= MAX_ATTACHMENT_DEPTH) {\n return \"\";\n }\n if (!Array.isArray(attachments)) {\n return \"\";\n }\n\n const parts: string[] = [];\n for (const a of attachments) {\n if (!isRecord(a)) {\n continue;\n }\n if (state.seen.has(a)) {\n continue;\n }\n state.seen.add(a);\n\n const isSharedMessage = Boolean(\n a.is_share || (a.is_msg_unfurl && Array.isArray(a.message_blocks)),\n );\n\n const chunk: string[] = [];\n\n if (isSharedMessage) {\n chunk.push(formatForwardHeader(a));\n\n const body =\n extractForwardedMessageBody(a, state).trim() ||\n extractMrkdwnFromAttachments(a.attachments, nextState(state)).trim() ||\n getString(a.text).trim();\n if (body) {\n chunk.push(quoteMarkdown(body));\n }\n\n if (chunk.length > 0) {\n parts.push(chunk.join(\"\\n\"));\n }\n continue;\n }\n\n const blocks = extractMrkdwnFromBlocks(a.blocks);\n if (blocks.trim()) {\n chunk.push(blocks);\n }\n const pretext = getString(a.pretext);\n if (pretext) {\n chunk.push(pretext);\n }\n const title = getString(a.title);\n const titleLink = getString(a.title_link);\n if (titleLink && title) {\n chunk.push(`<${titleLink}|${title}>`);\n } else if (title) {\n chunk.push(title);\n } else if (titleLink) {\n chunk.push(titleLink);\n }\n const text = getString(a.text);\n if (text) {\n chunk.push(text);\n }\n if (Array.isArray(a.fields)) {\n for (const f of a.fields) {\n if (!isRecord(f)) {\n continue;\n }\n const fieldTitle = getString(f.title);\n const value = getString(f.value);\n if (fieldTitle && value) {\n chunk.push(`${fieldTitle}\\n${value}`);\n } else if (fieldTitle) {\n chunk.push(fieldTitle);\n } else if (value) {\n chunk.push(value);\n }\n }\n }\n const fallback = getString(a.fallback);\n if (chunk.length === 0 && fallback) {\n chunk.push(fallback);\n }\n const nestedAttachments = extractMrkdwnFromAttachments(a.attachments, nextState(state));\n if (nestedAttachments.trim()) {\n chunk.push(nestedAttachments);\n }\n if (chunk.length > 0) {\n parts.push(uniqueTexts(chunk).join(\"\\n\"));\n }\n }\n return uniqueTexts(parts).join(\"\\n\\n\");\n}\n\nfunction formatForwardHeader(a: Record<string, unknown>): string {\n const authorName = getString(a.author_name);\n const authorLink = getString(a.author_link);\n const fromUrl = getString(a.from_url);\n\n const authorPart = authorName && authorLink ? `<${authorLink}|${authorName}>` : authorName || \"\";\n const sourcePart = fromUrl ? `<${fromUrl}|original>` : \"\";\n\n if (authorPart && sourcePart) {\n return `*Forwarded from ${authorPart} | ${sourcePart}*`;\n }\n if (authorPart) {\n return `*Forwarded from ${authorPart}*`;\n }\n if (sourcePart) {\n return `*Forwarded message | ${sourcePart}*`;\n }\n return \"*Forwarded message*\";\n}\n\nfunction extractForwardedMessageBody(\n attachment: Record<string, unknown>,\n state: RenderState,\n): string {\n const messageBlocks = attachment.message_blocks;\n const topLevelFiles = extractFileMentions(attachment.files).trim();\n if (!Array.isArray(messageBlocks)) {\n return topLevelFiles;\n }\n const out: string[] = [];\n for (const mb of messageBlocks) {\n if (!isRecord(mb)) {\n continue;\n }\n const message = isRecord(mb.message) ? mb.message : null;\n if (!message) {\n continue;\n }\n const messageText = getString(message.text).trim();\n const blocksContent = extractMrkdwnFromBlocks(message.blocks).trim();\n const attachmentsContent = extractMrkdwnFromAttachments(\n message.attachments,\n nextState(state),\n ).trim();\n const fileMentions = extractFileMentions(message.files).trim();\n const content = uniqueTexts([\n blocksContent,\n attachmentsContent,\n messageText,\n fileMentions,\n ]).join(\"\\n\\n\");\n if (content) {\n out.push(content);\n }\n }\n return uniqueTexts([topLevelFiles, ...out]).join(\"\\n\");\n}\n\nfunction nextState(state: RenderState): RenderState {\n return { depth: state.depth + 1, seen: state.seen };\n}\n\nfunction quoteMarkdown(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n}\n\nfunction uniqueTexts(values: string[]): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const text = value.trim();\n if (!text || seen.has(text)) {\n continue;\n }\n seen.add(text);\n out.push(text);\n }\n return out;\n}\n\nfunction extractFileMentions(files: unknown): string {\n if (!Array.isArray(files)) {\n return \"\";\n }\n const lines: string[] = [];\n for (const f of files) {\n if (!isRecord(f)) {\n continue;\n }\n const name = getString(f.title) || getString(f.name) || \"file\";\n const url =\n getString(f.permalink) || getString(f.url_private_download) || getString(f.url_private);\n if (url) {\n lines.push(`<${url}|${name}>`);\n continue;\n }\n lines.push(name);\n }\n return uniqueTexts(lines).join(\"\\n\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction getString(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n",
|
|
35
36
|
"import type { SlackApiClient } from \"./client.ts\";\nimport type { SlackFileSummary } from \"./messages.ts\";\nimport { getNumber, getString, isRecord } from \"../lib/object-type-guards.ts\";\n\nexport function toSlackFileSummary(value: unknown): SlackFileSummary | null {\n if (!isRecord(value)) {\n return null;\n }\n const id = getString(value.id);\n if (!id) {\n return null;\n }\n return {\n id,\n name: getString(value.name),\n title: getString(value.title),\n mimetype: getString(value.mimetype),\n filetype: getString(value.filetype),\n mode: getString(value.mode),\n permalink: getString(value.permalink),\n url_private: getString(value.url_private),\n url_private_download: getString(value.url_private_download),\n size: getNumber(value.size),\n };\n}\n\nexport async function enrichFiles(\n client: SlackApiClient,\n files: SlackFileSummary[],\n): Promise<SlackFileSummary[]> {\n const out: SlackFileSummary[] = [];\n for (const f of files) {\n if (f.mode === \"snippet\" || !f.url_private_download) {\n try {\n const info = await client.api(\"files.info\", { file: f.id });\n const file = isRecord(info.file) ? info.file : null;\n out.push({\n ...f,\n name: f.name ?? getString(file?.name),\n title: f.title ?? getString(file?.title),\n mimetype: f.mimetype ?? getString(file?.mimetype),\n filetype: f.filetype ?? getString(file?.filetype),\n mode: f.mode ?? getString(file?.mode),\n permalink: f.permalink ?? getString(file?.permalink),\n url_private: f.url_private ?? getString(file?.url_private),\n url_private_download: f.url_private_download ?? getString(file?.url_private_download),\n snippet: {\n content: getString(file?.content),\n language: getString(file?.filetype),\n },\n });\n continue;\n } catch {\n // ignore and fall back to summary\n }\n }\n out.push(f);\n }\n return out;\n}\n",
|
|
36
|
-
"import type { SlackMessageRef } from \"./url.ts\";\nimport type { SlackApiClient } from \"./client.ts\";\nimport { slackMrkdwnToMarkdown } from \"./mrkdwn.ts\";\nimport { renderSlackMessageContent } from \"./render.ts\";\nimport { asArray, getNumber, getString, isRecord } from \"../lib/object-type-guards.ts\";\nimport { enrichFiles, toSlackFileSummary } from \"./message-api-parsing.ts\";\n\nexport type SlackFileSummary = {\n id: string;\n name?: string;\n title?: string;\n mimetype?: string;\n filetype?: string;\n mode?: string;\n permalink?: string;\n url_private?: string;\n url_private_download?: string;\n size?: number;\n snippet?: {\n content?: string;\n language?: string;\n };\n};\n\nexport type SlackMessageSummary = {\n channel_id: string;\n ts: string;\n thread_ts?: string;\n reply_count?: number;\n user?: string;\n bot_id?: string;\n text: string;\n markdown: string;\n blocks?: unknown[];\n attachments?: unknown[];\n files?: SlackFileSummary[];\n reactions?: unknown[];\n};\n\nexport type CompactSlackMessage = {\n channel_id: string;\n ts: string;\n thread_ts?: string;\n author?: { user_id?: string; bot_id?: string };\n content?: string;\n files?: {\n mimetype?: string;\n mode?: string;\n path: string;\n }[];\n reactions?: {\n name: string;\n users: string[];\n count?: number;\n }[];\n forwarded_threads?: {\n url: string;\n thread_ts: string;\n channel_id?: string;\n reply_count?: number;\n }[];\n};\n\nexport function toCompactMessage(\n msg: SlackMessageSummary,\n input?: {\n maxSnippetChars?: number;\n maxBodyChars?: number;\n includeReactions?: boolean;\n downloadedPaths?: Record<string, string>;\n },\n): CompactSlackMessage {\n const maxBodyChars = input?.maxBodyChars ?? 8000;\n const includeReactions = input?.includeReactions ?? false;\n\n const rendered = renderSlackMessageContent(msg);\n const content =\n maxBodyChars >= 0 && rendered.length > maxBodyChars\n ? `${rendered.slice(0, maxBodyChars)}\\n…`\n : rendered;\n\n const files = msg.files\n ?.map((f) => {\n const path = input?.downloadedPaths?.[f.id];\n if (!path) {\n return null;\n }\n return {\n mimetype: f.mimetype,\n mode: f.mode,\n path,\n };\n })\n .filter((f): f is NonNullable<typeof f> => Boolean(f));\n\n return {\n channel_id: msg.channel_id,\n ts: msg.ts,\n thread_ts: msg.thread_ts ?? ((msg.reply_count ?? 0) > 0 ? msg.ts : undefined),\n author: msg.user || msg.bot_id ? { user_id: msg.user, bot_id: msg.bot_id } : undefined,\n content: content ? content : undefined,\n files: files && files.length > 0 ? files : undefined,\n reactions: includeReactions ? compactReactions(msg.reactions) : undefined,\n forwarded_threads: extractForwardedThreads(msg.attachments),\n };\n}\n\nfunction compactReactions(\n reactions: unknown[] | undefined,\n): Array<{ name: string; users: string[]; count?: number }> | undefined {\n if (!Array.isArray(reactions) || reactions.length === 0) {\n return undefined;\n }\n const out: { name: string; users: string[]; count?: number }[] = [];\n for (const r of reactions) {\n if (!isRecord(r)) {\n continue;\n }\n const name = getString(r.name)?.trim() ?? \"\";\n if (!name) {\n continue;\n }\n const users = Array.isArray(r.users)\n ? r.users.map((u) => String(u)).filter((u) => /^U[A-Z0-9]{8,}$/.test(u))\n : [];\n const count = typeof r.count === \"number\" && r.count !== users.length ? r.count : undefined;\n out.push({ name, users, count });\n }\n return out.length ? out : undefined;\n}\n\nfunction extractForwardedThreads(attachments: unknown[] | undefined):\n | {\n url: string;\n thread_ts: string;\n channel_id?: string;\n reply_count?: number;\n }[]\n | undefined {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return undefined;\n }\n const out: {\n url: string;\n thread_ts: string;\n channel_id?: string;\n reply_count?: number;\n }[] = [];\n const seen = new Set<string>();\n for (const attachment of attachments) {\n if (!isRecord(attachment)) {\n continue;\n }\n const fromUrl = getString(attachment.from_url)?.trim();\n if (!fromUrl) {\n continue;\n }\n let parsed: URL;\n try {\n parsed = new URL(fromUrl);\n } catch {\n continue;\n }\n const threadTs = parsed.searchParams.get(\"thread_ts\")?.trim();\n if (!threadTs || !/^\\d{6,}\\.\\d{6}$/.test(threadTs)) {\n continue;\n }\n const channelId = parsed.searchParams.get(\"cid\")?.trim();\n const replyCount = getNumber(attachment.reply_count);\n const key = `${fromUrl}::${threadTs}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n out.push({\n url: fromUrl,\n thread_ts: threadTs,\n channel_id: channelId || undefined,\n reply_count: replyCount,\n });\n }\n return out.length ? out : undefined;\n}\n\nexport async function fetchMessage(\n client: SlackApiClient,\n input: { ref: SlackMessageRef; includeReactions?: boolean },\n): Promise<SlackMessageSummary> {\n const history = await client.api(\"conversations.history\", {\n channel: input.ref.channel_id,\n latest: input.ref.message_ts,\n inclusive: true,\n limit: 5,\n include_all_metadata: input.includeReactions ? true : undefined,\n });\n const historyMessages = asArray(history.messages);\n let msg = historyMessages.find(\n (m): m is Record<string, unknown> => isRecord(m) && getString(m.ts) === input.ref.message_ts,\n );\n\n // Thread replies are not guaranteed to appear in channel history. If the URL\n // includes ?thread_ts=..., scan the thread directly.\n if (!msg && input.ref.thread_ts_hint) {\n msg = await findMessageInThread(client, {\n channelId: input.ref.channel_id,\n threadTs: input.ref.thread_ts_hint,\n targetTs: input.ref.message_ts,\n includeReactions: input.includeReactions,\n });\n }\n\n // Fallback: if the message_ts is actually the thread root, replies can still\n // be fetched via conversations.replies even if history is missing it.\n if (!msg) {\n try {\n const rootResp = await client.api(\"conversations.replies\", {\n channel: input.ref.channel_id,\n ts: input.ref.message_ts,\n limit: 1,\n include_all_metadata: input.includeReactions ? true : undefined,\n });\n const [root] = asArray(rootResp.messages);\n if (isRecord(root) && getString(root.ts) === input.ref.message_ts) {\n msg = root;\n }\n } catch {\n // ignore\n }\n }\n\n if (!msg) {\n throw new Error(\"Message not found (no access or wrong URL)\");\n }\n\n const files = asArray(msg.files)\n .map((f) => toSlackFileSummary(f))\n .filter((f): f is SlackFileSummary => f !== null);\n const enrichedFiles = files.length > 0 ? await enrichFiles(client, files) : undefined;\n\n const text = getString(msg.text) ?? \"\";\n const ts = getString(msg.ts) ?? input.ref.message_ts;\n const blocks = Array.isArray(msg.blocks) ? (msg.blocks as unknown[]) : undefined;\n const attachments = Array.isArray(msg.attachments) ? (msg.attachments as unknown[]) : undefined;\n const reactions = Array.isArray(msg.reactions) ? (msg.reactions as unknown[]) : undefined;\n return {\n channel_id: input.ref.channel_id,\n ts,\n thread_ts: getString(msg.thread_ts),\n reply_count: getNumber(msg.reply_count),\n user: getString(msg.user),\n bot_id: getString(msg.bot_id),\n text,\n markdown: slackMrkdwnToMarkdown(text),\n blocks,\n attachments,\n files: enrichedFiles,\n reactions,\n };\n}\n\nasync function findMessageInThread(\n client: SlackApiClient,\n input: {\n channelId: string;\n threadTs: string;\n targetTs: string;\n includeReactions?: boolean;\n },\n): Promise<Record<string, unknown> | undefined> {\n let cursor: string | undefined;\n for (;;) {\n const resp = await client.api(\"conversations.replies\", {\n channel: input.channelId,\n ts: input.threadTs,\n limit: 200,\n cursor,\n include_all_metadata: input.includeReactions ? true : undefined,\n });\n const messages = asArray(resp.messages);\n const found = messages.find(\n (m): m is Record<string, unknown> => isRecord(m) && getString(m.ts) === input.targetTs,\n );\n if (found) {\n return found;\n }\n const meta = isRecord(resp.response_metadata) ? resp.response_metadata : null;\n const next = meta ? getString(meta.next_cursor) : undefined;\n if (!next) {\n break;\n }\n cursor = next;\n }\n return undefined;\n}\n\nexport async function fetchChannelHistory(\n client: SlackApiClient,\n input: {\n channelId: string;\n limit?: number;\n latest?: string;\n oldest?: string;\n includeReactions?: boolean;\n withReactions?: string[];\n withoutReactions?: string[];\n },\n): Promise<SlackMessageSummary[]> {\n const raw = input.limit ?? 25;\n const limit = Number.isFinite(raw) ? Math.min(Math.max(raw, 1), 200) : 25;\n const out: SlackMessageSummary[] = [];\n const withReactions = input.withReactions ?? [];\n const withoutReactions = input.withoutReactions ?? [];\n const hasReactionFilters = withReactions.length > 0 || withoutReactions.length > 0;\n const pageLimit = hasReactionFilters ? 200 : limit;\n\n let cursorLatest = input.latest;\n for (;;) {\n const resp = await client.api(\"conversations.history\", {\n channel: input.channelId,\n limit: pageLimit,\n latest: cursorLatest,\n oldest: input.oldest,\n include_all_metadata: input.includeReactions || hasReactionFilters ? true : undefined,\n });\n const messages = asArray(resp.messages);\n if (messages.length === 0) {\n break;\n }\n for (const m of messages) {\n if (!isRecord(m)) {\n continue;\n }\n if (\n hasReactionFilters &&\n !passesReactionNameFilters(m, {\n withReactions,\n withoutReactions,\n })\n ) {\n continue;\n }\n const files = asArray(m.files)\n .map((f) => toSlackFileSummary(f))\n .filter((f): f is SlackFileSummary => f !== null);\n const enrichedFiles = files.length > 0 ? await enrichFiles(client, files) : undefined;\n\n const text = getString(m.text) ?? \"\";\n out.push({\n channel_id: input.channelId,\n ts: getString(m.ts) ?? \"\",\n thread_ts: getString(m.thread_ts),\n reply_count: getNumber(m.reply_count),\n user: getString(m.user),\n bot_id: getString(m.bot_id),\n text,\n markdown: slackMrkdwnToMarkdown(text),\n blocks: Array.isArray(m.blocks) ? (m.blocks as unknown[]) : undefined,\n attachments: Array.isArray(m.attachments) ? (m.attachments as unknown[]) : undefined,\n files: enrichedFiles,\n reactions: Array.isArray(m.reactions) ? (m.reactions as unknown[]) : undefined,\n });\n if (out.length >= limit) {\n break;\n }\n }\n\n if (out.length >= limit || !hasReactionFilters) {\n break;\n }\n\n const last = messages.at(-1);\n const nextLatest = isRecord(last) ? getString(last.ts) : undefined;\n if (!nextLatest || nextLatest === cursorLatest) {\n break;\n }\n cursorLatest = nextLatest;\n }\n\n // conversations.history returns newest-first; normalize to chronological.\n out.sort((a, b) => Number.parseFloat(a.ts) - Number.parseFloat(b.ts));\n return out;\n}\n\nexport function passesReactionNameFilters(\n msg: Record<string, unknown>,\n input: { withReactions?: string[]; withoutReactions?: string[] },\n): boolean {\n const withReactions = input.withReactions ?? [];\n const withoutReactions = input.withoutReactions ?? [];\n const names = new Set<string>();\n for (const r of asArray(msg.reactions)) {\n if (!isRecord(r)) {\n continue;\n }\n const name = getString(r.name)?.trim();\n if (name) {\n names.add(name);\n }\n }\n if (withReactions.some((name) => !names.has(name))) {\n return false;\n }\n if (withoutReactions.some((name) => names.has(name))) {\n return false;\n }\n return true;\n}\n\nexport async function fetchThread(\n client: SlackApiClient,\n input: { channelId: string; threadTs: string; includeReactions?: boolean },\n): Promise<SlackMessageSummary[]> {\n const out: SlackMessageSummary[] = [];\n let cursor: string | undefined;\n\n for (;;) {\n const resp = await client.api(\"conversations.replies\", {\n channel: input.channelId,\n ts: input.threadTs,\n limit: 200,\n cursor,\n include_all_metadata: input.includeReactions ? true : undefined,\n });\n const messages = asArray(resp.messages);\n for (const m of messages) {\n if (!isRecord(m)) {\n continue;\n }\n const files = asArray(m.files)\n .map((f) => toSlackFileSummary(f))\n .filter((f): f is SlackFileSummary => f !== null);\n const enrichedFiles = files.length > 0 ? await enrichFiles(client, files) : undefined;\n\n const text = getString(m.text) ?? \"\";\n out.push({\n channel_id: input.channelId,\n ts: getString(m.ts) ?? \"\",\n thread_ts: getString(m.thread_ts),\n reply_count: getNumber(m.reply_count),\n user: getString(m.user),\n bot_id: getString(m.bot_id),\n text,\n markdown: slackMrkdwnToMarkdown(text),\n blocks: Array.isArray(m.blocks) ? (m.blocks as unknown[]) : undefined,\n attachments: Array.isArray(m.attachments) ? (m.attachments as unknown[]) : undefined,\n files: enrichedFiles,\n reactions: Array.isArray(m.reactions) ? (m.reactions as unknown[]) : undefined,\n });\n }\n const meta = isRecord(resp.response_metadata) ? resp.response_metadata : null;\n const next = meta ? getString(meta.next_cursor) : undefined;\n if (!next) {\n break;\n }\n cursor = next;\n }\n\n // Slack returns newest-first for some methods; normalize to chronological.\n out.sort((a, b) => Number.parseFloat(a.ts) - Number.parseFloat(b.ts));\n return out;\n}\n",
|
|
37
|
+
"/**\n * Rich-text block rendering helpers extracted from render.ts.\n */\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction getString(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n\nexport function extractMrkdwnFromRichTextBlock(block: unknown): string {\n if (!isRecord(block)) {\n return \"\";\n }\n const elements = Array.isArray(block.elements) ? block.elements : [];\n const out: string[] = [];\n for (const el of elements) {\n const txt = extractMrkdwnFromRichTextElement(el);\n if (txt.trim()) {\n out.push(txt);\n }\n }\n return out.join(\"\\n\\n\");\n}\n\nfunction extractMrkdwnFromRichTextElement(el: unknown): string {\n if (!isRecord(el)) {\n return \"\";\n }\n const t = getString(el.type);\n\n if (t === \"rich_text_section\") {\n const parts: string[] = [];\n for (const child of Array.isArray(el.elements) ? el.elements : []) {\n parts.push(extractMrkdwnFromRichTextElement(child));\n }\n return parts.join(\"\");\n }\n\n if (t === \"rich_text_preformatted\") {\n const parts: string[] = [];\n for (const child of Array.isArray(el.elements) ? el.elements : []) {\n parts.push(extractMrkdwnFromRichTextElement(child));\n }\n const text = parts.join(\"\");\n return text ? `\\`\\`\\`${text}\\`\\`\\`` : \"\";\n }\n\n if (t === \"rich_text_quote\") {\n const parts: string[] = [];\n for (const child of Array.isArray(el.elements) ? el.elements : []) {\n parts.push(extractMrkdwnFromRichTextElement(child));\n }\n const text = parts.join(\"\").trim();\n if (!text) {\n return \"\";\n }\n return text\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n }\n\n if (t === \"rich_text_list\") {\n const style = typeof el.style === \"string\" ? el.style : \"bullet\";\n const items: string[] = [];\n const itemEls = Array.isArray(el.elements) ? el.elements : [];\n let num = 0;\n for (const item of itemEls) {\n const txt = extractMrkdwnFromRichTextElement(item).trim();\n if (!txt) {\n continue;\n }\n num++;\n const prefix = style === \"ordered\" ? `${num}. ` : \"- \";\n items.push(`${prefix}${txt}`);\n }\n return items.join(\"\\n\");\n }\n\n if (t === \"text\") {\n const raw = getString(el.text);\n const style = isRecord(el.style) ? el.style : null;\n if (!style) {\n return raw;\n }\n let text = raw;\n if (style.code) {\n text = `\\`${text}\\``;\n }\n if (style.bold) {\n text = `*${text}*`;\n }\n if (style.italic) {\n text = `_${text}_`;\n }\n if (style.strike) {\n text = `~${text}~`;\n }\n return text;\n }\n\n if (t === \"link\") {\n const url = getString(el.url);\n const text = getString(el.text);\n if (!url) {\n return text;\n }\n return text ? `<${url}|${text}>` : url;\n }\n\n if (t === \"emoji\") {\n const name = getString(el.name);\n return name ? `:${name}:` : \"\";\n }\n\n if (t === \"user\") {\n const userId = getString(el.user_id);\n return userId ? `<@${userId}>` : \"\";\n }\n\n if (t === \"channel\") {\n const channelId = getString(el.channel_id);\n return channelId ? `<#${channelId}>` : \"\";\n }\n\n return \"\";\n}\n",
|
|
38
|
+
"import { slackMrkdwnToMarkdown } from \"./mrkdwn.ts\";\nimport { extractMrkdwnFromRichTextBlock } from \"./render-rich-text.ts\";\n\ntype UnknownRecord = Record<string, unknown>;\ntype RenderState = { depth: number; seen: WeakSet<object> };\nconst MAX_ATTACHMENT_DEPTH = 8;\n\nexport function renderSlackMessageContent(msg: unknown): string {\n const msgObj = isRecord(msg) ? msg : {};\n const blockMrkdwn = extractMrkdwnFromBlocks(msgObj.blocks);\n const attachmentMrkdwn = extractMrkdwnFromAttachments(msgObj.attachments, {\n depth: 0,\n seen: new WeakSet<object>(),\n });\n const combined = [blockMrkdwn.trim(), attachmentMrkdwn.trim()].filter(Boolean).join(\"\\n\\n\");\n if (combined) {\n return slackMrkdwnToMarkdown(combined).trim();\n }\n\n const text = getString(msgObj.text).trim();\n if (text) {\n return slackMrkdwnToMarkdown(text).trim();\n }\n\n return \"\";\n}\n\nfunction extractMrkdwnFromBlocks(blocks: unknown): string {\n if (!Array.isArray(blocks)) {\n return \"\";\n }\n\n const out: string[] = [];\n for (const b of blocks) {\n if (!isRecord(b)) {\n continue;\n }\n const type = getString(b.type);\n if (type === \"section\") {\n const text = isRecord(b.text) ? b.text : null;\n const textType = text ? getString(text.type) : \"\";\n if (textType === \"mrkdwn\" || textType === \"plain_text\") {\n out.push(getString(text?.text));\n }\n if (Array.isArray(b.fields)) {\n for (const f of b.fields) {\n if (!isRecord(f)) {\n continue;\n }\n const fieldType = getString(f.type);\n if (fieldType === \"mrkdwn\" || fieldType === \"plain_text\") {\n out.push(getString(f.text));\n }\n }\n }\n // Buttons often carry the only URL (e.g. \"View Progress\")\n const accessory = isRecord(b.accessory) ? b.accessory : null;\n if (getString(accessory?.type) === \"button\") {\n const label = getString((accessory?.text as UnknownRecord | undefined)?.text);\n const url = getString(accessory?.url);\n if (url) {\n out.push(label ? `${label}: ${url}` : url);\n }\n }\n continue;\n }\n if (type === \"actions\" && Array.isArray(b.elements)) {\n for (const el of b.elements) {\n if (!isRecord(el)) {\n continue;\n }\n if (getString(el.type) === \"button\") {\n const label = getString((el.text as UnknownRecord | undefined)?.text);\n const url = getString(el.url);\n if (url) {\n out.push(label ? `${label}: ${url}` : url);\n }\n }\n }\n continue;\n }\n if (type === \"context\" && Array.isArray(b.elements)) {\n for (const el of b.elements) {\n if (!isRecord(el)) {\n continue;\n }\n const elType = getString(el.type);\n if (elType === \"mrkdwn\") {\n out.push(getString(el.text));\n }\n if (elType === \"plain_text\") {\n out.push(getString(el.text));\n }\n }\n continue;\n }\n if (type === \"image\") {\n const alt = getString(b.alt_text);\n const url = getString(b.image_url);\n if (url) {\n out.push(alt ? `${alt}: ${url}` : url);\n }\n continue;\n }\n if (type === \"rich_text\") {\n const rich = extractMrkdwnFromRichTextBlock(b);\n if (rich.trim()) {\n out.push(rich);\n }\n continue;\n }\n }\n\n return out.join(\"\\n\\n\");\n}\n\nfunction extractMrkdwnFromAttachments(attachments: unknown, state: RenderState): string {\n if (state.depth >= MAX_ATTACHMENT_DEPTH) {\n return \"\";\n }\n if (!Array.isArray(attachments)) {\n return \"\";\n }\n\n const parts: string[] = [];\n for (const a of attachments) {\n if (!isRecord(a)) {\n continue;\n }\n if (state.seen.has(a)) {\n continue;\n }\n state.seen.add(a);\n\n const isSharedMessage = Boolean(\n a.is_share || (a.is_msg_unfurl && Array.isArray(a.message_blocks)),\n );\n\n const chunk: string[] = [];\n\n if (isSharedMessage) {\n chunk.push(formatForwardHeader(a));\n\n const body =\n extractForwardedMessageBody(a, state).trim() ||\n extractMrkdwnFromAttachments(a.attachments, nextState(state)).trim() ||\n getString(a.text).trim();\n if (body) {\n chunk.push(quoteMarkdown(body));\n }\n\n if (chunk.length > 0) {\n parts.push(chunk.join(\"\\n\"));\n }\n continue;\n }\n\n const blocks = extractMrkdwnFromBlocks(a.blocks);\n if (blocks.trim()) {\n chunk.push(blocks);\n }\n const pretext = getString(a.pretext);\n if (pretext) {\n chunk.push(pretext);\n }\n const title = getString(a.title);\n const titleLink = getString(a.title_link);\n if (titleLink && title) {\n chunk.push(`<${titleLink}|${title}>`);\n } else if (title) {\n chunk.push(title);\n } else if (titleLink) {\n chunk.push(titleLink);\n }\n const text = getString(a.text);\n if (text) {\n chunk.push(text);\n }\n if (Array.isArray(a.fields)) {\n for (const f of a.fields) {\n if (!isRecord(f)) {\n continue;\n }\n const fieldTitle = getString(f.title);\n const value = getString(f.value);\n if (fieldTitle && value) {\n chunk.push(`${fieldTitle}\\n${value}`);\n } else if (fieldTitle) {\n chunk.push(fieldTitle);\n } else if (value) {\n chunk.push(value);\n }\n }\n }\n const fallback = getString(a.fallback);\n if (chunk.length === 0 && fallback) {\n chunk.push(fallback);\n }\n const nestedAttachments = extractMrkdwnFromAttachments(a.attachments, nextState(state));\n if (nestedAttachments.trim()) {\n chunk.push(nestedAttachments);\n }\n if (chunk.length > 0) {\n parts.push(uniqueTexts(chunk).join(\"\\n\"));\n }\n }\n return uniqueTexts(parts).join(\"\\n\\n\");\n}\n\nfunction formatForwardHeader(a: Record<string, unknown>): string {\n const authorName = getString(a.author_name);\n const authorLink = getString(a.author_link);\n const fromUrl = getString(a.from_url);\n\n const authorPart = authorName && authorLink ? `<${authorLink}|${authorName}>` : authorName || \"\";\n const sourcePart = fromUrl ? `<${fromUrl}|original>` : \"\";\n\n if (authorPart && sourcePart) {\n return `*Forwarded from ${authorPart} | ${sourcePart}*`;\n }\n if (authorPart) {\n return `*Forwarded from ${authorPart}*`;\n }\n if (sourcePart) {\n return `*Forwarded message | ${sourcePart}*`;\n }\n return \"*Forwarded message*\";\n}\n\nfunction extractForwardedMessageBody(\n attachment: Record<string, unknown>,\n state: RenderState,\n): string {\n const messageBlocks = attachment.message_blocks;\n const topLevelFiles = extractFileMentions(attachment.files).trim();\n if (!Array.isArray(messageBlocks)) {\n return topLevelFiles;\n }\n const out: string[] = [];\n for (const mb of messageBlocks) {\n if (!isRecord(mb)) {\n continue;\n }\n const message = isRecord(mb.message) ? mb.message : null;\n if (!message) {\n continue;\n }\n const messageText = getString(message.text).trim();\n const blocksContent = extractMrkdwnFromBlocks(message.blocks).trim();\n const attachmentsContent = extractMrkdwnFromAttachments(\n message.attachments,\n nextState(state),\n ).trim();\n const fileMentions = extractFileMentions(message.files).trim();\n const content = uniqueTexts([\n blocksContent,\n attachmentsContent,\n messageText,\n fileMentions,\n ]).join(\"\\n\\n\");\n if (content) {\n out.push(content);\n }\n }\n return uniqueTexts([topLevelFiles, ...out]).join(\"\\n\");\n}\n\nfunction nextState(state: RenderState): RenderState {\n return { depth: state.depth + 1, seen: state.seen };\n}\n\nfunction quoteMarkdown(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n}\n\nfunction uniqueTexts(values: string[]): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const text = value.trim();\n if (!text || seen.has(text)) {\n continue;\n }\n seen.add(text);\n out.push(text);\n }\n return out;\n}\n\nfunction extractFileMentions(files: unknown): string {\n if (!Array.isArray(files)) {\n return \"\";\n }\n const lines: string[] = [];\n for (const f of files) {\n if (!isRecord(f)) {\n continue;\n }\n const name = getString(f.title) || getString(f.name) || \"file\";\n const url =\n getString(f.permalink) || getString(f.url_private_download) || getString(f.url_private);\n if (url) {\n lines.push(`<${url}|${name}>`);\n continue;\n }\n lines.push(name);\n }\n return uniqueTexts(lines).join(\"\\n\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction getString(value: unknown): string {\n return typeof value === \"string\" ? value : \"\";\n}\n",
|
|
39
|
+
"import type { SlackMessageSummary } from \"./messages.ts\";\nimport { renderSlackMessageContent } from \"./render.ts\";\nimport { getNumber, getString, isRecord } from \"../lib/object-type-guards.ts\";\n\nexport type CompactSlackMessage = {\n channel_id: string;\n ts: string;\n thread_ts?: string;\n author?: { user_id?: string; bot_id?: string };\n content?: string;\n files?: {\n mimetype?: string;\n mode?: string;\n path: string;\n }[];\n reactions?: {\n name: string;\n users: string[];\n count?: number;\n }[];\n forwarded_threads?: {\n url: string;\n thread_ts: string;\n channel_id?: string;\n reply_count?: number;\n }[];\n};\n\nexport function toCompactMessage(\n msg: SlackMessageSummary,\n input?: {\n maxSnippetChars?: number;\n maxBodyChars?: number;\n includeReactions?: boolean;\n downloadedPaths?: Record<string, string>;\n },\n): CompactSlackMessage {\n const maxBodyChars = input?.maxBodyChars ?? 8000;\n const includeReactions = input?.includeReactions ?? false;\n\n const rendered = renderSlackMessageContent(msg);\n const content =\n maxBodyChars >= 0 && rendered.length > maxBodyChars\n ? `${rendered.slice(0, maxBodyChars)}\\n…`\n : rendered;\n\n const files = msg.files\n ?.map((f) => {\n const path = input?.downloadedPaths?.[f.id];\n if (!path) {\n return null;\n }\n return {\n mimetype: f.mimetype,\n mode: f.mode,\n path,\n };\n })\n .filter((f): f is NonNullable<typeof f> => Boolean(f));\n\n return {\n channel_id: msg.channel_id,\n ts: msg.ts,\n thread_ts: msg.thread_ts ?? ((msg.reply_count ?? 0) > 0 ? msg.ts : undefined),\n author: msg.user || msg.bot_id ? { user_id: msg.user, bot_id: msg.bot_id } : undefined,\n content: content ? content : undefined,\n files: files && files.length > 0 ? files : undefined,\n reactions: includeReactions ? compactReactions(msg.reactions) : undefined,\n forwarded_threads: extractForwardedThreads(msg.attachments),\n };\n}\n\nexport function compactReactions(\n reactions: unknown[] | undefined,\n): Array<{ name: string; users: string[]; count?: number }> | undefined {\n if (!Array.isArray(reactions) || reactions.length === 0) {\n return undefined;\n }\n const out: { name: string; users: string[]; count?: number }[] = [];\n for (const r of reactions) {\n if (!isRecord(r)) {\n continue;\n }\n const name = getString(r.name)?.trim() ?? \"\";\n if (!name) {\n continue;\n }\n const users = Array.isArray(r.users)\n ? r.users.map((u) => String(u)).filter((u) => /^U[A-Z0-9]{8,}$/.test(u))\n : [];\n const count = typeof r.count === \"number\" && r.count !== users.length ? r.count : undefined;\n out.push({ name, users, count });\n }\n return out.length ? out : undefined;\n}\n\nexport function extractForwardedThreads(attachments: unknown[] | undefined):\n | {\n url: string;\n thread_ts: string;\n channel_id?: string;\n reply_count?: number;\n }[]\n | undefined {\n if (!Array.isArray(attachments) || attachments.length === 0) {\n return undefined;\n }\n const out: {\n url: string;\n thread_ts: string;\n channel_id?: string;\n reply_count?: number;\n }[] = [];\n const seen = new Set<string>();\n for (const attachment of attachments) {\n if (!isRecord(attachment)) {\n continue;\n }\n const fromUrl = getString(attachment.from_url)?.trim();\n if (!fromUrl) {\n continue;\n }\n let parsed: URL;\n try {\n parsed = new URL(fromUrl);\n } catch {\n continue;\n }\n const threadTs = parsed.searchParams.get(\"thread_ts\")?.trim();\n if (!threadTs || !/^\\d{6,}\\.\\d{6}$/.test(threadTs)) {\n continue;\n }\n const channelId = parsed.searchParams.get(\"cid\")?.trim();\n const replyCount = getNumber(attachment.reply_count);\n const key = `${fromUrl}::${threadTs}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n out.push({\n url: fromUrl,\n thread_ts: threadTs,\n channel_id: channelId || undefined,\n reply_count: replyCount,\n });\n }\n return out.length ? out : undefined;\n}\n",
|
|
40
|
+
"import type { SlackMessageRef } from \"./url.ts\";\nimport type { SlackApiClient } from \"./client.ts\";\nimport { slackMrkdwnToMarkdown } from \"./mrkdwn.ts\";\nimport { asArray, getNumber, getString, isRecord } from \"../lib/object-type-guards.ts\";\nimport { enrichFiles, toSlackFileSummary } from \"./message-api-parsing.ts\";\n\nexport type SlackFileSummary = {\n id: string;\n name?: string;\n title?: string;\n mimetype?: string;\n filetype?: string;\n mode?: string;\n permalink?: string;\n url_private?: string;\n url_private_download?: string;\n size?: number;\n snippet?: {\n content?: string;\n language?: string;\n };\n};\n\nexport type SlackMessageSummary = {\n channel_id: string;\n ts: string;\n thread_ts?: string;\n reply_count?: number;\n user?: string;\n bot_id?: string;\n text: string;\n markdown: string;\n blocks?: unknown[];\n attachments?: unknown[];\n files?: SlackFileSummary[];\n reactions?: unknown[];\n};\n\nexport async function fetchMessage(\n client: SlackApiClient,\n input: { ref: SlackMessageRef; includeReactions?: boolean },\n): Promise<SlackMessageSummary> {\n const history = await client.api(\"conversations.history\", {\n channel: input.ref.channel_id,\n latest: input.ref.message_ts,\n inclusive: true,\n limit: 5,\n include_all_metadata: input.includeReactions ? true : undefined,\n });\n const historyMessages = asArray(history.messages);\n let msg = historyMessages.find(\n (m): m is Record<string, unknown> => isRecord(m) && getString(m.ts) === input.ref.message_ts,\n );\n\n // Thread replies are not guaranteed to appear in channel history. If the URL\n // includes ?thread_ts=..., scan the thread directly.\n if (!msg && input.ref.thread_ts_hint) {\n msg = await findMessageInThread(client, {\n channelId: input.ref.channel_id,\n threadTs: input.ref.thread_ts_hint,\n targetTs: input.ref.message_ts,\n includeReactions: input.includeReactions,\n });\n }\n\n // Fallback: if the message_ts is actually the thread root, replies can still\n // be fetched via conversations.replies even if history is missing it.\n if (!msg) {\n try {\n const rootResp = await client.api(\"conversations.replies\", {\n channel: input.ref.channel_id,\n ts: input.ref.message_ts,\n limit: 1,\n include_all_metadata: input.includeReactions ? true : undefined,\n });\n const [root] = asArray(rootResp.messages);\n if (isRecord(root) && getString(root.ts) === input.ref.message_ts) {\n msg = root;\n }\n } catch {\n // ignore\n }\n }\n\n if (!msg) {\n throw new Error(\"Message not found (no access or wrong URL)\");\n }\n\n const files = asArray(msg.files)\n .map((f) => toSlackFileSummary(f))\n .filter((f): f is SlackFileSummary => f !== null);\n const enrichedFiles = files.length > 0 ? await enrichFiles(client, files) : undefined;\n\n const text = getString(msg.text) ?? \"\";\n const ts = getString(msg.ts) ?? input.ref.message_ts;\n const blocks = Array.isArray(msg.blocks) ? (msg.blocks as unknown[]) : undefined;\n const attachments = Array.isArray(msg.attachments) ? (msg.attachments as unknown[]) : undefined;\n const reactions = Array.isArray(msg.reactions) ? (msg.reactions as unknown[]) : undefined;\n return {\n channel_id: input.ref.channel_id,\n ts,\n thread_ts: getString(msg.thread_ts),\n reply_count: getNumber(msg.reply_count),\n user: getString(msg.user),\n bot_id: getString(msg.bot_id),\n text,\n markdown: slackMrkdwnToMarkdown(text),\n blocks,\n attachments,\n files: enrichedFiles,\n reactions,\n };\n}\n\nasync function findMessageInThread(\n client: SlackApiClient,\n input: {\n channelId: string;\n threadTs: string;\n targetTs: string;\n includeReactions?: boolean;\n },\n): Promise<Record<string, unknown> | undefined> {\n let cursor: string | undefined;\n for (;;) {\n const resp = await client.api(\"conversations.replies\", {\n channel: input.channelId,\n ts: input.threadTs,\n limit: 200,\n cursor,\n include_all_metadata: input.includeReactions ? true : undefined,\n });\n const messages = asArray(resp.messages);\n const found = messages.find(\n (m): m is Record<string, unknown> => isRecord(m) && getString(m.ts) === input.targetTs,\n );\n if (found) {\n return found;\n }\n const meta = isRecord(resp.response_metadata) ? resp.response_metadata : null;\n const next = meta ? getString(meta.next_cursor) : undefined;\n if (!next) {\n break;\n }\n cursor = next;\n }\n return undefined;\n}\n\nexport async function fetchChannelHistory(\n client: SlackApiClient,\n input: {\n channelId: string;\n limit?: number;\n latest?: string;\n oldest?: string;\n includeReactions?: boolean;\n withReactions?: string[];\n withoutReactions?: string[];\n },\n): Promise<SlackMessageSummary[]> {\n const raw = input.limit ?? 25;\n const limit = Number.isFinite(raw) ? Math.min(Math.max(raw, 1), 200) : 25;\n const out: SlackMessageSummary[] = [];\n const withReactions = input.withReactions ?? [];\n const withoutReactions = input.withoutReactions ?? [];\n const hasReactionFilters = withReactions.length > 0 || withoutReactions.length > 0;\n const pageLimit = hasReactionFilters ? 200 : limit;\n\n let cursorLatest = input.latest;\n for (;;) {\n const resp = await client.api(\"conversations.history\", {\n channel: input.channelId,\n limit: pageLimit,\n latest: cursorLatest,\n oldest: input.oldest,\n include_all_metadata: input.includeReactions || hasReactionFilters ? true : undefined,\n });\n const messages = asArray(resp.messages);\n if (messages.length === 0) {\n break;\n }\n for (const m of messages) {\n if (!isRecord(m)) {\n continue;\n }\n if (\n hasReactionFilters &&\n !passesReactionNameFilters(m, {\n withReactions,\n withoutReactions,\n })\n ) {\n continue;\n }\n const files = asArray(m.files)\n .map((f) => toSlackFileSummary(f))\n .filter((f): f is SlackFileSummary => f !== null);\n const enrichedFiles = files.length > 0 ? await enrichFiles(client, files) : undefined;\n\n const text = getString(m.text) ?? \"\";\n out.push({\n channel_id: input.channelId,\n ts: getString(m.ts) ?? \"\",\n thread_ts: getString(m.thread_ts),\n reply_count: getNumber(m.reply_count),\n user: getString(m.user),\n bot_id: getString(m.bot_id),\n text,\n markdown: slackMrkdwnToMarkdown(text),\n blocks: Array.isArray(m.blocks) ? (m.blocks as unknown[]) : undefined,\n attachments: Array.isArray(m.attachments) ? (m.attachments as unknown[]) : undefined,\n files: enrichedFiles,\n reactions: Array.isArray(m.reactions) ? (m.reactions as unknown[]) : undefined,\n });\n if (out.length >= limit) {\n break;\n }\n }\n\n if (out.length >= limit || !hasReactionFilters) {\n break;\n }\n\n const last = messages.at(-1);\n const nextLatest = isRecord(last) ? getString(last.ts) : undefined;\n if (!nextLatest || nextLatest === cursorLatest) {\n break;\n }\n cursorLatest = nextLatest;\n }\n\n // conversations.history returns newest-first; normalize to chronological.\n out.sort((a, b) => Number.parseFloat(a.ts) - Number.parseFloat(b.ts));\n return out;\n}\n\nexport function passesReactionNameFilters(\n msg: Record<string, unknown>,\n input: { withReactions?: string[]; withoutReactions?: string[] },\n): boolean {\n const withReactions = input.withReactions ?? [];\n const withoutReactions = input.withoutReactions ?? [];\n const names = new Set<string>();\n for (const r of asArray(msg.reactions)) {\n if (!isRecord(r)) {\n continue;\n }\n const name = getString(r.name)?.trim();\n if (name) {\n names.add(name);\n }\n }\n if (withReactions.some((name) => !names.has(name))) {\n return false;\n }\n if (withoutReactions.some((name) => names.has(name))) {\n return false;\n }\n return true;\n}\n\nexport async function fetchThread(\n client: SlackApiClient,\n input: { channelId: string; threadTs: string; includeReactions?: boolean },\n): Promise<SlackMessageSummary[]> {\n const out: SlackMessageSummary[] = [];\n let cursor: string | undefined;\n\n for (;;) {\n const resp = await client.api(\"conversations.replies\", {\n channel: input.channelId,\n ts: input.threadTs,\n limit: 200,\n cursor,\n include_all_metadata: input.includeReactions ? true : undefined,\n });\n const messages = asArray(resp.messages);\n for (const m of messages) {\n if (!isRecord(m)) {\n continue;\n }\n const files = asArray(m.files)\n .map((f) => toSlackFileSummary(f))\n .filter((f): f is SlackFileSummary => f !== null);\n const enrichedFiles = files.length > 0 ? await enrichFiles(client, files) : undefined;\n\n const text = getString(m.text) ?? \"\";\n out.push({\n channel_id: input.channelId,\n ts: getString(m.ts) ?? \"\",\n thread_ts: getString(m.thread_ts),\n reply_count: getNumber(m.reply_count),\n user: getString(m.user),\n bot_id: getString(m.bot_id),\n text,\n markdown: slackMrkdwnToMarkdown(text),\n blocks: Array.isArray(m.blocks) ? (m.blocks as unknown[]) : undefined,\n attachments: Array.isArray(m.attachments) ? (m.attachments as unknown[]) : undefined,\n files: enrichedFiles,\n reactions: Array.isArray(m.reactions) ? (m.reactions as unknown[]) : undefined,\n });\n }\n const meta = isRecord(resp.response_metadata) ? resp.response_metadata : null;\n const next = meta ? getString(meta.next_cursor) : undefined;\n if (!next) {\n break;\n }\n cursor = next;\n }\n\n // Slack returns newest-first for some methods; normalize to chronological.\n out.sort((a, b) => Number.parseFloat(a.ts) - Number.parseFloat(b.ts));\n return out;\n}\n\nexport { toCompactMessage, type CompactSlackMessage } from \"./message-compact.ts\";\n",
|
|
37
41
|
"export type SlackMessageRef = {\n workspace_url: string;\n channel_id: string;\n message_ts: string; // \"1234567890.123456\"\n thread_ts_hint?: string; // from URL query (?thread_ts=...)\n raw: string;\n /** True if the URL looks like it may have been truncated by shell & interpretation */\n possiblyTruncated?: boolean;\n};\n\nexport function parseSlackMessageUrl(input: string): SlackMessageRef {\n let url: URL;\n try {\n url = new URL(input);\n } catch {\n throw new Error(`Invalid URL: ${input}`);\n }\n\n if (!/\\.slack\\.com$/i.test(url.hostname)) {\n throw new Error(`Not a Slack workspace URL: ${url.hostname}`);\n }\n\n const parts = url.pathname.split(\"/\").filter(Boolean);\n // /archives/<channel>/p<digits>\n if (parts.length < 3 || parts[0] !== \"archives\") {\n throw new Error(`Unsupported Slack URL path: ${url.pathname}`);\n }\n\n const channel_id = parts[1]!;\n const messagePart = parts[2]!;\n const match = messagePart.match(/^p(\\d{7,})$/);\n if (!match) {\n throw new Error(`Unsupported Slack message id: ${messagePart}`);\n }\n\n const digits = match[1]!;\n if (digits.length <= 6) {\n throw new Error(`Invalid Slack message id: ${messagePart}`);\n }\n const seconds = digits.slice(0, -6);\n const micros = digits.slice(-6);\n const message_ts = `${seconds}.${micros}`;\n\n const threadTsParam = url.searchParams.get(\"thread_ts\");\n const thread_ts_hint =\n threadTsParam && /^\\d{6,}\\.\\d{6}$/.test(threadTsParam) ? threadTsParam : undefined;\n\n // Slack URLs with thread_ts typically also have cid param. If thread_ts exists but\n // cid doesn't, the URL was likely truncated by shell interpreting & as background.\n const hasCid = url.searchParams.has(\"cid\");\n const possiblyTruncated = Boolean(threadTsParam && !hasCid);\n\n const workspace_url = `${url.protocol}//${url.host}`;\n return { workspace_url, channel_id, message_ts, thread_ts_hint, raw: input, possiblyTruncated };\n}\n",
|
|
38
42
|
"import { parseSlackMessageUrl, type SlackMessageRef } from \"../slack/url.ts\";\nimport { isChannelId, isUserId } from \"../slack/channels.ts\";\n\nexport type MsgTarget =\n | { kind: \"url\"; ref: SlackMessageRef }\n | { kind: \"channel\"; channel: string }\n | { kind: \"user\"; userId: string };\n\nexport function parseMsgTarget(input: string): MsgTarget {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new Error(\"Missing target\");\n }\n\n try {\n const ref = parseSlackMessageUrl(trimmed);\n return { kind: \"url\", ref };\n } catch {\n // not a slack message URL\n }\n\n if (isUserId(trimmed)) {\n return { kind: \"user\", userId: trimmed };\n }\n if (trimmed.startsWith(\"#\")) {\n return { kind: \"channel\", channel: trimmed };\n }\n if (isChannelId(trimmed)) {\n return { kind: \"channel\", channel: trimmed };\n }\n\n // Allow bare channel names (\"general\") for convenience.\n return { kind: \"channel\", channel: `#${trimmed}` };\n}\n",
|
|
39
|
-
"import type { SlackAuth } from \"../slack/client.ts\";\nimport type { SlackMessageSummary } from \"../slack/messages.ts\";\nimport { ensureDownloadsDir } from \"../lib/tmp-paths.ts\";\nimport { downloadSlackFile } from \"../slack/files.ts\";\nimport { htmlToMarkdown } from \"../slack/html-to-md.ts\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nfunction inferFileExtension(file: {\n mimetype?: string;\n filetype?: string;\n name?: string;\n title?: string;\n}): string | null {\n const mt = (file.mimetype || \"\").toLowerCase();\n const ft = (file.filetype || \"\").toLowerCase();\n\n if (mt === \"image/png\" || ft === \"png\") {\n return \"png\";\n }\n if (mt === \"image/jpeg\" || mt === \"image/jpg\" || ft === \"jpg\" || ft === \"jpeg\") {\n return \"jpg\";\n }\n if (mt === \"image/webp\" || ft === \"webp\") {\n return \"webp\";\n }\n if (mt === \"image/gif\" || ft === \"gif\") {\n return \"gif\";\n }\n\n if (mt === \"text/plain\" || ft === \"text\") {\n return \"txt\";\n }\n if (mt === \"text/markdown\" || ft === \"markdown\" || ft === \"md\") {\n return \"md\";\n }\n if (mt === \"application/json\" || ft === \"json\") {\n return \"json\";\n }\n\n const name = file.name || file.title || \"\";\n const match = name.match(/\\.([A-Za-z0-9]{1,10})$/);\n return match ? match[1]!.toLowerCase() : null;\n}\n\nconst CANVAS_MODES = new Set([\"canvas\", \"quip\", \"docs\"]);\n\nfunction looksLikeAuthPage(html: string): boolean {\n return /<form[^>]+signin|data-qa=\"signin|<title>[^<]*Sign\\s*in/i.test(html);\n}\n\nasync function downloadCanvasAsMarkdown(input: {\n auth: SlackAuth;\n fileId: string;\n url: string;\n destDir: string;\n}): Promise<string> {\n const htmlPath = await downloadSlackFile({\n auth: input.auth,\n url: input.url,\n destDir: input.destDir,\n preferredName: `${input.fileId}.html`,\n options: { allowHtml: true },\n });\n const html = await readFile(htmlPath, \"utf8\");\n if (looksLikeAuthPage(html)) {\n throw new Error(\"Downloaded auth/login page instead of canvas content (token may be expired)\");\n }\n\n const markdown = htmlToMarkdown(html).trim();\n const safeName = `${input.fileId.replace(/[\\\\/<>\"|?*]/g, \"_\")}.md`;\n const markdownPath = join(input.destDir, safeName);\n await writeFile(markdownPath, markdown, \"utf8\");\n return markdownPath;\n}\n\nexport async function downloadMessageFiles(input: {\n auth: SlackAuth;\n messages: SlackMessageSummary[];\n}): Promise<Record<string, string>> {\n const downloadedPaths: Record<string, string> = {};\n const downloadsDir = await ensureDownloadsDir();\n\n for (const message of input.messages) {\n for (const file of message.files ?? []) {\n if (downloadedPaths[file.id]) {\n continue;\n }\n\n const isCanvas = file.mode != null && CANVAS_MODES.has(file.mode);\n const url = isCanvas\n ? file.url_private || file.url_private_download\n : file.url_private_download || file.url_private;\n if (!url) {\n continue;\n }\n\n try {\n if (isCanvas) {\n downloadedPaths[file.id] = await downloadCanvasAsMarkdown({\n auth: input.auth,\n fileId: file.id,\n url,\n destDir: downloadsDir,\n });\n } else {\n const ext = inferFileExtension(file);\n downloadedPaths[file.id] = await downloadSlackFile({\n auth: input.auth,\n url,\n destDir: downloadsDir,\n preferredName: `${file.id}${ext ? `.${ext}` : \"\"}`,\n });\n }\n } catch (err) {\n console.error(\n `Warning: skipping file ${file.id}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n return downloadedPaths;\n}\n",
|
|
40
43
|
"export function warnOnTruncatedSlackUrl(ref: { possiblyTruncated?: boolean }): void {\n if (ref.possiblyTruncated) {\n console.error(\n 'Hint: URL may have been truncated by shell. Quote URLs containing \"&\":\\n' +\n ' agent-slack message get \"https://...?thread_ts=...&cid=...\"',\n );\n }\n}\n",
|
|
44
|
+
"type InlineStyle = { bold?: true; italic?: true; strike?: true; code?: true };\n\ntype InlineElement =\n | { type: \"text\"; text: string; style?: InlineStyle }\n | { type: \"link\"; url: string; text?: string; style?: InlineStyle };\n\ntype RichTextElement =\n | { type: \"rich_text_section\"; elements: InlineElement[] }\n | {\n type: \"rich_text_list\";\n style: \"bullet\" | \"ordered\";\n indent?: number;\n elements: RichTextListItem[];\n }\n | { type: \"rich_text_preformatted\"; elements: InlineElement[] }\n | { type: \"rich_text_quote\"; elements: InlineElement[] };\n\ntype RichTextListItem = {\n type: \"rich_text_section\";\n elements: InlineElement[];\n};\n\ntype RichTextBlock = {\n type: \"rich_text\";\n elements: RichTextElement[];\n};\n\nconst BULLET_RE = /^(\\s*)[•◦▪▫▸‣●○◆◇\\-*]\\s+(.*)$/;\nconst ORDERED_RE = /^(\\s*)\\d+[.)]\\s+(.*)$/;\nconst CODE_BLOCK_START = /^```/;\nconst BLOCKQUOTE_RE = /^> (.*)$/;\n\n/**\n * Parse mrkdwn inline formatting into Slack rich_text inline elements.\n *\n * Handles: *bold*, _italic_, ~strike~, `code`, <url|label>, <url>\n */\nexport function parseInlineElements(text: string): InlineElement[] {\n const elements: InlineElement[] = [];\n const re = /`([^`]+)`|\\*([^*]+)\\*|_([^_]+)_|~([^~]+)~|<([^>|]+)\\|([^>]+)>|<([^>|]+)>/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(text)) !== null) {\n if (match.index > lastIndex) {\n elements.push({ type: \"text\", text: text.slice(lastIndex, match.index) });\n }\n\n const [, code, bold, italic, strike, linkUrl, linkText, bareUrl] = match;\n if (code != null) {\n elements.push({ type: \"text\", text: code, style: { code: true } });\n } else if (bold != null) {\n elements.push({ type: \"text\", text: bold, style: { bold: true } });\n } else if (italic != null) {\n elements.push({ type: \"text\", text: italic, style: { italic: true } });\n } else if (strike != null) {\n elements.push({ type: \"text\", text: strike, style: { strike: true } });\n } else if (linkUrl != null && linkText != null) {\n elements.push({ type: \"link\", url: linkUrl, text: linkText });\n } else if (bareUrl != null) {\n elements.push({ type: \"link\", url: bareUrl });\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n elements.push({ type: \"text\", text: text.slice(lastIndex) });\n }\n\n return elements.length > 0 ? elements : [{ type: \"text\", text }];\n}\n\n/**\n * Convert mrkdwn text to Slack rich_text blocks when bullet or numbered\n * lists are detected. Returns `null` when the text contains no lists,\n * so the caller can fall back to plain `text`.\n */\nexport function textToRichTextBlocks(text: string): RichTextBlock[] | null {\n const lines = text.split(\"\\n\");\n const elements: RichTextElement[] = [];\n let hasLists = false;\n let idx = 0;\n\n while (idx < lines.length) {\n const line = lines[idx]!;\n\n // Code block\n if (CODE_BLOCK_START.test(line)) {\n idx++; // skip opening ```\n const codeLines: string[] = [];\n while (idx < lines.length && !CODE_BLOCK_START.test(lines[idx]!)) {\n codeLines.push(lines[idx]!);\n idx++;\n }\n if (idx < lines.length) {\n idx++;\n } // skip closing ```\n elements.push({\n type: \"rich_text_preformatted\",\n elements: [{ type: \"text\", text: codeLines.join(\"\\n\") }],\n });\n continue;\n }\n\n // Blockquote\n const quoteMatch = line.match(BLOCKQUOTE_RE);\n if (quoteMatch) {\n const quoteLines: string[] = [];\n while (idx < lines.length) {\n const qm = lines[idx]!.match(BLOCKQUOTE_RE);\n if (!qm) {\n break;\n }\n quoteLines.push(qm[1]!);\n idx++;\n }\n elements.push({\n type: \"rich_text_quote\",\n elements: parseInlineElements(quoteLines.join(\"\\n\")),\n });\n continue;\n }\n\n // Bullet list\n if (BULLET_RE.test(line)) {\n hasLists = true;\n idx = collectList({ lines, startIdx: idx, style: \"bullet\", pattern: BULLET_RE, elements });\n continue;\n }\n\n // Ordered list\n if (ORDERED_RE.test(line)) {\n hasLists = true;\n idx = collectList({ lines, startIdx: idx, style: \"ordered\", pattern: ORDERED_RE, elements });\n continue;\n }\n\n // Plain text — collect consecutive non-special lines\n const textLines: string[] = [];\n while (idx < lines.length) {\n const l = lines[idx]!;\n if (\n BULLET_RE.test(l) ||\n ORDERED_RE.test(l) ||\n CODE_BLOCK_START.test(l) ||\n BLOCKQUOTE_RE.test(l)\n ) {\n break;\n }\n textLines.push(l);\n idx++;\n }\n const content = textLines.join(\"\\n\");\n if (content.trim()) {\n elements.push({\n type: \"rich_text_section\",\n elements: parseInlineElements(content.endsWith(\"\\n\") ? content : `${content}\\n`),\n });\n }\n }\n\n if (!hasLists) {\n return null;\n }\n\n return [{ type: \"rich_text\", elements }];\n}\n\nfunction collectList(input: {\n lines: string[];\n startIdx: number;\n style: \"bullet\" | \"ordered\";\n pattern: RegExp;\n elements: RichTextElement[];\n}): number {\n const { lines, startIdx, style, pattern, elements } = input;\n let idx = startIdx;\n\n // Determine base indent from the first bullet in this group\n const firstMatch = lines[startIdx]!.match(pattern)!;\n const baseIndent = firstMatch[1]!.length;\n\n let currentIndent = -1;\n let currentItems: RichTextListItem[] = [];\n\n while (idx < lines.length) {\n const match = lines[idx]!.match(pattern);\n if (!match) {\n break;\n }\n\n // Anything significantly deeper (>= baseIndent + 2) is a sub-bullet\n const indent = match[1]!.length >= baseIndent + 2 ? 1 : 0;\n const content = match[2]!;\n\n if (currentIndent !== -1 && indent !== currentIndent) {\n elements.push({\n type: \"rich_text_list\",\n style,\n ...(currentIndent > 0 ? { indent: currentIndent } : {}),\n elements: currentItems,\n });\n currentItems = [];\n }\n\n currentIndent = indent;\n currentItems.push({\n type: \"rich_text_section\",\n elements: parseInlineElements(content),\n });\n idx++;\n }\n\n if (currentItems.length > 0) {\n elements.push({\n type: \"rich_text_list\",\n style,\n ...(currentIndent > 0 ? { indent: currentIndent } : {}),\n elements: currentItems,\n });\n }\n\n return idx;\n}\n",
|
|
45
|
+
"import { readFile, stat, realpath } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { SlackApiClient } from \"./client.ts\";\nimport { getString, isRecord } from \"../lib/object-type-guards.ts\";\n\nconst MAX_FILE_SIZE = 100 * 1024 * 1024; // 100 MB — Slack's upload limit\n\nexport async function uploadLocalFileToSlack(input: {\n client: SlackApiClient;\n channelId: string;\n filePath: string;\n threadTs?: string;\n initialComment?: string;\n}): Promise<void> {\n const resolvedPath = await realpath(input.filePath);\n const fileStats = await stat(resolvedPath);\n if (!fileStats.isFile()) {\n throw new Error(`Attachment path is not a file: ${input.filePath}`);\n }\n if (fileStats.size > MAX_FILE_SIZE) {\n throw new Error(\n `File too large (${Math.round(fileStats.size / 1024 / 1024)}MB). Slack allows up to 100MB.`,\n );\n }\n\n const bytes = await readFile(resolvedPath);\n const filename = basename(resolvedPath);\n\n const uploadInitResp = await input.client.api(\"files.getUploadURLExternal\", {\n filename,\n length: bytes.length,\n });\n\n if (isRecord(uploadInitResp) && uploadInitResp.ok === false) {\n const errMsg = typeof uploadInitResp.error === \"string\" ? uploadInitResp.error : \"unknown\";\n throw new Error(`Slack files.getUploadURLExternal failed: ${errMsg}`);\n }\n\n const uploadUrl = getString(uploadInitResp.upload_url);\n const fileId = getString(uploadInitResp.file_id);\n if (!uploadUrl || !fileId) {\n throw new Error(\"Slack did not return an upload URL for file attachment\");\n }\n\n const uploadResp = await fetch(uploadUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Length\": String(bytes.length),\n },\n body: bytes,\n });\n if (!uploadResp.ok) {\n const body = await uploadResp.text().catch(() => \"\");\n throw new Error(\n `Failed to upload attachment bytes (HTTP ${uploadResp.status})${body ? `: ${body}` : \"\"}`,\n );\n }\n\n const completeResp = await input.client.api(\"files.completeUploadExternal\", {\n files: [{ id: fileId, title: filename }],\n channel_id: input.channelId,\n thread_ts: input.threadTs,\n initial_comment: input.initialComment?.trim() || undefined,\n });\n\n if (!isRecord(completeResp) || completeResp.ok !== true) {\n const errMsg =\n isRecord(completeResp) && typeof completeResp.error === \"string\"\n ? completeResp.error\n : \"unknown\";\n throw new Error(`Slack files.completeUploadExternal failed: ${errMsg}`);\n }\n}\n",
|
|
46
|
+
"import type { SlackAuth } from \"../slack/client.ts\";\nimport type { SlackMessageSummary } from \"../slack/messages.ts\";\nimport { ensureDownloadsDir } from \"../lib/tmp-paths.ts\";\nimport { downloadSlackFile } from \"../slack/files.ts\";\nimport { htmlToMarkdown } from \"../slack/html-to-md.ts\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nfunction inferFileExtension(file: {\n mimetype?: string;\n filetype?: string;\n name?: string;\n title?: string;\n}): string | null {\n const mt = (file.mimetype || \"\").toLowerCase();\n const ft = (file.filetype || \"\").toLowerCase();\n\n if (mt === \"image/png\" || ft === \"png\") {\n return \"png\";\n }\n if (mt === \"image/jpeg\" || mt === \"image/jpg\" || ft === \"jpg\" || ft === \"jpeg\") {\n return \"jpg\";\n }\n if (mt === \"image/webp\" || ft === \"webp\") {\n return \"webp\";\n }\n if (mt === \"image/gif\" || ft === \"gif\") {\n return \"gif\";\n }\n\n if (mt === \"text/plain\" || ft === \"text\") {\n return \"txt\";\n }\n if (mt === \"text/markdown\" || ft === \"markdown\" || ft === \"md\") {\n return \"md\";\n }\n if (mt === \"application/json\" || ft === \"json\") {\n return \"json\";\n }\n\n const name = file.name || file.title || \"\";\n const match = name.match(/\\.([A-Za-z0-9]{1,10})$/);\n return match ? match[1]!.toLowerCase() : null;\n}\n\nconst CANVAS_MODES = new Set([\"canvas\", \"quip\", \"docs\"]);\n\nfunction looksLikeAuthPage(html: string): boolean {\n return /<form[^>]+signin|data-qa=\"signin|<title>[^<]*Sign\\s*in/i.test(html);\n}\n\nasync function downloadCanvasAsMarkdown(input: {\n auth: SlackAuth;\n fileId: string;\n url: string;\n destDir: string;\n}): Promise<string> {\n const htmlPath = await downloadSlackFile({\n auth: input.auth,\n url: input.url,\n destDir: input.destDir,\n preferredName: `${input.fileId}.html`,\n options: { allowHtml: true },\n });\n const html = await readFile(htmlPath, \"utf8\");\n if (looksLikeAuthPage(html)) {\n throw new Error(\"Downloaded auth/login page instead of canvas content (token may be expired)\");\n }\n\n const markdown = htmlToMarkdown(html).trim();\n const safeName = `${input.fileId.replace(/[\\\\/<>\"|?*]/g, \"_\")}.md`;\n const markdownPath = join(input.destDir, safeName);\n await writeFile(markdownPath, markdown, \"utf8\");\n return markdownPath;\n}\n\nexport async function downloadMessageFiles(input: {\n auth: SlackAuth;\n messages: SlackMessageSummary[];\n}): Promise<Record<string, string>> {\n const downloadedPaths: Record<string, string> = {};\n const downloadsDir = await ensureDownloadsDir();\n\n for (const message of input.messages) {\n for (const file of message.files ?? []) {\n if (downloadedPaths[file.id]) {\n continue;\n }\n\n const isCanvas = file.mode != null && CANVAS_MODES.has(file.mode);\n const url = isCanvas\n ? file.url_private || file.url_private_download\n : file.url_private_download || file.url_private;\n if (!url) {\n continue;\n }\n\n try {\n if (isCanvas) {\n downloadedPaths[file.id] = await downloadCanvasAsMarkdown({\n auth: input.auth,\n fileId: file.id,\n url,\n destDir: downloadsDir,\n });\n } else {\n const ext = inferFileExtension(file);\n downloadedPaths[file.id] = await downloadSlackFile({\n auth: input.auth,\n url,\n destDir: downloadsDir,\n preferredName: `${file.id}${ext ? `.${ext}` : \"\"}`,\n });\n }\n } catch (err) {\n console.error(\n `Warning: skipping file ${file.id}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n return downloadedPaths;\n}\n",
|
|
41
47
|
"import type { CompactSlackMessage } from \"../slack/messages.ts\";\nimport { asArray, isRecord } from \"../lib/object-type-guards.ts\";\n\nfunction getNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nexport async function getThreadSummary(\n client: { api: (method: string, params?: Record<string, unknown>) => Promise<unknown> },\n input: {\n channelId: string;\n msg: { ts: string; thread_ts?: string; reply_count?: number };\n },\n): Promise<{ ts: string; length: number } | null> {\n const replyCount = input.msg.reply_count ?? 0;\n const rootTs = input.msg.thread_ts ?? (replyCount > 0 ? input.msg.ts : null);\n if (!rootTs) {\n return null;\n }\n\n if (!input.msg.thread_ts && replyCount > 0) {\n return { ts: rootTs, length: 1 + replyCount };\n }\n\n const resp = await client.api(\"conversations.replies\", {\n channel: input.channelId,\n ts: rootTs,\n limit: 1,\n });\n const [root] = asArray(isRecord(resp) ? resp.messages : undefined);\n const rootReplyCount = isRecord(root) ? getNumber(root.reply_count) : undefined;\n if (rootReplyCount === undefined) {\n return { ts: rootTs, length: 1 };\n }\n return { ts: rootTs, length: 1 + rootReplyCount };\n}\n\nexport function toThreadListMessage(\n m: CompactSlackMessage,\n): Omit<CompactSlackMessage, \"channel_id\" | \"thread_ts\"> {\n const { channel_id: _channelId, thread_ts: _threadTs, ...rest } = m;\n return rest;\n}\n",
|
|
42
|
-
"import type { CliContext } from \"./context.ts\";\nimport {\n fetchMessage,\n fetchThread,\n fetchChannelHistory,\n toCompactMessage,\n} from \"../slack/messages.ts\";\nimport { pruneEmpty } from \"../lib/compact-json.ts\";\nimport { parseMsgTarget } from \"./targets.ts\";\nimport { resolveChannelId, openDmChannel } from \"../slack/channels.ts\";\nimport { normalizeSlackReactionName } from \"../slack/emoji.ts\";\nimport { downloadMessageFiles } from \"./message-file-downloads.ts\";\nimport { warnOnTruncatedSlackUrl } from \"./message-url-warning.ts\";\nimport { getThreadSummary, toThreadListMessage } from \"./message-thread-info.ts\";\n\nexport type MessageCommandOptions = {\n maxBodyChars: string;\n workspace?: string;\n ts?: string;\n threadTs?: string;\n limit?: string;\n oldest?: string;\n latest?: string;\n withReaction?: string[];\n withoutReaction?: string[];\n includeReactions?: boolean;\n};\n\nexport function parseLimit(raw: string | undefined): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1) {\n throw new Error(`Invalid --limit value \"${raw}\": must be a positive integer`);\n }\n return n;\n}\n\nexport function requireMessageTs(raw: string | undefined): string {\n const ts = raw?.trim();\n if (!ts) {\n throw new Error('When targeting a channel, you must pass --ts \"<seconds>.<micros>\"');\n }\n return ts;\n}\n\nexport function parseReactionFilters(raw: string[] | undefined): string[] {\n if (!Array.isArray(raw) || raw.length === 0) {\n return [];\n }\n const out: string[] = [];\n for (const value of raw) {\n const normalized = normalizeSlackReactionName(String(value));\n if (!out.includes(normalized)) {\n out.push(normalized);\n }\n }\n return out;\n}\n\nexport function requireOldestWhenReactionFiltersUsed(input: {\n oldest?: string;\n withReactions: string[];\n withoutReactions: string[];\n}): string | undefined {\n const hasReactionFilters = input.withReactions.length > 0 || input.withoutReactions.length > 0;\n const oldest = input.oldest?.trim();\n if (!hasReactionFilters) {\n return oldest;\n }\n if (!oldest) {\n throw new Error(\n 'Reaction filters require --oldest \"<seconds>.<micros>\" to bound scan size. Example: --oldest \"1770165109.628379\"',\n );\n }\n return oldest;\n}\n\nexport async function handleMessageGet(input: {\n ctx: CliContext;\n targetInput: string;\n options: MessageCommandOptions;\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(input.targetInput);\n if (target.kind === \"user\") {\n throw new Error(\n \"message get does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n\n return input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client, auth } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n const includeReactions = Boolean(input.options.includeReactions);\n const msg = await fetchMessage(client, { ref, includeReactions });\n const thread = await getThreadSummary(client, { channelId: ref.channel_id, msg });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: [msg] });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n const message = toCompactMessage(msg, { maxBodyChars, includeReactions, downloadedPaths });\n return pruneEmpty({ message, thread }) as Record<string, unknown>;\n }\n\n const ts = input.options.ts?.trim();\n if (!ts) {\n throw new Error('When targeting a channel, you must pass --ts \"<seconds>.<micros>\"');\n }\n\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n\n const includeReactions = Boolean(input.options.includeReactions);\n const { client, auth, workspace_url } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, target.channel);\n const ref = {\n workspace_url: workspace_url ?? workspaceUrl ?? \"\",\n channel_id: channelId,\n message_ts: ts,\n thread_ts_hint: input.options.threadTs?.trim() || undefined,\n raw: input.targetInput,\n };\n\n const msg = await fetchMessage(client, { ref, includeReactions });\n const thread = await getThreadSummary(client, { channelId, msg });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: [msg] });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n const message = toCompactMessage(msg, { maxBodyChars, includeReactions, downloadedPaths });\n return pruneEmpty({ message, thread }) as Record<string, unknown>;\n },\n });\n}\n\nexport async function handleMessageList(input: {\n ctx: CliContext;\n targetInput: string;\n options: MessageCommandOptions;\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(input.targetInput);\n if (target.kind === \"user\") {\n throw new Error(\n \"message list does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n\n return input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n const withReactions = parseReactionFilters(input.options.withReaction);\n const withoutReactions = parseReactionFilters(input.options.withoutReaction);\n const hasReactionFilters = withReactions.length > 0 || withoutReactions.length > 0;\n\n if (target.kind === \"url\") {\n if (hasReactionFilters) {\n throw new Error(\n \"Reaction filters are only supported for channel history mode (not message URL thread mode)\",\n );\n }\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client, auth } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n const includeReactions = Boolean(input.options.includeReactions);\n const msg = await fetchMessage(client, { ref, includeReactions });\n const rootTs = msg.thread_ts ?? msg.ts;\n const threadMessages = await fetchThread(client, {\n channelId: ref.channel_id,\n threadTs: rootTs,\n includeReactions,\n });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: threadMessages });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n return pruneEmpty({\n messages: threadMessages\n .map((m) => toCompactMessage(m, { maxBodyChars, includeReactions, downloadedPaths }))\n .map(toThreadListMessage),\n }) as Record<string, unknown>;\n }\n\n const { client, auth, workspace_url } = await input.ctx.getClientForWorkspace(workspaceUrl);\n\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n\n const channelId = await resolveChannelId(client, target.channel);\n\n const threadTs = input.options.threadTs?.trim();\n const ts = input.options.ts?.trim();\n\n // No thread specifier → list recent channel messages\n if (!threadTs && !ts) {\n const includeReactions = Boolean(input.options.includeReactions);\n const limit = parseLimit(input.options.limit);\n const oldest = requireOldestWhenReactionFiltersUsed({\n oldest: input.options.oldest,\n withReactions,\n withoutReactions,\n });\n const channelMessages = await fetchChannelHistory(client, {\n channelId,\n limit,\n latest: input.options.latest?.trim(),\n oldest,\n includeReactions: includeReactions || hasReactionFilters,\n withReactions,\n withoutReactions,\n });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: channelMessages });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n return pruneEmpty({\n channel_id: channelId,\n messages: channelMessages.map((m) =>\n toCompactMessage(m, { maxBodyChars, includeReactions, downloadedPaths }),\n ),\n }) as Record<string, unknown>;\n }\n\n if (hasReactionFilters) {\n throw new Error(\n \"Reaction filters are only supported for channel history mode (without --thread-ts/--ts)\",\n );\n }\n\n const rootTs =\n threadTs ??\n (await (async () => {\n const ref = {\n workspace_url: workspace_url ?? workspaceUrl ?? \"\",\n channel_id: channelId,\n message_ts: ts!,\n raw: input.targetInput,\n };\n const includeReactions = Boolean(input.options.includeReactions);\n const msg = await fetchMessage(client, { ref, includeReactions });\n return msg.thread_ts ?? msg.ts;\n })());\n\n const includeReactions = Boolean(input.options.includeReactions);\n const threadMessages = await fetchThread(client, {\n channelId,\n threadTs: rootTs,\n includeReactions,\n });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: threadMessages });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n return pruneEmpty({\n messages: threadMessages\n .map((m) => toCompactMessage(m, { maxBodyChars, includeReactions, downloadedPaths }))\n .map(toThreadListMessage),\n }) as Record<string, unknown>;\n },\n });\n}\n\nexport async function sendMessage(input: {\n ctx: CliContext;\n targetInput: string;\n text: string;\n options: { workspace?: string; threadTs?: string };\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(String(input.targetInput));\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n await input.ctx.withAutoRefresh({\n workspaceUrl: ref.workspace_url,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n const msg = await fetchMessage(client, { ref });\n const threadTs = msg.thread_ts ?? msg.ts;\n await client.api(\"chat.postMessage\", {\n channel: ref.channel_id,\n text: input.text,\n thread_ts: threadTs,\n });\n },\n });\n return { ok: true };\n }\n\n if (target.kind === \"user\") {\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const dmChannelId = await openDmChannel(client, target.userId);\n await client.api(\"chat.postMessage\", {\n channel: dmChannelId,\n text: input.text,\n });\n },\n });\n return { ok: true };\n }\n\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [String(target.channel)],\n });\n await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, String(target.channel));\n await client.api(\"chat.postMessage\", {\n channel: channelId,\n text: input.text,\n thread_ts: input.options.threadTs ? String(input.options.threadTs) : undefined,\n });\n },\n });\n return { ok: true };\n}\n\nexport async function editMessage(input: {\n ctx: CliContext;\n targetInput: string;\n text: string;\n options: { workspace?: string; ts?: string };\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(String(input.targetInput));\n if (target.kind === \"user\") {\n throw new Error(\n \"message edit does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n\n await input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n await client.api(\"chat.update\", {\n channel: ref.channel_id,\n ts: ref.message_ts,\n text: input.text,\n });\n return;\n }\n\n const ts = requireMessageTs(input.options.ts);\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, target.channel);\n await client.api(\"chat.update\", {\n channel: channelId,\n ts,\n text: input.text,\n });\n },\n });\n\n return { ok: true };\n}\n\nexport async function deleteMessage(input: {\n ctx: CliContext;\n targetInput: string;\n options: { workspace?: string; ts?: string };\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(String(input.targetInput));\n if (target.kind === \"user\") {\n throw new Error(\n \"message delete does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n\n await input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n await client.api(\"chat.delete\", {\n channel: ref.channel_id,\n ts: ref.message_ts,\n });\n return;\n }\n\n const ts = requireMessageTs(input.options.ts);\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, target.channel);\n await client.api(\"chat.delete\", {\n channel: channelId,\n ts,\n });\n },\n });\n\n return { ok: true };\n}\n\nexport async function reactOnTarget(input: {\n ctx: CliContext;\n action: \"add\" | \"remove\";\n targetInput: string;\n emoji: string;\n options?: { workspace?: string; ts?: string };\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(input.targetInput);\n if (target.kind === \"user\") {\n throw new Error(\n \"react does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options?.workspace);\n\n await input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n const name = normalizeSlackReactionName(input.emoji);\n await client.api(`reactions.${input.action}`, {\n channel: ref.channel_id,\n timestamp: ref.message_ts,\n name,\n });\n return;\n }\n\n const ts = requireMessageTs(input.options?.ts);\n\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, target.channel);\n const name = normalizeSlackReactionName(input.emoji);\n await client.api(`reactions.${input.action}`, {\n channel: channelId,\n timestamp: ts,\n name,\n });\n },\n });\n\n return { ok: true };\n}\n",
|
|
43
|
-
"import { createServer, type IncomingMessage, type Server } from \"node:http\";\nimport { exec } from \"node:child_process\";\n\nexport type DraftEditorConfig = {\n channelName: string;\n channelId?: string;\n workspaceUrl?: string;\n threadTs?: string;\n initialText?: string;\n onSend: (mrkdwn: string) => Promise<{ ts: string }>;\n};\n\nexport type DraftResult = { sent: true; text: string } | { cancelled: true };\n\nexport function openDraftEditor(config: DraftEditorConfig): Promise<DraftResult> {\n return new Promise<DraftResult>((resolve, reject) => {\n let settled = false;\n\n const server: Server = createServer(async (req, res) => {\n if (req.method === \"GET\" && (req.url === \"/\" || req.url === \"/index.html\")) {\n const html = buildEditorHtml(config);\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n\n if (req.method === \"POST\" && req.url === \"/send\") {\n try {\n const body = await readBody(req);\n const data = JSON.parse(body) as { text: string };\n if (typeof data.text !== \"string\" || !data.text.trim()) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"text is required\" }));\n return;\n }\n const sendResult = await config.onSend(data.text);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true, ts: sendResult.ts }));\n settled = true;\n resolve({ sent: true, text: data.text });\n setTimeout(() => server.close(), 300);\n } catch (err: unknown) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: String(err) }));\n }\n return;\n }\n\n if (req.method === \"POST\" && req.url === \"/cancel\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n settled = true;\n resolve({ cancelled: true });\n setTimeout(() => server.close(), 300);\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n server.on(\"error\", (err) => {\n if (!settled) {\n reject(err);\n }\n });\n\n server.on(\"close\", () => {\n clearTimeout(idleTimeout);\n if (!settled) {\n settled = true;\n resolve({ cancelled: true });\n }\n });\n\n const idleTimeout = setTimeout(\n () => {\n if (!settled) {\n server.close();\n }\n },\n 30 * 60 * 1000,\n );\n\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n const port = typeof addr === \"object\" && addr ? addr.port : 0;\n const url = `http://127.0.0.1:${port}`;\n process.stderr.write(`Draft editor: ${url}\\n`);\n openBrowser(url);\n });\n });\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n}\n\nfunction openBrowser(url: string): void {\n const cmd =\n process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${cmd} \"${url}\"`, () => {});\n}\n\nfunction buildSlackThreadUrl(config: DraftEditorConfig): string | null {\n if (!config.workspaceUrl || !config.channelId || !config.threadTs) {\n return null;\n }\n const tsNoDot = config.threadTs.replace(\".\", \"\");\n return `${config.workspaceUrl.replace(/\\/$/, \"\")}/archives/${config.channelId}/p${tsNoDot}`;\n}\n\nfunction extractWorkspaceName(url?: string): string | null {\n if (!url) {\n return null;\n }\n try {\n const host = new URL(url).hostname; // e.g. \"stablygroup.slack.com\"\n const parts = host.split(\".\");\n if (parts.length >= 3 && parts.at(-2) === \"slack\") {\n return parts.slice(0, -2).join(\".\"); // e.g. \"stablygroup\"\n }\n return host;\n } catch {\n return null;\n }\n}\n\nfunction buildEditorHtml(config: DraftEditorConfig): string {\n const threadUrl = buildSlackThreadUrl(config);\n const workspaceName = extractWorkspaceName(config.workspaceUrl);\n const injectedConfig = JSON.stringify({\n channelName: config.channelName,\n channelId: config.channelId || null,\n workspaceUrl: config.workspaceUrl || null,\n workspaceName,\n threadTs: config.threadTs || null,\n threadUrl,\n initialText: config.initialText || \"\",\n });\n\n return EDITOR_HTML.replace(\"__DRAFT_CONFIG__\", injectedConfig.replace(/</g, \"\\\\u003c\"));\n}\n\n// ---------------------------------------------------------------------------\n// Self-contained HTML editor — Slack-faithful draft composer\n// ---------------------------------------------------------------------------\n// NOTE: The template below is intentionally large (~900 lines). It is a fully\n// self-contained HTML page with CSS + JS — no external dependencies.\n\nconst EDITOR_HTML = /* html */ `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Draft Message — Agent Slack</title>\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500&display=swap\" rel=\"stylesheet\">\n<style>\n :root {\n --bg: #1a1d21;\n --surface: #222529;\n --surface-raised: #2c2d31;\n --border: #393b3f;\n --border-focus: #1264a3;\n --text: #d1d2d3;\n --text-secondary: #ababad;\n --text-muted: #696a6d;\n --green: #007a5a;\n --green-hover: #148567;\n --red: #e01e5a;\n --blue: #1264a3;\n --blue-link: #1d9bd1;\n --code-bg: #1a1d21;\n --blockquote-border: #616061;\n --toolbar-active: rgba(29,155,209,0.15);\n }\n\n * { margin: 0; padding: 0; box-sizing: border-box; }\n\n body {\n font-family: Slack-Lato, Lato, appleLogo, sans-serif;\n background: var(--bg);\n color: var(--text);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n min-height: 100vh;\n padding: 40px 24px;\n }\n\n .page {\n width: 100%;\n max-width: 720px;\n display: flex;\n flex-direction: column;\n align-items: center;\n animation: fadeIn 0.18s ease-out;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n /* ── Branding ── */\n .brand {\n position: relative;\n text-align: center;\n margin-bottom: 20px;\n user-select: none;\n }\n .brand-name {\n font-size: 17px;\n font-weight: 900;\n letter-spacing: -0.3px;\n color: var(--text);\n }\n .brand-byline {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 2px;\n justify-content: center;\n font-family: 'Inter', sans-serif;\n font-size: 10px;\n font-weight: 500;\n color: rgba(255,255,255,0.5);\n }\n .brand-byline a {\n color: rgba(255,255,255,0.6);\n text-decoration: none;\n }\n .brand-byline a:hover {\n color: rgba(255,255,255,0.8);\n }\n .brand-sub {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 1.5px;\n text-transform: uppercase;\n color: var(--text-muted);\n margin-top: 8px;\n }\n .brand-byline img {\n width: 12px;\n height: 12px;\n opacity: 0.6;\n vertical-align: -1px;\n }\n\n /* ── Context bar ── */\n .context-bar {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 4px;\n margin-bottom: 10px;\n font-size: 13px;\n color: var(--text-secondary);\n }\n\n .context-bar .hash-icon {\n width: 15px;\n height: 15px;\n color: var(--text-muted);\n flex-shrink: 0;\n }\n\n .context-bar .channel {\n font-weight: 700;\n color: var(--text);\n }\n\n .context-bar .workspace-label {\n color: var(--text-muted);\n font-size: 13px;\n margin-left: 8px;\n }\n\n .context-bar .thread-link {\n margin-left: auto;\n font-size: 12px;\n color: var(--blue-link);\n text-decoration: none;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n .context-bar .thread-link:hover { text-decoration: underline; }\n .context-bar .thread-link svg {\n width: 12px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n }\n\n /* ── Composer card ── */\n .composer {\n width: 100%;\n background: var(--surface);\n border: 1px solid #818385;\n border-radius: 8px;\n overflow: hidden;\n transition: border-color 0.15s;\n }\n\n .composer:focus-within {\n border-color: var(--border-focus);\n }\n\n /* ── Toolbar ── */\n .toolbar {\n display: flex;\n align-items: center;\n gap: 1px;\n padding: 4px 8px;\n border-bottom: 1px solid var(--border);\n background: var(--surface);\n }\n\n .toolbar-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--text-secondary);\n cursor: pointer;\n font-size: 13px;\n font-family: inherit;\n transition: all 0.08s;\n position: relative;\n flex-shrink: 0;\n }\n\n .toolbar-btn:hover {\n background: var(--surface-raised);\n color: var(--text);\n }\n\n .toolbar-btn.active {\n background: var(--toolbar-active);\n color: var(--blue-link);\n }\n\n .toolbar-btn.disabled {\n opacity: 0.3;\n pointer-events: none;\n }\n\n .toolbar-btn svg { width: 16px; height: 16px; fill: currentColor; }\n .toolbar-btn .b { font-weight: 800; font-size: 15px; line-height: 1; }\n .toolbar-btn .i { font-style: italic; font-weight: 600; font-size: 15px; font-family: Georgia, serif; line-height: 1; }\n .toolbar-btn .s { text-decoration: line-through; font-weight: 600; font-size: 13px; line-height: 1; }\n\n .toolbar-sep {\n width: 1px;\n height: 20px;\n background: var(--border);\n margin: 0 4px;\n flex-shrink: 0;\n }\n\n /* Tooltip */\n .toolbar-btn[data-tip]::after {\n content: attr(data-tip);\n position: absolute;\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n background: #1d1d1d;\n color: #e0e0e0;\n font-size: 11px;\n font-weight: 400;\n font-style: normal;\n text-decoration: none;\n padding: 4px 8px;\n border-radius: 6px;\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.12s;\n z-index: 20;\n }\n .toolbar-btn:hover[data-tip]::after { opacity: 1; }\n\n /* ── Editor ── */\n .editor {\n min-height: 200px;\n max-height: 55vh;\n overflow-y: auto;\n padding: 12px 16px;\n font-size: 15px;\n line-height: 1.46668;\n color: var(--text);\n outline: none;\n word-wrap: break-word;\n overflow-wrap: break-word;\n }\n\n .editor:empty::before {\n content: attr(data-placeholder);\n color: var(--text-muted);\n pointer-events: none;\n }\n\n .editor b, .editor strong { font-weight: 700; }\n .editor i, .editor em { font-style: italic; }\n .editor s, .editor strike, .editor del { text-decoration: line-through; }\n\n .editor code {\n background: var(--code-bg);\n border: 1px solid var(--border);\n border-radius: 3px;\n padding: 2px 4px;\n font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;\n font-size: 12px;\n color: #e06c75;\n }\n\n .editor pre {\n background: var(--code-bg);\n border: 1px solid var(--border);\n border-radius: 4px;\n padding: 8px 12px;\n margin: 4px 0;\n font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;\n font-size: 12px;\n line-height: 1.5;\n overflow-x: auto;\n white-space: pre-wrap;\n color: var(--text);\n }\n\n .editor pre code {\n background: none;\n border: none;\n padding: 0;\n font-size: inherit;\n color: inherit;\n }\n\n /* Adjacent <pre> elements look like one code block (browser splits on Enter) */\n .editor pre + pre,\n .editor pre + br + pre {\n border-top: none;\n margin-top: -4px; /* collapse gap */\n padding-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n .editor pre:has(+ pre),\n .editor pre:has(+ br + pre) {\n border-bottom: none;\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n .editor blockquote {\n border-left: 4px solid var(--blockquote-border);\n padding: 4px 0 4px 16px;\n margin: 4px 0;\n color: var(--text-secondary);\n }\n\n .editor ul, .editor ol { padding-left: 26px; margin: 4px 0; }\n .editor li { margin: 2px 0; }\n .editor a { color: var(--blue-link); text-decoration: none; }\n .editor a:hover { text-decoration: underline; }\n\n /* ── Source textarea ── */\n .source-editor {\n display: none;\n min-height: 200px;\n max-height: 55vh;\n width: 100%;\n padding: 12px 16px;\n font-family: Monaco, Menlo, Consolas, 'Courier New', monospace;\n font-size: 13px;\n line-height: 1.5;\n background: var(--surface);\n color: var(--text);\n border: none;\n outline: none;\n resize: vertical;\n }\n\n /* ── Bottom bar ── */\n .bottom-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 10px;\n border-top: 1px solid var(--border);\n background: var(--surface);\n }\n\n .bottom-left {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .hint {\n font-size: 12px;\n color: var(--text-muted);\n }\n .hint kbd {\n background: var(--surface-raised);\n border: 1px solid var(--border);\n border-radius: 3px;\n padding: 1px 4px;\n font-family: inherit;\n font-size: 11px;\n }\n\n .btn-send {\n background: var(--green);\n color: #fff;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.1s;\n flex-shrink: 0;\n }\n .btn-send:hover { background: var(--green-hover); }\n .btn-send:disabled { opacity: 0.3; cursor: not-allowed; }\n .btn-send svg { width: 16px; height: 16px; fill: currentColor; }\n\n .cancel-link {\n background: none;\n border: none;\n color: var(--text-muted);\n font-size: 12px;\n font-family: inherit;\n cursor: pointer;\n padding: 4px 6px;\n }\n .cancel-link:hover { color: var(--text-secondary); text-decoration: underline; }\n\n .btn-aa {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--text-secondary);\n cursor: pointer;\n font-size: 14px;\n font-weight: 700;\n font-family: inherit;\n transition: all 0.08s;\n flex-shrink: 0;\n }\n .btn-aa:hover { background: var(--surface-raised); color: var(--text); }\n .btn-aa.active { background: var(--toolbar-active); color: var(--blue-link); }\n\n .btn-source {\n background: transparent;\n color: var(--text-muted);\n font-size: 11px;\n font-weight: 600;\n padding: 3px 6px;\n border-radius: 4px;\n border: 1px solid transparent;\n cursor: pointer;\n font-family: Monaco, Menlo, Consolas, monospace;\n }\n .btn-source:hover { color: var(--text-secondary); border-color: var(--border); }\n .btn-source.active { color: var(--blue-link); border-color: rgba(29,155,209,0.3); }\n\n /* ── Inline link popover (Slack-style two-field) ── */\n .link-popover {\n display: none;\n position: absolute;\n z-index: 30;\n background: var(--surface-raised);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 12px 14px;\n box-shadow: 0 4px 20px rgba(0,0,0,0.5);\n flex-direction: column;\n gap: 8px;\n width: 340px;\n }\n .link-popover.visible { display: flex; }\n\n .link-popover label {\n font-size: 12px;\n font-weight: 600;\n color: var(--text-secondary);\n display: block;\n margin-bottom: 3px;\n }\n\n .link-popover input {\n width: 100%;\n background: var(--bg);\n border: 1px solid var(--border);\n border-radius: 4px;\n padding: 6px 8px;\n font-size: 13px;\n color: var(--text);\n font-family: inherit;\n outline: none;\n }\n .link-popover input:focus { border-color: var(--border-focus); }\n .link-popover input::placeholder { color: var(--text-muted); }\n\n .link-popover .popover-actions {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n margin-top: 2px;\n }\n\n .link-popover .popover-btn {\n border: none;\n border-radius: 4px;\n padding: 5px 12px;\n font-size: 12px;\n font-weight: 700;\n cursor: pointer;\n font-family: inherit;\n }\n .link-popover .popover-btn-save {\n background: var(--green);\n color: #fff;\n }\n .link-popover .popover-btn-save:hover { background: var(--green-hover); }\n .link-popover .popover-btn-cancel {\n background: transparent;\n color: var(--text-muted);\n }\n .link-popover .popover-btn-cancel:hover { color: var(--text-secondary); }\n\n /* ── Result overlay ── */\n .overlay {\n display: none;\n position: fixed;\n inset: 0;\n background: rgba(0,0,0,0.8);\n z-index: 100;\n align-items: center;\n justify-content: center;\n }\n .overlay.visible { display: flex; }\n\n .overlay-msg {\n text-align: center;\n font-size: 18px;\n font-weight: 600;\n }\n .overlay-msg.success { color: #2eb67d; }\n .overlay-msg.error { color: var(--red); }\n .overlay-msg small {\n display: block;\n margin-top: 8px;\n font-size: 13px;\n font-weight: 400;\n color: var(--text-muted);\n }\n\n /* Scrollbar */\n .editor::-webkit-scrollbar { width: 6px; }\n .editor::-webkit-scrollbar-track { background: transparent; }\n .editor::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }\n</style>\n</head>\n<body>\n\n<div class=\"page\">\n <!-- Branding -->\n <div class=\"brand\">\n <div class=\"brand-name\">Agent Slack</div>\n <div class=\"brand-byline\">By <a href=\"https://stably.ai\" target=\"_blank\" rel=\"noopener\"><img src=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjM3OCIgaGVpZ2h0PSIyMzc4IiB2aWV3Qm94PSIwIDAgMjM3OCAyMzc4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMTZfNDcpIj4KPHBhdGggZD0iTTExODguOTQgNjE4LjY0NUMxNTAwLjY5IDYxOC42NDUgMTc1My4zNiA4NzEuMzIyIDE3NTMuMzYgMTE4My4wNEMxNzUzLjM2IDE0OTQuNzIgMTUwMC42OSAxNzQ3LjM5IDExODguOTQgMTc0Ny4zOUM4NzcuMjUyIDE3NDcuMzkgNjI0LjU0NyAxNDk0LjcyIDYyNC41NDcgMTE4My4wNEM2MjQuNTQ3IDg3MS4zMTcgODc3LjI1MiA2MTguNjQ1IDExODguOTQgNjE4LjY0NVoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik0xMTg4Ljk0IDBDMTA0MC44MSAwIDg5OS40NiAyOC40NTgxIDc2OC42MTkgNzguMTc0MkM3OTcuMjAyIDEwNy4yMDMgODIwLjg0IDE0MC45OTIgODM4Ljk5IDE3OC4wNTJDOTQ4Ljg2MSAxMzkuODE4IDEwNjYuMzUgMTE4LjA1NSAxMTg5IDExOC4wNTVDMTc3OS41IDExOC4wNTUgMjI1OS44NSA1OTguNTYxIDIyNTkuODUgMTE4OC45NEMyMjU5Ljg1IDE3NzkuMzEgMTc3OS41IDIyNTkuOTEgMTE4OC45NCAyMjU5LjkxQzU5OC41MDEgMjI1OS45MSAxMTguMTIgMTc3OS4zNyAxMTguMTIgMTE4OUMxMTguMTIgOTkwLjEwNiAxNzMuNjA3IDgwNC40MDggMjY4LjQwOSA2NDQuNjNDMjM1LjkxOSA2MTkuNzU5IDIwNy4yNzEgNTg5LjkzNyAxODQuMzI4IDU1NS45NThDNjguMjEzNiA3MzkuNDkzIDAgOTU2LjE4NiAwIDExODlDMCAxODQ0LjYgNTMzLjMzIDIzNzguMDEgMTE4OC45NCAyMzc4LjAxQzE4NDQuNiAyMzc4LjAxIDIzNzggMTg0NC42MSAyMzc4IDExODlDMjM3OCA1MzMuMzk1IDE4NDQuNiAwIDExODguOTQgMFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik00OTguNjI0IDExMS4xMUM2MzMuMjA5IDExMS4xMSA3NDIuMjg3IDIyMC4xODggNzQyLjI4NyAzNTQuNzczQzc0Mi4yODcgNDg5LjM1OCA2MzMuMjA5IDU5OC40MzYgNDk4LjYyNCA1OTguNDM2QzM2NC4wNzEgNTk4LjQzNiAyNTQuOTYxIDQ4OS4zNTggMjU0Ljk2MSAzNTQuNzczQzI1NC45NjEgMjIwLjE4OCAzNjQuMDcxIDExMS4xMSA0OTguNjI0IDExMS4xMVoiIGZpbGw9IndoaXRlIi8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMTZfNDciPgo8cmVjdCB3aWR0aD0iMjM3OCIgaGVpZ2h0PSIyMzc4IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=\" alt=\"\" /></a><a href=\"https://stably.ai\" target=\"_blank\" rel=\"noopener\">Stably.ai</a></div>\n <div class=\"brand-sub\">draft mode</div>\n </div>\n\n <!-- Context: channel + thread link -->\n <div class=\"context-bar\">\n <svg class=\"hash-icon\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\">\n <line x1=\"7.5\" y1=\"2\" x2=\"6\" y2=\"18\"/><line x1=\"14\" y1=\"2\" x2=\"12.5\" y2=\"18\"/>\n <line x1=\"3\" y1=\"7\" x2=\"17.5\" y2=\"7\"/><line x1=\"2.5\" y1=\"13\" x2=\"17\" y2=\"13\"/>\n </svg>\n <span class=\"channel\" id=\"channelName\"></span>\n <span class=\"workspace-label\" id=\"workspaceName\"></span>\n <a class=\"thread-link\" id=\"threadLink\" style=\"display:none\" target=\"_blank\">\n <span>View thread</span>\n <svg viewBox=\"0 0 16 16\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M6 3h7v7\"/><path d=\"M13 3L6 10\"/>\n </svg>\n </a>\n </div>\n\n <!-- Composer -->\n <div class=\"composer\">\n <div class=\"toolbar\" id=\"toolbar\">\n <button class=\"toolbar-btn\" data-cmd=\"bold\" data-tip=\"Bold (⌘B)\"><span class=\"b\">B</span></button>\n <button class=\"toolbar-btn\" data-cmd=\"italic\" data-tip=\"Italic (⌘I)\"><span class=\"i\">I</span></button>\n <button class=\"toolbar-btn\" data-cmd=\"strikethrough\" data-tip=\"Strikethrough (⌘⇧X)\"><span class=\"s\">S</span></button>\n <div class=\"toolbar-sep\"></div>\n <button class=\"toolbar-btn\" data-cmd=\"link\" data-tip=\"Link (⌘K)\">\n <svg viewBox=\"0 0 16 16\"><path d=\"M6.354 5.5H4a3 3 0 0 0 0 6h3a3 3 0 0 0 2.83-4M9.646 10.5H12a3 3 0 0 0 0-6H9a3 3 0 0 0-2.83 4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/></svg>\n </button>\n <div class=\"toolbar-sep\"></div>\n <button class=\"toolbar-btn\" data-cmd=\"insertOrderedList\" data-tip=\"Numbered list (⌘⇧7)\">\n <svg viewBox=\"0 0 16 16\"><text x=\"1\" y=\"5\" font-size=\"5\" fill=\"currentColor\" font-family=\"system-ui\" font-weight=\"600\">1.</text><line x1=\"7\" y1=\"3.5\" x2=\"15\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/><text x=\"1\" y=\"10\" font-size=\"5\" fill=\"currentColor\" font-family=\"system-ui\" font-weight=\"600\">2.</text><line x1=\"7\" y1=\"8.5\" x2=\"15\" y2=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/><text x=\"1\" y=\"15\" font-size=\"5\" fill=\"currentColor\" font-family=\"system-ui\" font-weight=\"600\">3.</text><line x1=\"7\" y1=\"13.5\" x2=\"15\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/></svg>\n </button>\n <button class=\"toolbar-btn\" data-cmd=\"insertUnorderedList\" data-tip=\"Bulleted list (⌘⇧8)\">\n <svg viewBox=\"0 0 16 16\"><circle cx=\"3\" cy=\"3.5\" r=\"1.5\" fill=\"currentColor\"/><line x1=\"7\" y1=\"3.5\" x2=\"15\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/><circle cx=\"3\" cy=\"8.5\" r=\"1.5\" fill=\"currentColor\"/><line x1=\"7\" y1=\"8.5\" x2=\"15\" y2=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/><circle cx=\"3\" cy=\"13.5\" r=\"1.5\" fill=\"currentColor\"/><line x1=\"7\" y1=\"13.5\" x2=\"15\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/></svg>\n </button>\n <div class=\"toolbar-sep\"></div>\n <button class=\"toolbar-btn\" data-cmd=\"blockquote\" data-tip=\"Quote (⌘⇧9)\">\n <svg viewBox=\"0 0 16 16\"><rect x=\"1\" y=\"2\" width=\"2.5\" height=\"12\" rx=\"1\" fill=\"currentColor\" opacity=\"0.5\"/><line x1=\"6\" y1=\"4\" x2=\"15\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/><line x1=\"6\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/><line x1=\"6\" y1=\"12\" x2=\"11\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/></svg>\n </button>\n <div class=\"toolbar-sep\"></div>\n <button class=\"toolbar-btn\" data-cmd=\"code\" data-tip=\"Code (⌘E)\">\n <svg viewBox=\"0 0 16 16\"><polyline points=\"5,3 1,8 5,13\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><polyline points=\"11,3 15,8 11,13\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n <button class=\"toolbar-btn\" data-cmd=\"codeblock\" data-tip=\"Code block (⌘⇧C)\">\n <svg viewBox=\"0 0 16 16\"><rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" rx=\"2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\"/><polyline points=\"5,5 3,8 5,11\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><polyline points=\"11,5 13,8 11,11\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </button>\n </div>\n\n <div\n class=\"editor\"\n id=\"editor\"\n contenteditable=\"true\"\n data-placeholder=\"Message #channel\"\n spellcheck=\"true\"\n ></div>\n\n <textarea class=\"source-editor\" id=\"sourceEditor\" spellcheck=\"false\"></textarea>\n\n <div class=\"bottom-bar\">\n <div class=\"bottom-left\">\n <button class=\"btn-aa active\" id=\"aaToggle\" onclick=\"toggleToolbar()\" data-tip=\"Formatting\">Aa</button>\n <button class=\"btn-source\" id=\"sourceToggle\" onclick=\"toggleSourceMode()\">mrkdwn</button>\n <span class=\"hint\"><kbd id=\"modKey\">⌘</kbd><kbd>Enter</kbd> to send</span>\n </div>\n <div style=\"display:flex;align-items:center;gap:8px;\">\n <button class=\"cancel-link\" onclick=\"handleCancel()\">Cancel</button>\n <button class=\"btn-send\" id=\"sendBtn\" onclick=\"handleSend()\" disabled>\n <svg viewBox=\"0 0 20 20\"><path d=\"M1.7 9.1l7.3 1 .01 0L1.7 9.1zm0 1.8l7.3-1-7.3 1zM1.5 2.1c-.2-.7.5-1.3 1.1-1L19 8.9c.6.3.6 1.2 0 1.5L2.6 18.9c-.7.3-1.3-.3-1.1-1l1.8-6.9L11 10 3.3 8.9 1.5 2.1z\"/></svg>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Inline link popover (Slack-style two-field) -->\n<div class=\"link-popover\" id=\"linkPopover\">\n <div>\n <label>Text</label>\n <input type=\"text\" id=\"linkTextInput\" placeholder=\"Display text\">\n </div>\n <div>\n <label>Link</label>\n <input type=\"text\" id=\"linkUrlInput\" placeholder=\"https://example.com\">\n </div>\n <div class=\"popover-actions\">\n <button class=\"popover-btn popover-btn-cancel\" onclick=\"closeLinkPopover()\">Cancel</button>\n <button class=\"popover-btn popover-btn-save\" onclick=\"applyLink()\">Save</button>\n </div>\n</div>\n\n<!-- Result overlay -->\n<div class=\"overlay\" id=\"resultOverlay\">\n <div class=\"overlay-msg\" id=\"resultMsg\"></div>\n</div>\n\n<script>\n// ─── Config ───\nconst CONFIG = __DRAFT_CONFIG__;\nconst IS_MAC = /Mac|iPhone/.test(navigator.platform);\nconst MOD = IS_MAC ? 'metaKey' : 'ctrlKey';\n\n// ─── Init header ───\ndocument.getElementById('channelName').textContent = CONFIG.channelName;\nif (CONFIG.workspaceName) {\n document.getElementById('workspaceName').textContent = CONFIG.workspaceName;\n}\nif (!IS_MAC) {\n document.getElementById('modKey').textContent = 'Ctrl';\n document.querySelectorAll('[data-tip]').forEach(el => {\n el.dataset.tip = el.dataset.tip.replace(/\\\\u2318/g, 'Ctrl+').replace(/\\\\u21E7/g, 'Shift+');\n });\n}\nif (CONFIG.threadTs) {\n const link = document.getElementById('threadLink');\n link.style.display = '';\n if (CONFIG.threadUrl) {\n link.href = CONFIG.threadUrl;\n } else {\n link.removeAttribute('href');\n link.style.cursor = 'default';\n link.style.color = 'var(--text-muted)';\n }\n}\n\n// ─── Editor refs ───\nconst editor = document.getElementById('editor');\nconst sourceEditor = document.getElementById('sourceEditor');\nconst linkPopover = document.getElementById('linkPopover');\nconst linkUrlInput = document.getElementById('linkUrlInput');\nlet sourceMode = false;\n\n// Set Slack-style placeholder\neditor.dataset.placeholder = 'Message #' + CONFIG.channelName;\n\n// ─── Detect if cursor is inside a code element ───\nfunction isInsideCode(node) {\n let el = node;\n while (el && el !== editor) {\n if (el.nodeType === 1) {\n const tag = el.tagName.toLowerCase();\n if (tag === 'pre' || tag === 'code') { return true; }\n }\n el = el.parentNode;\n }\n return false;\n}\n\nfunction cursorInCode() {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) { return false; }\n return isInsideCode(sel.anchorNode);\n}\n\n// ─── mrkdwn to HTML (initial content) ───\nfunction escapeHtml(t) {\n return t.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');\n}\n\nfunction mrkdwnToHtml(text) {\n if (!text) { return ''; }\n const codeBlocks = [];\n text = text.replace(/\\`\\`\\`([\\\\s\\\\S]*?)\\`\\`\\`/g, (_, code) => {\n codeBlocks.push('<pre>' + escapeHtml(code.trim()) + '</pre>');\n return '\\\\x00CB' + (codeBlocks.length - 1) + '\\\\x00';\n });\n const inlineCodes = [];\n text = text.replace(/\\`([^\\`\\\\n]+)\\`/g, (_, code) => {\n inlineCodes.push('<code>' + escapeHtml(code) + '</code>');\n return '\\\\x00IC' + (inlineCodes.length - 1) + '\\\\x00';\n });\n\n const lines = text.split('\\\\n');\n let html = '', idx = 0;\n while (idx < lines.length) {\n const line = lines[idx];\n if (line.startsWith('> ')) {\n const q = [];\n while (idx < lines.length && lines[idx].startsWith('> ')) { q.push(fmtInline(lines[idx].slice(2))); idx++; }\n html += '<blockquote>' + q.join('<br>') + '</blockquote>'; continue;\n }\n if (/^[\\\\u2022\\\\-\\\\*] /.test(line)) {\n const items = [];\n while (idx < lines.length && /^[\\\\u2022\\\\-\\\\*] /.test(lines[idx])) { items.push('<li>' + fmtInline(lines[idx].replace(/^[\\\\u2022\\\\-\\\\*] /, '')) + '</li>'); idx++; }\n html += '<ul>' + items.join('') + '</ul>'; continue;\n }\n if (/^\\\\d+[\\\\.\\\\)] /.test(line)) {\n const items = [];\n while (idx < lines.length && /^\\\\d+[\\\\.\\\\)] /.test(lines[idx])) { items.push('<li>' + fmtInline(lines[idx].replace(/^\\\\d+[\\\\.\\\\)] /, '')) + '</li>'); idx++; }\n html += '<ol>' + items.join('') + '</ol>'; continue;\n }\n html += (line ? fmtInline(line) : '') + '<br>';\n idx++;\n }\n codeBlocks.forEach((b, i) => { html = html.replace('\\\\x00CB' + i + '\\\\x00', b); });\n inlineCodes.forEach((c, i) => { html = html.replace('\\\\x00IC' + i + '\\\\x00', c); });\n return html.replace(/(<br>)+$/, '');\n}\n\nfunction fmtInline(t) {\n t = t.replace(/<(https?:\\\\/\\\\/[^|>]+)\\\\|([^>]+)>/g, '<a href=\"$1\" target=\"_blank\">$2</a>');\n t = t.replace(/<(https?:\\\\/\\\\/[^>]+)>/g, '<a href=\"$1\" target=\"_blank\">$1</a>');\n t = t.replace(/\\\\*([^\\\\*]+)\\\\*/g, '<b>$1</b>');\n t = t.replace(/(?<![a-zA-Z0-9])_([^_]+)_(?![a-zA-Z0-9])/g, '<i>$1</i>');\n t = t.replace(/~([^~]+)~/g, '<s>$1</s>');\n return t;\n}\n\n// ─── HTML to mrkdwn (submission) ───\nfunction htmlToMrkdwn(root) {\n const visited = new Set();\n function walk(node) {\n if (visited.has(node)) { return ''; }\n if (node.nodeType === 3) { return node.textContent || ''; }\n if (node.nodeType !== 1) { return ''; }\n const el = node;\n const tag = el.tagName.toLowerCase();\n const kids = () => Array.from(el.childNodes).map(walk).join('');\n switch (tag) {\n case 'b': case 'strong': { const c = kids(); return c.trim() ? '*' + c + '*' : c; }\n case 'i': case 'em': { const c = kids(); return c.trim() ? '_' + c + '_' : c; }\n case 's': case 'strike': case 'del': { const c = kids(); return c.trim() ? '~' + c + '~' : c; }\n case 'code': return '\\`' + (el.textContent || '') + '\\`';\n case 'pre': {\n // Collect adjacent pres into one code block\n const lines = [(el.textContent || '').trimEnd()];\n let next = el.nextElementSibling;\n while (next && next.tagName === 'PRE') {\n lines.push((next.textContent || '').trimEnd());\n visited.add(next);\n next = next.nextElementSibling;\n }\n return '\\`\\`\\`\\\\n' + lines.filter(l => l).join('\\\\n') + '\\\\n\\`\\`\\`\\\\n';\n }\n case 'blockquote': { const c = kids().trim(); return c.split('\\\\n').map(l => '> ' + l).join('\\\\n') + '\\\\n'; }\n case 'ul': { let r = ''; for (const li of el.querySelectorAll(':scope > li')) { r += '\\\\u2022 ' + walk(li).trim() + '\\\\n'; } return r; }\n case 'ol': { let r = '', n = 1; for (const li of el.querySelectorAll(':scope > li')) { r += n + '. ' + walk(li).trim() + '\\\\n'; n++; } return r; }\n case 'li': return kids();\n case 'a': { const h = el.getAttribute('href'); const t = kids(); return (h && t && h !== t) ? '<' + h + '|' + t + '>' : (h || t); }\n case 'br': return '\\\\n';\n case 'div': case 'p': {\n const c = kids();\n const p = el.parentElement;\n if (p && ['li','blockquote','td'].includes(p.tagName.toLowerCase())) { return c; }\n return c.endsWith('\\\\n') ? c : c + '\\\\n';\n }\n case 'span': {\n const st = el.style;\n let c = kids();\n if (st.fontWeight === 'bold' || Number(st.fontWeight) >= 700) { c = c.trim() ? '*' + c + '*' : c; }\n if (st.fontStyle === 'italic') { c = c.trim() ? '_' + c + '_' : c; }\n if (st.textDecoration && st.textDecoration.includes('line-through')) { c = c.trim() ? '~' + c + '~' : c; }\n return c;\n }\n default: return kids();\n }\n }\n return walk(root).replace(/\\\\n{3,}/g, '\\\\n\\\\n').trim();\n}\n\n// ─── Init editor content ───\nif (CONFIG.initialText) { editor.innerHTML = mrkdwnToHtml(CONFIG.initialText); }\n\n// ─── Toolbar execution ───\nfunction execCmd(command) {\n // Block formatting inside code (except toggling code off)\n const inCode = cursorInCode();\n if (inCode && command !== 'code' && command !== 'codeblock') { return; }\n\n switch (command) {\n case 'bold':\n case 'italic':\n case 'strikethrough':\n case 'insertOrderedList':\n case 'insertUnorderedList':\n document.execCommand(command, false, null);\n break;\n case 'blockquote':\n document.execCommand('formatBlock', false, 'blockquote');\n break;\n case 'code': {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) { break; }\n // If already in code, unwrap\n if (inCode) {\n const codeEl = sel.anchorNode.nodeType === 1 ? sel.anchorNode : sel.anchorNode.parentElement;\n const code = codeEl.closest('code');\n if (code) {\n const text = document.createTextNode(code.textContent || '');\n code.parentNode.replaceChild(text, code);\n const r = document.createRange(); r.selectNodeContents(text); sel.removeAllRanges(); sel.addRange(r);\n }\n break;\n }\n const range = sel.getRangeAt(0);\n if (range.collapsed) { break; }\n const code = document.createElement('code');\n try { range.surroundContents(code); } catch (_) {\n const frag = range.extractContents(); code.appendChild(frag); range.insertNode(code);\n }\n sel.removeAllRanges();\n const nr = document.createRange(); nr.selectNodeContents(code); sel.addRange(nr);\n break;\n }\n case 'codeblock': {\n if (inCode) { break; } // No nesting\n const sel = window.getSelection();\n if (!sel) { break; }\n const pre = document.createElement('pre');\n if (!sel.isCollapsed) {\n const range = sel.getRangeAt(0);\n pre.textContent = range.extractContents().textContent || '';\n range.insertNode(pre);\n } else {\n pre.innerHTML = '<br>';\n const range = sel.getRangeAt(0);\n range.insertNode(pre);\n const nr = document.createRange(); nr.setStart(pre, 0); nr.collapse(true);\n sel.removeAllRanges(); sel.addRange(nr);\n }\n break;\n }\n case 'link':\n openLinkPopover();\n return; // Don't refocus — popover takes focus\n }\n editor.focus();\n updateToolbarState();\n}\n\n// Toolbar button clicks\ndocument.querySelectorAll('.toolbar-btn[data-cmd]').forEach(btn => {\n btn.addEventListener('mousedown', (e) => {\n e.preventDefault();\n execCmd(btn.dataset.cmd);\n });\n});\n\n// ─── Toolbar state ───\nfunction updateToolbarState() {\n const inCode = cursorInCode();\n document.querySelectorAll('.toolbar-btn[data-cmd]').forEach(btn => {\n const cmd = btn.dataset.cmd;\n // Disable non-code buttons when inside code\n if (inCode && cmd !== 'code' && cmd !== 'codeblock') {\n btn.classList.add('disabled');\n btn.classList.remove('active');\n return;\n }\n btn.classList.remove('disabled');\n let active = false;\n try {\n if (['bold','italic','strikethrough','insertOrderedList','insertUnorderedList'].includes(cmd)) {\n active = document.queryCommandState(cmd);\n }\n if (cmd === 'code') { active = inCode; }\n } catch (_) {}\n btn.classList.toggle('active', active);\n });\n}\n\neditor.addEventListener('keyup', updateToolbarState);\neditor.addEventListener('mouseup', updateToolbarState);\neditor.addEventListener('focus', updateToolbarState);\n\n// ─── Keyboard shortcuts (Slack-identical) ───\neditor.addEventListener('keydown', (e) => {\n const mod = e[MOD];\n\n // Cmd+Enter → Send\n if (mod && e.key === 'Enter') { e.preventDefault(); handleSend(); return; }\n\n // Cmd+B → Bold\n if (mod && !e.shiftKey && e.key === 'b') { e.preventDefault(); execCmd('bold'); return; }\n\n // Cmd+I → Italic\n if (mod && !e.shiftKey && e.key === 'i') { e.preventDefault(); execCmd('italic'); return; }\n\n // Cmd+Shift+X → Strikethrough\n if (mod && e.shiftKey && (e.key === 'X' || e.key === 'x')) { e.preventDefault(); execCmd('strikethrough'); return; }\n\n // Cmd+E → Inline code (Slack's actual shortcut)\n if (mod && !e.shiftKey && e.key === 'e') { e.preventDefault(); execCmd('code'); return; }\n\n // Cmd+Shift+C → Code block\n if (mod && e.shiftKey && (e.key === 'C' || e.key === 'c' || e.code === 'KeyC')) { e.preventDefault(); execCmd('codeblock'); return; }\n\n // Cmd+K → Link\n if (mod && !e.shiftKey && e.key === 'k') { e.preventDefault(); execCmd('link'); return; }\n\n // Cmd+Shift+7 → Numbered list\n if (mod && e.shiftKey && e.key === '7') { e.preventDefault(); execCmd('insertOrderedList'); return; }\n\n // Cmd+Shift+8 → Bulleted list\n if (mod && e.shiftKey && e.key === '8') { e.preventDefault(); execCmd('insertUnorderedList'); return; }\n\n // Cmd+Shift+9 → Blockquote\n if (mod && e.shiftKey && e.key === '9') { e.preventDefault(); execCmd('blockquote'); return; }\n});\n\n// ─── Code block: merge split <pre> elements + escape logic ───\nfunction findParentPre(node) {\n while (node && node !== editor) {\n if (node.nodeType === 1 && node.tagName === 'PRE') { return node; }\n node = node.parentNode;\n }\n return null;\n}\n\nfunction exitCodeBlock(pre) {\n const sel = window.getSelection();\n const p = document.createElement('div');\n p.innerHTML = '<br>';\n if (pre.parentNode === editor) {\n pre.parentNode.insertBefore(p, pre.nextSibling);\n } else {\n const wrapper = pre.parentNode;\n wrapper.parentNode.insertBefore(p, wrapper.nextSibling);\n }\n const nr = document.createRange();\n nr.setStart(p, 0);\n nr.collapse(true);\n sel.removeAllRanges();\n sel.addRange(nr);\n}\n\n// Code block management: the browser splits <pre> on Enter, creating adjacent\n// <pre> elements. We let this happen and handle it via:\n// 1. CSS: adjacent pres look like one block (no gaps/borders between them)\n// 2. Serialization: htmlToMrkdwn treats adjacent pres as one code block\n// 3. Escape: when user creates an empty pre after another empty pre, exit code\n\n// Track code block escape (double-Enter on empty line)\neditor.addEventListener('input', () => {\n const pres = Array.from(editor.querySelectorAll('pre'));\n if (pres.length < 2) { return; }\n\n // Check for escape: last two adjacent pres are both empty\n for (let i = pres.length - 1; i > 0; i--) {\n const cur = pres[i];\n const prev = pres[i - 1];\n const curEmpty = !cur.textContent?.trim();\n const prevEmpty = !prev.textContent?.trim();\n\n if (curEmpty && prevEmpty) {\n // Double-Enter escape: remove both empty pres, place cursor after\n const lastRealPre = pres[i - 2] || null;\n // Remove the two empty pres and their wrappers\n [cur, prev].forEach(p => {\n const parent = p.parentNode;\n p.remove();\n if (parent && parent !== editor && parent.tagName === 'DIV' && !parent.textContent?.trim()) {\n parent.remove();\n }\n });\n if (lastRealPre) {\n exitCodeBlock(lastRealPre);\n } else {\n // No code left — just place cursor\n const sel = window.getSelection();\n if (sel) {\n const div = document.createElement('div');\n div.innerHTML = '<br>';\n editor.appendChild(div);\n const r = document.createRange();\n r.setStart(div, 0);\n r.collapse(true);\n sel.removeAllRanges();\n sel.addRange(r);\n }\n }\n return;\n }\n }\n});\n\n// ArrowDown at end of last code block → exit\neditor.addEventListener('keydown', (e) => {\n if (e.key === 'ArrowDown') {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) { return; }\n const pre = findParentPre(sel.anchorNode);\n if (pre && !pre.nextElementSibling) {\n e.preventDefault();\n exitCodeBlock(pre);\n }\n }\n}, true);\n\n// ─── Paste handler ───\neditor.addEventListener('paste', (e) => {\n const cd = e.clipboardData;\n if (!cd) { return; }\n const html = cd.getData('text/html');\n if (html) {\n e.preventDefault();\n const tmp = document.createElement('div');\n tmp.innerHTML = html;\n tmp.querySelectorAll('script,style,meta,link').forEach(el => el.remove());\n tmp.querySelectorAll('[style]').forEach(el => {\n const s = el.style;\n const keep = {};\n if (s.fontWeight === 'bold' || Number(s.fontWeight) >= 700) { keep.fontWeight = s.fontWeight; }\n if (s.fontStyle === 'italic') { keep.fontStyle = s.fontStyle; }\n if (s.textDecoration?.includes('line-through')) { keep.textDecoration = 'line-through'; }\n el.removeAttribute('style');\n Object.assign(el.style, keep);\n });\n document.execCommand('insertHTML', false, tmp.innerHTML);\n }\n});\n\n// ─── Link popover (Slack-style: select text, Cmd+K, two-field form) ───\nlet linkSavedRange = null;\nlet linkPopoverOpen = false;\nconst linkTextInput = document.getElementById('linkTextInput');\n\nfunction openLinkPopover() {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) { return; }\n\n linkSavedRange = sel.getRangeAt(0).cloneRange();\n const selectedText = sel.toString();\n\n // Position near selection\n const rect = linkSavedRange.getBoundingClientRect();\n const editorRect = editor.getBoundingClientRect();\n linkPopover.style.top = (rect.bottom + window.scrollY + 6) + 'px';\n linkPopover.style.left = Math.max(8, Math.min(rect.left + window.scrollX, editorRect.right - 360)) + 'px';\n\n // Pre-fill text field with selected text\n linkTextInput.value = selectedText;\n\n // If selection is already a link, pre-fill URL\n let existingUrl = '';\n const anchor = sel.anchorNode?.parentElement?.closest('a');\n if (anchor) {\n existingUrl = anchor.getAttribute('href') || '';\n linkTextInput.value = anchor.textContent || selectedText;\n }\n linkUrlInput.value = existingUrl;\n\n // Show popover (use rAF to avoid same-frame mousedown closing it)\n requestAnimationFrame(() => {\n linkPopover.classList.add('visible');\n linkPopoverOpen = true;\n linkUrlInput.focus();\n linkUrlInput.select();\n });\n}\n\nfunction closeLinkPopover() {\n linkPopover.classList.remove('visible');\n linkPopoverOpen = false;\n editor.focus();\n if (linkSavedRange) {\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(linkSavedRange);\n }\n}\n\nfunction applyLink() {\n const url = linkUrlInput.value.trim();\n const text = linkTextInput.value.trim();\n linkPopover.classList.remove('visible');\n linkPopoverOpen = false;\n\n if (!url || !linkSavedRange) { editor.focus(); return; }\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(linkSavedRange);\n\n // Check if we're updating an existing link\n const anchor = sel.anchorNode?.parentElement?.closest('a');\n if (anchor) {\n anchor.setAttribute('href', url);\n if (text) { anchor.textContent = text; }\n } else {\n // Create new link\n const a = document.createElement('a');\n a.href = url;\n a.target = '_blank';\n a.textContent = text || url;\n\n if (!linkSavedRange.collapsed) {\n linkSavedRange.deleteContents();\n }\n linkSavedRange.insertNode(a);\n\n const nr = document.createRange();\n nr.setStartAfter(a);\n nr.collapse(true);\n sel.removeAllRanges();\n sel.addRange(nr);\n }\n\n editor.focus();\n linkSavedRange = null;\n}\n\n// Popover key handling — both inputs\n[linkTextInput, linkUrlInput].forEach(input => {\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') { e.preventDefault(); applyLink(); }\n if (e.key === 'Escape') { e.preventDefault(); closeLinkPopover(); }\n });\n});\n\n// Close popover on outside click (delayed check to avoid same-event close)\ndocument.addEventListener('mousedown', (e) => {\n if (linkPopoverOpen && !linkPopover.contains(e.target) && !e.target.closest('.toolbar-btn')) {\n closeLinkPopover();\n }\n});\n\n// ─── Toolbar toggle (Aa button) ───\nlet toolbarVisible = true;\nfunction toggleToolbar() {\n toolbarVisible = !toolbarVisible;\n document.getElementById('toolbar').style.display = toolbarVisible ? '' : 'none';\n document.getElementById('aaToggle').classList.toggle('active', toolbarVisible);\n}\n\n// ─── Send button state ───\nfunction updateSendBtn() {\n const text = sourceMode ? sourceEditor.value.trim() : (editor.textContent || '').trim();\n document.getElementById('sendBtn').disabled = !text;\n}\neditor.addEventListener('input', updateSendBtn);\n\n// ─── Source mode ───\nfunction toggleSourceMode() {\n sourceMode = !sourceMode;\n document.getElementById('sourceToggle').classList.toggle('active', sourceMode);\n if (sourceMode) {\n sourceEditor.value = htmlToMrkdwn(editor);\n editor.style.display = 'none';\n sourceEditor.style.display = 'block';\n document.getElementById('toolbar').style.display = 'none';\n document.getElementById('aaToggle').style.display = 'none';\n sourceEditor.focus();\n } else {\n editor.innerHTML = mrkdwnToHtml(sourceEditor.value);\n sourceEditor.style.display = 'none';\n editor.style.display = '';\n document.getElementById('toolbar').style.display = toolbarVisible ? '' : 'none';\n document.getElementById('aaToggle').style.display = '';\n editor.focus();\n }\n updateSendBtn();\n}\n\nsourceEditor.addEventListener('keydown', (e) => {\n if (e[MOD] && e.key === 'Enter') { e.preventDefault(); handleSend(); }\n});\nsourceEditor.addEventListener('input', updateSendBtn);\n\n// ─── Send / Cancel ───\nlet sending = false;\n\nasync function handleSend() {\n if (sending) { return; }\n const text = sourceMode ? sourceEditor.value.trim() : htmlToMrkdwn(editor);\n if (!text) { editor.focus(); return; }\n\n sending = true;\n const btn = document.getElementById('sendBtn');\n btn.disabled = true;\n btn.innerHTML = '\\\\u2026';\n\n try {\n const resp = await fetch('/send', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text }),\n });\n const data = await resp.json();\n if (data.ok) {\n let sub = 'You can close this tab.';\n if (data.ts && CONFIG.workspaceUrl && CONFIG.channelId) {\n const tsNoDot = data.ts.replace('.', '');\n const baseUrl = CONFIG.workspaceUrl.replace(/\\\\/$/, '');\n const msgUrl = baseUrl + '/archives/' + CONFIG.channelId + '/p' + tsNoDot;\n sub = '<a href=\"' + msgUrl + '\" target=\"_blank\" style=\"color:var(--accent);text-decoration:none;\">View in Slack \\\\u2197</a><br><span style=\"opacity:0.6;font-size:12px;\">You can close this tab.</span>';\n }\n showOverlay('Message sent \\\\u2705', sub, 'success');\n } else {\n throw new Error(data.error || 'Send failed');\n }\n } catch (err) {\n showOverlay('Failed to send', err.message, 'error');\n sending = false;\n btn.disabled = false;\n btn.innerHTML = '<svg viewBox=\"0 0 20 20\" style=\"width:16px;height:16px;fill:currentColor\"><path d=\"M1.7 9.1l7.3 1 .01 0L1.7 9.1zm0 1.8l7.3-1-7.3 1zM1.5 2.1c-.2-.7.5-1.3 1.1-1L19 8.9c.6.3.6 1.2 0 1.5L2.6 18.9c-.7.3-1.3-.3-1.1-1l1.8-6.9L11 10 3.3 8.9 1.5 2.1z\"/></svg>';\n }\n}\n\nasync function handleCancel() {\n try { await fetch('/cancel', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: '{}' }); } catch (_) {}\n showOverlay('Draft cancelled', 'You can close this tab.', 'success');\n}\n\nfunction showOverlay(title, sub, type) {\n const overlay = document.getElementById('resultOverlay');\n const msg = document.getElementById('resultMsg');\n msg.className = 'overlay-msg ' + type;\n msg.innerHTML = title + '<small>' + sub + '</small>';\n overlay.classList.add('visible');\n}\n\n// ─── Focus ───\neditor.focus();\nupdateSendBtn();\n</script>\n</body>\n</html>`;\n",
|
|
48
|
+
"import type { CliContext } from \"./context.ts\";\nimport {\n fetchMessage,\n fetchThread,\n fetchChannelHistory,\n toCompactMessage,\n} from \"../slack/messages.ts\";\nimport { pruneEmpty } from \"../lib/compact-json.ts\";\nimport { parseMsgTarget } from \"./targets.ts\";\nimport { resolveChannelId } from \"../slack/channels.ts\";\nimport { downloadMessageFiles } from \"./message-file-downloads.ts\";\nimport { warnOnTruncatedSlackUrl } from \"./message-url-warning.ts\";\nimport { getThreadSummary, toThreadListMessage } from \"./message-thread-info.ts\";\nimport type { MessageCommandOptions } from \"./message-actions.ts\";\nimport {\n parseLimit,\n parseReactionFilters,\n requireOldestWhenReactionFiltersUsed,\n} from \"./message-actions.ts\";\n\nexport async function handleMessageGet(input: {\n ctx: CliContext;\n targetInput: string;\n options: MessageCommandOptions;\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(input.targetInput);\n if (target.kind === \"user\") {\n throw new Error(\n \"message get does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n\n return input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client, auth } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n const includeReactions = Boolean(input.options.includeReactions);\n const msg = await fetchMessage(client, { ref, includeReactions });\n const thread = await getThreadSummary(client, { channelId: ref.channel_id, msg });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: [msg] });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n const message = toCompactMessage(msg, { maxBodyChars, includeReactions, downloadedPaths });\n return pruneEmpty({ message, thread }) as Record<string, unknown>;\n }\n\n const ts = input.options.ts?.trim();\n if (!ts) {\n throw new Error('When targeting a channel, you must pass --ts \"<seconds>.<micros>\"');\n }\n\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n\n const includeReactions = Boolean(input.options.includeReactions);\n const { client, auth, workspace_url } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, target.channel);\n const ref = {\n workspace_url: workspace_url ?? workspaceUrl ?? \"\",\n channel_id: channelId,\n message_ts: ts,\n thread_ts_hint: input.options.threadTs?.trim() || undefined,\n raw: input.targetInput,\n };\n\n const msg = await fetchMessage(client, { ref, includeReactions });\n const thread = await getThreadSummary(client, { channelId, msg });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: [msg] });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n const message = toCompactMessage(msg, { maxBodyChars, includeReactions, downloadedPaths });\n return pruneEmpty({ message, thread }) as Record<string, unknown>;\n },\n });\n}\n\nexport async function handleMessageList(input: {\n ctx: CliContext;\n targetInput: string;\n options: MessageCommandOptions;\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(input.targetInput);\n if (target.kind === \"user\") {\n throw new Error(\n \"message list does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n\n return input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n const withReactions = parseReactionFilters(input.options.withReaction);\n const withoutReactions = parseReactionFilters(input.options.withoutReaction);\n const hasReactionFilters = withReactions.length > 0 || withoutReactions.length > 0;\n\n if (target.kind === \"url\") {\n if (hasReactionFilters) {\n throw new Error(\n \"Reaction filters are only supported for channel history mode (not message URL thread mode)\",\n );\n }\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client, auth } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n const includeReactions = Boolean(input.options.includeReactions);\n const msg = await fetchMessage(client, { ref, includeReactions });\n const rootTs = msg.thread_ts ?? msg.ts;\n const threadMessages = await fetchThread(client, {\n channelId: ref.channel_id,\n threadTs: rootTs,\n includeReactions,\n });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: threadMessages });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n return pruneEmpty({\n messages: threadMessages\n .map((m) => toCompactMessage(m, { maxBodyChars, includeReactions, downloadedPaths }))\n .map(toThreadListMessage),\n }) as Record<string, unknown>;\n }\n\n const { client, auth, workspace_url } = await input.ctx.getClientForWorkspace(workspaceUrl);\n\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n\n const channelId = await resolveChannelId(client, target.channel);\n\n const threadTs = input.options.threadTs?.trim();\n const ts = input.options.ts?.trim();\n\n // No thread specifier → list recent channel messages\n if (!threadTs && !ts) {\n const includeReactions = Boolean(input.options.includeReactions);\n const limit = parseLimit(input.options.limit);\n const oldest = requireOldestWhenReactionFiltersUsed({\n oldest: input.options.oldest,\n withReactions,\n withoutReactions,\n });\n const channelMessages = await fetchChannelHistory(client, {\n channelId,\n limit,\n latest: input.options.latest?.trim(),\n oldest,\n includeReactions: includeReactions || hasReactionFilters,\n withReactions,\n withoutReactions,\n });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: channelMessages });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n return pruneEmpty({\n channel_id: channelId,\n messages: channelMessages.map((m) =>\n toCompactMessage(m, { maxBodyChars, includeReactions, downloadedPaths }),\n ),\n }) as Record<string, unknown>;\n }\n\n if (hasReactionFilters) {\n throw new Error(\n \"Reaction filters are only supported for channel history mode (without --thread-ts/--ts)\",\n );\n }\n\n const rootTs =\n threadTs ??\n (await (async () => {\n const ref = {\n workspace_url: workspace_url ?? workspaceUrl ?? \"\",\n channel_id: channelId,\n message_ts: ts!,\n raw: input.targetInput,\n };\n const includeReactions = Boolean(input.options.includeReactions);\n const msg = await fetchMessage(client, { ref, includeReactions });\n return msg.thread_ts ?? msg.ts;\n })());\n\n const includeReactions = Boolean(input.options.includeReactions);\n const threadMessages = await fetchThread(client, {\n channelId,\n threadTs: rootTs,\n includeReactions,\n });\n const downloadedPaths = await downloadMessageFiles({ auth, messages: threadMessages });\n const maxBodyChars = Number.parseInt(input.options.maxBodyChars, 10);\n return pruneEmpty({\n messages: threadMessages\n .map((m) => toCompactMessage(m, { maxBodyChars, includeReactions, downloadedPaths }))\n .map(toThreadListMessage),\n }) as Record<string, unknown>;\n },\n });\n}\n",
|
|
49
|
+
"import type { CliContext } from \"./context.ts\";\nimport { fetchMessage } from \"../slack/messages.ts\";\nimport { parseMsgTarget } from \"./targets.ts\";\nimport { resolveChannelId, openDmChannel } from \"../slack/channels.ts\";\nimport { normalizeSlackReactionName } from \"../slack/emoji.ts\";\nimport { warnOnTruncatedSlackUrl } from \"./message-url-warning.ts\";\nimport { textToRichTextBlocks } from \"../slack/rich-text.ts\";\nimport { getThreadSummary, toThreadListMessage } from \"./message-thread-info.ts\";\nimport type { SlackApiClient } from \"../slack/client.ts\";\nimport { uploadLocalFileToSlack } from \"../slack/upload.ts\";\n\nexport type MessageCommandOptions = {\n maxBodyChars: string;\n workspace?: string;\n ts?: string;\n threadTs?: string;\n limit?: string;\n oldest?: string;\n latest?: string;\n withReaction?: string[];\n withoutReaction?: string[];\n includeReactions?: boolean;\n};\n\nexport function parseLimit(raw: string | undefined): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1) {\n throw new Error(`Invalid --limit value \"${raw}\": must be a positive integer`);\n }\n return n;\n}\n\nexport function requireMessageTs(raw: string | undefined): string {\n const ts = raw?.trim();\n if (!ts) {\n throw new Error('When targeting a channel, you must pass --ts \"<seconds>.<micros>\"');\n }\n return ts;\n}\n\nexport function parseReactionFilters(raw: string[] | undefined): string[] {\n if (!Array.isArray(raw) || raw.length === 0) {\n return [];\n }\n const out: string[] = [];\n for (const value of raw) {\n const normalized = normalizeSlackReactionName(String(value));\n if (!out.includes(normalized)) {\n out.push(normalized);\n }\n }\n return out;\n}\n\nexport function requireOldestWhenReactionFiltersUsed(input: {\n oldest?: string;\n withReactions: string[];\n withoutReactions: string[];\n}): string | undefined {\n const hasReactionFilters = input.withReactions.length > 0 || input.withoutReactions.length > 0;\n const oldest = input.oldest?.trim();\n if (!hasReactionFilters) {\n return oldest;\n }\n if (!oldest) {\n throw new Error(\n 'Reaction filters require --oldest \"<seconds>.<micros>\" to bound scan size. Example: --oldest \"1770165109.628379\"',\n );\n }\n return oldest;\n}\n\nexport async function sendMessage(input: {\n ctx: CliContext;\n targetInput: string;\n text: string;\n options: { workspace?: string; threadTs?: string; attach?: string[] };\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(String(input.targetInput));\n const blocks = input.text ? textToRichTextBlocks(input.text) : null;\n const attachPaths = normalizeAttachPaths(input.options.attach);\n\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n await input.ctx.withAutoRefresh({\n workspaceUrl: ref.workspace_url,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n const msg = await fetchMessage(client, { ref });\n const threadTs = msg.thread_ts ?? msg.ts;\n await sendMessageToChannel({\n client,\n channelId: ref.channel_id,\n text: input.text,\n blocks,\n threadTs,\n attachPaths,\n });\n },\n });\n return { ok: true };\n }\n\n if (target.kind === \"user\") {\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const dmChannelId = await openDmChannel(client, target.userId);\n await sendMessageToChannel({\n client,\n channelId: dmChannelId,\n text: input.text,\n blocks,\n attachPaths,\n });\n },\n });\n return { ok: true };\n }\n\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [String(target.channel)],\n });\n await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, String(target.channel));\n await sendMessageToChannel({\n client,\n channelId,\n text: input.text,\n blocks,\n threadTs: input.options.threadTs ? String(input.options.threadTs) : undefined,\n attachPaths,\n });\n },\n });\n return { ok: true };\n}\n\nfunction normalizeAttachPaths(raw: string[] | undefined): string[] {\n if (!Array.isArray(raw) || raw.length === 0) {\n return [];\n }\n const out: string[] = [];\n for (const p of raw.map((v) => String(v).trim()).filter(Boolean)) {\n if (!out.includes(p)) {\n out.push(p);\n }\n }\n return out;\n}\n\nasync function sendMessageToChannel(input: {\n client: SlackApiClient;\n channelId: string;\n text: string;\n blocks?: unknown[] | null;\n threadTs?: string;\n attachPaths: string[];\n}): Promise<void> {\n if (input.attachPaths.length === 0) {\n await input.client.api(\"chat.postMessage\", {\n channel: input.channelId,\n text: input.text,\n thread_ts: input.threadTs,\n ...(input.blocks ? { blocks: input.blocks } : {}),\n });\n return;\n }\n\n if (input.blocks) {\n process.stderr.write(\n \"Warning: rich text formatting is not supported with file attachments; sending as plain text.\\n\",\n );\n }\n\n let initialComment = input.text;\n for (const filePath of input.attachPaths) {\n await uploadLocalFileToSlack({\n client: input.client,\n channelId: input.channelId,\n filePath,\n threadTs: input.threadTs,\n initialComment,\n });\n initialComment = \"\";\n }\n}\n\nexport async function editMessage(input: {\n ctx: CliContext;\n targetInput: string;\n text: string;\n options: { workspace?: string; ts?: string };\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(String(input.targetInput));\n if (target.kind === \"user\") {\n throw new Error(\n \"message edit does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n\n await input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n await client.api(\"chat.update\", {\n channel: ref.channel_id,\n ts: ref.message_ts,\n text: input.text,\n });\n return;\n }\n\n const ts = requireMessageTs(input.options.ts);\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, target.channel);\n await client.api(\"chat.update\", {\n channel: channelId,\n ts,\n text: input.text,\n });\n },\n });\n\n return { ok: true };\n}\n\nexport async function deleteMessage(input: {\n ctx: CliContext;\n targetInput: string;\n options: { workspace?: string; ts?: string };\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(String(input.targetInput));\n if (target.kind === \"user\") {\n throw new Error(\n \"message delete does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n\n await input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n await client.api(\"chat.delete\", {\n channel: ref.channel_id,\n ts: ref.message_ts,\n });\n return;\n }\n\n const ts = requireMessageTs(input.options.ts);\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, target.channel);\n await client.api(\"chat.delete\", {\n channel: channelId,\n ts,\n });\n },\n });\n\n return { ok: true };\n}\n\nexport async function reactOnTarget(input: {\n ctx: CliContext;\n action: \"add\" | \"remove\";\n targetInput: string;\n emoji: string;\n options?: { workspace?: string; ts?: string };\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(input.targetInput);\n if (target.kind === \"user\") {\n throw new Error(\n \"react does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options?.workspace);\n\n await input.ctx.withAutoRefresh({\n workspaceUrl: target.kind === \"url\" ? target.ref.workspace_url : workspaceUrl,\n work: async () => {\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n const { client } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n const name = normalizeSlackReactionName(input.emoji);\n await client.api(`reactions.${input.action}`, {\n channel: ref.channel_id,\n timestamp: ref.message_ts,\n name,\n });\n return;\n }\n\n const ts = requireMessageTs(input.options?.ts);\n\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [target.channel],\n });\n\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, target.channel);\n const name = normalizeSlackReactionName(input.emoji);\n await client.api(`reactions.${input.action}`, {\n channel: channelId,\n timestamp: ts,\n name,\n });\n },\n });\n\n return { ok: true };\n}\n\nexport { handleMessageGet, handleMessageList } from \"./message-read-actions.ts\";\n",
|
|
50
|
+
"import { createServer, type IncomingMessage, type Server } from \"node:http\";\nimport { execFile } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\nexport type DraftEditorConfig = {\n channelName: string;\n channelId?: string;\n workspaceUrl?: string;\n threadTs?: string;\n initialText?: string;\n onSend: (mrkdwn: string) => Promise<{ ts: string }>;\n};\n\nexport type DraftResult = { sent: true; text: string } | { cancelled: true };\n\nexport function openDraftEditor(config: DraftEditorConfig): Promise<DraftResult> {\n return new Promise<DraftResult>((resolve, reject) => {\n let settled = false;\n\n const server: Server = createServer(async (req, res) => {\n if (req.method === \"GET\" && (req.url === \"/\" || req.url === \"/index.html\")) {\n const html = buildEditorHtml(config);\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n\n if (req.method === \"POST\" && req.url === \"/send\") {\n try {\n const body = await readBody(req);\n const data = JSON.parse(body) as { text: string };\n if (typeof data.text !== \"string\" || !data.text.trim()) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: \"text is required\" }));\n return;\n }\n const sendResult = await config.onSend(data.text);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true, ts: sendResult.ts }));\n settled = true;\n resolve({ sent: true, text: data.text });\n setTimeout(() => server.close(), 300);\n } catch (err: unknown) {\n const safeMessage =\n err instanceof Error\n ? err.message.replace(/xox[a-z]-[A-Za-z0-9-]+/g, \"[REDACTED]\")\n : \"Send failed\";\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: false, error: safeMessage }));\n }\n return;\n }\n\n if (req.method === \"POST\" && req.url === \"/cancel\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n settled = true;\n resolve({ cancelled: true });\n setTimeout(() => server.close(), 300);\n return;\n }\n\n res.writeHead(404);\n res.end(\"Not found\");\n });\n\n server.on(\"error\", (err) => {\n if (!settled) {\n reject(err);\n }\n });\n\n server.on(\"close\", () => {\n clearTimeout(idleTimeout);\n if (!settled) {\n settled = true;\n resolve({ cancelled: true });\n }\n });\n\n const idleTimeout = setTimeout(\n () => {\n if (!settled) {\n server.close();\n }\n },\n 30 * 60 * 1000,\n );\n\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n const port = typeof addr === \"object\" && addr ? addr.port : 0;\n const url = `http://127.0.0.1:${port}`;\n process.stderr.write(`Draft editor: ${url}\\n`);\n openBrowser(url);\n });\n });\n}\n\nconst MAX_BODY_BYTES = 1024 * 1024; // 1 MB\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n req.on(\"data\", (chunk: Buffer) => {\n totalBytes += chunk.length;\n if (totalBytes > MAX_BODY_BYTES) {\n req.destroy();\n reject(new Error(\"Request body too large\"));\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n}\n\nfunction openBrowser(url: string): void {\n const cmd =\n process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n execFile(cmd, [url], () => {});\n}\n\nfunction buildSlackThreadUrl(config: DraftEditorConfig): string | null {\n if (!config.workspaceUrl || !config.channelId || !config.threadTs) {\n return null;\n }\n const tsNoDot = config.threadTs.replaceAll(\".\", \"\");\n return `${config.workspaceUrl.replace(/\\/$/, \"\")}/archives/${config.channelId}/p${tsNoDot}`;\n}\n\nfunction extractWorkspaceName(url?: string): string | null {\n if (!url) {\n return null;\n }\n try {\n const host = new URL(url).hostname; // e.g. \"stablygroup.slack.com\"\n const parts = host.split(\".\");\n if (parts.length >= 3 && parts.at(-2) === \"slack\") {\n return parts.slice(0, -2).join(\".\"); // e.g. \"stablygroup\"\n }\n return host;\n } catch {\n return null;\n }\n}\n\nfunction buildEditorHtml(config: DraftEditorConfig): string {\n const threadUrl = buildSlackThreadUrl(config);\n const workspaceName = extractWorkspaceName(config.workspaceUrl);\n const injectedConfig = JSON.stringify({\n channelName: config.channelName,\n channelId: config.channelId || null,\n workspaceUrl: config.workspaceUrl || null,\n workspaceName,\n threadTs: config.threadTs || null,\n threadUrl,\n initialText: config.initialText || \"\",\n });\n\n // JSON.stringify handles quotes/backslashes; escape < and > to prevent\n // </script> breakout and other HTML injection in <script> context.\n const safeConfig = injectedConfig.replace(/</g, \"\\\\u003c\").replace(/>/g, \"\\\\u003e\");\n return getEditorHtml().replace(\"__DRAFT_CONFIG__\", safeConfig);\n}\n\n// ---------------------------------------------------------------------------\n// Self-contained HTML editor — lazy-loaded from draft-editor.html\n// ---------------------------------------------------------------------------\n\nlet _editorHtml: string | undefined;\n\nfunction getEditorHtml(): string {\n if (!_editorHtml) {\n _editorHtml = readFileSync(\n join(dirname(fileURLToPath(import.meta.url)), \"draft-editor.html\"),\n \"utf-8\",\n );\n }\n return _editorHtml;\n}\n",
|
|
44
51
|
"import type { CliContext } from \"./context.ts\";\nimport { fetchMessage } from \"../slack/messages.ts\";\nimport { parseMsgTarget } from \"./targets.ts\";\nimport { resolveChannelId, resolveChannelName, normalizeChannelInput } from \"../slack/channels.ts\";\nimport { warnOnTruncatedSlackUrl } from \"./message-url-warning.ts\";\nimport { openDraftEditor } from \"./draft-server.ts\";\n\nexport async function draftMessage(input: {\n ctx: CliContext;\n targetInput: string;\n initialText?: string;\n options: { workspace?: string; threadTs?: string };\n}): Promise<Record<string, unknown>> {\n const target = parseMsgTarget(String(input.targetInput));\n if (target.kind === \"user\") {\n throw new Error(\n \"message draft does not support user ID targets. Use a channel name, channel ID, or message URL.\",\n );\n }\n\n // URL target: resolve thread context and send\n if (target.kind === \"url\") {\n const { ref } = target;\n warnOnTruncatedSlackUrl(ref);\n return input.ctx.withAutoRefresh({\n workspaceUrl: ref.workspace_url,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(ref.workspace_url);\n const msg = await fetchMessage(client, { ref });\n const threadTs = input.options.threadTs ?? msg.thread_ts ?? msg.ts;\n const channelName = await resolveChannelName(client, ref.channel_id);\n\n return draftWithEditor({\n channelName,\n channelId: ref.channel_id,\n workspaceUrl: ref.workspace_url,\n threadTs,\n initialText: input.initialText,\n sendFn: async (text: string) => {\n const resp = await client.api(\"chat.postMessage\", {\n channel: ref.channel_id,\n text,\n thread_ts: threadTs,\n });\n return { ts: resp.ts as string };\n },\n });\n },\n });\n }\n\n // Channel name/ID target\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [String(target.channel)],\n });\n\n return input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, String(target.channel));\n const normalized = normalizeChannelInput(target.channel);\n const channelName =\n normalized.kind === \"name\" ? normalized.value : await resolveChannelName(client, channelId);\n\n return draftWithEditor({\n channelName,\n channelId,\n workspaceUrl,\n threadTs: input.options.threadTs,\n initialText: input.initialText,\n sendFn: async (text: string) => {\n const resp = await client.api(\"chat.postMessage\", {\n channel: channelId,\n text,\n thread_ts: input.options.threadTs,\n });\n return { ts: resp.ts as string };\n },\n });\n },\n });\n}\n\nasync function draftWithEditor(input: {\n channelName: string;\n channelId: string;\n workspaceUrl?: string;\n threadTs?: string;\n initialText?: string;\n sendFn: (text: string) => Promise<{ ts: string }>;\n}): Promise<Record<string, unknown>> {\n // In CI mode, skip the editor and send directly\n if (process.env.CI) {\n if (!input.initialText) {\n throw new Error(\"In CI mode, initial text is required (no editor available)\");\n }\n const result = await input.sendFn(input.initialText);\n return { ok: true, sent: true, editor: \"skipped\", ts: result.ts };\n }\n\n const result = await openDraftEditor({\n channelName: input.channelName,\n channelId: input.channelId,\n workspaceUrl: input.workspaceUrl,\n threadTs: input.threadTs,\n initialText: input.initialText,\n onSend: input.sendFn,\n });\n\n if (\"cancelled\" in result) {\n return { ok: true, cancelled: true };\n }\n\n return { ok: true, sent: true };\n}\n",
|
|
45
|
-
"import type { Command } from \"commander\";\nimport type { CliContext } from \"./context.ts\";\nimport {\n deleteMessage,\n editMessage,\n handleMessageGet,\n handleMessageList,\n reactOnTarget,\n sendMessage,\n type MessageCommandOptions,\n} from \"./message-actions.ts\";\nimport { draftMessage } from \"./draft-actions.ts\";\n\nfunction collectOptionValue(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function registerMessageCommand(input: { program: Command; ctx: CliContext }): void {\n const messageCmd = input.program\n .command(\"message\")\n .description(\"Read/write Slack messages (token-efficient JSON)\");\n\n messageCmd\n .command(\"get\", { isDefault: true })\n .description(\"Fetch a single Slack message (with thread summary if any)\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .option(\"--thread-ts <ts>\", \"Thread root ts hint (useful for thread permalinks)\")\n .option(\n \"--max-body-chars <n>\",\n \"Max content characters to include (default 8000, -1 for unlimited)\",\n \"8000\",\n )\n .option(\"--include-reactions\", \"Include reactions + reacting users\")\n .action(async (...args) => {\n const [targetInput, options] = args as [string, MessageCommandOptions];\n try {\n const payload = await handleMessageGet({ ctx: input.ctx, targetInput, options });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"list\")\n .description(\"List recent channel messages, or fetch a full thread\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--thread-ts <ts>\", \"Thread root ts (lists thread replies instead of channel history)\")\n .option(\"--ts <ts>\", \"Message ts (resolve message to its thread)\")\n .option(\"--limit <n>\", \"Max messages to return for channel history (default 25, max 200)\")\n .option(\"--oldest <ts>\", \"Only messages after this ts (channel history mode)\")\n .option(\"--latest <ts>\", \"Only messages before this ts (channel history mode)\")\n .option(\n \"--with-reaction <emoji>\",\n \"Only include messages with this reaction (repeatable; channel history mode; requires --oldest)\",\n collectOptionValue,\n [],\n )\n .option(\n \"--without-reaction <emoji>\",\n \"Only include messages without this reaction (repeatable; channel history mode; requires --oldest)\",\n collectOptionValue,\n [],\n )\n .option(\n \"--max-body-chars <n>\",\n \"Max content characters to include (default 8000, -1 for unlimited)\",\n \"8000\",\n )\n .option(\"--include-reactions\", \"Include reactions + reacting users\")\n .action(async (...args) => {\n const [targetInput, options] = args as [string, MessageCommandOptions];\n try {\n const payload = await handleMessageList({ ctx: input.ctx, targetInput, options });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"edit\")\n .description(\"Edit a message\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .argument(\"<text>\", \"New message text\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .action(async (...args) => {\n const [targetInput, text, options] = args as [\n string,\n string,\n { workspace?: string; ts?: string },\n ];\n try {\n const payload = await editMessage({\n ctx: input.ctx,\n targetInput,\n text,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"delete\")\n .description(\"Delete a message\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .action(async (...args) => {\n const [targetInput, options] = args as [string, { workspace?: string; ts?: string }];\n try {\n const payload = await deleteMessage({\n ctx: input.ctx,\n targetInput,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"send\")\n .description(\"Send a message (optionally into a thread)\")\n .argument(\"<target>\", \"Slack message URL, #name/name, or channel id\")\n .argument(\"<text>\", \"Message text to post\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--thread-ts <ts>\", \"Thread root ts to post into (optional)\")\n .action(async (...args) => {\n const [targetInput, text, options] = args as [\n string,\n string,\n { workspace?: string; threadTs?: string },\n ];\n try {\n const payload = await sendMessage({\n ctx: input.ctx,\n targetInput,\n text,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"draft\")\n .description(\"Open a rich Slack-like editor to compose and send a message\")\n .argument(\"<target>\", \"Slack message URL, #name/name, or channel id\")\n .argument(\"[text]\", \"Initial draft text (mrkdwn format)\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--thread-ts <ts>\", \"Thread root ts to post into (optional)\")\n .action(async (...args) => {\n const [targetInput, text, options] = args as [\n string,\n string | undefined,\n { workspace?: string; threadTs?: string },\n ];\n try {\n const payload = await draftMessage({\n ctx: input.ctx,\n targetInput,\n initialText: text,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n const reactCmd = messageCmd.command(\"react\").description(\"Add or remove reactions\");\n\n reactCmd\n .command(\"add\")\n .description(\"Add a reaction to a message\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .argument(\"<emoji>\", \"Emoji to react with (:rocket:, rocket, or 🚀)\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .action(async (...args) => {\n const [targetInput, emoji, options] = args as [\n string,\n string,\n { workspace?: string; ts?: string },\n ];\n try {\n const payload = await reactOnTarget({\n ctx: input.ctx,\n action: \"add\",\n targetInput,\n emoji,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n reactCmd\n .command(\"remove\")\n .description(\"Remove a reaction from a message\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .argument(\"<emoji>\", \"Emoji to remove (:rocket:, rocket, or 🚀)\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .action(async (...args) => {\n const [targetInput, emoji, options] = args as [\n string,\n string,\n { workspace?: string; ts?: string },\n ];\n try {\n const payload = await reactOnTarget({\n ctx: input.ctx,\n action: \"remove\",\n targetInput,\n emoji,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n}\n",
|
|
52
|
+
"import type { Command } from \"commander\";\nimport type { CliContext } from \"./context.ts\";\nimport {\n deleteMessage,\n editMessage,\n handleMessageGet,\n handleMessageList,\n reactOnTarget,\n sendMessage,\n type MessageCommandOptions,\n} from \"./message-actions.ts\";\nimport { draftMessage } from \"./draft-actions.ts\";\n\nfunction collectOptionValue(value: string, previous: string[] = []): string[] {\n return [...previous, value];\n}\n\nexport function registerMessageCommand(input: { program: Command; ctx: CliContext }): void {\n const messageCmd = input.program\n .command(\"message\")\n .description(\"Read/write Slack messages (token-efficient JSON)\");\n\n messageCmd\n .command(\"get\", { isDefault: true })\n .description(\"Fetch a single Slack message (with thread summary if any)\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .option(\"--thread-ts <ts>\", \"Thread root ts hint (useful for thread permalinks)\")\n .option(\n \"--max-body-chars <n>\",\n \"Max content characters to include (default 8000, -1 for unlimited)\",\n \"8000\",\n )\n .option(\"--include-reactions\", \"Include reactions + reacting users\")\n .action(async (...args) => {\n const [targetInput, options] = args as [string, MessageCommandOptions];\n try {\n const payload = await handleMessageGet({ ctx: input.ctx, targetInput, options });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"list\")\n .description(\"List recent channel messages, or fetch a full thread\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--thread-ts <ts>\", \"Thread root ts (lists thread replies instead of channel history)\")\n .option(\"--ts <ts>\", \"Message ts (resolve message to its thread)\")\n .option(\"--limit <n>\", \"Max messages to return for channel history (default 25, max 200)\")\n .option(\"--oldest <ts>\", \"Only messages after this ts (channel history mode)\")\n .option(\"--latest <ts>\", \"Only messages before this ts (channel history mode)\")\n .option(\n \"--with-reaction <emoji>\",\n \"Only include messages with this reaction (repeatable; channel history mode; requires --oldest)\",\n collectOptionValue,\n [],\n )\n .option(\n \"--without-reaction <emoji>\",\n \"Only include messages without this reaction (repeatable; channel history mode; requires --oldest)\",\n collectOptionValue,\n [],\n )\n .option(\n \"--max-body-chars <n>\",\n \"Max content characters to include (default 8000, -1 for unlimited)\",\n \"8000\",\n )\n .option(\"--include-reactions\", \"Include reactions + reacting users\")\n .action(async (...args) => {\n const [targetInput, options] = args as [string, MessageCommandOptions];\n try {\n const payload = await handleMessageList({ ctx: input.ctx, targetInput, options });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"edit\")\n .description(\"Edit a message\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .argument(\"<text>\", \"New message text\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .action(async (...args) => {\n const [targetInput, text, options] = args as [\n string,\n string,\n { workspace?: string; ts?: string },\n ];\n try {\n const payload = await editMessage({\n ctx: input.ctx,\n targetInput,\n text,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"delete\")\n .description(\"Delete a message\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .action(async (...args) => {\n const [targetInput, options] = args as [string, { workspace?: string; ts?: string }];\n try {\n const payload = await deleteMessage({\n ctx: input.ctx,\n targetInput,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"send\")\n .description(\"Send a message (optionally into a thread)\")\n .argument(\"<target>\", \"Slack message URL, #name/name, or channel id\")\n .argument(\"[text]\", \"Message text to post (optional when using --attach)\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--thread-ts <ts>\", \"Thread root ts to post into (optional)\")\n .option(\"--attach <path>\", \"Attach a local file path (repeatable)\", collectOptionValue, [])\n .action(async (...args) => {\n const [targetInput, text, options] = args as [\n string,\n string | undefined,\n { workspace?: string; threadTs?: string; attach?: string[] },\n ];\n const hasAttach = (options.attach ?? []).length > 0;\n if (!text && !hasAttach) {\n console.error(\"Error: <text> is required when no --attach files are provided.\");\n process.exitCode = 1;\n return;\n }\n try {\n const payload = await sendMessage({\n ctx: input.ctx,\n targetInput,\n text: text ?? \"\",\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n messageCmd\n .command(\"draft\")\n .description(\"Open a rich Slack-like editor to compose and send a message\")\n .argument(\"<target>\", \"Slack message URL, #name/name, or channel id\")\n .argument(\"[text]\", \"Initial draft text (mrkdwn format)\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--thread-ts <ts>\", \"Thread root ts to post into (optional)\")\n .action(async (...args) => {\n const [targetInput, text, options] = args as [\n string,\n string | undefined,\n { workspace?: string; threadTs?: string },\n ];\n try {\n const payload = await draftMessage({\n ctx: input.ctx,\n targetInput,\n initialText: text,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n const reactCmd = messageCmd.command(\"react\").description(\"Add or remove reactions\");\n\n reactCmd\n .command(\"add\")\n .description(\"Add a reaction to a message\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .argument(\"<emoji>\", \"Emoji to react with (:rocket:, rocket, or 🚀)\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .action(async (...args) => {\n const [targetInput, emoji, options] = args as [\n string,\n string,\n { workspace?: string; ts?: string },\n ];\n try {\n const payload = await reactOnTarget({\n ctx: input.ctx,\n action: \"add\",\n targetInput,\n emoji,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n reactCmd\n .command(\"remove\")\n .description(\"Remove a reaction from a message\")\n .argument(\"<target>\", \"Slack message URL, #channel, or channel ID\")\n .argument(\"<emoji>\", \"Emoji to remove (:rocket:, rocket, or 🚀)\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when using #channel/channel id across multiple workspaces)\",\n )\n .option(\"--ts <ts>\", \"Message ts (required when using #channel/channel id)\")\n .action(async (...args) => {\n const [targetInput, emoji, options] = args as [\n string,\n string,\n { workspace?: string; ts?: string },\n ];\n try {\n const payload = await reactOnTarget({\n ctx: input.ctx,\n action: \"remove\",\n targetInput,\n emoji,\n options,\n });\n console.log(JSON.stringify(payload, null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n}\n",
|
|
46
53
|
"import type { SlackApiClient } from \"./client.ts\";\nimport { normalizeChannelInput } from \"./channels.ts\";\nimport { asArray, getString, isRecord } from \"../lib/object-type-guards.ts\";\n\nexport async function buildSlackSearchQuery(\n client: SlackApiClient,\n input: {\n query: string;\n channels?: string[];\n user?: string;\n after?: string;\n before?: string;\n },\n): Promise<string> {\n const parts: string[] = [];\n const base = input.query.trim();\n if (base) {\n parts.push(base);\n }\n\n if (input.after) {\n parts.push(`after:${validateDate(input.after)}`);\n }\n if (input.before) {\n parts.push(`before:${validateDate(input.before)}`);\n }\n\n if (input.user) {\n const token = await userTokenForSearch(client, input.user);\n if (token) {\n parts.push(token);\n }\n }\n\n if (input.channels && input.channels.length > 0) {\n for (const ch of input.channels) {\n const inToken = await channelTokenForSearch(client, ch);\n if (inToken) {\n parts.push(inToken);\n }\n }\n }\n\n return parts.join(\" \");\n}\n\nexport function validateDate(s: string): string {\n const v = s.trim();\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(v)) {\n throw new Error(`Invalid date: ${s} (expected YYYY-MM-DD)`);\n }\n return v;\n}\n\nexport function dateToUnixSeconds(date: string, edge: \"start\" | \"end\"): number {\n const d = validateDate(date);\n const iso = edge === \"start\" ? `${d}T00:00:00.000Z` : `${d}T23:59:59.999Z`;\n return Math.floor(Date.parse(iso) / 1000);\n}\n\nasync function userTokenForSearch(client: SlackApiClient, user: string): Promise<string | null> {\n const trimmed = user.trim();\n if (!trimmed) {\n return null;\n }\n\n // Accept @name or name\n if (trimmed.startsWith(\"@\")) {\n return `from:@${trimmed.slice(1)}`;\n }\n if (/^U[A-Z0-9]{8,}$/.test(trimmed)) {\n try {\n const info = await client.api(\"users.info\", { user: trimmed });\n const infoUser = isRecord(info) ? info.user : null;\n const name = isRecord(infoUser) ? (getString(infoUser.name) ?? \"\").trim() : \"\";\n return name ? `from:@${name}` : null;\n } catch {\n return null;\n }\n }\n return `from:@${trimmed}`;\n}\n\nasync function channelTokenForSearch(\n client: SlackApiClient,\n channel: string,\n): Promise<string | null> {\n const normalized = normalizeChannelInput(channel);\n if (normalized.kind === \"name\") {\n const name = normalized.value.trim();\n if (!name) {\n return null;\n }\n return `in:#${name}`;\n }\n\n // Channel id -> name for use in search query.\n try {\n const info = await client.api(\"conversations.info\", {\n channel: normalized.value,\n });\n const channelInfo = isRecord(info) ? info.channel : null;\n const name = isRecord(channelInfo) ? (getString(channelInfo.name) ?? \"\").trim() : \"\";\n if (name) {\n return `in:#${name}`;\n }\n } catch {\n // ignore\n }\n return null;\n}\n\nexport async function resolveUserId(\n client: SlackApiClient,\n input: string,\n): Promise<string | undefined> {\n const trimmed = input.trim();\n if (!trimmed) {\n return undefined;\n }\n if (/^U[A-Z0-9]{8,}$/.test(trimmed)) {\n return trimmed;\n }\n const name = trimmed.startsWith(\"@\") ? trimmed.slice(1) : trimmed;\n\n let cursor: string | undefined;\n for (;;) {\n const resp = await client.api(\"users.list\", { limit: 200, cursor });\n const members = isRecord(resp) ? asArray(resp.members).filter(isRecord) : [];\n const found = members.find((m) => {\n const mName = getString(m.name);\n const profile = isRecord(m.profile) ? m.profile : null;\n const display = profile ? getString(profile.display_name) : undefined;\n return mName === name || display === name;\n });\n const foundId = found ? getString(found.id) : undefined;\n if (foundId) {\n return foundId;\n }\n const meta = isRecord(resp) ? resp.response_metadata : null;\n const next = isRecord(meta) ? getString(meta.next_cursor) : undefined;\n if (!next) {\n break;\n }\n cursor = next;\n }\n return undefined;\n}\n",
|
|
47
54
|
"import type { SlackApiClient } from \"./client.ts\";\nimport { asArray, isRecord } from \"../lib/object-type-guards.ts\";\n\nexport async function searchMessagesRaw(\n client: SlackApiClient,\n input: { query: string; limit: number },\n): Promise<Record<string, unknown>[]> {\n const pageSize = Math.min(Math.max(input.limit, 1), 100);\n const out: Record<string, unknown>[] = [];\n let page = 1;\n let pages = 1;\n\n for (;;) {\n const resp = await client.api(\"search.messages\", {\n query: input.query,\n count: pageSize,\n page,\n highlight: false,\n sort: \"timestamp\",\n sort_dir: \"desc\",\n });\n const messages = isRecord(resp) ? resp.messages : null;\n const matches = isRecord(messages) ? asArray(messages.matches).filter(isRecord) : [];\n out.push(...matches);\n\n const paging = isRecord(messages) ? (messages.paging ?? messages.pagination) : null;\n const totalPages = Number(isRecord(paging) ? (paging.pages ?? 1) : 1);\n if (Number.isFinite(totalPages) && totalPages > 0) {\n pages = totalPages;\n }\n\n if (out.length >= input.limit) {\n break;\n }\n if (matches.length === 0) {\n break;\n }\n if (page >= pages) {\n break;\n }\n page++;\n }\n\n return out.slice(0, input.limit);\n}\n\nexport async function searchFilesRaw(\n client: SlackApiClient,\n input: { query: string; limit: number },\n): Promise<Record<string, unknown>[]> {\n const pageSize = Math.min(Math.max(input.limit, 1), 100);\n const out: Record<string, unknown>[] = [];\n let page = 1;\n let pages = 1;\n\n for (;;) {\n const resp = await client.api(\"search.files\", {\n query: input.query,\n count: pageSize,\n page,\n highlight: false,\n sort: \"timestamp\",\n sort_dir: \"desc\",\n });\n const files = isRecord(resp) ? resp.files : null;\n const matches = isRecord(files) ? asArray(files.matches).filter(isRecord) : [];\n out.push(...matches);\n\n const paging = isRecord(files) ? (files.paging ?? files.pagination) : null;\n const totalPages = Number(isRecord(paging) ? (paging.pages ?? 1) : 1);\n if (Number.isFinite(totalPages) && totalPages > 0) {\n pages = totalPages;\n }\n\n if (out.length >= input.limit) {\n break;\n }\n if (matches.length === 0) {\n break;\n }\n if (page >= pages) {\n break;\n }\n page++;\n }\n\n return out.slice(0, input.limit);\n}\n",
|
|
48
55
|
"export function inferExt(file: {\n mimetype?: string;\n filetype?: string;\n name?: string;\n title?: string;\n}): string | null {\n const mt = (file.mimetype || \"\").toLowerCase();\n const ft = (file.filetype || \"\").toLowerCase();\n\n if (mt === \"image/png\" || ft === \"png\") {\n return \"png\";\n }\n if (mt === \"image/jpeg\" || mt === \"image/jpg\" || ft === \"jpg\" || ft === \"jpeg\") {\n return \"jpg\";\n }\n if (mt === \"image/webp\" || ft === \"webp\") {\n return \"webp\";\n }\n if (mt === \"image/gif\" || ft === \"gif\") {\n return \"gif\";\n }\n\n if (mt === \"text/plain\" || ft === \"text\") {\n return \"txt\";\n }\n if (mt === \"text/markdown\" || ft === \"markdown\" || ft === \"md\") {\n return \"md\";\n }\n if (mt === \"application/json\" || ft === \"json\") {\n return \"json\";\n }\n\n const name = file.name || file.title || \"\";\n const m = name.match(/\\.([A-Za-z0-9]{1,10})$/);\n return m ? m[1]!.toLowerCase() : null;\n}\n",
|
|
@@ -52,12 +59,12 @@
|
|
|
52
59
|
"import type { Command } from \"commander\";\nimport type { CliContext } from \"./context.ts\";\nimport { pruneEmpty } from \"../lib/compact-json.ts\";\nimport { searchSlack } from \"../slack/search.ts\";\n\ntype SearchCommandOptions = {\n workspace?: string;\n channel?: string[] | string;\n user?: string;\n after?: string;\n before?: string;\n contentType?: string;\n limit?: string;\n maxContentChars?: string;\n};\n\nfunction addSearchOptions(cmd: Command): Command {\n return cmd\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; needed when searching across multiple workspaces)\",\n )\n .option(\"--channel <channel...>\", \"Channel filter (#name, name, or id). Repeatable.\")\n .option(\"--user <user>\", \"User filter (@name, name, or user id U...)\")\n .option(\"--after <date>\", \"Only results after YYYY-MM-DD\")\n .option(\"--before <date>\", \"Only results before YYYY-MM-DD\")\n .option(\n \"--content-type <type>\",\n \"Filter content type: any|text|image|snippet|file (default any)\",\n )\n .option(\"--limit <n>\", \"Max results (default 20)\", \"20\")\n .option(\n \"--max-content-chars <n>\",\n \"Max message content characters (default 4000, -1 for unlimited)\",\n \"4000\",\n );\n}\n\nasync function runSearch(input: {\n ctx: CliContext;\n kind: \"messages\" | \"files\" | \"all\";\n query: string;\n options: SearchCommandOptions;\n}): Promise<void> {\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(input.options.workspace);\n const channels = Array.isArray(input.options.channel)\n ? input.options.channel\n : input.options.channel\n ? [input.options.channel]\n : [];\n\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({ workspaceUrl, channels });\n\n const payload = await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client, auth, workspace_url } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const limit = Number.parseInt(input.options.limit || \"20\", 10);\n const maxContentChars = Number.parseInt(input.options.maxContentChars || \"4000\", 10);\n const contentType = input.ctx.parseContentType(input.options.contentType);\n return await searchSlack({\n client,\n auth,\n options: {\n workspace_url: workspace_url ?? workspaceUrl ?? \"\",\n query: input.query,\n kind: input.kind,\n channels,\n user: input.options.user,\n after: input.options.after,\n before: input.options.before,\n content_type: contentType,\n limit,\n max_content_chars: maxContentChars,\n download: true,\n },\n });\n },\n });\n\n console.log(JSON.stringify(pruneEmpty(payload), null, 2));\n}\n\nexport function registerSearchCommand(input: { program: Command; ctx: CliContext }): void {\n const searchCmd = input.program\n .command(\"search\")\n .description(\"Search Slack messages and files (token-efficient JSON)\");\n\n const create = (spec: {\n kind: \"messages\" | \"files\" | \"all\";\n name: string;\n desc: string;\n }): Command =>\n addSearchOptions(searchCmd.command(spec.name).description(spec.desc))\n .argument(\"<query>\", \"Search query\")\n .action(async (...args) => {\n const [query, options] = args as [string, SearchCommandOptions];\n try {\n await runSearch({ ctx: input.ctx, kind: spec.kind, query, options });\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n create({ kind: \"all\", name: \"all\", desc: \"Search messages and files\" });\n create({ kind: \"messages\", name: \"messages\", desc: \"Search messages\" });\n create({ kind: \"files\", name: \"files\", desc: \"Search files\" });\n}\n",
|
|
53
60
|
"import { execSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { chmod, copyFile, mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport { getAppDir } from \"./app-dir.ts\";\nimport { readJsonFile, writeJsonFile } from \"./fs.ts\";\nimport { getPackageVersion } from \"./version.ts\";\n\nconst REPO = \"stablyai/agent-slack\";\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ntype UpdateCheckCache = {\n latest_version: string;\n checked_at: number; // epoch ms\n};\n\ntype GitHubRelease = {\n tag_name: string;\n assets: { name: string; browser_download_url: string }[];\n};\n\nfunction getCachePath(): string {\n return join(getAppDir(), \"update-check.json\");\n}\n\n/**\n * Compare two semver strings. Returns:\n * negative if a < b, 0 if equal, positive if a > b\n */\nexport function compareSemver(a: string, b: string): number {\n const pa = a.replace(/^v/, \"\").split(\".\").map(Number);\n const pb = b.replace(/^v/, \"\").split(\".\").map(Number);\n for (let i = 0; i < 3; i++) {\n const diff = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n}\n\n/**\n * Fetch the latest release version from GitHub.\n * Returns null on any network/API error (never throws).\n */\nexport async function fetchLatestVersion(): Promise<string | null> {\n try {\n const resp = await fetch(`https://api.github.com/repos/${REPO}/releases/latest`, {\n headers: { Accept: \"application/vnd.github+json\", \"User-Agent\": \"agent-slack-updater\" },\n signal: AbortSignal.timeout(5000),\n });\n if (!resp.ok) {\n return null;\n }\n const data = (await resp.json()) as GitHubRelease;\n return data.tag_name?.replace(/^v/, \"\") ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a newer version is available. Uses a local cache to avoid\n * hitting GitHub more than once per CHECK_INTERVAL_MS.\n *\n * @param force Skip the cache and always fetch from GitHub.\n * @returns `{ current, latest, updateAvailable }` or null on error.\n */\nexport async function checkForUpdate(force = false): Promise<{\n current: string;\n latest: string;\n update_available: boolean;\n} | null> {\n const current = getPackageVersion();\n\n if (!force) {\n const cached = await readJsonFile<UpdateCheckCache>(getCachePath());\n if (cached && Date.now() - cached.checked_at < CHECK_INTERVAL_MS) {\n return {\n current,\n latest: cached.latest_version,\n update_available: compareSemver(cached.latest_version, current) > 0,\n };\n }\n }\n\n const latest = await fetchLatestVersion();\n if (!latest) {\n return null;\n }\n\n // Persist cache (best-effort, never throw)\n try {\n await writeJsonFile(getCachePath(), {\n latest_version: latest,\n checked_at: Date.now(),\n } satisfies UpdateCheckCache);\n } catch {\n // ignore\n }\n\n return {\n current,\n latest,\n update_available: compareSemver(latest, current) > 0,\n };\n}\n\nexport type InstallMethod = \"binary\" | \"npm\" | \"bun\";\n\n/**\n * Detect how agent-slack was installed so we can use the right update strategy.\n *\n * - \"npm\" → running via Node.js (npm install -g agent-slack)\n * - \"bun\" → running via Bun runtime (bun install -g agent-slack / bunx)\n * - \"binary\" → standalone compiled binary (GitHub release)\n */\nexport function detectInstallMethod(): InstallMethod {\n // Running under Bun runtime (bun install -g, bunx, bun run, etc.)\n // Note: compiled bun binaries also have process.versions.bun set,\n // so we check that the executable is actually the bun runtime itself.\n if (process.versions.bun && basename(process.execPath) === \"bun\") {\n return \"bun\";\n }\n\n // Running under Node.js (npm install -g, npx, etc.)\n const execName = basename(process.execPath);\n if ([\"node\", \"nodejs\", \"node.exe\"].includes(execName) || process.env.npm_execpath) {\n return \"npm\";\n }\n\n // Standalone compiled binary\n return \"binary\";\n}\n\n/**\n * Return the shell command a user should run to update, based on install method.\n */\nexport function getUpdateCommand(method?: InstallMethod): string {\n const m = method ?? detectInstallMethod();\n switch (m) {\n case \"npm\":\n return \"npm install -g agent-slack@latest\";\n case \"bun\":\n return \"bun install -g agent-slack@latest\";\n case \"binary\":\n return \"agent-slack update\";\n }\n}\n\n/**\n * Update via a package manager (npm or bun).\n * Spawns the package manager synchronously and returns the result.\n */\nexport function performPackageManagerUpdate(method: \"npm\" | \"bun\"): {\n success: boolean;\n message: string;\n} {\n const cmd = getUpdateCommand(method);\n try {\n execSync(cmd, { stdio: [\"inherit\", \"pipe\", \"inherit\"] });\n return { success: true, message: `Updated agent-slack via: ${cmd}` };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { success: false, message: `Failed to run \"${cmd}\": ${msg}` };\n }\n}\n\nfunction detectPlatformAsset(): string {\n const platform = process.platform === \"win32\" ? \"windows\" : process.platform;\n const archMap: Record<string, string> = { x64: \"x64\", arm64: \"arm64\" };\n const arch = archMap[process.arch] ?? process.arch;\n const ext = platform === \"windows\" ? \".exe\" : \"\";\n return `agent-slack-${platform}-${arch}${ext}`;\n}\n\nasync function sha256(filePath: string): Promise<string> {\n const data = await readFile(filePath);\n return createHash(\"sha256\").update(data).digest(\"hex\");\n}\n\n/**\n * Download, verify, and replace the current binary with the latest release.\n * Returns `true` on success.\n */\nexport async function performUpdate(\n latest: string,\n): Promise<{ success: boolean; message: string }> {\n const asset = detectPlatformAsset();\n const tag = `v${latest}`;\n const baseUrl = `https://github.com/${REPO}/releases/download/${tag}`;\n\n const tmp = join(tmpdir(), `agent-slack-update-${Date.now()}`);\n await mkdir(tmp, { recursive: true });\n\n const binTmp = join(tmp, asset);\n const sumsTmp = join(tmp, \"checksums-sha256.txt\");\n\n try {\n // Download binary + checksums in parallel\n const [binResp, sumsResp] = await Promise.all([\n fetch(`${baseUrl}/${asset}`, { signal: AbortSignal.timeout(120_000) }),\n fetch(`${baseUrl}/checksums-sha256.txt`, { signal: AbortSignal.timeout(30_000) }),\n ]);\n\n if (!binResp.ok) {\n return { success: false, message: `Failed to download ${asset}: HTTP ${binResp.status}` };\n }\n if (!sumsResp.ok) {\n return { success: false, message: `Failed to download checksums: HTTP ${sumsResp.status}` };\n }\n\n await writeFile(binTmp, Buffer.from(await binResp.arrayBuffer()));\n const sumsText = await sumsResp.text();\n await writeFile(sumsTmp, sumsText);\n\n // Verify checksum\n const expected = sumsText\n .split(\"\\n\")\n .map((line) => line.trim().split(/\\s+/))\n .find((parts) => parts[1] === asset)?.[0];\n\n if (!expected) {\n return { success: false, message: `Checksum not found for ${asset} in release checksums` };\n }\n\n const actual = await sha256(binTmp);\n if (actual !== expected) {\n return { success: false, message: `Checksum mismatch: expected ${expected}, got ${actual}` };\n }\n\n // Replace current binary\n const currentBin = process.execPath;\n const backupPath = `${currentBin}.bak`;\n\n // Rename current -> backup, copy new -> current, remove backup\n await rename(currentBin, backupPath);\n try {\n await copyFile(binTmp, currentBin);\n await chmod(currentBin, 0o755);\n await rm(backupPath, { force: true });\n } catch (err) {\n // Restore backup on failure\n try {\n await rename(backupPath, currentBin);\n } catch {\n // ignore restore failure\n }\n throw err;\n }\n\n return { success: true, message: `Updated agent-slack to ${latest}` };\n } finally {\n await rm(tmp, { recursive: true, force: true }).catch(() => {});\n }\n}\n\n/**\n * Background update check. Writes a notice to stderr if an update is available.\n * Swallows all errors silently. Respects the 24-hour throttle.\n * Disable with AGENT_SLACK_NO_UPDATE_CHECK=1.\n */\nexport async function backgroundUpdateCheck(): Promise<void> {\n if (process.env.AGENT_SLACK_NO_UPDATE_CHECK === \"1\") {\n return;\n }\n try {\n const result = await checkForUpdate();\n if (result?.update_available) {\n const cmd = getUpdateCommand();\n process.stderr.write(\n `\\nUpdate available: ${result.current} → ${result.latest}. Run \"${cmd}\" to upgrade.\\n`,\n );\n }\n } catch {\n // never interfere with normal operation\n }\n}\n",
|
|
54
61
|
"import type { Command } from \"commander\";\nimport {\n checkForUpdate,\n detectInstallMethod,\n getUpdateCommand,\n performPackageManagerUpdate,\n performUpdate,\n} from \"../lib/update.ts\";\nimport { pruneEmpty } from \"../lib/compact-json.ts\";\n\nexport function registerUpdateCommand(input: { program: Command }): void {\n input.program\n .command(\"update\")\n .description(\"Update agent-slack to the latest version\")\n .option(\"--check\", \"Only check for updates (don't install)\")\n .action(async (...args) => {\n const [options] = args as [{ check?: boolean }];\n const method = detectInstallMethod();\n\n try {\n const result = await checkForUpdate(true);\n\n if (!result) {\n console.error(\"Could not check for updates. Check your network connection.\");\n process.exitCode = 1;\n return;\n }\n\n if (!result.update_available) {\n console.log(\n JSON.stringify(\n pruneEmpty({ ...result, install_method: method, status: \"up_to_date\" }),\n null,\n 2,\n ),\n );\n return;\n }\n\n if (options.check) {\n console.log(\n JSON.stringify(\n pruneEmpty({\n ...result,\n install_method: method,\n update_command: getUpdateCommand(method),\n status: \"update_available\",\n }),\n null,\n 2,\n ),\n );\n return;\n }\n\n process.stderr.write(`Updating agent-slack ${result.current} → ${result.latest}...\\n`);\n\n let outcome: { success: boolean; message: string };\n if (method === \"npm\" || method === \"bun\") {\n process.stderr.write(`Detected install method: ${method}\\n`);\n outcome = performPackageManagerUpdate(method);\n } else {\n outcome = await performUpdate(result.latest);\n }\n\n if (!outcome.success) {\n console.error(outcome.message);\n process.exitCode = 1;\n return;\n }\n\n console.log(\n JSON.stringify(\n pruneEmpty({\n status: \"updated\",\n install_method: method,\n previous_version: result.current,\n new_version: result.latest,\n message: outcome.message,\n }),\n null,\n 2,\n ),\n );\n } catch (err: unknown) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n });\n}\n",
|
|
55
|
-
"import type { SlackApiClient } from \"./client.ts\";\nimport { asArray, getString, isRecord } from \"../lib/object-type-guards.ts\";\n\nexport type CompactSlackUser = {\n id: string;\n name?: string; // handle\n real_name?: string;\n display_name?: string;\n email?: string;\n title?: string;\n tz?: string;\n is_bot?: boolean;\n deleted?: boolean;\n};\n\nexport async function listUsers(\n client: SlackApiClient,\n options?: {\n limit?: number;\n cursor?: string;\n includeBots?: boolean;\n },\n): Promise<{ users: CompactSlackUser[]; next_cursor?: string }> {\n const limit = Math.min(Math.max(options?.limit ?? 200, 1), 1000);\n const includeBots = options?.includeBots ?? false;\n\n const out: CompactSlackUser[] = [];\n
|
|
62
|
+
"import type { SlackApiClient } from \"./client.ts\";\nimport { asArray, getString, isRecord } from \"../lib/object-type-guards.ts\";\n\nexport type CompactSlackUser = {\n id: string;\n name?: string; // handle\n real_name?: string;\n display_name?: string;\n email?: string;\n title?: string;\n tz?: string;\n is_bot?: boolean;\n deleted?: boolean;\n dm_id?: string;\n};\n\nexport async function listUsers(\n client: SlackApiClient,\n options?: {\n limit?: number;\n cursor?: string;\n includeBots?: boolean;\n },\n): Promise<{ users: CompactSlackUser[]; next_cursor?: string }> {\n const limit = Math.min(Math.max(options?.limit ?? 200, 1), 1000);\n const includeBots = options?.includeBots ?? false;\n\n let next_cursor: string | undefined;\n const [out, dmMap] = await Promise.all([\n (async () => {\n const users: CompactSlackUser[] = [];\n let cursor = options?.cursor;\n while (users.length < limit) {\n const pageSize = Math.min(200, limit - users.length);\n const resp = await client.api(\"users.list\", { limit: pageSize, cursor });\n const members = asArray(resp.members).filter(isRecord);\n for (const m of members) {\n const id = getString(m.id);\n if (!id) {\n continue;\n }\n if (!includeBots && m.is_bot) {\n continue;\n }\n users.push(toCompactUser(m));\n if (users.length >= limit) {\n break;\n }\n }\n const meta = isRecord(resp.response_metadata) ? resp.response_metadata : null;\n const next = meta ? getString(meta.next_cursor) : undefined;\n if (!next) {\n break;\n }\n cursor = next;\n next_cursor = next;\n }\n return users;\n })(),\n fetchDmMap(client),\n ]);\n\n for (const u of out) {\n const dmId = dmMap.get(u.id);\n if (dmId) {\n u.dm_id = dmId;\n }\n }\n\n return { users: out, next_cursor };\n}\n\nexport async function getUser(client: SlackApiClient, input: string): Promise<CompactSlackUser> {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new Error(\"User is empty\");\n }\n\n const userId = await resolveUserId(client, trimmed);\n if (!userId) {\n throw new Error(`Could not resolve user: ${input}`);\n }\n\n const resp = await client.api(\"users.info\", { user: userId });\n const u = isRecord(resp.user) ? resp.user : null;\n if (!u || !getString(u.id)) {\n throw new Error(\"users.info returned no user\");\n }\n return toCompactUser(u);\n}\n\nexport async function resolveUserId(client: SlackApiClient, input: string): Promise<string | null> {\n const trimmed = input.trim();\n if (/^U[A-Z0-9]{8,}$/.test(trimmed)) {\n return trimmed;\n }\n\n const looksLikeEmail = /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(trimmed) && !trimmed.startsWith(\"@\");\n if (looksLikeEmail) {\n try {\n const byEmail = await client.api(\"users.lookupByEmail\", { email: trimmed });\n const user = isRecord(byEmail.user) ? byEmail.user : null;\n const userId = user ? getString(user.id) : undefined;\n if (userId) {\n return userId;\n }\n } catch {\n // Fallback to users.list scan below.\n }\n }\n\n const handle = trimmed.startsWith(\"@\") ? trimmed.slice(1) : trimmed;\n if (!handle) {\n return null;\n }\n\n let cursor: string | undefined;\n for (;;) {\n const resp = await client.api(\"users.list\", { limit: 200, cursor });\n const members = asArray(resp.members).filter(isRecord);\n const found = members.find((m) => {\n if (getString(m.name) === handle) {\n return true;\n }\n if (looksLikeEmail) {\n const profile = isRecord(m.profile) ? m.profile : null;\n const email = profile ? getString(profile.email) : undefined;\n return Boolean(email) && email?.toLowerCase() === trimmed.toLowerCase();\n }\n return false;\n });\n if (found) {\n const id = getString(found.id);\n if (id) {\n return id;\n }\n }\n const meta = isRecord(resp.response_metadata) ? resp.response_metadata : null;\n const next = meta ? getString(meta.next_cursor) : undefined;\n if (!next) {\n break;\n }\n cursor = next;\n }\n return null;\n}\n\nasync function fetchDmMap(client: SlackApiClient): Promise<Map<string, string>> {\n const map = new Map<string, string>();\n let cursor: string | undefined;\n for (;;) {\n const resp = await client.api(\"conversations.list\", {\n types: \"im\",\n limit: 200,\n cursor,\n });\n const channels = asArray(resp.channels).filter(isRecord);\n for (const ch of channels) {\n const id = getString(ch.id);\n const user = getString(ch.user);\n if (id && user) {\n map.set(user, id);\n }\n }\n const meta = isRecord(resp.response_metadata) ? resp.response_metadata : null;\n const next = meta ? getString(meta.next_cursor) : undefined;\n if (!next) {\n break;\n }\n cursor = next;\n }\n return map;\n}\n\nfunction toCompactUser(u: Record<string, unknown>): CompactSlackUser {\n const profile = isRecord(u.profile) ? u.profile : {};\n return {\n id: getString(u.id) ?? \"\",\n name: getString(u.name) ?? undefined,\n real_name: getString(u.real_name) ?? undefined,\n display_name: getString(profile.display_name) ?? undefined,\n email: getString(profile.email) ?? undefined,\n title: getString(profile.title) ?? undefined,\n tz: getString(u.tz) ?? undefined,\n is_bot: typeof u.is_bot === \"boolean\" ? u.is_bot : undefined,\n deleted: typeof u.deleted === \"boolean\" ? u.deleted : undefined,\n };\n}\n",
|
|
56
63
|
"import type { Command } from \"commander\";\nimport type { CliContext } from \"./context.ts\";\nimport { pruneEmpty } from \"../lib/compact-json.ts\";\nimport { getUser, listUsers } from \"../slack/users.ts\";\n\nexport function registerUserCommand(input: { program: Command; ctx: CliContext }): void {\n const userCmd = input.program.command(\"user\").description(\"Workspace user directory\");\n\n userCmd\n .command(\"list\")\n .description(\"List users in the workspace\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; required if you have multiple workspaces)\",\n )\n .option(\"--limit <n>\", \"Max users (default 200)\", \"200\")\n .option(\"--cursor <cursor>\", \"Pagination cursor\")\n .option(\"--include-bots\", \"Include bot users\")\n .action(async (...args) => {\n const [options] = args as [\n { workspace?: string; limit: string; cursor?: string; includeBots?: boolean },\n ];\n try {\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(options.workspace);\n const payload = await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const limit = Number.parseInt(options.limit, 10);\n return await listUsers(client, {\n limit,\n cursor: options.cursor,\n includeBots: Boolean(options.includeBots),\n });\n },\n });\n console.log(JSON.stringify(pruneEmpty(payload), null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n userCmd\n .command(\"get\")\n .description(\"Get a single user by id (U...) or handle (@name)\")\n .argument(\"<user>\", \"User id (U...) or @handle/handle\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; required if you have multiple workspaces)\",\n )\n .action(async (...args) => {\n const [user, options] = args as [string, { workspace?: string }];\n try {\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(options.workspace);\n const payload = await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n return await getUser(client, user);\n },\n });\n console.log(JSON.stringify(pruneEmpty(payload), null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n}\n",
|
|
57
64
|
"import type { SlackApiClient } from \"./client.ts\";\nimport { asArray, getString, isRecord } from \"../lib/object-type-guards.ts\";\n\nexport async function createChannel(\n client: SlackApiClient,\n input: { name: string; isPrivate?: boolean },\n): Promise<{ channel: { id: string; name: string; is_private: boolean } }> {\n const name = input.name.trim();\n if (!name) {\n throw new Error(\"Channel name is empty\");\n }\n\n const resp = await client.api(\"conversations.create\", {\n name,\n is_private: Boolean(input.isPrivate),\n });\n const channel = isRecord(resp.channel) ? resp.channel : null;\n const id = channel ? getString(channel.id) : undefined;\n const channelName = channel ? getString(channel.name) : undefined;\n const isPrivate =\n channel && typeof channel.is_private === \"boolean\"\n ? channel.is_private\n : Boolean(input.isPrivate);\n\n if (!id || !channelName) {\n throw new Error(\"conversations.create returned no channel\");\n }\n\n return {\n channel: {\n id,\n name: channelName,\n is_private: isPrivate,\n },\n };\n}\n\nexport async function inviteUsersToChannel(\n client: SlackApiClient,\n input: { channelId: string; userIds: string[] },\n): Promise<{ invited_user_ids: string[]; already_in_channel_user_ids: string[] }> {\n const invitedUserIds: string[] = [];\n const alreadyInChannelUserIds: string[] = [];\n\n for (const userId of input.userIds) {\n try {\n await client.api(\"conversations.invite\", {\n channel: input.channelId,\n users: userId,\n });\n invitedUserIds.push(userId);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"already_in_channel\")) {\n alreadyInChannelUserIds.push(userId);\n continue;\n }\n throw err;\n }\n }\n\n return {\n invited_user_ids: invitedUserIds,\n already_in_channel_user_ids: alreadyInChannelUserIds,\n };\n}\n\nexport function parseInviteUsersCsv(input: string): string[] {\n return Array.from(\n new Set(\n asArray(input.split(\",\"))\n .map((value) => String(value).trim())\n .filter(Boolean),\n ),\n );\n}\n\nexport function splitEmailsFromInviteTargets(input: string[]): {\n emails: string[];\n non_email_targets: string[];\n} {\n const emails: string[] = [];\n const nonEmailTargets: string[] = [];\n for (const target of input) {\n if (isLikelyEmail(target)) {\n emails.push(target);\n continue;\n }\n nonEmailTargets.push(target);\n }\n return {\n emails: Array.from(new Set(emails)),\n non_email_targets: nonEmailTargets,\n };\n}\n\nexport async function inviteExternalUsersToChannel(\n client: SlackApiClient,\n input: { channelId: string; emails: string[]; externalLimited?: boolean },\n): Promise<{ invited_emails: string[]; already_invited_emails: string[] }> {\n const invitedEmails: string[] = [];\n const alreadyInvitedEmails: string[] = [];\n\n for (const email of input.emails) {\n try {\n await client.api(\"conversations.inviteShared\", {\n channel: input.channelId,\n emails: [email],\n external_limited: input.externalLimited ?? true,\n });\n invitedEmails.push(email);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"already_in_channel\") || message.includes(\"already_invited\")) {\n alreadyInvitedEmails.push(email);\n continue;\n }\n throw err;\n }\n }\n\n return {\n invited_emails: invitedEmails,\n already_invited_emails: alreadyInvitedEmails,\n };\n}\n\nfunction isLikelyEmail(input: string): boolean {\n return /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(input.trim());\n}\n",
|
|
58
65
|
"import type { Command } from \"commander\";\nimport type { CliContext } from \"./context.ts\";\nimport { pruneEmpty } from \"../lib/compact-json.ts\";\nimport {\n listAllConversations,\n listUserConversations,\n resolveChannelId,\n} from \"../slack/channels.ts\";\nimport {\n createChannel,\n inviteExternalUsersToChannel,\n inviteUsersToChannel,\n parseInviteUsersCsv,\n splitEmailsFromInviteTargets,\n} from \"../slack/channel-admin.ts\";\nimport { resolveUserId } from \"../slack/users.ts\";\n\ntype ChannelListOptions = {\n workspace?: string;\n user?: string;\n all?: boolean;\n limit: string;\n cursor?: string;\n};\n\nexport function registerChannelCommand(input: { program: Command; ctx: CliContext }): void {\n const channelCmd = input.program\n .command(\"channel\")\n .description(\"List conversations, create channels, and manage invites\");\n\n channelCmd\n .command(\"list\")\n .description(\"List conversations for a user (or current user), or all conversations\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; required if you have multiple workspaces)\",\n )\n .option(\"--user <user>\", \"User id (U...) or @handle/handle\")\n .option(\"--all\", \"List all conversations (conversations.list); incompatible with --user\")\n .option(\"--limit <n>\", \"Max conversations in one page (default 100)\", \"100\")\n .option(\"--cursor <cursor>\", \"Pagination cursor for the next page\")\n .action(async (...args) => {\n const [options] = args as [ChannelListOptions];\n try {\n if (options.all && options.user) {\n throw new Error(\"--all cannot be used with --user\");\n }\n\n const limit = Number.parseInt(options.limit, 10);\n if (!Number.isFinite(limit) || limit < 1) {\n throw new Error(`Invalid --limit value \"${options.limit}\": must be a positive integer`);\n }\n\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(options.workspace);\n const payload = await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n if (options.all) {\n return await listAllConversations(client, {\n limit,\n cursor: options.cursor,\n excludeArchived: true,\n });\n }\n\n let userId: string | undefined;\n if (options.user) {\n const resolvedUserId = await resolveUserId(client, options.user);\n if (!resolvedUserId) {\n throw new Error(`Could not resolve user: ${options.user}`);\n }\n userId = resolvedUserId;\n }\n\n return await listUserConversations(client, {\n user: userId,\n limit,\n cursor: options.cursor,\n excludeArchived: true,\n });\n },\n });\n\n console.log(JSON.stringify(pruneEmpty(payload), null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n channelCmd\n .command(\"new\")\n .description(\"Create a new channel\")\n .requiredOption(\"--name <name>\", \"Channel name\")\n .option(\"--private\", \"Create as a private channel\")\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; required if you have multiple workspaces)\",\n )\n .action(async (...args) => {\n const [options] = args as [{ name: string; private?: boolean; workspace?: string }];\n try {\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(options.workspace);\n const payload = await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n return await createChannel(client, {\n name: options.name,\n isPrivate: Boolean(options.private),\n });\n },\n });\n console.log(JSON.stringify(pruneEmpty(payload), null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n\n channelCmd\n .command(\"invite\")\n .description(\"Invite users to a channel\")\n .requiredOption(\"--channel <id-or-name>\", \"Channel id/name (#general, general, C...)\")\n .requiredOption(\"--users <users>\", \"Comma-separated users (U..., @handle, handle, email)\")\n .option(\"--external\", \"Send Slack Connect external invites (email targets only)\")\n .option(\n \"--allow-external-user-invites\",\n \"For --external invites, allow invitees to invite additional users\",\n )\n .option(\n \"--workspace <url>\",\n \"Workspace selector (full URL or unique substring; required if you have multiple workspaces)\",\n )\n .action(async (...args) => {\n const [options] = args as [\n {\n channel: string;\n users: string;\n external?: boolean;\n allowExternalUserInvites?: boolean;\n workspace?: string;\n },\n ];\n try {\n if (options.allowExternalUserInvites && !options.external) {\n throw new Error(\"--allow-external-user-invites requires --external\");\n }\n\n const workspaceUrl = input.ctx.effectiveWorkspaceUrl(options.workspace);\n await input.ctx.assertWorkspaceSpecifiedForChannelNames({\n workspaceUrl,\n channels: [options.channel],\n });\n\n const userInputs = parseInviteUsersCsv(options.users);\n if (userInputs.length === 0) {\n throw new Error('No users provided. Pass --users \"U01...,@alice,bob@example.com\"');\n }\n\n const payload = await input.ctx.withAutoRefresh({\n workspaceUrl,\n work: async () => {\n const { client } = await input.ctx.getClientForWorkspace(workspaceUrl);\n const channelId = await resolveChannelId(client, options.channel);\n\n if (options.external) {\n const split = splitEmailsFromInviteTargets(userInputs);\n if (split.emails.length === 0) {\n throw new Error(\n 'External invites require email targets in --users, e.g. --users \"alice@example.com,bob@example.com\"',\n );\n }\n const externalLimited = !options.allowExternalUserInvites;\n const inviteResult = await inviteExternalUsersToChannel(client, {\n channelId,\n emails: split.emails,\n externalLimited,\n });\n return {\n channel_id: channelId,\n external: true,\n external_limited: externalLimited,\n invited_emails: inviteResult.invited_emails,\n already_invited_emails: inviteResult.already_invited_emails,\n invalid_external_targets: split.non_email_targets,\n };\n }\n\n const resolvedUserIds: string[] = [];\n const unresolvedUsers: string[] = [];\n for (const userInput of userInputs) {\n const userId = await resolveUserId(client, userInput);\n if (!userId) {\n unresolvedUsers.push(userInput);\n continue;\n }\n resolvedUserIds.push(userId);\n }\n\n const inviteResult = await inviteUsersToChannel(client, {\n channelId,\n userIds: resolvedUserIds,\n });\n return {\n channel_id: channelId,\n invited_user_ids: inviteResult.invited_user_ids,\n already_in_channel_user_ids: inviteResult.already_in_channel_user_ids,\n unresolved_users: unresolvedUsers,\n };\n },\n });\n console.log(JSON.stringify(pruneEmpty(payload), null, 2));\n } catch (err: unknown) {\n console.error(input.ctx.errorMessage(err));\n process.exitCode = 1;\n }\n });\n}\n"
|
|
59
66
|
],
|
|
60
|
-
"mappings": ";;;;AAAA;;;ACAA;AACA;AACA;AAKA,IAAI;AAEG,SAAS,iBAAiB,GAAW;AAAA,EAC1C,IAAI,kBAAkB,WAAW;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,OAAO,8BAA8B,YAAY,2BAA2B;AAAA,IAC9E,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,aACJ,QAAQ,IAAI,qBAAqB,KAAK,KAAK,QAAQ,IAAI,qBAAqB,KAAK;AAAA,EACnF,IAAI,YAAY;AAAA,IACd,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EAGA,IAAI;AAAA,IACF,IAAI,MAAM,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,IAChD,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK;AAAA,MAC1B,MAAM,YAAY,KAAK,KAAK,cAAc;AAAA,MAC1C,IAAI,WAAW,SAAS,GAAG;AAAA,QACzB,MAAM,MAAM,aAAa,WAAW,MAAM;AAAA,QAC1C,MAAM,MAAM,KAAK,MAAM,GAAG;AAAA,QAC1B,MAAM,IAAI,OAAO,IAAI,YAAY,WAAW,IAAI,QAAQ,KAAK,IAAI;AAAA,QACjE,gBAAgB,KAAK;AAAA,QACrB,OAAO;AAAA,MACT;AAAA,MACA,MAAM,OAAO,QAAQ,GAAG;AAAA,MACxB,IAAI,SAAS,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,MACA,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA,EAIR,gBAAgB;AAAA,EAChB,OAAO;AAAA;AAGF,SAAS,YAAY,GAAW;AAAA,EACrC,OAAO,eAAe,kBAAkB;AAAA;;;ACvD1C;AACA,uBAAS;AACT;AACA;AACA,iBAAS;AAST,IAAM,WAAW,SAAS,MAAM;AAIhC,SAAS,eAAe,CAAC,QAAwB;AAAA,EAC/C,OAAO,OAAO,QAAQ,MAAM,OAAO;AAAA;AAGrC,SAAS,SAAS,CAAC,QAAwB;AAAA,EACzC,OAAO,SAAS,iBAAiB,gBAAgB,MAAM,MAAM;AAAA,IAC3D,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC,EAAE,KAAK;AAAA;AAGV,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,WAAW,GAAW;AAAA,EAC7B,MAAM,WAAW,gBAAgB,IAC/B,CAAC,SAAS,iBAAiB,oEAC7B;AAAA,EACA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,wDAK+C,SAAS,KAAK,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASzE,SAAS,QAAQ,CAAC,OAAkD;AAAA,EAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAAA;AAGhD,SAAS,WAAW,CAAC,OAA2C;AAAA,EAC9D,IAAI,CAAC,SAAS,KAAK,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,EAC9D,MAAM,MAAM,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM;AAAA,EACxD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,WAAW,OAAO,GAAG;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,EAC3D,OAAO,EAAE,KAAK,MAAM,MAAM;AAAA;AAG5B,SAAS,wBAAwB,GAAyB;AAAA,EACxD,MAAM,WAAW,UAAU,YAAY,CAAC;AAAA,EACxC,IAAI,WAAoB,CAAC;AAAA,EACzB,IAAI;AAAA,IACF,WAAW,KAAK,MAAM,YAAY,IAAI;AAAA,IACtC,MAAM;AAAA,IACN,WAAW,CAAC;AAAA;AAAA,EAGd,MAAM,cAAc,SAAS,QAAQ,IAAI,WAAW,CAAC;AAAA,EACrD,OAAO,OAAO,OAAO,WAAW,EAC7B,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC,EACzB,OAAO,CAAC,MAA+B,MAAM,IAAI;AAAA;AAKtD,IAAM,mBAAmB,MACvB,QAAQ,GACR,WACA,uBACA,iBACA,iBACA,WACA,SACF;AAEA,SAAS,wBAAwB,CAAC,OAAyB;AAAA,EACzD,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM;AAAA,EACZ,MAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,EACvD,MAAM,UAAU,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,EAEhE,IAAI,SAAS,0BAA0B,SAAS,kCAAkC;AAAA,IAChF,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,QAAQ,SAAS,YAAY,GAAG;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,OACE,QAAQ,SAAS,oBAAoB,KACrC,QAAQ,SAAS,wBAAwB,KACzC,QAAQ,SAAS,wBAAwB,KACzC,QAAQ,SAAS,4BAA4B;AAAA;AAMjD,eAAe,mBAAmB,CAAC,QAAgB,KAAmC;AAAA,EACpF,IAAI;AAAA,IACF,QAAQ,aAAa,MAAa;AAAA,IAClC,MAAM,KAAK,IAAI,SAAS,QAAQ,EAAE,UAAU,KAAK,CAAC;AAAA,IAClD,IAAI;AAAA,MACF,OAAO,GAAG,MAAM,GAAG,EAAE,IAAI;AAAA,cACzB;AAAA,MACA,GAAG,MAAM;AAAA;AAAA,IAEX,OAAO,OAAO;AAAA,IACd,IAAI,CAAC,yBAAyB,KAAK,GAAG;AAAA,MACpC,MAAM;AAAA,IACR;AAAA,IACA,QAAQ,iBAAiB,MAAa;AAAA,IACtC,MAAM,KAAK,IAAI,aAAa,QAAQ,EAAE,UAAU,KAAK,CAAC;AAAA,IACtD,IAAI;AAAA,MACF,OAAO,GAAG,QAAQ,GAAG,EAAE,IAAI;AAAA,cAC3B;AAAA,MACA,GAAG,MAAM;AAAA;AAAA;AAAA;AAKf,SAAS,uBAAuB,GAAa;AAAA,EAC3C,MAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAM,YAAsB,CAAC;AAAA,EAC7B,WAAW,WAAW,UAAU;AAAA,IAC9B,IAAI;AAAA,MACF,MAAM,MAAM,aAAa,YAAY,CAAC,yBAAyB,MAAM,MAAM,OAAO,GAAG;AAAA,QACnF,UAAU;AAAA,QACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,MACpC,CAAC,EAAE,KAAK;AAAA,MACR,IAAI,KAAK;AAAA,QACP,UAAU,KAAK,GAAG;AAAA,MACpB;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,0BAA0B,CAAC,MAAc,UAA0B;AAAA,EAC1E,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,OAAO,KAAK,aAAa,MAAM;AAAA,EAC5C,MAAM,KAAK,OAAO,MAAM,IAAI,GAAG;AAAA,EAC/B,MAAM,MAAM,WAAW,UAAU,MAAM,MAAM,IAAI,MAAM;AAAA,EAEvD,MAAM,WAAW,iBAAiB,eAAe,KAAK,EAAE;AAAA,EACxD,SAAS,eAAe,IAAI;AAAA,EAC5B,MAAM,QAAQ,OAAO,OAAO,CAAC,SAAS,OAAO,IAAI,GAAG,SAAS,MAAM,CAAC,CAAC;AAAA,EACrE,MAAM,SAAS,OAAO,KAAK,OAAO;AAAA,EAClC,MAAM,MAAM,MAAM,QAAQ,MAAM;AAAA,EAChC,IAAI,QAAQ,IAAI;AAAA,IACd,OAAO,MAAM,SAAS,MAAM;AAAA,EAC9B;AAAA,EAEA,IAAI,MAAM;AAAA,EACV,OAAO,MAAM,MAAM,QAAQ;AAAA,IACzB,MAAM,IAAI,MAAM;AAAA,IAChB,IAAI,IAAI,MAAQ,IAAI,KAAM;AAAA,MACxB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAM,WAAW,MAAM,SAAS,KAAK,GAAG,EAAE,SAAS,MAAM;AAAA,EACzD,IAAI;AAAA,IACF,OAAO,mBAAmB,QAAQ;AAAA,IAClC,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,eAAe,uBAAuB,GAAoB;AAAA,EACxD,IAAI,CAAC,YAAW,gBAAgB,GAAG;AAAA,IACjC,MAAM,IAAI,MAAM,+BAA+B,kBAAkB;AAAA,EACnE;AAAA,EAEA,MAAM,OAAQ,MAAM,oBAClB,kBACA,kJACF;AAAA,EAOA,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAAA,IAC9B,MAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAAA,EACA,MAAM,MAAM,KAAK;AAAA,EACjB,IAAI,IAAI,SAAS,IAAI,MAAM,WAAW,OAAO,GAAG;AAAA,IAC9C,OAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,YAAY,OAAO,KAAK,IAAI,mBAAmB,CAAC,CAAC;AAAA,EACvD,IAAI,UAAU,WAAW,GAAG;AAAA,IAC1B,MAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAAA,EAEA,MAAM,SAAS,UAAU,SAAS,GAAG,CAAC,EAAE,SAAS,MAAM;AAAA,EACvD,MAAM,OAAO,WAAW,SAAS,WAAW,QAAQ,UAAU,SAAS,CAAC,IAAI;AAAA,EAC5E,MAAM,YAAY,wBAAwB;AAAA,EAE1C,WAAW,YAAY,WAAW;AAAA,IAChC,IAAI;AAAA,MACF,MAAM,YAAY,2BAA2B,MAAM,QAAQ;AAAA,MAC3D,MAAM,QAAQ,UAAU,MAAM,0BAA0B;AAAA,MACxD,IAAI,OAAO;AAAA,QACT,OAAO,MAAM;AAAA,MACf;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EAEA,MAAM,IAAI,MAAM,+CAA+C;AAAA;AAKjE,eAAsB,gBAAgB,GAAmC;AAAA,EACvE,IAAI,CAAC,UAAU;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,MAAM,QAAQ,yBAAyB;AAAA,IACvC,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,WAAW,MAAM,wBAAwB;AAAA,IAC/C,IAAI,CAAC,YAAY,CAAC,SAAS,WAAW,OAAO,GAAG;AAAA,MAC9C,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,EAAE,UAAU,MAAM;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;AC7QX,qBAAS;AACT,qBAAS;AAST,IAAM,YAAW,UAAS,MAAM;AAEhC,SAAS,gBAAe,CAAC,QAAwB;AAAA,EAE/C,OAAO,OAAO,QAAQ,MAAM,OAAO;AAAA;AAGrC,SAAS,UAAS,CAAC,QAAwB;AAAA,EACzC,OAAO,UAAS,iBAAiB,iBAAgB,MAAM,MAAM;AAAA,IAC3D,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC,EAAE,KAAK;AAAA;AAGV,SAAS,YAAY,GAAW;AAAA,EAC9B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcT,IAAM,mBAAkB;AAAA,EAEtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,SAAQ,CAAC,OAAkD;AAAA,EAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAAA;AAGhD,SAAS,YAAY,CAAC,OAA4C;AAAA,EAChE,IAAI,CAAC,UAAS,KAAK,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,EAC9D,MAAM,MAAM,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM;AAAA,EACxD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,WAAW,OAAO,GAAG;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,EAC3D,OAAO,EAAE,KAAK,MAAM,MAAM;AAAA;AAG5B,SAAS,YAAW,GAAW;AAAA,EAC7B,MAAM,WAAW,iBAAgB,IAC/B,CAAC,SAAS,iBAAiB,oEAC7B;AAAA,EACA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,wDAK+C,SAAS,KAAK,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASlE,SAAS,iBAAiB,GAA2B;AAAA,EAC1D,IAAI,CAAC,WAAU;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,MAAM,SAAS,WAAU,aAAa,CAAC;AAAA,IACvC,IAAI,CAAC,UAAU,CAAC,OAAO,WAAW,OAAO,GAAG;AAAA,MAC1C,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,WAAW,WAAU,aAAY,CAAC;AAAA,IACxC,IAAI,WAAoB,CAAC;AAAA,IACzB,IAAI;AAAA,MACF,WAAW,KAAK,MAAM,YAAY,IAAI;AAAA,MACtC,MAAM;AAAA,MACN,WAAW,CAAC;AAAA;AAAA,IAGd,MAAM,cAAc,UAAS,QAAQ,IAAI,WAAW,CAAC;AAAA,IACrD,MAAM,QAA+B,OAAO,OAAO,WAAW,EAC3D,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC,EAC1B,OAAO,CAAC,MAAgC,MAAM,IAAI;AAAA,IAErD,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,OAAO;AAAA,IACT;AAAA,IACA,OAAO,EAAE,UAAU,QAAQ,MAAM;AAAA,IACjC,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;ACzGJ,SAAS,qBAAqB,CAAC,WAAqC;AAAA,EACzE,MAAM,WAAW,UAAU,MAAM,uDAAuD;AAAA,EACxF,IAAI,CAAC,UAAU;AAAA,IACb,MAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAAA,EACA,MAAM,gBAAgB,WAAW,SAAS;AAAA,EAE1C,MAAM,cAAc,UAAU,MAC5B,6HACF;AAAA,EACA,MAAM,eAAe,cACjB,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,KACxE;AAAA,EACJ,MAAM,YAAY,aAAa,MAAM,0BAA0B;AAAA,EAC/D,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAAA,EACA,MAAM,cAAc,mBAAmB,UAAU,EAAG;AAAA,EAIpD,MAAM,gBAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,IAAI,aAA4B;AAAA,EAChC,WAAW,MAAM,eAAe;AAAA,IAC9B,MAAM,IAAI,UAAU,MAAM,EAAE;AAAA,IAC5B,IAAI,IAAI,IAAI;AAAA,MACV,SAAS,SAAS;AAAA,MAClB,aAAa,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,CAAC,YAAY;AAAA,IACf,MAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAAA,EAEA,OAAO,EAAE,eAAe,YAAY,YAAY;AAAA;;;AC7ClD;AACA,uBAAS;AACT,yBAAS;AACT,uBAAS,iCAAY;AACrB,oBAAS,sBAAS;AAClB,iBAAS;;;ACCT;AACA,iBAAS;AACT;AAGA,IAAM,gBAAgB,OAAO,KAAK,CAAC,IAAM,KAAM,KAAM,KAAM,IAAM,KAAM,IAAM,GAAI,CAAC;AAGlF,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAG3B,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AAUxB,SAAS,UAAU,CAAC,KAAa,QAAkC;AAAA,EACjE,IAAI,SAAS;AAAA,EACb,IAAI,QAAQ;AAAA,EACZ,IAAI,YAAY;AAAA,EAEhB,OAAO,SAAS,YAAY,IAAI,QAAQ;AAAA,IACtC,MAAM,OAAO,IAAI,SAAS;AAAA,IAC1B;AAAA,IACA,WAAW,OAAO,QAAS;AAAA,IAC3B,KAAK,OAAO,SAAU,GAAG;AAAA,MACvB,OAAO,CAAC,QAAQ,SAAS;AAAA,IAC3B;AAAA,IACA,SAAS;AAAA,IACT,IAAI,SAAS,IAAI;AAAA,MACf,MAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM,yCAAyC;AAAA;AAM3D,SAAS,YAAY,CAAC,KAAa,QAAkC;AAAA,EACnE,IAAI,SAAS;AAAA,EACb,IAAI,QAAQ;AAAA,EACZ,IAAI,YAAY;AAAA,EAEhB,OAAO,SAAS,YAAY,IAAI,UAAU,YAAY,IAAI;AAAA,IACxD,MAAM,OAAO,IAAI,SAAS;AAAA,IAC1B;AAAA,IACA,IAAI,QAAQ,IAAI;AAAA,MACd,WAAW,OAAO,QAAS;AAAA,IAC7B;AAAA,IACA,KAAK,OAAO,SAAU,GAAG;AAAA,MACvB,OAAO,CAAC,WAAW,GAAG,SAAS;AAAA,IACjC;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EACA,MAAM,IAAI,MAAM,2CAA2C;AAAA;AAO7D,SAAS,2BAA2B,CAAC,YAA4B;AAAA,EAC/D,OAAO,UAAU,WAAW,YAAY,CAAC;AAAA,EACzC,OAAO;AAAA;AAMT,SAAS,gBAAgB,CACvB,KACA,QACqD;AAAA,EACrD,OAAO,aAAa,MAAM,aAAa,KAAK,MAAM;AAAA,EAClD,OAAO,WAAW,MAAM,aAAa,KAAK,SAAS,EAAE;AAAA,EACrD,OAAO,EAAE,QAAQ,aAAa,MAAM,WAAW,WAAW,KAAK,GAAG;AAAA;AAMpE,SAAS,eAAe,CAAC,WAAmB,iBAAiC;AAAA,EAC3E,IAAI,oBAAoB,kBAAkB;AAAA,IACxC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,oBAAoB,oBAAoB;AAAA,IAC1C,MAAM,qBAAqB,4BAA4B,SAAS;AAAA,IAChE,MAAM,SAAS,iBAAiB,WAAW,kBAAkB;AAAA,IAC7D,OAAO,OAAO,KAAK,MAAM;AAAA,EAC3B;AAAA,EACA,MAAM,IAAI,MAAM,6BAA6B,iBAAiB;AAAA;AAOhE,SAAS,cAAc,CAAC,OAA+B;AAAA,EACrD,MAAM,UAA0B,CAAC;AAAA,EAEjC,IAAI,MAAM,SAAS,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,cAAc,MAAM,aAAa,MAAM,SAAS,CAAC;AAAA,EAEvD,MAAM,gBAAgB,MAAM,SAAS,IAAI,cAAc;AAAA,EAEvD,IAAI,gBAAgB,GAAG;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS;AAAA,EACb,IAAI,UAAU,OAAO,MAAM,CAAC;AAAA,EAE5B,OAAO,SAAS,eAAe;AAAA,IAC7B,IAAI;AAAA,MACF,OAAO,QAAQ,MAAM,WAAW,OAAO,MAAM;AAAA,MAC7C,UAAU;AAAA,MACV,OAAO,WAAW,MAAM,WAAW,OAAO,MAAM;AAAA,MAChD,UAAU;AAAA,MACV,OAAO,UAAU,MAAM,WAAW,OAAO,MAAM;AAAA,MAC/C,UAAU;AAAA,MAEV,IAAI,SAAS,YAAY,WAAW,eAAe;AAAA,QACjD;AAAA,MACF;AAAA,MAGA,MAAM,WAAW,MAAM,SAAS,QAAQ,SAAS,SAAS;AAAA,MAC1D,UAAU;AAAA,MAEV,MAAM,MAAM,OAAO,OAAO,CAAC,QAAQ,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAAA,MACjE,MAAM,QAAQ,MAAM,SAAS,QAAQ,SAAS,QAAQ;AAAA,MACtD,UAAU;AAAA,MAIV,QAAQ,KAAK,EAAE,KAAK,OAAO,KAAK,GAAG,GAAG,OAAO,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,MACjE,UAAU;AAAA,MACV,MAAM;AAAA,MACN;AAAA;AAAA,EAEJ;AAAA,EAEA,OAAO;AAAA;AAMT,eAAe,YAAY,CAAC,UAA2C;AAAA,EACrE,MAAM,UAA0B,CAAC;AAAA,EAEjC,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,OAAO,MAAM,SAAS,QAAQ;AAAA,IAC9B,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,EAGT,IAAI,KAAK,SAAS,IAAI;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,SAAS,KAAK,SAAS,GAAG;AAAA,EAGhC,MAAM,QAAQ,OAAO,SAAS,IAAI,EAAE;AAAA,EACpC,IAAI,CAAC,MAAM,OAAO,aAAa,GAAG;AAAA,IAEhC,OAAO;AAAA,EACT;AAAA,EAEA,IAAI;AAAA,IAGF,QAAQ,WAAW,cAAc,iBAAiB,QAAQ,CAAC;AAAA,IAC3D,MAAM,cAAc,iBAAiB,QAAQ,SAAS;AAAA,IAGtD,MAAM,kBAAkB,YAAY;AAAA,IACpC,MAAM,gBAAgB,YAAY,SAAS,YAAY,OAAO;AAAA,IAE9D,IAAI,gBAAgB,KAAK,SAAS,IAAI;AAAA,MACpC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,gBAAgB,KAAK,SAAS,iBAAiB,aAAa;AAAA,IAClE,MAAM,uBAAuB,cAAc,GAAG,EAAE;AAAA,IAChD,MAAM,iBAAiB,cAAc,SAAS,GAAG,EAAE;AAAA,IACnD,MAAM,aAAa,gBAAgB,gBAAgB,oBAAoB;AAAA,IAGvE,MAAM,eAAe,eAAe,UAAU;AAAA,IAG9C,WAAW,cAAc,cAAc;AAAA,MACrC,IAAI;AAAA,QAEF,MAAM,cAAc,iBAAiB,WAAW,OAAO,CAAC;AAAA,QACxD,MAAM,aAAa,YAAY;AAAA,QAC/B,MAAM,WAAW,YAAY,SAAS,YAAY,OAAO;AAAA,QAEzD,IAAI,WAAW,KAAK,QAAQ;AAAA,UAC1B;AAAA,QACF;AAAA,QAEA,MAAM,WAAW,KAAK,SAAS,YAAY,QAAQ;AAAA,QACnD,MAAM,kBAAkB,SAAS,GAAG,EAAE;AAAA,QACtC,MAAM,YAAY,SAAS,SAAS,GAAG,EAAE;AAAA,QACzC,MAAM,QAAQ,gBAAgB,WAAW,eAAe;AAAA,QAExD,MAAM,eAAe,eAAe,KAAK;AAAA,QACzC,QAAQ,KAAK,GAAG,YAAY;AAAA,QAC5B,MAAM;AAAA,QAEN;AAAA;AAAA,IAEJ;AAAA,IACA,MAAM;AAAA,IAEN,OAAO;AAAA;AAAA,EAGT,OAAO;AAAA;AAOT,eAAe,YAAY,CAAC,UAA2C;AAAA,EACrE,MAAM,UAA0B,CAAC;AAAA,EAEjC,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,OAAO,MAAM,SAAS,QAAQ;AAAA,IAC9B,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,EAGT,MAAM,aAAa;AAAA,EACnB,IAAI,SAAS;AAAA,EACb,IAAI,gBAA0B,CAAC;AAAA,EAE/B,OAAO,SAAS,KAAK,QAAQ;AAAA,IAE3B,MAAM,cAAc,SAAS;AAAA,IAC7B,MAAM,YAAY,aAAa;AAAA,IAG/B,IAAI,YAAY,GAAG;AAAA,MACjB,UAAU;AAAA,MACV;AAAA,IACF;AAAA,IAGA,IAAI,SAAS,IAAI,KAAK,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,KAAK,aAAa,SAAS,CAAC;AAAA,IAC3C,MAAM,OAAO,KAAK,SAAS;AAAA,IAE3B,IAAI,WAAW,KAAK,SAAS,IAAI,SAAS,KAAK,QAAQ;AAAA,MACrD,UAAU;AAAA,MACV,gBAAgB,CAAC;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,MAAM,aAAa,KAAK,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;AAAA,IAChE,UAAU,IAAI;AAAA,IAEd,IAAI,SAAS,iBAAiB;AAAA,MAC5B,gBAAgB,CAAC;AAAA,MACjB,cAAc,YAAY,OAAO;AAAA,IACnC,EAAO,SAAI,SAAS,kBAAkB;AAAA,MACpC,gBAAgB,CAAC,UAAU;AAAA,IAC7B,EAAO,SAAI,SAAS,mBAAmB;AAAA,MACrC,IAAI,cAAc,SAAS,GAAG;AAAA,QAC5B,cAAc,KAAK,UAAU;AAAA,MAC/B;AAAA,IACF,EAAO,SAAI,SAAS,iBAAiB;AAAA,MACnC,IAAI,cAAc,SAAS,GAAG;AAAA,QAC5B,cAAc,KAAK,UAAU;AAAA,QAC7B,MAAM,aAAa,OAAO,OAAO,aAAa;AAAA,QAC9C,cAAc,YAAY,OAAO;AAAA,MACnC;AAAA,MACA,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAQT,SAAS,aAAa,CAAC,OAAe,SAA+B;AAAA,EACnE,IAAI,MAAM,SAAS,IAAI;AAAA,IACrB;AAAA,EACF;AAAA,EAGA,IAAI,SAAS;AAAA,EAEb,OAAO,SAAS,MAAM,QAAQ;AAAA,IAC5B,IAAI;AAAA,MACF,MAAM,aAAa,MAAM;AAAA,MACzB;AAAA,MAEA,IAAI,eAAe,GAAG;AAAA,QAEpB,OAAO,QAAQ,MAAM,WAAW,OAAO,MAAM;AAAA,QAC7C,UAAU;AAAA,QACV,MAAM,MAAM,MAAM,SAAS,QAAQ,SAAS,MAAM;AAAA,QAClD,UAAU;AAAA,QACV,OAAO,UAAU,MAAM,WAAW,OAAO,MAAM;AAAA,QAC/C,UAAU;AAAA,QACV,MAAM,QAAQ,MAAM,SAAS,QAAQ,SAAS,QAAQ;AAAA,QACtD,UAAU;AAAA,QAEV,QAAQ,KAAK,EAAE,KAAK,OAAO,KAAK,GAAG,GAAG,OAAO,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,MACnE,EAAO,SAAI,eAAe,GAAG;AAAA,QAE3B,OAAO,QAAQ,MAAM,WAAW,OAAO,MAAM;AAAA,QAC7C,UAAU,KAAK;AAAA,MACjB,EAAO;AAAA,QAEL;AAAA;AAAA,MAEF,MAAM;AAAA,MACN;AAAA;AAAA,EAEJ;AAAA;AAOF,eAAsB,mBAAmB,CAAC,KAAsC;AAAA,EAC9E,MAAM,UAA0B,CAAC;AAAA,EAEjC,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,QAAQ,MAAM,QAAQ,GAAG;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,EAIT,MAAM,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,MAAM,CAAC;AAAA,EAC7E,WAAW,QAAQ,UAAU;AAAA,IAC3B,MAAM,cAAc,MAAM,aAAa,MAAK,KAAK,IAAI,CAAC;AAAA,IACtD,QAAQ,KAAK,GAAG,WAAW;AAAA,EAC7B;AAAA,EAGA,MAAM,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,EACvD,WAAW,QAAQ,UAAU;AAAA,IAC3B,MAAM,cAAc,MAAM,aAAa,MAAK,KAAK,IAAI,CAAC;AAAA,IACtD,QAAQ,KAAK,GAAG,WAAW;AAAA,EAC7B;AAAA,EAEA,OAAO;AAAA;AAMT,eAAsB,kBAAkB,CAAC,KAAa,WAA4C;AAAA,EAChG,MAAM,aAAa,MAAM,oBAAoB,GAAG;AAAA,EAChD,OAAO,WAAW,OAAO,CAAC,UAAU,MAAM,IAAI,SAAS,SAAS,CAAC;AAAA;;;ADhYnE,SAAS,yBAAwB,CAAC,OAAyB;AAAA,EACzD,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM;AAAA,EACZ,MAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,EACvD,MAAM,UAAU,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,EAEhE,IAAI,SAAS,0BAA0B,SAAS,kCAAkC;AAAA,IAChF,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,QAAQ,SAAS,YAAY,GAAG;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,OACE,QAAQ,SAAS,oBAAoB,KACrC,QAAQ,SAAS,wBAAwB,KACzC,QAAQ,SAAS,wBAAwB,KACzC,QAAQ,SAAS,4BAA4B;AAAA;AAQjD,eAAe,oBAAmB,CAAC,QAAgB,KAAmC;AAAA,EACpF,IAAI;AAAA,IACF,QAAQ,aAAa,MAAa;AAAA,IAClC,MAAM,KAAK,IAAI,SAAS,QAAQ,EAAE,UAAU,KAAK,CAAC;AAAA,IAClD,IAAI;AAAA,MACF,OAAO,GAAG,MAAM,GAAG,EAAE,IAAI;AAAA,cACzB;AAAA,MACA,GAAG,MAAM;AAAA;AAAA,IAEX,OAAO,OAAO;AAAA,IACd,IAAI,CAAC,0BAAyB,KAAK,GAAG;AAAA,MACpC,MAAM;AAAA,IACR;AAAA,IACA,QAAQ,iBAAiB,MAAa;AAAA,IACtC,MAAM,KAAK,IAAI,aAAa,QAAQ,EAAE,UAAU,KAAK,CAAC;AAAA,IACtD,IAAI;AAAA,MACF,OAAO,GAAG,QAAQ,GAAG,EAAE,IAAI;AAAA,cAC3B;AAAA,MACA,GAAG,MAAM;AAAA;AAAA;AAAA;AAaf,IAAM,WAAW,UAAS;AAC1B,IAAM,YAAW,aAAa;AAC9B,IAAM,WAAW,aAAa;AAG9B,IAAM,6BAA6B,MAAK,SAAQ,GAAG,WAAW,uBAAuB,OAAO;AAE5F,IAAM,6BAA6B,MACjC,SAAQ,GACR,WACA,cACA,6BACA,QACA,WACA,uBACA,OACF;AAEA,IAAM,0BAA0B,MAAK,SAAQ,GAAG,WAAW,OAAO;AAElE,IAAM,kCAAkC,MACtC,SAAQ,GACR,QACA,OACA,mBACA,UACA,OACF;AAEA,SAAS,aAAa,GAA8C;AAAA,EAClE,MAAM,aAAa,YACf,CAAC,4BAA4B,0BAA0B,IACvD,WACE,CAAC,iCAAiC,uBAAuB,IACzD,CAAC;AAAA,EAEP,IAAI,WAAW,WAAW,GAAG;AAAA,IAC3B,MAAM,IAAI,MAAM,gDAAgD,WAAW;AAAA,EAC7E;AAAA,EAEA,WAAW,OAAO,YAAY;AAAA,IAC5B,MAAM,aAAa,MAAK,KAAK,iBAAiB,SAAS;AAAA,IACvD,IAAI,YAAW,UAAU,GAAG;AAAA,MAC1B,MAAM,sBAAsB,CAAC,MAAK,KAAK,WAAW,SAAS,GAAG,MAAK,KAAK,SAAS,CAAC;AAAA,MAClF,MAAM,YACJ,oBAAoB,KAAK,CAAC,cAAc,YAAW,SAAS,CAAC,KAAK,oBAAoB;AAAA,MACxF,OAAO,EAAE,YAAY,UAAU;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MACR;AAAA,MAA+C,WAAW,IAAI,CAAC,MAAM,MAAK,GAAG,iBAAiB,SAAS,CAAC,EAAE,KAAK;AAAA,KAAQ,GACzH;AAAA;AAGF,SAAS,SAAQ,CAAC,OAAkD;AAAA,EAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAAA;AAGhD,SAAS,aAAa,CAAC,OAAoC;AAAA,EACzD,IAAI,CAAC,UAAS,KAAK,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM;AAAA,EACxD,MAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,EAC9D,IAAI,CAAC,OAAO,CAAC,OAAO;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAAA,EAC3D,OAAO,EAAE,KAAK,MAAM,MAAM;AAAA;AAG5B,eAAe,eAAe,CAAC,QAAiC;AAAA,EAC9D,MAAM,OAAO,MAAK,SAAQ,GAAG,WAAW,eAAe,SAAS,mBAAmB;AAAA,EACnF,MAAM,OAAO,MAAK,MAAM,GAAG,KAAK,IAAI,GAAG;AAAA,EACvC,MAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EACrC,IAAI,cAAc,CAAC;AAAA,EACnB,IAAI,WAAU;AAAA,IACZ,IAAI;AAAA,MACF,cAAa,MAAM,CAAC,OAAO,QAAQ,IAAI,GAAG;AAAA,QACxC,OAAO,CAAC,UAAU,UAAU,QAAQ;AAAA,MACtC,CAAC;AAAA,MACD,MAAM;AAAA,MACN,cAAc;AAAA;AAAA,EAElB;AAAA,EACA,IAAI,aAAa;AAAA,IACf,MAAM,GAAG,QAAQ,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACzD;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,OAAO,MAAK,MAAM,MAAM,CAAC;AAAA,IAC/B,MAAM;AAAA,EAGR,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,KAAsB;AAAA,EAC9C,IAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAAA,IAC5B,MAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAAA,EAEA,OAAO,SAAS;AAAA,EAChB,MAAM,OAAO,UAAU,KAAQ,UAAU,KAAQ,UAAU,IAAO,IAAI,SAAS,CAAC,IAAI;AAAA,EAEpF,IAAI,WAAW;AAAA,EACf,WAAW,KAAK,MAAM;AAAA,IACpB,IAAI,MAAM,GAAG;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YACJ,WAAW,KAAK,SAAS,IAAK,CAAC,WAAW,MAAM,IAAe,CAAC,QAAQ,SAAS;AAAA,EAEnF,IAAI;AAAA,EACJ,WAAW,OAAO,WAAW;AAAA,IAC3B,IAAI;AAAA,MACF,MAAM,OAAO,KAAK,SAAS,GAAG;AAAA,MAC9B,IAAI;AAAA,QACF,OAAO,KAAK,MAAM,IAAI;AAAA,QACtB,OAAO,MAAM;AAAA,QACb,UAAU;AAAA;AAAA,MAGZ,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAAA,MAC9B,MAAM,MAAM,KAAK,YAAY,GAAG;AAAA,MAChC,IAAI,UAAU,MAAM,QAAQ,MAAM,MAAM,OAAO;AAAA,QAC7C,IAAI;AAAA,UACF,OAAO,KAAK,MAAM,KAAK,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,UAC5C,OAAO,MAAM;AAAA,UACb,UAAU;AAAA;AAAA,MAEd;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,UAAU;AAAA;AAAA,EAEd;AAAA,EAEA,MAAM,WAAW,IAAI,MAAM,2BAA2B;AAAA;AAGxD,eAAe,4BAA4B,CAAC,YAA4C;AAAA,EACtF,IAAI,CAAC,YAAW,UAAU,GAAG;AAAA,IAC3B,MAAM,IAAI,MAAM,4BAA4B,YAAY;AAAA,EAC1D;AAAA,EAEA,MAAM,OAAO,MAAM,gBAAgB,UAAU;AAAA,EAE7C,IAAI;AAAA,IAEF,MAAM,gBAAgB,OAAO,KAAK,gBAAgB;AAAA,IAClD,MAAM,gBAAgB,OAAO,KAAK,gBAAgB;AAAA,IAElD,MAAM,UAAU,MAAM,mBAAmB,MAAM,OAAO,KAAK,eAAe,CAAC;AAAA,IAE3E,IAAI,YAA2B;AAAA,IAC/B,IAAI,aAAa,CAAC;AAAA,IAClB,WAAW,SAAS,SAAS;AAAA,MAC3B,IAAI,MAAM,IAAI,SAAS,aAAa,KAAK,MAAM,IAAI,SAAS,aAAa,GAAG;AAAA,QAC1E,IAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AAAA,UACzC,IAAI,OAAO;AAAA,UACX,IAAI,MAAM,IAAI,UAAU,GAAG;AAAA,YACzB,OAAO,MAAM,IAAI,gBAAgB,MAAM,IAAI,SAAS,CAAC;AAAA,UACvD;AAAA,UACA,IAAI,CAAC,aAAa,QAAQ,YAAY;AAAA,YACpC,YAAY,MAAM;AAAA,YAClB,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,CAAC,WAAW;AAAA,MACd,MAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AAAA,IAEA,MAAM,MAAM,iBAAiB,SAAS;AAAA,IACtC,MAAM,aAAa,UAAS,GAAG,IAAI,IAAI,QAAQ;AAAA,IAC/C,MAAM,WAAW,UAAS,UAAU,IAAI,aAAa,CAAC;AAAA,IACtD,MAAM,QAAuB,OAAO,OAAO,QAAQ,EAChD,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,EAC3B,OAAO,CAAC,MAAwB,MAAM,IAAI,EAC1C,OAAO,CAAC,MAAM,EAAE,MAAM,WAAW,OAAO,CAAC;AAAA,IAE5C,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,MAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAAA,IACA,OAAO;AAAA,YACP;AAAA,IACA,IAAI;AAAA,MACF,MAAM,GAAG,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAC/C,MAAM;AAAA;AAAA;AAMZ,SAAS,wBAAuB,CAAC,QAA0B;AAAA,EACzD,IAAI,WAAU;AAAA,IACZ,MAAM,WAAW,CAAC,sBAAsB,uBAAuB,uBAAuB;AAAA,IACtF,MAAM,YAAsB,CAAC;AAAA,IAC7B,WAAW,WAAW,UAAU;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,MAAM,cAAa,YAAY,CAAC,yBAAyB,MAAM,MAAM,OAAO,GAAG;AAAA,UACnF,UAAU;AAAA,UACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,QACpC,CAAC,EAAE,KAAK;AAAA,QACR,IAAI,KAAK;AAAA,UACP,UAAU,KAAK,GAAG;AAAA,QACpB;AAAA,QACA,MAAM;AAAA,IAGV;AAAA,IACA,IAAI,UAAU,SAAS,GAAG;AAAA,MACxB,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,IAAI,UAAU;AAAA,IACZ,MAAM,aAAyB;AAAA,MAC7B,CAAC,eAAe,iBAAiB;AAAA,MACjC,CAAC,eAAe,OAAO;AAAA,MACvB,CAAC,eAAe,OAAO;AAAA,MACvB,CAAC,WAAW,oBAAoB;AAAA,IAClC;AAAA,IACA,MAAM,YAAsB,CAAC;AAAA,IAC7B,WAAW,QAAQ,YAAY;AAAA,MAC7B,IAAI;AAAA,QACF,MAAM,MAAM,cAAa,eAAe,CAAC,UAAU,GAAG,IAAI,GAAG;AAAA,UAC3D,UAAU;AAAA,UACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,QACpC,CAAC,EAAE,KAAK;AAAA,QACR,IAAI,KAAK;AAAA,UACP,UAAU,KAAK,GAAG;AAAA,QACpB;AAAA,QACA,MAAM;AAAA,IAGV;AAAA,IAGA,IAAI,WAAW,OAAO;AAAA,MACpB,UAAU,KAAK,EAAE;AAAA,IACnB;AAAA,IACA,UAAU,KAAK,SAAS;AAAA,IAExB,OAAO,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAAA,EAC/B;AAAA,EAEA,MAAM,IAAI,MAAM,6DAA6D;AAAA;AAG/E,SAAS,2BAA0B,CAAC,MAAc,UAA0B;AAAA,EAC1E,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,OAAO,KAAK,aAAa,MAAM;AAAA,EAC5C,MAAM,KAAK,OAAO,MAAM,IAAI,GAAG;AAAA,EAC/B,MAAM,MAAM,YAAW,UAAU,MAAM,WAAW,IAAI,MAAM,IAAI,MAAM;AAAA,EAEtE,MAAM,WAAW,kBAAiB,eAAe,KAAK,EAAE;AAAA,EACxD,SAAS,eAAe,IAAI;AAAA,EAC5B,MAAM,QAAQ,OAAO,OAAO,CAAC,SAAS,OAAO,IAAI,GAAG,SAAS,MAAM,CAAC,CAAC;AAAA,EACrE,MAAM,SAAS,OAAO,KAAK,OAAO;AAAA,EAClC,MAAM,MAAM,MAAM,QAAQ,MAAM;AAAA,EAChC,IAAI,QAAQ,IAAI;AAAA,IACd,OAAO,MAAM,SAAS,MAAM;AAAA,EAC9B;AAAA,EAEA,IAAI,MAAM;AAAA,EACV,OAAO,MAAM,MAAM,QAAQ;AAAA,IACzB,MAAM,IAAI,MAAM;AAAA,IAChB,IAAI,IAAI,MAAQ,IAAI,KAAM;AAAA,MACxB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAM,WAAW,MAAM,SAAS,KAAK,GAAG,EAAE,SAAS,MAAM;AAAA,EACzD,IAAI;AAAA,IACF,OAAO,mBAAmB,QAAQ;AAAA,IAClC,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,eAAe,gCAAgC,CAAC,aAAsC;AAAA,EACpF,IAAI,CAAC,YAAW,WAAW,GAAG;AAAA,IAC5B,MAAM,IAAI,MAAM,+BAA+B,aAAa;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAQ,MAAM,qBAClB,aACA,kJACF;AAAA,EAOA,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAAA,IAC9B,MAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAAA,EACA,MAAM,MAAM,KAAK;AAAA,EACjB,IAAI,IAAI,SAAS,IAAI,MAAM,WAAW,OAAO,GAAG;AAAA,IAC9C,OAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,YAAY,OAAO,KAAK,IAAI,mBAAmB,CAAC,CAAC;AAAA,EACvD,IAAI,UAAU,WAAW,GAAG;AAAA,IAC1B,MAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAAA,EAEA,MAAM,SAAS,UAAU,SAAS,GAAG,CAAC,EAAE,SAAS,MAAM;AAAA,EACvD,MAAM,OAAO,WAAW,SAAS,WAAW,QAAQ,UAAU,SAAS,CAAC,IAAI;AAAA,EAC5E,MAAM,YAAY,yBAAwB,MAAM;AAAA,EAEhD,WAAW,YAAY,WAAW;AAAA,IAChC,IAAI;AAAA,MACF,MAAM,YAAY,4BAA2B,MAAM,QAAQ;AAAA,MAC3D,MAAM,QAAQ,UAAU,MAAM,0BAA0B;AAAA,MACxD,IAAI,OAAO;AAAA,QACT,OAAO,MAAM;AAAA,MACf;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EAEA,MAAM,IAAI,MAAM,mDAAmD;AAAA;AAGrE,eAAsB,uBAAuB,GAA8B;AAAA,EACzE,QAAQ,YAAY,cAAc,cAAc;AAAA,EAChD,MAAM,QAAQ,MAAM,6BAA6B,UAAU;AAAA,EAC3D,MAAM,WAAW,MAAM,iCAAiC,SAAS;AAAA,EACjE,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,EAAE,cAAc,YAAY,cAAc,UAAU;AAAA,EAC9D;AAAA;;;AE7ZF,uCAA4B,sBAAS,iBAAU;AAC/C,uBAAS;AACT;AACA,oBAAS,sBAAS;AAClB,iBAAS;AAkBT,IAAM,YAAW,UAAS;AAC1B,IAAM,YAAW,cAAa;AAC9B,IAAM,YAAW,cAAa;AAE9B,SAAS,yBAAwB,CAAC,OAAyB;AAAA,EACzD,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM;AAAA,EACZ,MAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,EACvD,MAAM,UAAU,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,EAEhE,IAAI,SAAS,0BAA0B,SAAS,kCAAkC;AAAA,IAChF,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,QAAQ,SAAS,YAAY,GAAG;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,OACE,QAAQ,SAAS,oBAAoB,KACrC,QAAQ,SAAS,wBAAwB,KACzC,QAAQ,SAAS,wBAAwB,KACzC,QAAQ,SAAS,4BAA4B;AAAA;AAIjD,eAAe,oBAAmB,CAAC,QAAgB,KAAmC;AAAA,EACpF,IAAI;AAAA,IACF,QAAQ,aAAa,MAAa;AAAA,IAClC,MAAM,KAAK,IAAI,SAAS,QAAQ,EAAE,UAAU,KAAK,CAAC;AAAA,IAClD,IAAI;AAAA,MACF,OAAO,GAAG,MAAM,GAAG,EAAE,IAAI;AAAA,cACzB;AAAA,MACA,GAAG,MAAM;AAAA;AAAA,IAEX,OAAO,OAAO;AAAA,IACd,IAAI,CAAC,0BAAyB,KAAK,GAAG;AAAA,MACpC,MAAM;AAAA,IACR;AAAA,IACA,QAAQ,iBAAiB,MAAa;AAAA,IACtC,MAAM,KAAK,IAAI,aAAa,QAAQ,EAAE,UAAU,KAAK,CAAC;AAAA,IACtD,IAAI;AAAA,MACF,OAAO,GAAG,QAAQ,GAAG,EAAE,IAAI;AAAA,cAC3B;AAAA,MACA,GAAG,MAAM;AAAA;AAAA;AAAA;AAKf,SAAS,iBAAiB,GAAW;AAAA,EACnC,IAAI,WAAU;AAAA,IACZ,OAAO,MAAK,SAAQ,GAAG,YAAY,SAAS;AAAA,EAC9C;AAAA,EACA,IAAI,WAAU;AAAA,IACZ,OAAO,MAAK,SAAQ,GAAG,WAAW,uBAAuB,SAAS;AAAA,EACpE;AAAA,EACA,MAAM,IAAI,MAAM,0CAA0C,YAAW;AAAA;AAGvE,SAAS,gBAAgB,CAAC,KAAa,SAAqC;AAAA,EAC1E,MAAM,QAAQ,IAAI,MAAM,OAAO;AAAA,EAC/B,MAAM,WAKA,CAAC;AAAA,EAEP,MAAM,kBAAkB,IAAI;AAAA,EAE5B,IAAI,UAAU;AAAA,EACd,IAAI,UACF;AAAA,EAEF,WAAW,WAAW,OAAO;AAAA,IAC3B,MAAM,OAAO,QAAQ,KAAK;AAAA,IAC1B,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,GAAG;AAAA,MACzD;AAAA,IACF;AAAA,IACA,IAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAAA,MAC9C,IAAI,SAAS;AAAA,QACX,SAAS,KAAK,OAAO;AAAA,QACrB,UAAU;AAAA,MACZ;AAAA,MACA,UAAU,KAAK,MAAM,GAAG,EAAE;AAAA,MAC1B,IAAI,QAAQ,WAAW,SAAS,GAAG;AAAA,QACjC,UAAU,EAAE,YAAY,MAAM,WAAW,MAAM;AAAA,MACjD;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,KAAK,QAAQ,GAAG;AAAA,IAC5B,IAAI,QAAQ,IAAI;AAAA,MACd;AAAA,IACF;AAAA,IACA,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK;AAAA,IACpC,MAAM,QAAQ,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AAAA,IAEvC,IAAI,QAAQ,WAAW,SAAS,KAAK,SAAS;AAAA,MAC5C,IAAI,QAAQ,QAAQ;AAAA,QAClB,QAAQ,OAAO;AAAA,MACjB,EAAO,SAAI,QAAQ,QAAQ;AAAA,QACzB,QAAQ,OAAO;AAAA,MACjB,EAAO,SAAI,QAAQ,cAAc;AAAA,QAC/B,QAAQ,aAAa,UAAU;AAAA,MACjC,EAAO,SAAI,QAAQ,WAAW;AAAA,QAC5B,QAAQ,YAAY,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,QAAQ,WAAW,SAAS,KAAK,QAAQ,aAAa,OAAO;AAAA,MAC/D,gBAAgB,IAAI,KAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,IAAI,SAAS;AAAA,IACX,SAAS,KAAK,OAAO;AAAA,EACvB;AAAA,EAEA,OAAO,SACJ,OAAO,CAAC,MAAM,QAAQ,EAAE,IAAI,CAAC,EAC7B,IAAI,CAAC,MAAM;AAAA,IACV,MAAM,cAAc,EAAE,aAAa,MAAK,SAAS,EAAE,IAAK,IAAI,EAAE;AAAA,IAC9D,OAAO;AAAA,MACL,MAAM,EAAE;AAAA,MACR,MAAM;AAAA,MACN,WAAW,EAAE,aAAa,gBAAgB,IAAI,EAAE,IAAK;AAAA,IACvD;AAAA,GACD;AAAA;AAGL,eAAe,qBAAqB,GAAgC;AAAA,EAClE,MAAM,UAAU,kBAAkB;AAAA,EAClC,MAAM,UAAU,MAAK,SAAS,cAAc;AAAA,EAC5C,MAAM,aAAiC,CAAC;AAAA,EAExC,IAAI,YAAW,OAAO,GAAG;AAAA,IACvB,MAAM,MAAM,MAAM,UAAS,SAAS,MAAM;AAAA,IAC1C,WAAW,KAAK,GAAG,iBAAiB,KAAK,OAAO,CAAC;AAAA,EACnD;AAAA,EAGA,MAAM,UAAU,YAAW,aAAa;AAAA,EACxC,IAAI,YAAW,OAAO,GAAG;AAAA,IACvB,MAAM,UAAU,MAAM,SAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAC9D,WAAW,SAAS,SAAS;AAAA,MAC3B,IAAI,CAAC,MAAM,YAAY,GAAG;AAAA,QACxB;AAAA,MACF;AAAA,MACA,MAAM,cAAc,MAAK,SAAS,MAAM,IAAI;AAAA,MAC5C,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,GAAG;AAAA,QACnD,WAAW,KAAK,EAAE,MAAM,aAAa,WAAW,MAAM,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,WAAW,OAAO,CAAC,MAAM,YAAW,EAAE,IAAI,CAAC;AAAA,EAC5D,SAAS,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,SAAS,CAAC;AAAA,EACjE,OAAO;AAAA;AAGT,SAAS,uBAAuB,CAC9B,YACA,SACoB;AAAA,EACpB,MAAM,WAAW,SAAS,KAAK;AAAA,EAC/B,IAAI,CAAC,UAAU;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,MAAM,aAAa,SAAS,YAAY;AAAA,EACxC,MAAM,UAAU,WAAW,OAAO,CAAC,MAAM;AAAA,IACvC,MAAM,OAAO,EAAE,MAAM,YAAY,KAAK;AAAA,IACtC,MAAM,OAAO,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAAA,IACvD,MAAM,OAAO,EAAE,KAAK,YAAY;AAAA,IAChC,OAAO,SAAS,cAAc,SAAS,cAAc,KAAK,SAAS,UAAU;AAAA,GAC9E;AAAA,EACD,OAAO;AAAA;AAGT,eAAe,iBAAiB,CAC9B,QAC6D;AAAA,EAC7D,MAAM,UAAU,MAAM,QAAQ,MAAK,OAAO,GAAG,sBAAsB,CAAC;AAAA,EACpE,MAAM,OAAO,OAAO,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,EACxC,MAAM,WAAW,MAAK,SAAS,IAAI;AAAA,EACnC,MAAM,SAAS,QAAQ,QAAQ;AAAA,EAG/B,WAAW,UAAU,CAAC,QAAQ,MAAM,GAAG;AAAA,IACrC,MAAM,UAAU,GAAG,SAAS;AAAA,IAC5B,IAAI,CAAC,YAAW,OAAO,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,IACA,IAAI;AAAA,MACF,MAAM,SAAS,SAAS,GAAG,WAAW,QAAQ;AAAA,MAC9C,MAAM;AAAA,EACV;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IACA,SAAS,YAAY;AAAA,MACnB,IAAI;AAAA,QACF,MAAM,IAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,QAClD,MAAM;AAAA;AAAA,EAEZ;AAAA;AAGF,SAAS,aAAa,CAAC,OAAwB;AAAA,EAC7C,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,iBAAiB,YAAY;AAAA,IAE/B,MAAM,MAAM,OAAO,KAAK,KAAK;AAAA,IAC7B,MAAM,UAAoB,CAAC;AAAA,IAC3B,QAAQ,KAAK,IAAI,SAAS,MAAM,CAAC;AAAA,IACjC,QAAQ,KAAK,IAAI,SAAS,SAAS,CAAC;AAAA,IACpC,MAAM,QAAQ,IAAI;AAAA,IAClB,IAAI,UAAU,KAAQ,UAAU,KAAQ,UAAU,GAAM;AAAA,MACtD,MAAM,SAAS,IAAI,SAAS,CAAC;AAAA,MAC7B,QAAQ,KAAK,OAAO,SAAS,MAAM,CAAC;AAAA,MACpC,QAAQ,KAAK,OAAO,SAAS,SAAS,CAAC;AAAA,IACzC;AAAA,IACA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM;AAAA,EAC3D;AAAA,EACA,OAAO,OAAO,SAAS,EAAE;AAAA;AAG3B,SAAS,wBAAwB,CAAC,OAAgD;AAAA,EAChF,MAAM,MAAM,cAAc,KAAK;AAAA,EAC/B,IAAI,CAAC,KAAK;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,CAAC,SAAiD;AAAA,IAClE,IAAI;AAAA,MACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAAA,MAC9B,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AAAA,QACjD,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA,IACR,OAAO;AAAA;AAAA,EAGT,MAAM,SAAS,UAAU,GAAG;AAAA,EAC5B,IAAI,QAAQ;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,WAAW,IAAI,QAAQ,oBAAoB,EAAE;AAAA,EACnD,MAAM,iBAAiB,UAAU,QAAQ;AAAA,EACzC,IAAI,gBAAgB;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,IAAI,QAAQ,GAAG;AAAA,EAC7B,MAAM,MAAM,IAAI,YAAY,GAAG;AAAA,EAC/B,IAAI,UAAU,MAAM,QAAQ,MAAM,OAAO,OAAO;AAAA,IAC9C,OAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS,IAAI,MAAM,OAAO,MAAM,CAAC;AAAA,EACvC,MAAM,eAAe,UAAU,MAAM;AAAA,EACrC,IAAI,cAAc;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EACA,OAAO,UAAU,OAAO,QAAQ,oBAAoB,EAAE,CAAC;AAAA;AAGzD,SAAS,aAAa,CAAC,OAAoC;AAAA,EACzD,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAAA,IAC/C,OAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AAAA,EACf,MAAM,MAAM,OAAO,OAAO,QAAQ,WAAW,OAAO,MAAM;AAAA,EAC1D,MAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,EAChE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,WAAW,OAAO,GAAG;AAAA,IAChD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,EAC7D,OAAO,EAAE,KAAK,MAAM,MAAM;AAAA;AAG5B,SAAS,uBAAuB,CAAC,KAA4B;AAAA,EAC3D,MAAM,QAAuB,CAAC;AAAA,EAC9B,MAAM,OAAO,IAAI;AAAA,EAGjB,MAAM,cACJ;AAAA,EACF,WAAW,SAAS,IAAI,SAAS,WAAW,GAAG;AAAA,IAC7C,MAAM,OAAO,MAAM;AAAA,IACnB,MAAM,MAAM,MAAM;AAAA,IAClB,MAAM,QAAQ,MAAM;AAAA,IACpB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,MAAM,MAAM,GAAG,QAAQ;AAAA,IACvB,IAAI,KAAK,IAAI,GAAG,GAAG;AAAA,MACjB;AAAA,IACF;AAAA,IACA,KAAK,IAAI,GAAG;AAAA,IACZ,MAAM,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,EACjC;AAAA,EAEA,IAAI,MAAM,SAAS,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,MAAM,KAAK,IAAI,SAAS,0CAA0C,CAAC,EAAE,IAChF,CAAC,MAAM,EAAE,EACX;AAAA,EACA,MAAM,SAAS,MAAM,KAAK,IAAI,SAAS,yBAAyB,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAG;AAAA,EACnF,MAAM,QAAQ,KAAK,IAAI,KAAK,QAAQ,OAAO,MAAM;AAAA,EACjD,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,MAAM,KAAK;AAAA,IACjB,MAAM,QAAQ,OAAO;AAAA,IACrB,IAAI,CAAC,OAAO,CAAC,OAAO;AAAA,MAClB;AAAA,IACF;AAAA,IACA,MAAM,MAAM,GAAG,QAAQ;AAAA,IACvB,IAAI,KAAK,IAAI,GAAG,GAAG;AAAA,MACjB;AAAA,IACF;AAAA,IACA,KAAK,IAAI,GAAG;AAAA,IACZ,MAAM,KAAK,EAAE,KAAK,MAAM,CAAC;AAAA,EAC3B;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,mBAAmB,CAAC,aAA+B;AAAA,EAC1D,MAAM,QAAQ,CAAC,MAAK,aAAa,WAAW,SAAS,CAAC;AAAA,EACtD,MAAM,aAAuB,CAAC;AAAA,EAC9B,WAAW,QAAQ,OAAO;AAAA,IACxB,IAAI,CAAC,YAAW,IAAI,GAAG;AAAA,MACrB;AAAA,IACF;AAAA,IACA,WAAW,KAAK,MAAK,MAAM,yBAAyB,IAAI,CAAC;AAAA,EAC3D;AAAA,EACA,OAAO;AAAA;AAGT,eAAe,uBAAuB,CACpC,aAC8D;AAAA,EAC9D,MAAM,SAAS,oBAAoB,WAAW;AAAA,EAC9C,WAAW,SAAS,QAAQ;AAAA,IAC1B,MAAM,SAAS,MAAK,OAAO,aAAa;AAAA,IACxC,IAAI,CAAC,YAAW,MAAM,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,MAAM,kBAAkB,MAAM;AAAA,IAC7C,IAAI;AAAA,MACF,MAAM,OAAQ,MAAM,qBAClB,OAAO,UACP,iGACF;AAAA,MAEA,WAAW,OAAO,MAAM;AAAA,QACtB,MAAM,MAAM,yBAAyB,IAAI,KAAK;AAAA,QAC9C,MAAM,WACJ,OAAO,OAAO,IAAI,UAAU,YAAY,IAAI,UAAU,OAAO,IAAI,QAAQ,CAAC;AAAA,QAC5E,MAAM,cAAc,OAAO,OAAO,QAAQ,EACvC,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,EAC3B,OAAO,CAAC,MAAwB,MAAM,IAAI;AAAA,QAC7C,IAAI,YAAY,SAAS,GAAG;AAAA,UAC1B,OAAO,EAAE,OAAO,aAAa,YAAY,OAAO;AAAA,QAClD;AAAA,QAEA,MAAM,WAAW,wBAAwB,cAAc,IAAI,KAAK,CAAC;AAAA,QACjE,IAAI,SAAS,SAAS,GAAG;AAAA,UACvB,OAAO,EAAE,OAAO,UAAU,YAAY,OAAO;AAAA,QAC/C;AAAA,MACF;AAAA,cACA;AAAA,MACA,MAAM,OAAO,QAAQ;AAAA;AAAA,EAEzB;AAAA,EACA,OAAO;AAAA;AAGT,eAAe,yBAAyB,CACtC,aAC0D;AAAA,EAC1D,MAAM,SAAS,MAAK,aAAa,gBAAgB;AAAA,EACjD,IAAI,CAAC,YAAW,MAAM,GAAG;AAAA,IACvB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,MAAM,kBAAkB,MAAM;AAAA,EAC7C,IAAI;AAAA,IACF,MAAM,OAAQ,MAAM,qBAClB,OAAO,UACP,sGACF;AAAA,IAEA,WAAW,OAAO,MAAM;AAAA,MACtB,IAAI,IAAI,OAAO,WAAW,OAAO,GAAG;AAAA,QAClC,OAAO,EAAE,UAAU,yBAAyB,IAAI,KAAK,GAAG,YAAY,OAAO;AAAA,MAC7E;AAAA,IACF;AAAA,YACA;AAAA,IACA,MAAM,OAAO,QAAQ;AAAA;AAAA,EAGvB,OAAO;AAAA;AAGT,SAAS,wBAAwB,CAAC,QAAwB;AAAA,EACxD,IAAI,UAAU;AAAA,EAEd,SAAS,IAAI,EAAG,IAAI,GAAG,KAAK,GAAG;AAAA,IAC7B,IAAI;AAAA,MACF,MAAM,OAAO,mBAAmB,OAAO;AAAA,MACvC,IAAI,SAAS,SAAS;AAAA,QACpB;AAAA,MACF;AAAA,MACA,UAAU;AAAA,MACV,MAAM;AAAA,MACN;AAAA;AAAA,EAEJ;AAAA,EACA,OAAO;AAAA;AAGT,eAAsB,kBAAkB,CAAC,OAEJ;AAAA,EAUnC,MAAM,gBAAgB,MAAM,sBAAsB;AAAA,EAClD,MAAM,aAAa,wBAAwB,eAAe,OAAO,OAAO;AAAA,EACxE,IAAI,WAAW,WAAW,GAAG;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,aAAa,YAAY;AAAA,IAClC,MAAM,cAAc,MAAM,wBAAwB,UAAU,IAAI;AAAA,IAChE,IAAI,CAAC,aAAa;AAAA,MAChB;AAAA,IACF;AAAA,IACA,MAAM,eAAe,MAAM,0BAA0B,UAAU,IAAI;AAAA,IACnE,IAAI,CAAC,cAAc;AAAA,MACjB;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,UAAU,aAAa;AAAA,MACvB,OAAO,YAAY;AAAA,MACnB,QAAQ;AAAA,QACN,cAAc,UAAU;AAAA,QACxB,cAAc,aAAa;AAAA,QAC3B,mBAAmB,YAAY;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;;;ACzeT,oBAAS;AACT,iBAAS;AAEF,IAAM,kBAAkB,MAAK,SAAQ,GAAG,WAAW,aAAa;AAChE,IAAM,mBAAmB,MAAK,iBAAiB,kBAAkB;AACjE,IAAM,mBAAmB;;;ACLhC,kBAAS,oBAAO;AAChB,oBAAS;AAET,eAAsB,YAAe,CAAC,MAAiC;AAAA,EACrE,IAAI;AAAA,IACF,MAAM,MAAM,MAAM,UAAS,MAAM,MAAM;AAAA,IACvC,OAAO,KAAK,MAAM,GAAG;AAAA,IACrB,OAAO,KAAc;AAAA,IACrB,IAAI,UAAS,GAAG,KAAK,IAAI,SAAS,UAAU;AAAA,MAC1C,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,eAAe,aAAa;AAAA,MAC9B,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA;AAAA;AAIV,eAAsB,aAAa,CAAC,MAAc,MAA8B;AAAA,EAC9E,MAAM,OAAM,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C,MAAM,UAAU,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,GAAO,EAAE,MAAM,IAAM,CAAC;AAAA;AAG7E,SAAS,SAAQ,CAAC,OAAkD;AAAA,EAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAAA;;;ACzBhD;AAEO,IAAM,sBAAsB,EAAE,MAAM;AAAA,EACzC,EAAE,OAAO;AAAA,IACP,WAAW,EAAE,QAAQ,UAAU;AAAA,IAC/B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,WAAW,EAAE,QAAQ,SAAS;AAAA,IAC9B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC5B,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC/B,CAAC;AACH,CAAC;AAIM,IAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,eAAe,EAAE,OAAO,EAAE,IAAI;AAAA,EAC9B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAM;AACR,CAAC;AAIM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,SAAS,EAAE,QAAQ,CAAC;AAAA,EACpB,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,uBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACjD,YAAY,EAAE,MAAM,eAAe,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;;;AC/BD,qBAAS;AACT,yBAAS;AAET,IAAM,YAAW,UAAS,MAAM;AAEzB,SAAS,WAAW,CAAC,SAAiB,SAAgC;AAAA,EAC3E,IAAI,CAAC,WAAU;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,MAAM,SAAS,cACb,YACA,CAAC,yBAAyB,MAAM,SAAS,MAAM,SAAS,IAAI,GAC5D,EAAE,UAAU,QAAQ,OAAO,CAAC,QAAQ,QAAQ,QAAQ,EAAE,CACxD;AAAA,IACA,OAAO,OAAO,KAAK,KAAK;AAAA,IACxB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIJ,SAAS,WAAW,CAAC,OAAqE;AAAA,EAC/F,IAAI,CAAC,WAAU;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,QAAQ,SAAS,OAAO,YAAY;AAAA,EACpC,IAAI;AAAA,IACF,IAAI;AAAA,MACF,cAAa,YAAY,CAAC,2BAA2B,MAAM,SAAS,MAAM,OAAO,GAAG;AAAA,QAClF,OAAO,CAAC,QAAQ,QAAQ,QAAQ;AAAA,MAClC,CAAC;AAAA,MACD,MAAM;AAAA,IAGR,cAAa,YAAY,CAAC,wBAAwB,MAAM,SAAS,MAAM,SAAS,MAAM,KAAK,GAAG;AAAA,MAC5F,OAAO;AAAA,IACT,CAAC;AAAA,IACD,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;ACnCX,qBAAS;AAET,IAAM,uBAAuB;AAC7B,IAAM,YAAW,UAAS,MAAM;AAEhC,SAAS,qBAAqB,CAAC,cAA8B;AAAA,EAC3D,MAAM,IAAI,IAAI,IAAI,YAAY;AAAA,EAC9B,OAAO,GAAG,EAAE,aAAa,EAAE;AAAA;AAG7B,SAAS,mBAAmB,CAAC,OAAoC;AAAA,EAC/D,OAAO,CAAC,SAAS,UAAU;AAAA;AAG7B,eAAsB,eAAe,GAAyB;AAAA,EAC5D,MAAM,WAAW,MAAM,aAAsB,gBAAgB;AAAA,EAC7D,MAAM,SAAS,kBAAkB,UAAU,YAAY,EAAE,SAAS,GAAG,YAAY,CAAC,EAAE,CAAC;AAAA,EACrF,IAAI,CAAC,OAAO,SAAS;AAAA,IACnB,OAAO,EAAE,SAAS,GAAG,YAAY,CAAC,EAAE;AAAA,EACtC;AAAA,EAGA,MAAM,QAAQ,OAAO;AAAA,EACrB,MAAM,WAAW,MAAM,WAAW,IAAI,CAAC,MAAM;AAAA,IAC3C,IAAI,EAAE,KAAK,cAAc,WAAW;AAAA,MAClC,MAAM,UAAU,QAAQ,sBAAsB,EAAE,aAAa;AAAA,MAC7D,MAAM,OAAO,YAAY,SAAS,gBAAgB;AAAA,MAClD,MAAM,OAAO,YAAY,QAAQ,gBAAgB;AAAA,MACjD,OAAO;AAAA,WACF;AAAA,QACH,MAAM;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,QAAQ,EAAE,KAAK;AAAA,UAC3B,aAAa,QAAQ,EAAE,KAAK;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI,EAAE,KAAK,cAAc,YAAY;AAAA,MACnC,MAAM,UAAU,SAAS,sBAAsB,EAAE,aAAa;AAAA,MAC9D,MAAM,QAAQ,YAAY,SAAS,gBAAgB;AAAA,MACnD,OAAO;AAAA,WACF;AAAA,QACH,MAAM;AAAA,UACJ,WAAW;AAAA,UACX,OAAO,SAAS,EAAE,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO;AAAA,GACR;AAAA,EAED,OAAO,KAAK,OAAO,YAAY,SAAS;AAAA;AAG1C,eAAsB,eAAe,CAAC,aAAyC;AAAA,EAC7E,MAAM,UAAuB;AAAA,OACxB;AAAA,IACH,YAAY,IAAI,KAAK,EAAE,YAAY;AAAA,IACnC,YAAY,YAAY,WAAW,IAAI,CAAC,OAAO;AAAA,SAC1C;AAAA,MACH,eAAe,sBAAsB,EAAE,aAAa;AAAA,IACtD,EAAE;AAAA,EACJ;AAAA,EAIA,MAAM,cAA2B,gBAAgB,OAAO;AAAA,EAExD,IAAI,WAAU;AAAA,IAEZ,MAAM,eAAe,QAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,KAAK,cAAc,SAAS;AAAA,IAClF,IAAI,aAAa;AAAA,IACjB,IACE,cAAc,KAAK,cAAc,aACjC,CAAC,oBAAoB,aAAa,KAAK,WAAW,GAClD;AAAA,MACA,MAAM,WAAW,YAAY,QAAQ,gBAAgB;AAAA,MACrD,aACE,aAAa,aAAa,KAAK,eAC/B,YAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAO,aAAa,KAAK;AAAA,QACzB,SAAS;AAAA,MACX,CAAC;AAAA,IACL;AAAA,IAEA,WAAW,KAAK,YAAY,YAAY;AAAA,MACtC,IAAI,EAAE,KAAK,cAAc,WAAW;AAAA,QAClC,MAAM,UAAU,QAAQ,sBAAsB,EAAE,aAAa;AAAA,QAC7D,MAAM,cACJ,oBAAoB,EAAE,KAAK,UAAU,KACrC,YAAY,SAAS,gBAAgB,MAAM,EAAE,KAAK,cAClD,YAAY,EAAE,SAAS,OAAO,EAAE,KAAK,YAAY,SAAS,iBAAiB,CAAC;AAAA,QAE9E,IAAI,aAAa;AAAA,UACf,EAAE,KAAK,aAAa;AAAA,QACtB;AAAA,QACA,IAAI,YAAY;AAAA,UACd,EAAE,KAAK,cAAc;AAAA,QACvB;AAAA,MACF;AAAA,MAEA,IAAI,EAAE,KAAK,cAAc,YAAY;AAAA,QACnC,MAAM,UAAU,SAAS,sBAAsB,EAAE,aAAa;AAAA,QAC9D,MAAM,cACJ,oBAAoB,EAAE,KAAK,KAAK,KAChC,YAAY,SAAS,gBAAgB,MAAM,EAAE,KAAK,SAClD,YAAY,EAAE,SAAS,OAAO,EAAE,KAAK,OAAO,SAAS,iBAAiB,CAAC;AAAA,QACzE,IAAI,aAAa;AAAA,UACf,EAAE,KAAK,QAAQ;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,kBAAkB,WAAW;AAAA;AAGnD,eAAsB,eAAe,CAAC,WAA0C;AAAA,EAC9E,MAAM,QAAQ,MAAM,gBAAgB;AAAA,EACpC,MAAM,gBAAgB,sBAAsB,UAAU,aAAa;AAAA,EACnE,MAAM,OAAkB,KAAK,WAAW,eAAe,cAAc;AAAA,EAErE,MAAM,MAAM,MAAM,WAAW,UAC3B,CAAC,MAAM,sBAAsB,EAAE,aAAa,MAAM,aACpD;AAAA,EACA,IAAI,QAAQ,IAAI;AAAA,IACd,MAAM,WAAW,KAAK,IAAI;AAAA,EAC5B,EAAO;AAAA,IACL,MAAM,WAAW,OAAO;AAAA,SACnB,MAAM,WAAW;AAAA,SACjB;AAAA,MACH,MAAM,KAAK;AAAA,IACb;AAAA;AAAA,EAGF,IAAI,CAAC,MAAM,uBAAuB;AAAA,IAChC,MAAM,wBAAwB;AAAA,EAChC;AAAA,EACA,MAAM,gBAAgB,KAAK;AAAA,EAC3B,OAAO;AAAA;AAGT,eAAsB,gBAAgB,CAAC,YAAwC;AAAA,EAC7E,IAAI,WAAW,WAAW,GAAG;AAAA,IAC3B;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,gBAAgB;AAAA,EAEpC,WAAW,aAAa,YAAY;AAAA,IAClC,MAAM,gBAAgB,sBAAsB,UAAU,aAAa;AAAA,IACnE,MAAM,OAAkB,KAAK,WAAW,eAAe,cAAc;AAAA,IAErE,MAAM,MAAM,MAAM,WAAW,UAC3B,CAAC,MAAM,sBAAsB,EAAE,aAAa,MAAM,aACpD;AAAA,IACA,IAAI,QAAQ,IAAI;AAAA,MACd,MAAM,WAAW,KAAK,IAAI;AAAA,IAC5B,EAAO;AAAA,MACL,MAAM,WAAW,OAAO;AAAA,WACnB,MAAM,WAAW;AAAA,WACjB;AAAA,QACH,MAAM,KAAK;AAAA,MACb;AAAA;AAAA,IAGF,IAAI,CAAC,MAAM,uBAAuB;AAAA,MAChC,MAAM,wBAAwB;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,KAAK;AAAA;AAG7B,eAAsB,mBAAmB,CAAC,cAAqC;AAAA,EAC7E,MAAM,QAAQ,MAAM,gBAAgB;AAAA,EACpC,MAAM,wBAAwB,sBAAsB,YAAY;AAAA,EAChE,MAAM,gBAAgB,KAAK;AAAA;AAG7B,eAAsB,eAAe,CAAC,cAAqC;AAAA,EACzE,MAAM,QAAQ,MAAM,gBAAgB;AAAA,EACpC,MAAM,aAAa,sBAAsB,YAAY;AAAA,EACrD,MAAM,aAAa,MAAM,WAAW,OAClC,CAAC,MAAM,sBAAsB,EAAE,aAAa,MAAM,UACpD;AAAA,EACA,IAAI,MAAM,0BAA0B,YAAY;AAAA,IAC9C,MAAM,wBAAwB,MAAM,WAAW,IAAI;AAAA,EACrD;AAAA,EACA,MAAM,gBAAgB,KAAK;AAAA;AAG7B,eAAsB,sBAAsB,CAAC,cAAiD;AAAA,EAC5F,MAAM,QAAQ,MAAM,gBAAgB;AAAA,EACpC,MAAM,aAAa,sBAAsB,YAAY;AAAA,EACrD,OACE,MAAM,WAAW,KAAK,CAAC,MAAM,sBAAsB,EAAE,aAAa,MAAM,UAAU,KAAK;AAAA;AAI3F,eAAsB,uBAAuB,GAA8B;AAAA,EACzE,MAAM,QAAQ,MAAM,gBAAgB;AAAA,EACpC,IAAI,MAAM,uBAAuB;AAAA,IAC/B,MAAM,YAAY,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,kBAAkB,MAAM,qBAAqB;AAAA,IAC9F,IAAI,WAAW;AAAA,MACb,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,OAAO,MAAM,WAAW,MAAM;AAAA;;;AC7MhC,SAAS,YAAY,CAAC,GAAmB;AAAA,EACvC,MAAM,MAAM,IAAI,IAAI,CAAC;AAAA,EACrB,OAAO,GAAG,IAAI,aAAa,IAAI;AAAA;AAGjC,SAAS,6BAA6B,CAAC,WAAgC;AAAA,EACrE,IAAI,OAAO;AAAA,EACX,IAAI;AAAA,IACF,OAAO,IAAI,IAAI,UAAU,aAAa,EAAE,KAAK,YAAY;AAAA,IACzD,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,EAET,MAAM,yBAAyB,KAAK,QAAQ,kBAAkB,EAAE;AAAA,EAChE,OAAO;AAAA,IACL,UAAU,cAAc,YAAY;AAAA,IACpC;AAAA,IACA;AAAA,IACA,UAAU,gBAAgB,YAAY,KAAK;AAAA,IAC3C,UAAU,aAAa,YAAY,KAAK;AAAA,EAC1C,EAAE,OAAO,OAAO;AAAA;AAGX,SAAS,wBAAwB,CACtC,YACA,UACyB;AAAA,EACzB,MAAM,MAAM,SAAS,KAAK;AAAA,EAC1B,IAAI,CAAC,KAAK;AAAA,IACR,OAAO,EAAE,OAAO,MAAM,WAAW,CAAC,EAAE;AAAA,EACtC;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,aAAa,aAAa,GAAG,EAAE,YAAY;AAAA,IACjD,MAAM,QAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,cAAc,YAAY,MAAM,UAAU;AAAA,IACjF,IAAI,OAAO;AAAA,MACT,OAAO,EAAE,OAAO,OAAO,WAAW,CAAC,EAAE;AAAA,IACvC;AAAA,IACA,MAAM;AAAA,EAIR,MAAM,SAAS,IAAI,YAAY;AAAA,EAC/B,MAAM,UAAU,WAAW,OAAO,CAAC,cACjC,8BAA8B,SAAS,EAAE,KAAK,CAAC,cAAc,UAAU,SAAS,MAAM,CAAC,CACzF;AAAA,EACA,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,OAAO,EAAE,OAAO,QAAQ,IAAK,WAAW,CAAC,EAAE;AAAA,EAC7C;AAAA,EACA,IAAI,QAAQ,SAAS,GAAG;AAAA,IACtB,OAAO,EAAE,OAAO,MAAM,WAAW,QAAQ;AAAA,EAC3C;AAAA,EACA,OAAO,EAAE,OAAO,MAAM,WAAW,CAAC,EAAE;AAAA;;;AC1D/B,SAAS,SAAQ,CAAC,OAAkD;AAAA,EACzE,OAAO,OAAO,UAAU,YAAY,UAAU;AAAA;AAGzC,SAAS,OAAO,CAAC,OAA2B;AAAA,EACjD,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAAA;AAGlC,SAAS,SAAS,CAAC,OAAoC;AAAA,EAC5D,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA;AAGtC,SAAS,SAAS,CAAC,OAAoC;AAAA,EAC5D,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA;;;ACV7C,IAAM,6BAA6B;AAO5B,SAAS,WAAW,CAAC,OAAwB;AAAA,EAClD,OAAO,sBAAsB,KAAK,KAAK;AAAA;AAGlC,SAAS,QAAQ,CAAC,OAAwB;AAAA,EAC/C,OAAO,kBAAkB,KAAK,KAAK;AAAA;AAOrC,eAAsB,aAAa,CAAC,QAAwB,QAAiC;AAAA,EAC3F,MAAM,OAAO,MAAM,OAAO,IAAI,sBAAsB,EAAE,OAAO,OAAO,CAAC;AAAA,EACrE,MAAM,UAAU,UAAS,IAAI,IAAI,KAAK,UAAU;AAAA,EAChD,MAAM,YAAY,UAAS,OAAO,IAAI,UAAU,QAAQ,EAAE,IAAI;AAAA,EAC9D,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,MAAM,uCAAuC,QAAQ;AAAA,EACjE;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,qBAAqB,CAAC,OAGpC;AAAA,EACA,MAAM,UAAU,MAAM,KAAK;AAAA,EAC3B,IAAI,QAAQ,WAAW,GAAG,GAAG;AAAA,IAC3B,OAAO,EAAE,MAAM,QAAQ,OAAO,QAAQ,MAAM,CAAC,EAAE;AAAA,EACjD;AAAA,EACA,IAAI,YAAY,OAAO,GAAG;AAAA,IACxB,OAAO,EAAE,MAAM,MAAM,OAAO,QAAQ;AAAA,EACtC;AAAA,EACA,OAAO,EAAE,MAAM,QAAQ,OAAO,QAAQ;AAAA;AAGxC,eAAsB,gBAAgB,CAAC,QAAwB,OAAgC;AAAA,EAC7F,MAAM,aAAa,sBAAsB,KAAK;AAAA,EAC9C,IAAI,WAAW,SAAS,MAAM;AAAA,IAC5B,OAAO,WAAW;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,WAAW;AAAA,EACxB,IAAI,CAAC,MAAM;AAAA,IACT,MAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAAA,EAMA,IAAI;AAAA,IACF,MAAM,aAAa,MAAM,OAAO,IAAI,mBAAmB;AAAA,MACrD,OAAO,OAAO;AAAA,MACd,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,MAAM,WAAW,UAAS,UAAU,IAAI,WAAW,WAAW;AAAA,IAC9D,MAAM,UAAU,UAAS,QAAQ,IAAI,QAAQ,SAAS,OAAO,EAAE,OAAO,SAAQ,IAAI,CAAC;AAAA,IACnF,IAAI,QAAQ,SAAS,GAAG;AAAA,MACtB,MAAM,UAAU,UAAS,QAAQ,GAAI,OAAO,IAAI,QAAQ,GAAI,UAAU;AAAA,MACtE,MAAM,YAAY,UAAU,UAAU,QAAQ,EAAE,IAAI;AAAA,MACpD,IAAI,WAAW;AAAA,QACb,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM;AAAA,EAKR,IAAI;AAAA,EACJ,UAAS;AAAA,IACP,MAAM,OAAO,MAAM,OAAO,IAAI,sBAAsB;AAAA,MAClD,kBAAkB;AAAA,MAClB,OAAO;AAAA,MACP;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,IACD,MAAM,QAAQ,QAAQ,KAAK,QAAQ,EAAE,OAAO,SAAQ;AAAA,IACpD,WAAW,KAAK,OAAO;AAAA,MACrB,IAAI,UAAU,EAAE,IAAI,MAAM,QAAQ,UAAU,EAAE,EAAE,GAAG;AAAA,QACjD,OAAO,UAAU,EAAE,EAAE;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,UAAS,KAAK,iBAAiB,IAAI,KAAK,oBAAoB;AAAA,IACzE,MAAM,OAAO,OAAO,UAAU,KAAK,WAAW,IAAI;AAAA,IAClD,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EAEA,MAAM,IAAI,MAAM,oCAAoC,MAAM;AAAA;AAQ5D,eAAsB,kBAAkB,CACtC,QACA,WACiB;AAAA,EACjB,IAAI;AAAA,IACF,MAAM,OAAO,MAAM,OAAO,IAAI,sBAAsB,EAAE,SAAS,UAAU,CAAC;AAAA,IAC1E,MAAM,UAAU,UAAS,IAAI,IAAI,KAAK,UAAU;AAAA,IAChD,IAAI,CAAC,UAAS,OAAO,GAAG;AAAA,MACtB,OAAO;AAAA,IACT;AAAA,IAGA,IAAI,QAAQ,OAAO;AAAA,MACjB,MAAM,SAAS,UAAU,QAAQ,IAAI;AAAA,MACrC,IAAI,QAAQ;AAAA,QACV,IAAI;AAAA,UACF,MAAM,WAAW,MAAM,OAAO,IAAI,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,UAChE,MAAM,OAAO,UAAS,QAAQ,IAAI,SAAS,OAAO;AAAA,UAClD,MAAM,UAAU,UAAS,IAAI,IAAI,KAAK,UAAU;AAAA,UAChD,IAAI,UAAS,OAAO,GAAG;AAAA,YACrB,OAAO,UAAU,QAAQ,YAAY,KAAK,UAAU,QAAQ,SAAS,KAAK;AAAA,UAC5E;AAAA,UACA,MAAM;AAAA,MAGV;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,UAAU,QAAQ,IAAI,KAAK;AAAA,IAClC,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAWX,eAAsB,qBAAqB,CACzC,QACA,SAC4B;AAAA,EAC5B,MAAM,OAAO,MAAM,OAAO,IAAI,uBAAuB;AAAA,IACnD,MAAM,SAAS;AAAA,IACf,OAAO,4BAA4B,SAAS,KAAK;AAAA,IACjD,QAAQ,SAAS;AAAA,IACjB,OAAO,SAAS,SAAS;AAAA,IACzB,kBAAkB,SAAS,mBAAmB;AAAA,EAChD,CAAC;AAAA,EACD,OAAO,2BAA2B,IAAI;AAAA;AAGxC,eAAsB,oBAAoB,CACxC,QACA,SAC4B;AAAA,EAC5B,MAAM,OAAO,MAAM,OAAO,IAAI,sBAAsB;AAAA,IAClD,OAAO,4BAA4B,SAAS,KAAK;AAAA,IACjD,QAAQ,SAAS;AAAA,IACjB,OAAO,SAAS,SAAS;AAAA,IACzB,kBAAkB,SAAS,mBAAmB;AAAA,EAChD,CAAC;AAAA,EACD,OAAO,2BAA2B,IAAI;AAAA;AAGjC,SAAS,0BAA0B,CAAC,MAAkD;AAAA,EAC3F,MAAM,WAAW,QAAQ,KAAK,QAAQ,EAAE,OAAO,SAAQ;AAAA,EACvD,MAAM,OAAO,UAAS,KAAK,iBAAiB,IAAI,KAAK,oBAAoB;AAAA,EACzE,MAAM,OAAO,OAAO,UAAU,KAAK,WAAW,IAAI;AAAA,EAClD,OAAO,EAAE,UAAU,aAAa,KAAK;AAAA;AAGvC,SAAS,2BAA2B,CAAC,OAAmC;AAAA,EACtE,OAAO,KAAK,IAAI,KAAK,IAAI,SAAS,KAAK,CAAC,GAAG,IAAI;AAAA;;;AC9LjD;AAOO,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EAER,WAAW,CAAC,MAAiB,SAAqC;AAAA,IAChE,KAAK,OAAO;AAAA,IACZ,KAAK,eAAe,SAAS;AAAA,IAC7B,IAAI,KAAK,cAAc,YAAY;AAAA,MACjC,KAAK,MAAM,IAAI,UAAU,KAAK,KAAK;AAAA,IACrC;AAAA;AAAA,OAGI,IAAG,CACP,QACA,SAAkC,CAAC,GACD;AAAA,IAClC,IAAI,KAAK,KAAK,cAAc,YAAY;AAAA,MACtC,IAAI,CAAC,KAAK,KAAK;AAAA,QACb,MAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AAAA,MACA,OAAQ,MAAM,KAAK,IAAI,QAAQ,QAAQ,MAAM;AAAA,IAC/C;AAAA,IAEA,IAAI,CAAC,KAAK,cAAc;AAAA,MACtB,MAAM,IAAI,MACR,2HACF;AAAA,IACF;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,IAAI,KAAK,cAAc,WAAW;AAAA,MAChC,MAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,IACA,OAAO,KAAK,WAAW;AAAA,MACrB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA,OAGW,WAAU,CAAC,OAMY;AAAA,IACnC,MAAM,UAAU,MAAM,WAAW;AAAA,IACjC,MAAM,MAAM,GAAG,MAAM,aAAa,QAAQ,OAAO,EAAE,SAAS,MAAM;AAAA,IAClE,MAAM,iBAAiB,OAAO,QAAQ,MAAM,MAAM,EAC/C,OAAO,IAAI,OAAO,MAAM,SAAS,EACjC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AAAA,IACjC,MAAM,WAAW,IAAI,gBAAgB;AAAA,MACnC,OAAO,MAAM,KAAK;AAAA,SACf,OAAO,YAAY,cAAc;AAAA,IACtC,CAAC;AAAA,IACD,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ,KAAK,mBAAmB,MAAM,KAAK,WAAW;AAAA,QACtD,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,cAAc,aAAa;AAAA,MAC7B;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA,IAED,IAAI,SAAS,WAAW,OAAO,UAAU,GAAG;AAAA,MAC1C,MAAM,aAAa,OAAO,SAAS,QAAQ,IAAI,aAAa,KAAK,GAAG;AAAA,MACpE,MAAM,UAAU,KAAK,IAAI,KAAK,IAAI,YAAY,CAAC,IAAI,MAAM,KAAK;AAAA,MAC9D,MAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAAA,MAC/C,OAAO,KAAK,WAAW;AAAA,WAClB;AAAA,QACH,SAAS,UAAU;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,OAAgB,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,IAC5D,IAAI,CAAC,SAAS,IAAI;AAAA,MAChB,MAAM,IAAI,MAAM,cAAc,SAAS,kBAAkB,MAAM,QAAQ;AAAA,IACzE;AAAA,IACA,IAAI,CAAC,UAAS,IAAI,KAAK,KAAK,OAAO,MAAM;AAAA,MACvC,MAAM,QAAQ,UAAS,IAAI,KAAK,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MAC9E,MAAM,IAAI,MAAM,SAAS,2BAA2B,MAAM,QAAQ;AAAA,IACpE;AAAA,IACA,OAAO;AAAA;AAEX;AAEA,SAAS,SAAQ,CAAC,OAAkD;AAAA,EAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAAA;;;ACzDhD,SAAS,mBAAmB,GAAY;AAAA,EACtC,OAAO,QAAQ,QAAQ,IAAI,aAAa,KAAK,CAAC;AAAA;AAGhD,SAAS,qBAAqB,CAAC,MAAmC;AAAA,EAChE,OAAO,MAAM,KAAK,KAAK,QAAQ,IAAI,qBAAqB,KAAK,KAAK;AAAA;AAGpE,SAAS,YAAY,CAAC,KAAsB;AAAA,EAC1C,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA;AAGxD,SAAS,gBAAgB,CAAC,OAA+D;AAAA,EACvF,MAAM,MAAM,OAAO,SAAS,KAAK,EAAE,YAAY;AAAA,EAC/C,IAAI,QAAQ,UAAU,QAAQ,WAAW,QAAQ,aAAa,QAAQ,QAAQ;AAAA,IAC5E,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGT,eAAe,uCAAuC,CAAC,OAGrC;AAAA,EAChB,MAAM,UAAU,MAAM,SAAS,KAAK,CAAC,MAAM,sBAAsB,CAAC,EAAE,SAAS,MAAM;AAAA,EACnF,IAAI,CAAC,SAAS;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAAM,gBAAgB;AAAA,EACpC,KAAK,MAAM,YAAY,UAAU,MAAM,GAAG;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,IAAI,CAAC,MAAM,cAAc;AAAA,IACvB,MAAM,IAAI,MACR,+HACF;AAAA,EACF;AAAA;AAGF,SAAS,kBAAkB,CAAC,SAA0B;AAAA,EACpD,OAAO,wDAAwD,KAAK,OAAO;AAAA;AAG7E,SAAS,aAAY,CAAC,GAAmB;AAAA,EACvC,MAAM,MAAM,IAAI,IAAI,CAAC;AAAA,EACrB,OAAO,GAAG,IAAI,aAAa,IAAI;AAAA;AAGjC,SAAS,eAAe,CAAC,GAA+B;AAAA,EACtD,IAAI;AAAA,IACF,OAAO,cAAa,CAAC;AAAA,IACrB,MAAM;AAAA,IACN;AAAA;AAAA;AAIJ,eAAe,4BAA4B,GAAqB;AAAA,EAC9D,IAAI,QAAQ,aAAa,YAAY,QAAQ,aAAa,SAAS;AAAA,IACjE,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,MAAM,YAAY,MAAM,wBAAwB;AAAA,IAChD,MAAM,iBACJ,UAAU,MAAM,IAAI,CAAC,UAAU;AAAA,MAC7B,eAAe,cAAa,KAAK,GAAG;AAAA,MACpC,gBAAgB,KAAK;AAAA,MACrB,MAAM;AAAA,QACJ,WAAW;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,aAAa,UAAU;AAAA,MACzB;AAAA,IACF,EAAE,CACJ;AAAA,IACA,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,eAAe,eAAkB,CAAC,OAGnB;AAAA,EACb,IAAI;AAAA,IACF,OAAO,MAAM,MAAM,KAAK;AAAA,IACxB,OAAO,KAAc;AAAA,IACrB,MAAM,UAAU,aAAa,GAAG;AAAA,IAChC,IAAI,oBAAoB,GAAG;AAAA,MACzB,MAAM;AAAA,IACR;AAAA,IACA,IAAI,CAAC,mBAAmB,OAAO,GAAG;AAAA,MAChC,MAAM;AAAA,IACR;AAAA,IAEA,MAAM,YAAY,MAAM,6BAA6B;AAAA,IACrD,IAAI,CAAC,WAAW;AAAA,MACd,MAAM;AAAA,IACR;AAAA,IACA,OAAO,MAAM,MAAM,KAAK;AAAA;AAAA;AAI5B,SAAS,eAAe,GAAqB;AAAA,EAC3C,MAAM,QAAQ,QAAQ,IAAI,aAAa,KAAK;AAAA,EAC5C,IAAI,CAAC,OAAO;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,WAAW,OAAO,GAAG;AAAA,IAC7B,MAAM,UAAU,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,gBAAgB,IAAI,KAAK;AAAA,IACnF,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAAA,IACA,OAAO,EAAE,WAAW,WAAW,YAAY,OAAO,aAAa,OAAO;AAAA,EACxE;AAAA,EACA,OAAO,EAAE,WAAW,YAAY,MAAM;AAAA;AAGxC,eAAe,qBAAqB,CAAC,cAIlC;AAAA,EACD,MAAM,WAAW,cAAc,KAAK,KAAK;AAAA,EACzC,MAAM,wBAAwB,WAAW,gBAAgB,QAAQ,IAAI;AAAA,EACrE,MAAM,mBAAmB,QAAQ,QAAQ;AAAA,EACzC,IAAI,uBAAuB;AAAA,EAC3B,IAAI,UAAU;AAAA,IACZ,MAAM,QAAQ,MAAM,gBAAgB;AAAA,IACpC,MAAM,WAAW,yBAAyB,MAAM,YAAY,QAAQ;AAAA,IACpE,IAAI,SAAS,UAAU,SAAS,GAAG;AAAA,MACjC,MAAM,UAAU,SAAS,UAAU,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,IAAI;AAAA,MACxE,MAAM,IAAI,MACR,uBAAuB,oCAAoC,+DAC7D;AAAA,IACF;AAAA,IACA,IAAI,SAAS,OAAO;AAAA,MAClB,uBAAuB,SAAS,MAAM;AAAA,IACxC,EAAO,SAAI,CAAC,uBAAuB;AAAA,MACjC,uBAAuB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,gBAAgB;AAAA,EAC5B,IAAI,KAAK;AAAA,IACP,MAAM,kBAAkB,QAAQ,IAAI,qBAAqB,KAAK;AAAA,IAC9D,MAAM,gBAAgB,wBAAwB;AAAA,IAC9C,OAAO;AAAA,MACL,QAAQ,IAAI,eAAe,KAAK,EAAE,cAAc,cAAc,CAAC;AAAA,MAC/D,MAAM;AAAA,MACN,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,IAAI,sBAAsB;AAAA,IACxB,MAAM,KAAK,MAAM,uBAAuB,oBAAoB;AAAA,IAC5D,IAAI,IAAI;AAAA,MACN,OAAO;AAAA,QACL,QAAQ,IAAI,eAAe,GAAG,MAAmB;AAAA,UAC/C,cAAc,GAAG;AAAA,QACnB,CAAC;AAAA,QACD,MAAM,GAAG;AAAA,QACT,eAAe,GAAG;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,CAAC,kBAAkB;AAAA,IACrB,MAAM,MAAM,MAAM,wBAAwB;AAAA,IAC1C,IAAI,KAAK;AAAA,MACP,OAAO;AAAA,QACL,QAAQ,IAAI,eAAe,IAAI,MAAmB;AAAA,UAChD,cAAc,IAAI;AAAA,QACpB,CAAC;AAAA,QACD,MAAM,IAAI;AAAA,QACV,eAAe,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,YAAY,MAAM,wBAAwB;AAAA,IAChD,MAAM,iBACJ,UAAU,MAAM,IAAI,CAAC,UAAU;AAAA,MAC7B,eAAe,cAAa,KAAK,GAAG;AAAA,MACpC,gBAAgB,KAAK;AAAA,MACrB,MAAM;AAAA,QACJ,WAAW;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,aAAa,UAAU;AAAA,MACzB;AAAA,IACF,EAAE,CACJ;AAAA,IAEA,MAAM,UAAU,uBACZ,MAAM,uBAAuB,oBAAoB,IACjD,WACE,0BAA0B,MAAM,gBAAgB,GAAG,YAAY,QAAQ,EAAE,QACzE,MAAM,wBAAwB;AAAA,IACpC,MAAM,SAAS,YAAY,CAAC,mBAAmB,MAAM,wBAAwB,IAAI;AAAA,IACjF,IAAI,QAAQ;AAAA,MACV,OAAO;AAAA,QACL,QAAQ,IAAI,eAAe,OAAO,MAAmB;AAAA,UACnD,cAAc,OAAO;AAAA,QACvB,CAAC;AAAA,QACD,MAAM,OAAO;AAAA,QACb,eAAe,OAAO;AAAA,MACxB;AAAA,IACF;AAAA,IACA,MAAM;AAAA,EAKR,MAAM,SAAS,kBAAkB,KAAM,MAAM,iBAAiB;AAAA,EAC9D,IAAI,UAAU,OAAO,MAAM,SAAS,GAAG;AAAA,IACrC,IAAI,SAAS,OAAO,MAAM;AAAA,IAC1B,IAAI,UAAU;AAAA,MACZ,MAAM,qBAAqB,SAAS,YAAY;AAAA,MAChD,MAAM,UAAU,OAAO,MAAM,OAAO,CAAC,MAAM;AAAA,QACzC,MAAM,gBAAgB,cAAa,EAAE,GAAG,EAAE,YAAY;AAAA,QACtD,MAAM,OAAO,IAAI,IAAI,EAAE,GAAG,EAAE,KAAK,YAAY;AAAA,QAC7C,MAAM,yBAAyB,KAAK,QAAQ,kBAAkB,EAAE;AAAA,QAChE,MAAM,OAAO,EAAE,MAAM,YAAY,KAAK;AAAA,QACtC,OACE,cAAc,SAAS,kBAAkB,KACzC,KAAK,SAAS,kBAAkB,KAChC,uBAAuB,SAAS,kBAAkB,KAClD,KAAK,SAAS,kBAAkB;AAAA,OAEnC;AAAA,MACD,IAAI,QAAQ,SAAS,GAAG;AAAA,QACtB,MAAM,IAAI,MACR,uBAAuB,yDAAyD,QAAQ,IAAI,CAAC,MAAM,cAAa,EAAE,GAAG,CAAC,EAAE,KAAK,IAAI,yDACnI;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB,SAAS,QAAQ;AAAA,MACnB,EAAO,SAAI,uBAAuB;AAAA,QAChC,IAAI;AAAA,UACF,SACE,OAAO,MAAM,KAAK,CAAC,MAAM,cAAa,EAAE,GAAG,MAAM,cAAa,QAAQ,CAAC,KAAK;AAAA,UAC9E,MAAM;AAAA,MAGV,EAAO;AAAA,QACL,MAAM,IAAI,MACR,6CAA6C,wEAC/C;AAAA;AAAA,IAEJ;AAAA,IACA,MAAM,OAAkB;AAAA,MACtB,WAAW;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,aAAa,OAAO;AAAA,IACtB;AAAA,IACA,MAAM,gBAAgB;AAAA,MACpB,eAAe,cAAa,OAAO,GAAG;AAAA,MACtC,gBAAgB,OAAO;AAAA,MACvB,MAAM;AAAA,QACJ,WAAW;AAAA,QACX,YAAY,OAAO;AAAA,QACnB,aAAa,OAAO;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,IACD,OAAO;AAAA,MACL,QAAQ,IAAI,eAAe,MAAM;AAAA,QAC/B,cAAc,cAAa,OAAO,GAAG;AAAA,MACvC,CAAC;AAAA,MACD;AAAA,MACA,eAAe,cAAa,OAAO,GAAG;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,MAAM,mBAAmB;AAAA,EACzC,IAAI,WAAW,QAAQ,MAAM,SAAS,GAAG;AAAA,IACvC,IAAI,SAAS,QAAQ,MAAM;AAAA,IAC3B,IAAI,UAAU;AAAA,MACZ,MAAM,qBAAqB,SAAS,YAAY;AAAA,MAChD,MAAM,UAAU,QAAQ,MAAM,OAAO,CAAC,MAAM;AAAA,QAC1C,MAAM,gBAAgB,cAAa,EAAE,GAAG,EAAE,YAAY;AAAA,QACtD,MAAM,OAAO,IAAI,IAAI,EAAE,GAAG,EAAE,KAAK,YAAY;AAAA,QAC7C,MAAM,yBAAyB,KAAK,QAAQ,kBAAkB,EAAE;AAAA,QAChE,MAAM,OAAO,EAAE,MAAM,YAAY,KAAK;AAAA,QACtC,OACE,cAAc,SAAS,kBAAkB,KACzC,KAAK,SAAS,kBAAkB,KAChC,uBAAuB,SAAS,kBAAkB,KAClD,KAAK,SAAS,kBAAkB;AAAA,OAEnC;AAAA,MACD,IAAI,QAAQ,SAAS,GAAG;AAAA,QACtB,MAAM,IAAI,MACR,uBAAuB,0DAA0D,QAAQ,IAAI,CAAC,MAAM,cAAa,EAAE,GAAG,CAAC,EAAE,KAAK,IAAI,yDACpI;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB,SAAS,QAAQ;AAAA,MACnB,EAAO,SAAI,uBAAuB;AAAA,QAChC,IAAI;AAAA,UACF,SACE,QAAQ,MAAM,KAAK,CAAC,MAAM,cAAa,EAAE,GAAG,MAAM,cAAa,QAAQ,CAAC,KAAK;AAAA,UAC/E,MAAM;AAAA,MACV,EAAO;AAAA,QACL,MAAM,IAAI,MACR,6CAA6C,wEAC/C;AAAA;AAAA,IAEJ;AAAA,IACA,MAAM,OAAkB;AAAA,MACtB,WAAW;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,aAAa,QAAQ;AAAA,IACvB;AAAA,IACA,MAAM,gBAAgB;AAAA,MACpB,eAAe,cAAa,OAAO,GAAG;AAAA,MACtC,gBAAgB,OAAO;AAAA,MACvB,MAAM;AAAA,QACJ,WAAW;AAAA,QACX,YAAY,OAAO;AAAA,QACnB,aAAa,QAAQ;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,IACD,OAAO;AAAA,MACL,QAAQ,IAAI,eAAe,MAAM;AAAA,QAC/B,cAAc,cAAa,OAAO,GAAG;AAAA,MACvC,CAAC;AAAA,MACD;AAAA,MACA,eAAe,cAAa,OAAO,GAAG;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,IAAI,YAAY,CAAC,uBAAuB;AAAA,IACtC,MAAM,IAAI,MACR,6CAA6C,wEAC/C;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,MACR,mNACF;AAAA;AAGK,SAAS,gBAAgB,GAAe;AAAA,EAC7C,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA;;;AC/YK,SAAS,UAAa,CAAC,OAAa;AAAA,EACzC,MAAM,SAAS,mBAAmB,KAAK;AAAA,EACvC,OAAQ,WAAW,YAAa,CAAC,IAAW;AAAA;AAG9C,SAAS,kBAAkB,CAAC,OAAyB;AAAA,EACnD,IAAI,UAAU,QAAQ,UAAU,WAAW;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,MAAM,KAAK,MAAM,KAAK,YAAY;AAAA,EAC3C;AAAA,EAEA,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAAA,IAC3D,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,MAAM,OAAO,MACV,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC,EAChC,OAAO,CAAC,MAAwC,MAAM,SAAS;AAAA,IAClE,OAAO,KAAK,WAAW,IAAI,YAAY;AAAA,EACzC;AAAA,EAEA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,MAAM,MAA+B,CAAC;AAAA,IACtC,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAgC,GAAG;AAAA,MACrE,MAAM,OAAO,mBAAmB,CAAC;AAAA,MACjC,IAAI,SAAS,WAAW;AAAA,QACtB,IAAI,KAAK;AAAA,MACX;AAAA,IACF;AAAA,IACA,OAAO,OAAO,KAAK,GAAG,EAAE,WAAW,IAAI,YAAY;AAAA,EACrD;AAAA,EAEA,OAAO;AAAA;;;ACpCF,SAAS,YAAY,CAC1B,OACA,SACQ;AAAA,EACR,MAAM,YAAY,SAAS,aAAa;AAAA,EACxC,MAAM,UAAU,SAAS,WAAW;AAAA,EACpC,IAAI,CAAC,OAAO;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,UAAU,YAAY,UAAU,GAAG;AAAA,IAC3C,OAAO;AAAA,EACT;AAAA,EACA,OAAO,GAAG,MAAM,MAAM,GAAG,SAAS,KAAI,MAAM,MAAM,CAAC,OAAO;AAAA;;;ACA5D,eAAe,WAAW,CAAC,OAGU;AAAA,EACnC,OAAO,MAAM,IAAI,gBAAgB;AAAA,IAC/B,cAAc,MAAM;AAAA,IACpB,MAAM,YAAY;AAAA,MAChB,QAAQ,WAAW,MAAM,MAAM,IAAI,sBAAsB,MAAM,YAAY;AAAA,MAC3E,OAAQ,MAAM,OAAO,IAAI,aAAa,CAAC,CAAC;AAAA;AAAA,EAE5C,CAAC;AAAA;AAGI,SAAS,mBAAmB,CAAC,OAAoD;AAAA,EACtF,MAAM,OAAO,MAAM,QAAQ,QAAQ,MAAM,EAAE,YAAY,6BAA6B;AAAA,EAEpF,KACG,QAAQ,QAAQ,EAChB,YAAY,8CAA8C,EAC1D,OAAO,YAAY;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,QAAQ,MAAM,gBAAgB;AAAA,MACpC,MAAM,YAAY;AAAA,WACb;AAAA,QACH,YAAY,MAAM,WAAW,IAAI,CAAC,OAAO;AAAA,UACvC,eAAe,EAAE;AAAA,UACjB,gBAAgB,EAAE;AAAA,UAClB,WAAW,EAAE,KAAK;AAAA,UAClB,OACE,EAAE,KAAK,cAAc,aACjB,aAAa,EAAE,KAAK,KAAK,IACzB,aAAa,EAAE,KAAK,UAAU;AAAA,UACpC,UAAU,EAAE,KAAK,cAAc,YAAY,aAAa,EAAE,KAAK,WAAW,IAAI;AAAA,QAChF,EAAE;AAAA,MACJ;AAAA,MACA,QAAQ,IAAI,KAAK,UAAU,WAAW,SAAS,GAAG,MAAM,CAAC,CAAC;AAAA,MAC1D,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA,EAEH,KACG,QAAQ,MAAM,EACd,YAAY,4CAA4C,EACxD,OACC,qBACA,6FACF,EACC,OAAO,UAAU,SAAS;AAAA,IACzB,OAAO,WAAW;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,OAAO,MAAM,YAAY;AAAA,QAC7B,KAAK,MAAM;AAAA,QACX,cAAc,MAAM,IAAI,sBAAsB,QAAQ,SAAS;AAAA,MACjE,CAAC;AAAA,MACD,QAAQ,IAAI,KAAK,UAAU,WAAW,IAAI,GAAG,MAAM,CAAC,CAAC;AAAA,MACrD,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA,EAEH,KACG,QAAQ,eAAe,EACvB,YAAY,sEAAsE,EAClF,OAAO,YAAY;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,YAAY,MAAM,IAAI,aAAa;AAAA,MACzC,IAAI,CAAC,WAAW;AAAA,QACd,MAAM,IAAI,MACR,yFACF;AAAA,MACF;AAAA,MAEA,WAAW,QAAQ,UAAU,OAAO;AAAA,QAClC,MAAM,gBAAgB;AAAA,UACpB,eAAe,MAAM,IAAI,aAAa,KAAK,GAAG;AAAA,UAC9C,gBAAgB,KAAK;AAAA,UACrB,MAAM;AAAA,YACJ,WAAW;AAAA,YACX,YAAY,KAAK;AAAA,YACjB,aAAa,UAAU;AAAA,UACzB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,IAAI,YAAY,UAAU,MAAM,wCAAwC;AAAA,MAChF,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA,EAEH,KACG,QAAQ,cAAc,EACtB,YAAY,sEAAsE,EAClF,OAAO,YAAY;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,YAAY,MAAM,MAAM,IAAI,YAAY;AAAA,MAC9C,IAAI,CAAC,WAAW;AAAA,QACd,MAAM,IAAI,MACR,uFACF;AAAA,MACF;AAAA,MAEA,WAAW,QAAQ,UAAU,OAAO;AAAA,QAClC,MAAM,gBAAgB;AAAA,UACpB,eAAe,MAAM,IAAI,aAAa,KAAK,GAAG;AAAA,UAC9C,gBAAgB,KAAK;AAAA,UACrB,MAAM;AAAA,YACJ,WAAW;AAAA,YACX,YAAY,KAAK;AAAA,YACjB,aAAa,UAAU;AAAA,UACzB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,IAAI,YAAY,UAAU,MAAM,uCAAuC;AAAA,MAC/E,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA,EAEH,KACG,QAAQ,gBAAgB,EACxB,YAAY,6DAA6D,EACzE,OAAO,YAAY;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,YAAY,MAAM,MAAM,IAAI,cAAc;AAAA,MAChD,IAAI,CAAC,WAAW;AAAA,QACd,MAAM,IAAI,MACR,2FACF;AAAA,MACF;AAAA,MAEA,WAAW,QAAQ,UAAU,OAAO;AAAA,QAClC,MAAM,gBAAgB;AAAA,UACpB,eAAe,MAAM,IAAI,aAAa,KAAK,GAAG;AAAA,UAC9C,gBAAgB,KAAK;AAAA,UACrB,MAAM;AAAA,YACJ,WAAW;AAAA,YACX,YAAY,KAAK;AAAA,YACjB,aAAa,UAAU;AAAA,UACzB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,IAAI,YAAY,UAAU,MAAM,yCAAyC;AAAA,MACjF,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA,EAEH,KACG,QAAQ,YAAY,EACpB,YAAY,iFAAiF,EAC7F,OAAO,YAAY;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,YAAY,MAAM,IAAI,SAAS,QAAQ,KAAK,EAAE,KAAK;AAAA,MACzD,IAAI,CAAC,UAAU,KAAK,GAAG;AAAA,QACrB,MAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AAAA,MACA,MAAM,SAAS,MAAM,IAAI,UAAU,SAAS;AAAA,MAC5C,MAAM,gBAAgB;AAAA,QACpB,eAAe,MAAM,IAAI,aAAa,OAAO,aAAa;AAAA,QAC1D,MAAM;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,aAAa,OAAO;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,MACD,QAAQ,IAAI,uBAAuB,MAAM,IAAI,aAAa,OAAO,aAAa,IAAI;AAAA,MAClF,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA,EAEH,KACG,QAAQ,gBAAgB,EACxB,YACC,6FACF,EACC,OAAO,YAAY;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,YAAY,MAAM,MAAM,IAAI,cAAc;AAAA,MAChD,MAAM,iBACJ,UAAU,MAAM,IAAI,CAAC,UAAU;AAAA,QAC7B,eAAe,MAAM,IAAI,aAAa,KAAK,GAAG;AAAA,QAC9C,gBAAgB,KAAK;AAAA,QACrB,MAAM;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,KAAK;AAAA,UACjB,aAAa,UAAU;AAAA,QACzB;AAAA,MACF,EAAE,CACJ;AAAA,MACA,MAAM,UAAU;AAAA,QACd,UAAU,UAAU,MAAM;AAAA,QAC1B,QAAQ,UAAU;AAAA,QAClB,YAAY,UAAU,MAAM,IAAI,CAAC,OAAO;AAAA,UACtC,eAAe,MAAM,IAAI,aAAa,EAAE,GAAG;AAAA,UAC3C,gBAAgB,EAAE;AAAA,QACpB,EAAE;AAAA,MACJ;AAAA,MACA,QAAQ,IAAI,KAAK,UAAU,WAAW,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,MACxD,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA,EAEH,KACG,QAAQ,KAAK,EACb,YAAY,uDAAuD,EACnE,eAAe,yBAAyB,6CAA6C,EACrF,OAAO,mBAAmB,kCAAkC,EAC5D,OAAO,kBAAkB,0BAA0B,EACnD,OAAO,mBAAmB,6BAA6B,EACvD,OAAO,UAAU,SAAS;AAAA,IACzB,OAAO,WAAW;AAAA,IAGlB,IAAI;AAAA,MACF,MAAM,eAAe,MAAM,IAAI,aAAa,QAAQ,YAAY;AAAA,MAChE,IAAI,QAAQ,OAAO;AAAA,QACjB,MAAM,gBAAgB;AAAA,UACpB,eAAe;AAAA,UACf,MAAM,EAAE,WAAW,YAAY,OAAO,QAAQ,MAAM;AAAA,QACtD,CAAC;AAAA,QACD,QAAQ,IAAI,uBAAuB;AAAA,QACnC;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,QAAQ,QAAQ,MAAM;AAAA,QAChC,MAAM,gBAAgB;AAAA,UACpB,eAAe;AAAA,UACf,MAAM;AAAA,YACJ,WAAW;AAAA,YACX,YAAY,QAAQ;AAAA,YACpB,aAAa,QAAQ;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,QACD,QAAQ,IAAI,uBAAuB;AAAA,QACnC;AAAA,MACF;AAAA,MACA,MAAM,IAAI,MAAM,kDAAkD;AAAA,MAClE,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA,EAEH,KACG,QAAQ,aAAa,EACrB,YAAY,+BAA+B,EAC3C,SAAS,mBAAmB,6CAA6C,EACzE,OAAO,UAAU,SAAS;AAAA,IACzB,OAAO,gBAAgB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,oBAAoB,YAAY;AAAA,MACtC,QAAQ,IAAI,4BAA4B;AAAA,MACxC,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA,EAEH,KACG,QAAQ,QAAQ,EAChB,YAAY,sCAAsC,EAClD,SAAS,mBAAmB,6CAA6C,EACzE,OAAO,UAAU,SAAS;AAAA,IACzB,OAAO,gBAAgB;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,gBAAgB,YAAY;AAAA,MAClC,QAAQ,IAAI,oBAAoB;AAAA,MAChC,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA;;;ACpSL,kBAAS,qBAAO;AAChB,2BAAmB;AAEnB,uBAAS;AAGT,eAAsB,iBAAiB,CAAC,OAMpB;AAAA,EAClB,QAAQ,MAAM,KAAK,SAAS,eAAe,YAAY;AAAA,EACvD,MAAM,SAAS,QAAQ,OAAO;AAAA,EAC9B,MAAM,OAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC,MAAM,OAAO,iBAAiB,iBAAiB,SAAS,IAAI,IAAI,GAAG,EAAE,QAAQ,KAAK,MAAM;AAAA,EACxF,MAAM,OAAO,MAAK,QAAQ,IAAI;AAAA,EAE9B,IAAI,YAAW,IAAI,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAkC,CAAC;AAAA,EACzC,IAAI,KAAK,cAAc,YAAY;AAAA,IACjC,QAAQ,gBAAgB,UAAU,KAAK;AAAA,EACzC,EAAO;AAAA,IACL,QAAQ,gBAAgB,UAAU,KAAK;AAAA,IACvC,QAAQ,SAAS,KAAK,mBAAmB,KAAK,WAAW;AAAA,IACzD,QAAQ,UAAU;AAAA,IAClB,QAAQ,gBAAgB,aAAa;AAAA;AAAA,EAGvC,MAAM,OAAO,MAAM,MAAM,KAAK,EAAE,QAAQ,CAAC;AAAA,EACzC,IAAI,CAAC,KAAK,IAAI;AAAA,IACZ,MAAM,IAAI,MAAM,4BAA4B,KAAK,SAAS;AAAA,EAC5D;AAAA,EACA,MAAM,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK;AAAA,EACxD,IAAI,CAAC,SAAS,aAAa,YAAY,SAAS,WAAW,GAAG;AAAA,IAC5D,MAAM,OAAO,MAAM,KAAK,KAAK;AAAA,IAC7B,MAAM,IAAI,MACR,sEAAsE,KAAK,UACzE,KAAK,MAAM,GAAG,GAAG,CACnB,GACF;AAAA,EACF;AAAA,EACA,MAAM,MAAM,OAAO,KAAK,MAAM,KAAK,YAAY,CAAC;AAAA,EAChD,MAAM,WAAU,MAAM,GAAG;AAAA,EACzB,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,MAAsB;AAAA,EAC9C,OAAO,KAAK,QAAQ,iBAAiB,GAAG;AAAA;;;ACpD1C;AACA;AAEO,SAAS,cAAc,CAAC,MAAsB;AAAA,EACnD,MAAM,UAAU,IAAI,gBAAgB;AAAA,IAClC,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,aAAa;AAAA,EACf,CAAC;AAAA,EAED,QAAQ,IAAI,GAAG;AAAA,EAGf,QAAQ,QAAQ,MAAM;AAAA,IACpB,QAAQ;AAAA,IACR,aAAa,MAAM;AAAA;AAAA,EACrB,CAAC;AAAA,EAID,MAAM,YACJ,WAAW,MAAM,MAAM,KAAK,WAAW,MAAM,SAAS,KAAK,WAAW,MAAM,MAAM,KAAK;AAAA,EAEzF,OAAO,QAAQ,SAAS,SAAS;AAAA;AAGnC,SAAS,UAAU,CAAC,MAAc,KAA4B;AAAA,EAC5D,MAAM,KAAK,IAAI,OAAO,IAAI,+BAA+B,QAAQ,GAAG;AAAA,EACpE,MAAM,IAAI,KAAK,MAAM,EAAE;AAAA,EACvB,OAAO,IAAI,EAAE,KAAM;AAAA;;;AC9BrB,iBAAS,kBAAM;AACf,kBAAS;;;ACDT,oBAAS,oBAAS;AAClB,iBAAS;AAEF,SAAS,SAAS,GAAW;AAAA,EAClC,MAAM,MAAM,QAAQ,IAAI,iBAAiB,KAAK;AAAA,EAC9C,IAAI,KAAK;AAAA,IACP,OAAO,MAAK,KAAK,aAAa;AAAA,EAChC;AAAA,EAEA,MAAM,OAAO,SAAQ;AAAA,EACrB,IAAI,MAAM;AAAA,IACR,OAAO,MAAK,MAAM,cAAc;AAAA,EAClC;AAAA,EAEA,OAAO,MAAK,QAAO,GAAG,aAAa;AAAA;;;ADV9B,SAAS,eAAe,GAAW;AAAA,EACxC,OAAO,SAAQ,MAAK,UAAU,GAAG,OAAO,WAAW,CAAC;AAAA;AAGtD,eAAsB,kBAAkB,GAAoB;AAAA,EAC1D,MAAM,MAAM,gBAAgB;AAAA,EAC5B,MAAM,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC,OAAO;AAAA;;;AENT,qBAAS;AASF,SAAS,mBAAmB,CAAC,OAA+B;AAAA,EACjE,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,IAAI,IAAI,KAAK;AAAA,IACnB,MAAM;AAAA,IACN,MAAM,IAAI,MAAM,gBAAgB,OAAO;AAAA;AAAA,EAGzC,IAAI,CAAC,iBAAiB,KAAK,IAAI,QAAQ,GAAG;AAAA,IACxC,MAAM,IAAI,MAAM,8BAA8B,IAAI,UAAU;AAAA,EAC9D;AAAA,EAIA,MAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,EACpD,IAAI,MAAM,OAAO,QAAQ;AAAA,IACvB,MAAM,IAAI,MAAM,sCAAsC,IAAI,UAAU;AAAA,EACtE;AAAA,EAEA,MAAM,YAAY,MAAM,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,CAAC;AAAA,EAC7D,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,MAAM,gCAAgC,IAAI,UAAU;AAAA,EAChE;AAAA,EAEA,MAAM,gBAAgB,GAAG,IAAI,aAAa,IAAI;AAAA,EAC9C,OAAO,EAAE,eAAe,WAAW,KAAK,MAAM;AAAA;AAGhD,eAAsB,mBAAmB,CACvC,QACA,OAMuE;AAAA,EACvE,MAAM,OAAO,MAAM,OAAO,IAAI,cAAc,EAAE,MAAM,MAAM,SAAS,CAAC;AAAA,EACpE,MAAM,OAAO,UAAS,KAAK,IAAI,IAAI,KAAK,OAAO;AAAA,EAC/C,IAAI,CAAC,MAAM;AAAA,IACT,MAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAAA,EAEA,MAAM,SAAS,UAAU,KAAK,KAAK,KAAK,UAAU,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK;AAAA,EAC9E,MAAM,cAAc,UAAU,KAAK,oBAAoB,KAAK,UAAU,KAAK,WAAW;AAAA,EACtF,IAAI,CAAC,aAAa;AAAA,IAChB,MAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAAA,EAEA,IAAI,OAAO;AAAA,EACX,IAAI,MAAM,SAAS,gBAAgB,MAAM;AAAA,IACvC,MAAM,WAAW,MAAM,kBAAkB;AAAA,MACvC,MAAM,MAAM;AAAA,MACZ,KAAK;AAAA,MAKL,SAAS,MAAM,mBAAmB;AAAA,MAClC,eAAe,GAAG,MAAM;AAAA,MACxB,SAAS,EAAE,WAAW,KAAK;AAAA,IAC7B,CAAC;AAAA,IACD,OAAO,MAAM,UAAS,UAAU,MAAM;AAAA,EACxC,EAAO;AAAA,IACL,MAAM,UAAkC,CAAC;AAAA,IACzC,IAAI,MAAM,KAAK,cAAc,YAAY;AAAA,MACvC,QAAQ,gBAAgB,UAAU,MAAM,KAAK;AAAA,IAC/C,EAAO;AAAA,MACL,QAAQ,gBAAgB,UAAU,MAAM,KAAK;AAAA,MAC7C,QAAQ,SAAS,KAAK,mBAAmB,MAAM,KAAK,WAAW;AAAA,MAC/D,QAAQ,UAAU;AAAA,MAClB,QAAQ,gBAAgB,aAAa;AAAA;AAAA,IAEvC,MAAM,OAAO,MAAM,MAAM,aAAa,EAAE,QAAQ,CAAC;AAAA,IACjD,IAAI,CAAC,KAAK,IAAI;AAAA,MACZ,MAAM,IAAI,MAAM,mCAAmC,KAAK,SAAS;AAAA,IACnE;AAAA,IACA,OAAO,MAAM,KAAK,KAAK;AAAA;AAAA,EAGzB,MAAM,cAAc,eAAe,IAAI,EAAE,KAAK;AAAA,EAC9C,MAAM,WAAW,MAAM,SAAS,YAAY;AAAA,EAC5C,MAAM,WACJ,YAAY,KAAK,YAAY,SAAS,WAClC,GAAG,YAAY,MAAM,GAAG,QAAQ;AAAA,KAChC;AAAA,EAEN,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,IAAI,MAAM;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;;;ACtGK,SAAS,qBAAqB,CAAC,OAAoD;AAAA,EACxF,MAAM,YAAY,MAAM,QAAQ,QAAQ,QAAQ,EAAE,YAAY,0BAA0B;AAAA,EAExF,UACG,QAAQ,KAAK,EACb,YAAY,iDAAiD,EAC7D,SAAS,YAAY,kDAAiD,EACtE,OACC,qBACA,+GACF,EACC,OACC,mBACA,wEACA,OACF,EACC,OAAO,UAAU,SAAS;AAAA,IACzB,OAAO,OAAO,WAAW;AAAA,IACzB,IAAI;AAAA,MACF,IAAI;AAAA,MACJ,IAAI;AAAA,MAEJ,IAAI;AAAA,QACF,MAAM,MAAM,oBAAoB,KAAK;AAAA,QACrC,eAAe,IAAI;AAAA,QACnB,WAAW,IAAI;AAAA,QACf,MAAM;AAAA,QACN,MAAM,UAAU,OAAO,KAAK,EAAE,KAAK;AAAA,QACnC,IAAI,CAAC,kBAAkB,KAAK,OAAO,GAAG;AAAA,UACpC,MAAM,IAAI,MACR,6BAA6B,mDAC/B;AAAA,QACF;AAAA,QACA,WAAW;AAAA,QACX,eAAe,QAAQ,WAAW,KAAK,KAAK;AAAA;AAAA,MAG9C,MAAM,UAAU,MAAM,MAAM,IAAI,gBAAgB;AAAA,QAC9C;AAAA,QACA,MAAM,YAAY;AAAA,UAChB,QAAQ,QAAQ,MAAM,kBACpB,MAAM,MAAM,IAAI,sBAAsB,YAAY;AAAA,UACpD,MAAM,WAAW,OAAO,SAAS,QAAQ,UAAU,EAAE;AAAA,UACrD,OAAO,MAAM,oBAAoB,QAAQ;AAAA,YACvC;AAAA,YACA,cAAc,iBAAiB,gBAAgB;AAAA,YAC/C;AAAA,YACA,SAAS,EAAE,SAAS;AAAA,UACtB,CAAC;AAAA;AAAA,MAEL,CAAC;AAAA,MAED,QAAQ,IAAI,KAAK,UAAU,WAAW,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,MACxD,OAAO,KAAc;AAAA,MACrB,QAAQ,MAAM,MAAM,IAAI,aAAa,GAAG,CAAC;AAAA,MACzC,QAAQ,WAAW;AAAA;AAAA,GAEtB;AAAA;;;AC9DL;AAEO,SAAS,6BAA6B,CAAC,MAAsB;AAAA,EAClE,IAAI,CAAC,MAAM;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EAGA,OAAa,cAAQ,IAAI;AAAA;AAGpB,SAAS,0BAA0B,CAAC,OAAuB;AAAA,EAChE,MAAM,UAAU,OAAO,SAAS,EAAE,EAAE,KAAK;AAAA,EACzC,IAAI,CAAC,SAAS;AAAA,IACZ,MAAM,IAAI,MAAM,gBAAgB;AAAA,EAClC;AAAA,EAGA,MAAM,iBAAiB,QAAQ,MAAM,eAAe;AAAA,EACpD,IAAI,gBAAgB;AAAA,IAClB,OAAO,eAAe;AAAA,EACxB;AAAA,EAGA,IAAI,oBAAoB,KAAK,OAAO,GAAG;AAAA,IACrC,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,eAAqB,YAAM,OAAO;AAAA,EACxC,IAAI,cAAc;AAAA,IAChB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,MACR,6BAA6B,KAAK,UAAU,KAAK,kCACnD;AAAA;;;AClCK,SAAS,qBAAqB,CAAC,MAAsB;AAAA,EAC1D,IAAI,CAAC,MAAM;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,MAAM,KAAK,QAAQ,qCAAqC,UAAU;AAAA,EACtE,MAAM,IAAI,QAAQ,2BAA2B,IAAI;AAAA,EAGjD,MAAM,IAAI,QAAQ,0BAA0B,KAAK;AAAA,EAGjD,MAAM,IAAI,QAAQ,4BAA4B,KAAK;AAAA,EACnD,MAAM,IAAI,QAAQ,mBAAmB,KAAK;AAAA,EAG1C,MAAM,IAAI,QAAQ,mBAAmB,KAAK;AAAA,EAG1C,MAAM,IAAI,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,GAAG,EAAE,QAAQ,UAAU,GAAG;AAAA,EAG3E,MAAM,8BAA8B,GAAG;AAAA,EAEvC,OAAO;AAAA;;;ACvBT,IAAM,uBAAuB;AAEtB,SAAS,yBAAyB,CAAC,KAAsB;AAAA,EAC9D,MAAM,SAAS,UAAS,GAAG,IAAI,MAAM,CAAC;AAAA,EACtC,MAAM,cAAc,wBAAwB,OAAO,MAAM;AAAA,EACzD,MAAM,mBAAmB,6BAA6B,OAAO,aAAa;AAAA,IACxE,OAAO;AAAA,IACP,MAAM,IAAI;AAAA,EACZ,CAAC;AAAA,EACD,MAAM,WAAW,CAAC,YAAY,KAAK,GAAG,iBAAiB,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK;AAAA;AAAA,CAAM;AAAA,EAC1F,IAAI,UAAU;AAAA,IACZ,OAAO,sBAAsB,QAAQ,EAAE,KAAK;AAAA,EAC9C;AAAA,EAEA,MAAM,OAAO,WAAU,OAAO,IAAI,EAAE,KAAK;AAAA,EACzC,IAAI,MAAM;AAAA,IACR,OAAO,sBAAsB,IAAI,EAAE,KAAK;AAAA,EAC1C;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,uBAAuB,CAAC,QAAyB;AAAA,EACxD,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAAA,IAC1B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAgB,CAAC;AAAA,EACvB,WAAW,KAAK,QAAQ;AAAA,IACtB,IAAI,CAAC,UAAS,CAAC,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,WAAU,EAAE,IAAI;AAAA,IAC7B,IAAI,SAAS,WAAW;AAAA,MACtB,MAAM,OAAO,UAAS,EAAE,IAAI,IAAI,EAAE,OAAO;AAAA,MACzC,MAAM,WAAW,OAAO,WAAU,KAAK,IAAI,IAAI;AAAA,MAC/C,IAAI,aAAa,YAAY,aAAa,cAAc;AAAA,QACtD,IAAI,KAAK,WAAU,MAAM,IAAI,CAAC;AAAA,MAChC;AAAA,MACA,IAAI,MAAM,QAAQ,EAAE,MAAM,GAAG;AAAA,QAC3B,WAAW,KAAK,EAAE,QAAQ;AAAA,UACxB,IAAI,CAAC,UAAS,CAAC,GAAG;AAAA,YAChB;AAAA,UACF;AAAA,UACA,MAAM,YAAY,WAAU,EAAE,IAAI;AAAA,UAClC,IAAI,cAAc,YAAY,cAAc,cAAc;AAAA,YACxD,IAAI,KAAK,WAAU,EAAE,IAAI,CAAC;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,UAAS,EAAE,SAAS,IAAI,EAAE,YAAY;AAAA,MACxD,IAAI,WAAU,WAAW,IAAI,MAAM,UAAU;AAAA,QAC3C,MAAM,QAAQ,WAAW,WAAW,MAAoC,IAAI;AAAA,QAC5E,MAAM,MAAM,WAAU,WAAW,GAAG;AAAA,QACpC,IAAI,KAAK;AAAA,UACP,IAAI,KAAK,QAAQ,GAAG,UAAU,QAAQ,GAAG;AAAA,QAC3C;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,SAAS,aAAa,MAAM,QAAQ,EAAE,QAAQ,GAAG;AAAA,MACnD,WAAW,MAAM,EAAE,UAAU;AAAA,QAC3B,IAAI,CAAC,UAAS,EAAE,GAAG;AAAA,UACjB;AAAA,QACF;AAAA,QACA,IAAI,WAAU,GAAG,IAAI,MAAM,UAAU;AAAA,UACnC,MAAM,QAAQ,WAAW,GAAG,MAAoC,IAAI;AAAA,UACpE,MAAM,MAAM,WAAU,GAAG,GAAG;AAAA,UAC5B,IAAI,KAAK;AAAA,YACP,IAAI,KAAK,QAAQ,GAAG,UAAU,QAAQ,GAAG;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,SAAS,aAAa,MAAM,QAAQ,EAAE,QAAQ,GAAG;AAAA,MACnD,WAAW,MAAM,EAAE,UAAU;AAAA,QAC3B,IAAI,CAAC,UAAS,EAAE,GAAG;AAAA,UACjB;AAAA,QACF;AAAA,QACA,MAAM,SAAS,WAAU,GAAG,IAAI;AAAA,QAChC,IAAI,WAAW,UAAU;AAAA,UACvB,IAAI,KAAK,WAAU,GAAG,IAAI,CAAC;AAAA,QAC7B;AAAA,QACA,IAAI,WAAW,cAAc;AAAA,UAC3B,IAAI,KAAK,WAAU,GAAG,IAAI,CAAC;AAAA,QAC7B;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,SAAS,SAAS;AAAA,MACpB,MAAM,MAAM,WAAU,EAAE,QAAQ;AAAA,MAChC,MAAM,MAAM,WAAU,EAAE,SAAS;AAAA,MACjC,IAAI,KAAK;AAAA,QACP,IAAI,KAAK,MAAM,GAAG,QAAQ,QAAQ,GAAG;AAAA,MACvC;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,SAAS,aAAa;AAAA,MACxB,MAAM,OAAO,+BAA+B,CAAC;AAAA,MAC7C,IAAI,KAAK,KAAK,GAAG;AAAA,QACf,IAAI,KAAK,IAAI;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,IAAI,KAAK;AAAA;AAAA,CAAM;AAAA;AAGxB,SAAS,8BAA8B,CAAC,OAAwB;AAAA,EAC9D,IAAI,CAAC,UAAS,KAAK,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC;AAAA,EACnE,MAAM,MAAgB,CAAC;AAAA,EACvB,WAAW,MAAM,UAAU;AAAA,IACzB,MAAM,MAAM,iCAAiC,EAAE;AAAA,IAC/C,IAAI,IAAI,KAAK,GAAG;AAAA,MACd,IAAI,KAAK,GAAG;AAAA,IACd;AAAA,EACF;AAAA,EACA,OAAO,IAAI,KAAK;AAAA;AAAA,CAAM;AAAA;AAGxB,SAAS,gCAAgC,CAAC,IAAqB;AAAA,EAC7D,IAAI,CAAC,UAAS,EAAE,GAAG;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,WAAU,GAAG,IAAI;AAAA,EAE3B,IAAI,MAAM,qBAAqB;AAAA,IAC7B,MAAM,QAAkB,CAAC;AAAA,IACzB,WAAW,SAAS,MAAM,QAAQ,GAAG,QAAQ,IAAI,GAAG,WAAW,CAAC,GAAG;AAAA,MACjE,MAAM,KAAK,iCAAiC,KAAK,CAAC;AAAA,IACpD;AAAA,IACA,OAAO,MAAM,KAAK,EAAE;AAAA,EACtB;AAAA,EAEA,IAAI,MAAM,0BAA0B;AAAA,IAClC,MAAM,QAAkB,CAAC;AAAA,IACzB,WAAW,SAAS,MAAM,QAAQ,GAAG,QAAQ,IAAI,GAAG,WAAW,CAAC,GAAG;AAAA,MACjE,MAAM,KAAK,iCAAiC,KAAK,CAAC;AAAA,IACpD;AAAA,IACA,MAAM,OAAO,MAAM,KAAK,EAAE;AAAA,IAC1B,OAAO,OAAO,SAAS,eAAe;AAAA,EACxC;AAAA,EAEA,IAAI,MAAM,mBAAmB;AAAA,IAC3B,MAAM,QAAkB,CAAC;AAAA,IACzB,WAAW,SAAS,MAAM,QAAQ,GAAG,QAAQ,IAAI,GAAG,WAAW,CAAC,GAAG;AAAA,MACjE,MAAM,KAAK,iCAAiC,KAAK,CAAC;AAAA,IACpD;AAAA,IACA,MAAM,OAAO,MAAM,KAAK,EAAE,EAAE,KAAK;AAAA,IACjC,IAAI,CAAC,MAAM;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,OAAO,KACJ,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,SAAS,KAAK,MAAM,EACzB,KAAK;AAAA,CAAI;AAAA,EACd;AAAA,EAEA,IAAI,MAAM,kBAAkB;AAAA,IAC1B,MAAM,QAAQ,OAAO,GAAG,UAAU,WAAW,GAAG,QAAQ;AAAA,IACxD,MAAM,QAAkB,CAAC;AAAA,IACzB,MAAM,UAAU,MAAM,QAAQ,GAAG,QAAQ,IAAI,GAAG,WAAW,CAAC;AAAA,IAC5D,SAAS,MAAM,EAAG,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAC7C,MAAM,OAAO,QAAQ;AAAA,MACrB,MAAM,MAAM,iCAAiC,IAAI,EAAE,KAAK;AAAA,MACxD,IAAI,CAAC,KAAK;AAAA,QACR;AAAA,MACF;AAAA,MACA,MAAM,SAAS,UAAU,YAAY,GAAG,MAAM,QAAQ;AAAA,MACtD,MAAM,KAAK,GAAG,SAAS,KAAK;AAAA,IAC9B;AAAA,IACA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA,EACxB;AAAA,EAEA,IAAI,MAAM,QAAQ;AAAA,IAChB,MAAM,MAAM,WAAU,GAAG,IAAI;AAAA,IAC7B,MAAM,QAAQ,UAAS,GAAG,KAAK,IAAI,GAAG,QAAQ;AAAA,IAC9C,IAAI,CAAC,OAAO;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAO;AAAA,IACX,IAAI,MAAM,MAAM;AAAA,MACd,OAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,MAAM,MAAM;AAAA,MACd,OAAO,IAAI;AAAA,IACb;AAAA,IACA,IAAI,MAAM,QAAQ;AAAA,MAChB,OAAO,IAAI;AAAA,IACb;AAAA,IACA,IAAI,MAAM,QAAQ;AAAA,MAChB,OAAO,IAAI;AAAA,IACb;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAM,QAAQ;AAAA,IAChB,MAAM,MAAM,WAAU,GAAG,GAAG;AAAA,IAC5B,MAAM,OAAO,WAAU,GAAG,IAAI;AAAA,IAC9B,IAAI,CAAC,KAAK;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAO,IAAI,OAAO,UAAU;AAAA,EACrC;AAAA,EAEA,IAAI,MAAM,SAAS;AAAA,IACjB,MAAM,OAAO,WAAU,GAAG,IAAI;AAAA,IAC9B,OAAO,OAAO,IAAI,UAAU;AAAA,EAC9B;AAAA,EAEA,IAAI,MAAM,QAAQ;AAAA,IAChB,MAAM,SAAS,WAAU,GAAG,OAAO;AAAA,IACnC,OAAO,SAAS,KAAK,YAAY;AAAA,EACnC;AAAA,EAEA,IAAI,MAAM,WAAW;AAAA,IACnB,MAAM,YAAY,WAAU,GAAG,UAAU;AAAA,IACzC,OAAO,YAAY,KAAK,eAAe;AAAA,EACzC;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,4BAA4B,CAAC,aAAsB,OAA4B;AAAA,EACtF,IAAI,MAAM,SAAS,sBAAsB;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAkB,CAAC;AAAA,EACzB,WAAW,KAAK,aAAa;AAAA,IAC3B,IAAI,CAAC,UAAS,CAAC,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,IACA,IAAI,MAAM,KAAK,IAAI,CAAC,GAAG;AAAA,MACrB;AAAA,IACF;AAAA,IACA,MAAM,KAAK,IAAI,CAAC;AAAA,IAEhB,MAAM,kBAAkB,QACtB,EAAE,YAAa,EAAE,iBAAiB,MAAM,QAAQ,EAAE,cAAc,CAClE;AAAA,IAEA,MAAM,QAAkB,CAAC;AAAA,IAEzB,IAAI,iBAAiB;AAAA,MACnB,MAAM,KAAK,oBAAoB,CAAC,CAAC;AAAA,MAEjC,MAAM,OACJ,4BAA4B,GAAG,KAAK,EAAE,KAAK,KAC3C,6BAA6B,EAAE,aAAa,UAAU,KAAK,CAAC,EAAE,KAAK,KACnE,WAAU,EAAE,IAAI,EAAE,KAAK;AAAA,MACzB,IAAI,MAAM;AAAA,QACR,MAAM,KAAK,cAAc,IAAI,CAAC;AAAA,MAChC;AAAA,MAEA,IAAI,MAAM,SAAS,GAAG;AAAA,QACpB,MAAM,KAAK,MAAM,KAAK;AAAA,CAAI,CAAC;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,wBAAwB,EAAE,MAAM;AAAA,IAC/C,IAAI,OAAO,KAAK,GAAG;AAAA,MACjB,MAAM,KAAK,MAAM;AAAA,IACnB;AAAA,IACA,MAAM,UAAU,WAAU,EAAE,OAAO;AAAA,IACnC,IAAI,SAAS;AAAA,MACX,MAAM,KAAK,OAAO;AAAA,IACpB;AAAA,IACA,MAAM,QAAQ,WAAU,EAAE,KAAK;AAAA,IAC/B,MAAM,YAAY,WAAU,EAAE,UAAU;AAAA,IACxC,IAAI,aAAa,OAAO;AAAA,MACtB,MAAM,KAAK,IAAI,aAAa,QAAQ;AAAA,IACtC,EAAO,SAAI,OAAO;AAAA,MAChB,MAAM,KAAK,KAAK;AAAA,IAClB,EAAO,SAAI,WAAW;AAAA,MACpB,MAAM,KAAK,SAAS;AAAA,IACtB;AAAA,IACA,MAAM,OAAO,WAAU,EAAE,IAAI;AAAA,IAC7B,IAAI,MAAM;AAAA,MACR,MAAM,KAAK,IAAI;AAAA,IACjB;AAAA,IACA,IAAI,MAAM,QAAQ,EAAE,MAAM,GAAG;AAAA,MAC3B,WAAW,KAAK,EAAE,QAAQ;AAAA,QACxB,IAAI,CAAC,UAAS,CAAC,GAAG;AAAA,UAChB;AAAA,QACF;AAAA,QACA,MAAM,aAAa,WAAU,EAAE,KAAK;AAAA,QACpC,MAAM,QAAQ,WAAU,EAAE,KAAK;AAAA,QAC/B,IAAI,cAAc,OAAO;AAAA,UACvB,MAAM,KAAK,GAAG;AAAA,EAAe,OAAO;AAAA,QACtC,EAAO,SAAI,YAAY;AAAA,UACrB,MAAM,KAAK,UAAU;AAAA,QACvB,EAAO,SAAI,OAAO;AAAA,UAChB,MAAM,KAAK,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,WAAW,WAAU,EAAE,QAAQ;AAAA,IACrC,IAAI,MAAM,WAAW,KAAK,UAAU;AAAA,MAClC,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,IACA,MAAM,oBAAoB,6BAA6B,EAAE,aAAa,UAAU,KAAK,CAAC;AAAA,IACtF,IAAI,kBAAkB,KAAK,GAAG;AAAA,MAC5B,MAAM,KAAK,iBAAiB;AAAA,IAC9B;AAAA,IACA,IAAI,MAAM,SAAS,GAAG;AAAA,MACpB,MAAM,KAAK,YAAY,KAAK,EAAE,KAAK;AAAA,CAAI,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,OAAO,YAAY,KAAK,EAAE,KAAK;AAAA;AAAA,CAAM;AAAA;AAGvC,SAAS,mBAAmB,CAAC,GAAoC;AAAA,EAC/D,MAAM,aAAa,WAAU,EAAE,WAAW;AAAA,EAC1C,MAAM,aAAa,WAAU,EAAE,WAAW;AAAA,EAC1C,MAAM,UAAU,WAAU,EAAE,QAAQ;AAAA,EAEpC,MAAM,aAAa,cAAc,aAAa,IAAI,cAAc,gBAAgB,cAAc;AAAA,EAC9F,MAAM,aAAa,UAAU,IAAI,sBAAsB;AAAA,EAEvD,IAAI,cAAc,YAAY;AAAA,IAC5B,OAAO,mBAAmB,gBAAgB;AAAA,EAC5C;AAAA,EACA,IAAI,YAAY;AAAA,IACd,OAAO,mBAAmB;AAAA,EAC5B;AAAA,EACA,IAAI,YAAY;AAAA,IACd,OAAO,wBAAwB;AAAA,EACjC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,2BAA2B,CAClC,YACA,OACQ;AAAA,EACR,MAAM,gBAAgB,WAAW;AAAA,EACjC,MAAM,gBAAgB,oBAAoB,WAAW,KAAK,EAAE,KAAK;AAAA,EACjE,IAAI,CAAC,MAAM,QAAQ,aAAa,GAAG;AAAA,IACjC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAgB,CAAC;AAAA,EACvB,WAAW,MAAM,eAAe;AAAA,IAC9B,IAAI,CAAC,UAAS,EAAE,GAAG;AAAA,MACjB;AAAA,IACF;AAAA,IACA,MAAM,UAAU,UAAS,GAAG,OAAO,IAAI,GAAG,UAAU;AAAA,IACpD,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IACA,MAAM,cAAc,WAAU,QAAQ,IAAI,EAAE,KAAK;AAAA,IACjD,MAAM,gBAAgB,wBAAwB,QAAQ,MAAM,EAAE,KAAK;AAAA,IACnE,MAAM,qBAAqB,6BACzB,QAAQ,aACR,UAAU,KAAK,CACjB,EAAE,KAAK;AAAA,IACP,MAAM,eAAe,oBAAoB,QAAQ,KAAK,EAAE,KAAK;AAAA,IAC7D,MAAM,UAAU,YAAY;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM;AAAA,IACd,IAAI,SAAS;AAAA,MACX,IAAI,KAAK,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EACA,OAAO,YAAY,CAAC,eAAe,GAAG,GAAG,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA;AAGvD,SAAS,SAAS,CAAC,OAAiC;AAAA,EAClD,OAAO,EAAE,OAAO,MAAM,QAAQ,GAAG,MAAM,MAAM,KAAK;AAAA;AAGpD,SAAS,aAAa,CAAC,MAAsB;AAAA,EAC3C,OAAO,KACJ,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,SAAS,KAAK,MAAM,EACzB,KAAK;AAAA,CAAI;AAAA;AAGd,SAAS,WAAW,CAAC,QAA4B;AAAA,EAC/C,MAAM,MAAgB,CAAC;AAAA,EACvB,MAAM,OAAO,IAAI;AAAA,EACjB,WAAW,SAAS,QAAQ;AAAA,IAC1B,MAAM,OAAO,MAAM,KAAK;AAAA,IACxB,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,KAAK,IAAI,IAAI;AAAA,IACb,IAAI,KAAK,IAAI;AAAA,EACf;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,mBAAmB,CAAC,OAAwB;AAAA,EACnD,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AAAA,IACzB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,QAAkB,CAAC;AAAA,EACzB,WAAW,KAAK,OAAO;AAAA,IACrB,IAAI,CAAC,UAAS,CAAC,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,WAAU,EAAE,KAAK,KAAK,WAAU,EAAE,IAAI,KAAK;AAAA,IACxD,MAAM,MACJ,WAAU,EAAE,SAAS,KAAK,WAAU,EAAE,oBAAoB,KAAK,WAAU,EAAE,WAAW;AAAA,IACxF,IAAI,KAAK;AAAA,MACP,MAAM,KAAK,IAAI,OAAO,OAAO;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,MAAM,KAAK,IAAI;AAAA,EACjB;AAAA,EACA,OAAO,YAAY,KAAK,EAAE,KAAK;AAAA,CAAI;AAAA;AAGrC,SAAS,SAAQ,CAAC,OAAkD;AAAA,EAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAAA;AAGhD,SAAS,UAAS,CAAC,OAAwB;AAAA,EACzC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA;;;AC/atC,SAAS,kBAAkB,CAAC,OAAyC;AAAA,EAC1E,IAAI,CAAC,UAAS,KAAK,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,UAAU,MAAM,EAAE;AAAA,EAC7B,IAAI,CAAC,IAAI;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA,MAAM,UAAU,MAAM,IAAI;AAAA,IAC1B,OAAO,UAAU,MAAM,KAAK;AAAA,IAC5B,UAAU,UAAU,MAAM,QAAQ;AAAA,IAClC,UAAU,UAAU,MAAM,QAAQ;AAAA,IAClC,MAAM,UAAU,MAAM,IAAI;AAAA,IAC1B,WAAW,UAAU,MAAM,SAAS;AAAA,IACpC,aAAa,UAAU,MAAM,WAAW;AAAA,IACxC,sBAAsB,UAAU,MAAM,oBAAoB;AAAA,IAC1D,MAAM,UAAU,MAAM,IAAI;AAAA,EAC5B;AAAA;AAGF,eAAsB,WAAW,CAC/B,QACA,OAC6B;AAAA,EAC7B,MAAM,MAA0B,CAAC;AAAA,EACjC,WAAW,KAAK,OAAO;AAAA,IACrB,IAAI,EAAE,SAAS,aAAa,CAAC,EAAE,sBAAsB;AAAA,MACnD,IAAI;AAAA,QACF,MAAM,OAAO,MAAM,OAAO,IAAI,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC;AAAA,QAC1D,MAAM,OAAO,UAAS,KAAK,IAAI,IAAI,KAAK,OAAO;AAAA,QAC/C,IAAI,KAAK;AAAA,aACJ;AAAA,UACH,MAAM,EAAE,QAAQ,UAAU,MAAM,IAAI;AAAA,UACpC,OAAO,EAAE,SAAS,UAAU,MAAM,KAAK;AAAA,UACvC,UAAU,EAAE,YAAY,UAAU,MAAM,QAAQ;AAAA,UAChD,UAAU,EAAE,YAAY,UAAU,MAAM,QAAQ;AAAA,UAChD,MAAM,EAAE,QAAQ,UAAU,MAAM,IAAI;AAAA,UACpC,WAAW,EAAE,aAAa,UAAU,MAAM,SAAS;AAAA,UACnD,aAAa,EAAE,eAAe,UAAU,MAAM,WAAW;AAAA,UACzD,sBAAsB,EAAE,wBAAwB,UAAU,MAAM,oBAAoB;AAAA,UACpF,SAAS;AAAA,YACP,SAAS,UAAU,MAAM,OAAO;AAAA,YAChC,UAAU,UAAU,MAAM,QAAQ;AAAA,UACpC;AAAA,QACF,CAAC;AAAA,QACD;AAAA,QACA,MAAM;AAAA,IAGV;AAAA,IACA,IAAI,KAAK,CAAC;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;;;ACKF,SAAS,gBAAgB,CAC9B,KACA,OAMqB;AAAA,EACrB,MAAM,eAAe,OAAO,gBAAgB;AAAA,EAC5C,MAAM,mBAAmB,OAAO,oBAAoB;AAAA,EAEpD,MAAM,WAAW,0BAA0B,GAAG;AAAA,EAC9C,MAAM,UACJ,gBAAgB,KAAK,SAAS,SAAS,eACnC,GAAG,SAAS,MAAM,GAAG,YAAY;AAAA,KACjC;AAAA,EAEN,MAAM,QAAQ,IAAI,OACd,IAAI,CAAC,MAAM;AAAA,IACX,MAAM,OAAO,OAAO,kBAAkB,EAAE;AAAA,IACxC,IAAI,CAAC,MAAM;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,UAAU,EAAE;AAAA,MACZ,MAAM,EAAE;AAAA,MACR;AAAA,IACF;AAAA,GACD,EACA,OAAO,CAAC,MAAkC,QAAQ,CAAC,CAAC;AAAA,EAEvD,OAAO;AAAA,IACL,YAAY,IAAI;AAAA,IAChB,IAAI,IAAI;AAAA,IACR,WAAW,IAAI,eAAe,IAAI,eAAe,KAAK,IAAI,IAAI,KAAK;AAAA,IACnE,QAAQ,IAAI,QAAQ,IAAI,SAAS,EAAE,SAAS,IAAI,MAAM,QAAQ,IAAI,OAAO,IAAI;AAAA,IAC7E,SAAS,UAAU,UAAU;AAAA,IAC7B,OAAO,SAAS,MAAM,SAAS,IAAI,QAAQ;AAAA,IAC3C,WAAW,mBAAmB,iBAAiB,IAAI,SAAS,IAAI;AAAA,IAChE,mBAAmB,wBAAwB,IAAI,WAAW;AAAA,EAC5D;AAAA;AAGF,SAAS,gBAAgB,CACvB,WACsE;AAAA,EACtE,IAAI,CAAC,MAAM,QAAQ,SAAS,KAAK,UAAU,WAAW,GAAG;AAAA,IACvD;AAAA,EACF;AAAA,EACA,MAAM,MAA2D,CAAC;AAAA,EAClE,WAAW,KAAK,WAAW;AAAA,IACzB,IAAI,CAAC,UAAS,CAAC,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,UAAU,EAAE,IAAI,GAAG,KAAK,KAAK;AAAA,IAC1C,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,MAAM,QAAQ,EAAE,KAAK,IAC/B,EAAE,MAAM,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,kBAAkB,KAAK,CAAC,CAAC,IACrE,CAAC;AAAA,IACL,MAAM,QAAQ,OAAO,EAAE,UAAU,YAAY,EAAE,UAAU,MAAM,SAAS,EAAE,QAAQ;AAAA,IAClF,IAAI,KAAK,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,EACjC;AAAA,EACA,OAAO,IAAI,SAAS,MAAM;AAAA;AAG5B,SAAS,uBAAuB,CAAC,aAOnB;AAAA,EACZ,IAAI,CAAC,MAAM,QAAQ,WAAW,KAAK,YAAY,WAAW,GAAG;AAAA,IAC3D;AAAA,EACF;AAAA,EACA,MAAM,MAKA,CAAC;AAAA,EACP,MAAM,OAAO,IAAI;AAAA,EACjB,WAAW,cAAc,aAAa;AAAA,IACpC,IAAI,CAAC,UAAS,UAAU,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,IACA,MAAM,UAAU,UAAU,WAAW,QAAQ,GAAG,KAAK;AAAA,IACrD,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IACA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,IAAI,IAAI,OAAO;AAAA,MACxB,MAAM;AAAA,MACN;AAAA;AAAA,IAEF,MAAM,WAAW,OAAO,aAAa,IAAI,WAAW,GAAG,KAAK;AAAA,IAC5D,IAAI,CAAC,YAAY,CAAC,kBAAkB,KAAK,QAAQ,GAAG;AAAA,MAClD;AAAA,IACF;AAAA,IACA,MAAM,YAAY,OAAO,aAAa,IAAI,KAAK,GAAG,KAAK;AAAA,IACvD,MAAM,aAAa,UAAU,WAAW,WAAW;AAAA,IACnD,MAAM,MAAM,GAAG,YAAY;AAAA,IAC3B,IAAI,KAAK,IAAI,GAAG,GAAG;AAAA,MACjB;AAAA,IACF;AAAA,IACA,KAAK,IAAI,GAAG;AAAA,IACZ,IAAI,KAAK;AAAA,MACP,KAAK;AAAA,MACL,WAAW;AAAA,MACX,YAAY,aAAa;AAAA,MACzB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EACA,OAAO,IAAI,SAAS,MAAM;AAAA;AAG5B,eAAsB,YAAY,CAChC,QACA,OAC8B;AAAA,EAC9B,MAAM,UAAU,MAAM,OAAO,IAAI,yBAAyB;AAAA,IACxD,SAAS,MAAM,IAAI;AAAA,IACnB,QAAQ,MAAM,IAAI;AAAA,IAClB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,sBAAsB,MAAM,mBAAmB,OAAO;AAAA,EACxD,CAAC;AAAA,EACD,MAAM,kBAAkB,QAAQ,QAAQ,QAAQ;AAAA,EAChD,IAAI,MAAM,gBAAgB,KACxB,CAAC,MAAoC,UAAS,CAAC,KAAK,UAAU,EAAE,EAAE,MAAM,MAAM,IAAI,UACpF;AAAA,EAIA,IAAI,CAAC,OAAO,MAAM,IAAI,gBAAgB;AAAA,IACpC,MAAM,MAAM,oBAAoB,QAAQ;AAAA,MACtC,WAAW,MAAM,IAAI;AAAA,MACrB,UAAU,MAAM,IAAI;AAAA,MACpB,UAAU,MAAM,IAAI;AAAA,MACpB,kBAAkB,MAAM;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAIA,IAAI,CAAC,KAAK;AAAA,IACR,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,OAAO,IAAI,yBAAyB;AAAA,QACzD,SAAS,MAAM,IAAI;AAAA,QACnB,IAAI,MAAM,IAAI;AAAA,QACd,OAAO;AAAA,QACP,sBAAsB,MAAM,mBAAmB,OAAO;AAAA,MACxD,CAAC;AAAA,MACD,OAAO,QAAQ,QAAQ,SAAS,QAAQ;AAAA,MACxC,IAAI,UAAS,IAAI,KAAK,UAAU,KAAK,EAAE,MAAM,MAAM,IAAI,YAAY;AAAA,QACjE,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,EAGV;AAAA,EAEA,IAAI,CAAC,KAAK;AAAA,IACR,MAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAAA,EAEA,MAAM,QAAQ,QAAQ,IAAI,KAAK,EAC5B,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC,EAChC,OAAO,CAAC,MAA6B,MAAM,IAAI;AAAA,EAClD,MAAM,gBAAgB,MAAM,SAAS,IAAI,MAAM,YAAY,QAAQ,KAAK,IAAI;AAAA,EAE5E,MAAM,OAAO,UAAU,IAAI,IAAI,KAAK;AAAA,EACpC,MAAM,KAAK,UAAU,IAAI,EAAE,KAAK,MAAM,IAAI;AAAA,EAC1C,MAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,IAAK,IAAI,SAAuB;AAAA,EACvE,MAAM,cAAc,MAAM,QAAQ,IAAI,WAAW,IAAK,IAAI,cAA4B;AAAA,EACtF,MAAM,YAAY,MAAM,QAAQ,IAAI,SAAS,IAAK,IAAI,YAA0B;AAAA,EAChF,OAAO;AAAA,IACL,YAAY,MAAM,IAAI;AAAA,IACtB;AAAA,IACA,WAAW,UAAU,IAAI,SAAS;AAAA,IAClC,aAAa,UAAU,IAAI,WAAW;AAAA,IACtC,MAAM,UAAU,IAAI,IAAI;AAAA,IACxB,QAAQ,UAAU,IAAI,MAAM;AAAA,IAC5B;AAAA,IACA,UAAU,sBAAsB,IAAI;AAAA,IACpC;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACF;AAAA;AAGF,eAAe,mBAAmB,CAChC,QACA,OAM8C;AAAA,EAC9C,IAAI;AAAA,EACJ,UAAS;AAAA,IACP,MAAM,OAAO,MAAM,OAAO,IAAI,yBAAyB;AAAA,MACrD,SAAS,MAAM;AAAA,MACf,IAAI,MAAM;AAAA,MACV,OAAO;AAAA,MACP;AAAA,MACA,sBAAsB,MAAM,mBAAmB,OAAO;AAAA,IACxD,CAAC;AAAA,IACD,MAAM,WAAW,QAAQ,KAAK,QAAQ;AAAA,IACtC,MAAM,QAAQ,SAAS,KACrB,CAAC,MAAoC,UAAS,CAAC,KAAK,UAAU,EAAE,EAAE,MAAM,MAAM,QAChF;AAAA,IACA,IAAI,OAAO;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,UAAS,KAAK,iBAAiB,IAAI,KAAK,oBAAoB;AAAA,IACzE,MAAM,OAAO,OAAO,UAAU,KAAK,WAAW,IAAI;AAAA,IAClD,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EACA;AAAA;AAGF,eAAsB,mBAAmB,CACvC,QACA,OASgC;AAAA,EAChC,MAAM,MAAM,MAAM,SAAS;AAAA,EAC3B,MAAM,QAAQ,OAAO,SAAS,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI;AAAA,EACvE,MAAM,MAA6B,CAAC;AAAA,EACpC,MAAM,gBAAgB,MAAM,iBAAiB,CAAC;AAAA,EAC9C,MAAM,mBAAmB,MAAM,oBAAoB,CAAC;AAAA,EACpD,MAAM,qBAAqB,cAAc,SAAS,KAAK,iBAAiB,SAAS;AAAA,EACjF,MAAM,YAAY,qBAAqB,MAAM;AAAA,EAE7C,IAAI,eAAe,MAAM;AAAA,EACzB,UAAS;AAAA,IACP,MAAM,OAAO,MAAM,OAAO,IAAI,yBAAyB;AAAA,MACrD,SAAS,MAAM;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,MAAM;AAAA,MACd,sBAAsB,MAAM,oBAAoB,qBAAqB,OAAO;AAAA,IAC9E,CAAC;AAAA,IACD,MAAM,WAAW,QAAQ,KAAK,QAAQ;AAAA,IACtC,IAAI,SAAS,WAAW,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,IACA,WAAW,KAAK,UAAU;AAAA,MACxB,IAAI,CAAC,UAAS,CAAC,GAAG;AAAA,QAChB;AAAA,MACF;AAAA,MACA,IACE,sBACA,CAAC,0BAA0B,GAAG;AAAA,QAC5B;AAAA,QACA;AAAA,MACF,CAAC,GACD;AAAA,QACA;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,QAAQ,EAAE,KAAK,EAC1B,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC,EAChC,OAAO,CAAC,MAA6B,MAAM,IAAI;AAAA,MAClD,MAAM,gBAAgB,MAAM,SAAS,IAAI,MAAM,YAAY,QAAQ,KAAK,IAAI;AAAA,MAE5E,MAAM,OAAO,UAAU,EAAE,IAAI,KAAK;AAAA,MAClC,IAAI,KAAK;AAAA,QACP,YAAY,MAAM;AAAA,QAClB,IAAI,UAAU,EAAE,EAAE,KAAK;AAAA,QACvB,WAAW,UAAU,EAAE,SAAS;AAAA,QAChC,aAAa,UAAU,EAAE,WAAW;AAAA,QACpC,MAAM,UAAU,EAAE,IAAI;AAAA,QACtB,QAAQ,UAAU,EAAE,MAAM;AAAA,QAC1B;AAAA,QACA,UAAU,sBAAsB,IAAI;AAAA,QACpC,QAAQ,MAAM,QAAQ,EAAE,MAAM,IAAK,EAAE,SAAuB;AAAA,QAC5D,aAAa,MAAM,QAAQ,EAAE,WAAW,IAAK,EAAE,cAA4B;AAAA,QAC3E,OAAO;AAAA,QACP,WAAW,MAAM,QAAQ,EAAE,SAAS,IAAK,EAAE,YAA0B;AAAA,MACvE,CAAC;AAAA,MACD,IAAI,IAAI,UAAU,OAAO;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,IAAI,UAAU,SAAS,CAAC,oBAAoB;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,SAAS,GAAG,EAAE;AAAA,IAC3B,MAAM,aAAa,UAAS,IAAI,IAAI,UAAU,KAAK,EAAE,IAAI;AAAA,IACzD,IAAI,CAAC,cAAc,eAAe,cAAc;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,eAAe;AAAA,EACjB;AAAA,EAGA,IAAI,KAAK,CAAC,GAAG,MAAM,OAAO,WAAW,EAAE,EAAE,IAAI,OAAO,WAAW,EAAE,EAAE,CAAC;AAAA,EACpE,OAAO;AAAA;AAGF,SAAS,yBAAyB,CACvC,KACA,OACS;AAAA,EACT,MAAM,gBAAgB,MAAM,iBAAiB,CAAC;AAAA,EAC9C,MAAM,mBAAmB,MAAM,oBAAoB,CAAC;AAAA,EACpD,MAAM,QAAQ,IAAI;AAAA,EAClB,WAAW,KAAK,QAAQ,IAAI,SAAS,GAAG;AAAA,IACtC,IAAI,CAAC,UAAS,CAAC,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,UAAU,EAAE,IAAI,GAAG,KAAK;AAAA,IACrC,IAAI,MAAM;AAAA,MACR,MAAM,IAAI,IAAI;AAAA,IAChB;AAAA,EACF;AAAA,EACA,IAAI,cAAc,KAAK,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG;AAAA,IAClD,OAAO;AAAA,EACT;AAAA,EACA,IAAI,iBAAiB,KAAK,CAAC,SAAS,MAAM,IAAI,IAAI,CAAC,GAAG;AAAA,IACpD,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGT,eAAsB,WAAW,CAC/B,QACA,OACgC;AAAA,EAChC,MAAM,MAA6B,CAAC;AAAA,EACpC,IAAI;AAAA,EAEJ,UAAS;AAAA,IACP,MAAM,OAAO,MAAM,OAAO,IAAI,yBAAyB;AAAA,MACrD,SAAS,MAAM;AAAA,MACf,IAAI,MAAM;AAAA,MACV,OAAO;AAAA,MACP;AAAA,MACA,sBAAsB,MAAM,mBAAmB,OAAO;AAAA,IACxD,CAAC;AAAA,IACD,MAAM,WAAW,QAAQ,KAAK,QAAQ;AAAA,IACtC,WAAW,KAAK,UAAU;AAAA,MACxB,IAAI,CAAC,UAAS,CAAC,GAAG;AAAA,QAChB;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,QAAQ,EAAE,KAAK,EAC1B,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC,EAChC,OAAO,CAAC,MAA6B,MAAM,IAAI;AAAA,MAClD,MAAM,gBAAgB,MAAM,SAAS,IAAI,MAAM,YAAY,QAAQ,KAAK,IAAI;AAAA,MAE5E,MAAM,OAAO,UAAU,EAAE,IAAI,KAAK;AAAA,MAClC,IAAI,KAAK;AAAA,QACP,YAAY,MAAM;AAAA,QAClB,IAAI,UAAU,EAAE,EAAE,KAAK;AAAA,QACvB,WAAW,UAAU,EAAE,SAAS;AAAA,QAChC,aAAa,UAAU,EAAE,WAAW;AAAA,QACpC,MAAM,UAAU,EAAE,IAAI;AAAA,QACtB,QAAQ,UAAU,EAAE,MAAM;AAAA,QAC1B;AAAA,QACA,UAAU,sBAAsB,IAAI;AAAA,QACpC,QAAQ,MAAM,QAAQ,EAAE,MAAM,IAAK,EAAE,SAAuB;AAAA,QAC5D,aAAa,MAAM,QAAQ,EAAE,WAAW,IAAK,EAAE,cAA4B;AAAA,QAC3E,OAAO;AAAA,QACP,WAAW,MAAM,QAAQ,EAAE,SAAS,IAAK,EAAE,YAA0B;AAAA,MACvE,CAAC;AAAA,IACH;AAAA,IACA,MAAM,OAAO,UAAS,KAAK,iBAAiB,IAAI,KAAK,oBAAoB;AAAA,IACzE,MAAM,OAAO,OAAO,UAAU,KAAK,WAAW,IAAI;AAAA,IAClD,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AAAA,EAGA,IAAI,KAAK,CAAC,GAAG,MAAM,OAAO,WAAW,EAAE,EAAE,IAAI,OAAO,WAAW,EAAE,EAAE,CAAC;AAAA,EACpE,OAAO;AAAA;;;ACjcF,SAAS,oBAAoB,CAAC,OAAgC;AAAA,EACnE,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,IAAI,IAAI,KAAK;AAAA,IACnB,MAAM;AAAA,IACN,MAAM,IAAI,MAAM,gBAAgB,OAAO;AAAA;AAAA,EAGzC,IAAI,CAAC,iBAAiB,KAAK,IAAI,QAAQ,GAAG;AAAA,IACxC,MAAM,IAAI,MAAM,8BAA8B,IAAI,UAAU;AAAA,EAC9D;AAAA,EAEA,MAAM,QAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,EAEpD,IAAI,MAAM,SAAS,KAAK,MAAM,OAAO,YAAY;AAAA,IAC/C,MAAM,IAAI,MAAM,+BAA+B,IAAI,UAAU;AAAA,EAC/D;AAAA,EAEA,MAAM,aAAa,MAAM;AAAA,EACzB,MAAM,cAAc,MAAM;AAAA,EAC1B,MAAM,QAAQ,YAAY,MAAM,aAAa;AAAA,EAC7C,IAAI,CAAC,OAAO;AAAA,IACV,MAAM,IAAI,MAAM,iCAAiC,aAAa;AAAA,EAChE;AAAA,EAEA,MAAM,SAAS,MAAM;AAAA,EACrB,IAAI,OAAO,UAAU,GAAG;AAAA,IACtB,MAAM,IAAI,MAAM,6BAA6B,aAAa;AAAA,EAC5D;AAAA,EACA,MAAM,UAAU,OAAO,MAAM,GAAG,EAAE;AAAA,EAClC,MAAM,SAAS,OAAO,MAAM,EAAE;AAAA,EAC9B,MAAM,aAAa,GAAG,WAAW;AAAA,EAEjC,MAAM,gBAAgB,IAAI,aAAa,IAAI,WAAW;AAAA,EACtD,MAAM,iBACJ,iBAAiB,kBAAkB,KAAK,aAAa,IAAI,gBAAgB;AAAA,EAI3E,MAAM,SAAS,IAAI,aAAa,IAAI,KAAK;AAAA,EACzC,MAAM,oBAAoB,QAAQ,iBAAiB,CAAC,MAAM;AAAA,EAE1D,MAAM,gBAAgB,GAAG,IAAI,aAAa,IAAI;AAAA,EAC9C,OAAO,EAAE,eAAe,YAAY,YAAY,gBAAgB,KAAK,OAAO,kBAAkB;AAAA;;;AC7CzF,SAAS,cAAc,CAAC,OAA0B;AAAA,EACvD,MAAM,UAAU,MAAM,KAAK;AAAA,EAC3B,IAAI,CAAC,SAAS;AAAA,IACZ,MAAM,IAAI,MAAM,gBAAgB;AAAA,EAClC;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,MAAM,qBAAqB,OAAO;AAAA,IACxC,OAAO,EAAE,MAAM,OAAO,IAAI;AAAA,IAC1B,MAAM;AAAA,EAIR,IAAI,SAAS,OAAO,GAAG;AAAA,IACrB,OAAO,EAAE,MAAM,QAAQ,QAAQ,QAAQ;AAAA,EACzC;AAAA,EACA,IAAI,QAAQ,WAAW,GAAG,GAAG;AAAA,IAC3B,OAAO,EAAE,MAAM,WAAW,SAAS,QAAQ;AAAA,EAC7C;AAAA,EACA,IAAI,YAAY,OAAO,GAAG;AAAA,IACxB,OAAO,EAAE,MAAM,WAAW,SAAS,QAAQ;AAAA,EAC7C;AAAA,EAGA,OAAO,EAAE,MAAM,WAAW,SAAS,IAAI,UAAU;AAAA;;;AC3BnD,qBAAS,wBAAU;AACnB,iBAAS;AAET,SAAS,kBAAkB,CAAC,MAKV;AAAA,EAChB,MAAM,MAAM,KAAK,YAAY,IAAI,YAAY;AAAA,EAC7C,MAAM,MAAM,KAAK,YAAY,IAAI,YAAY;AAAA,EAE7C,IAAI,OAAO,eAAe,OAAO,OAAO;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,gBAAgB,OAAO,eAAe,OAAO,SAAS,OAAO,QAAQ;AAAA,IAC9E,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,gBAAgB,OAAO,QAAQ;AAAA,IACxC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,eAAe,OAAO,OAAO;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAO,gBAAgB,OAAO,QAAQ;AAAA,IACxC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,mBAAmB,OAAO,cAAc,OAAO,MAAM;AAAA,IAC9D,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,sBAAsB,OAAO,QAAQ;AAAA,IAC9C,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,KAAK,QAAQ,KAAK,SAAS;AAAA,EACxC,MAAM,QAAQ,KAAK,MAAM,wBAAwB;AAAA,EACjD,OAAO,QAAQ,MAAM,GAAI,YAAY,IAAI;AAAA;AAG3C,IAAM,eAAe,IAAI,IAAI,CAAC,UAAU,QAAQ,MAAM,CAAC;AAEvD,SAAS,iBAAiB,CAAC,MAAuB;AAAA,EAChD,OAAO,0DAA0D,KAAK,IAAI;AAAA;AAG5E,eAAe,wBAAwB,CAAC,OAKpB;AAAA,EAClB,MAAM,WAAW,MAAM,kBAAkB;AAAA,IACvC,MAAM,MAAM;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,SAAS,MAAM;AAAA,IACf,eAAe,GAAG,MAAM;AAAA,IACxB,SAAS,EAAE,WAAW,KAAK;AAAA,EAC7B,CAAC;AAAA,EACD,MAAM,OAAO,MAAM,UAAS,UAAU,MAAM;AAAA,EAC5C,IAAI,kBAAkB,IAAI,GAAG;AAAA,IAC3B,MAAM,IAAI,MAAM,6EAA6E;AAAA,EAC/F;AAAA,EAEA,MAAM,WAAW,eAAe,IAAI,EAAE,KAAK;AAAA,EAC3C,MAAM,WAAW,GAAG,MAAM,OAAO,QAAQ,gBAAgB,GAAG;AAAA,EAC5D,MAAM,eAAe,OAAK,MAAM,SAAS,QAAQ;AAAA,EACjD,MAAM,WAAU,cAAc,UAAU,MAAM;AAAA,EAC9C,OAAO;AAAA;AAGT,eAAsB,oBAAoB,CAAC,OAGP;AAAA,EAClC,MAAM,kBAA0C,CAAC;AAAA,EACjD,MAAM,eAAe,MAAM,mBAAmB;AAAA,EAE9C,WAAW,WAAW,MAAM,UAAU;AAAA,IACpC,WAAW,QAAQ,QAAQ,SAAS,CAAC,GAAG;AAAA,MACtC,IAAI,gBAAgB,KAAK,KAAK;AAAA,QAC5B;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,KAAK,QAAQ,QAAQ,aAAa,IAAI,KAAK,IAAI;AAAA,MAChE,MAAM,MAAM,WACR,KAAK,eAAe,KAAK,uBACzB,KAAK,wBAAwB,KAAK;AAAA,MACtC,IAAI,CAAC,KAAK;AAAA,QACR;AAAA,MACF;AAAA,MAEA,IAAI;AAAA,QACF,IAAI,UAAU;AAAA,UACZ,gBAAgB,KAAK,MAAM,MAAM,yBAAyB;AAAA,YACxD,MAAM,MAAM;AAAA,YACZ,QAAQ,KAAK;AAAA,YACb;AAAA,YACA,SAAS;AAAA,UACX,CAAC;AAAA,QACH,EAAO;AAAA,UACL,MAAM,MAAM,mBAAmB,IAAI;AAAA,UACnC,gBAAgB,KAAK,MAAM,MAAM,kBAAkB;AAAA,YACjD,MAAM,MAAM;AAAA,YACZ;AAAA,YACA,SAAS;AAAA,YACT,eAAe,GAAG,KAAK,KAAK,MAAM,IAAI,QAAQ;AAAA,UAChD,CAAC;AAAA;AAAA,QAEH,OAAO,KAAK;AAAA,QACZ,QAAQ,MACN,0BAA0B,KAAK,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,GACvF;AAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;;;AC1HF,SAAS,uBAAuB,CAAC,KAA4C;AAAA,EAClF,IAAI,IAAI,mBAAmB;AAAA,IACzB,QAAQ,MACN;AAAA,IACE,+DACJ;AAAA,EACF;AAAA;;;ACHF,SAAS,UAAS,CAAC,OAAoC;AAAA,EACrD,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA;AAG7C,eAAsB,gBAAgB,CACpC,QACA,OAIgD;AAAA,EAChD,MAAM,aAAa,MAAM,IAAI,eAAe;AAAA,EAC5C,MAAM,SAAS,MAAM,IAAI,cAAc,aAAa,IAAI,MAAM,IAAI,KAAK;AAAA,EACvE,IAAI,CAAC,QAAQ;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,CAAC,MAAM,IAAI,aAAa,aAAa,GAAG;AAAA,IAC1C,OAAO,EAAE,IAAI,QAAQ,QAAQ,IAAI,WAAW;AAAA,EAC9C;AAAA,EAEA,MAAM,OAAO,MAAM,OAAO,IAAI,yBAAyB;AAAA,IACrD,SAAS,MAAM;AAAA,IACf,IAAI;AAAA,IACJ,OAAO;AAAA,EACT,CAAC;AAAA,EACD,OAAO,QAAQ,QAAQ,UAAS,IAAI,IAAI,KAAK,WAAW,SAAS;AAAA,EACjE,MAAM,iBAAiB,UAAS,IAAI,IAAI,WAAU,KAAK,WAAW,IAAI;AAAA,EACtE,IAAI,mBAAmB,WAAW;AAAA,IAChC,OAAO,EAAE,IAAI,QAAQ,QAAQ,EAAE;AAAA,EACjC;AAAA,EACA,OAAO,EAAE,IAAI,QAAQ,QAAQ,IAAI,eAAe;AAAA;AAG3C,SAAS,mBAAmB,CACjC,GACuD;AAAA,EACvD,QAAQ,YAAY,YAAY,WAAW,cAAc,SAAS;AAAA,EAClE,OAAO;AAAA;;;ACbF,SAAS,UAAU,CAAC,KAA6C;AAAA,EACtE,IAAI,QAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAAA,EACA,MAAM,IAAI,OAAO,SAAS,KAAK,EAAE;AAAA,EACjC,IAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,GAAG;AAAA,IAChC,MAAM,IAAI,MAAM,0BAA0B,kCAAkC;AAAA,EAC9E;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,gBAAgB,CAAC,KAAiC;AAAA,EAChE,MAAM,KAAK,KAAK,KAAK;AAAA,EACrB,IAAI,CAAC,IAAI;AAAA,IACP,MAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,oBAAoB,CAAC,KAAqC;AAAA,EACxE,IAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW,GAAG;AAAA,IAC3C,OAAO,CAAC;AAAA,EACV;AAAA,EACA,MAAM,MAAgB,CAAC;AAAA,EACvB,WAAW,SAAS,KAAK;AAAA,IACvB,MAAM,aAAa,2BAA2B,OAAO,KAAK,CAAC;AAAA,IAC3D,IAAI,CAAC,IAAI,SAAS,UAAU,GAAG;AAAA,MAC7B,IAAI,KAAK,UAAU;AAAA,IACrB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,oCAAoC,CAAC,OAI9B;AAAA,EACrB,MAAM,qBAAqB,MAAM,cAAc,SAAS,KAAK,MAAM,iBAAiB,SAAS;AAAA,EAC7F,MAAM,SAAS,MAAM,QAAQ,KAAK;AAAA,EAClC,IAAI,CAAC,oBAAoB;AAAA,IACvB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MACR,kHACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,eAAsB,gBAAgB,CAAC,OAIF;AAAA,EACnC,MAAM,SAAS,eAAe,MAAM,WAAW;AAAA,EAC/C,IAAI,OAAO,SAAS,QAAQ;AAAA,IAC1B,MAAM,IAAI,MACR,+FACF;AAAA,EACF;AAAA,EACA,MAAM,eAAe,MAAM,IAAI,sBAAsB,MAAM,QAAQ,SAAS;AAAA,EAE5E,OAAO,MAAM,IAAI,gBAAgB;AAAA,IAC/B,cAAc,OAAO,SAAS,QAAQ,OAAO,IAAI,gBAAgB;AAAA,IACjE,MAAM,YAAY;AAAA,MAChB,IAAI,OAAO,SAAS,OAAO;AAAA,QACzB,QAAQ,cAAQ;AAAA,QAChB,wBAAwB,IAAG;AAAA,QAC3B,QAAQ,iBAAQ,gBAAS,MAAM,MAAM,IAAI,sBAAsB,KAAI,aAAa;AAAA,QAChF,MAAM,oBAAmB,QAAQ,MAAM,QAAQ,gBAAgB;AAAA,QAC/D,MAAM,OAAM,MAAM,aAAa,SAAQ,EAAE,WAAK,oCAAiB,CAAC;AAAA,QAChE,MAAM,UAAS,MAAM,iBAAiB,SAAQ,EAAE,WAAW,KAAI,YAAY,UAAI,CAAC;AAAA,QAChF,MAAM,mBAAkB,MAAM,qBAAqB,EAAE,aAAM,UAAU,CAAC,IAAG,EAAE,CAAC;AAAA,QAC5E,MAAM,gBAAe,OAAO,SAAS,MAAM,QAAQ,cAAc,EAAE;AAAA,QACnE,MAAM,WAAU,iBAAiB,MAAK,EAAE,6BAAc,qCAAkB,kCAAgB,CAAC;AAAA,QACzF,OAAO,WAAW,EAAE,mBAAS,gBAAO,CAAC;AAAA,MACvC;AAAA,MAEA,MAAM,KAAK,MAAM,QAAQ,IAAI,KAAK;AAAA,MAClC,IAAI,CAAC,IAAI;AAAA,QACP,MAAM,IAAI,MAAM,mEAAmE;AAAA,MACrF;AAAA,MAEA,MAAM,MAAM,IAAI,wCAAwC;AAAA,QACtD;AAAA,QACA,UAAU,CAAC,OAAO,OAAO;AAAA,MAC3B,CAAC;AAAA,MAED,MAAM,mBAAmB,QAAQ,MAAM,QAAQ,gBAAgB;AAAA,MAC/D,QAAQ,QAAQ,MAAM,kBAAkB,MAAM,MAAM,IAAI,sBAAsB,YAAY;AAAA,MAC1F,MAAM,YAAY,MAAM,iBAAiB,QAAQ,OAAO,OAAO;AAAA,MAC/D,MAAM,MAAM;AAAA,QACV,eAAe,iBAAiB,gBAAgB;AAAA,QAChD,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,gBAAgB,MAAM,QAAQ,UAAU,KAAK,KAAK;AAAA,QAClD,KAAK,MAAM;AAAA,MACb;AAAA,MAEA,MAAM,MAAM,MAAM,aAAa,QAAQ,EAAE,KAAK,iBAAiB,CAAC;AAAA,MAChE,MAAM,SAAS,MAAM,iBAAiB,QAAQ,EAAE,WAAW,IAAI,CAAC;AAAA,MAChE,MAAM,kBAAkB,MAAM,qBAAqB,EAAE,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC;AAAA,MAC5E,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,cAAc,EAAE;AAAA,MACnE,MAAM,UAAU,iBAAiB,KAAK,EAAE,cAAc,kBAAkB,gBAAgB,CAAC;AAAA,MACzF,OAAO,WAAW,EAAE,SAAS,OAAO,CAAC;AAAA;AAAA,EAEzC,CAAC;AAAA;AAGH,eAAsB,iBAAiB,CAAC,OAIH;AAAA,EACnC,MAAM,SAAS,eAAe,MAAM,WAAW;AAAA,EAC/C,IAAI,OAAO,SAAS,QAAQ;AAAA,IAC1B,MAAM,IAAI,MACR,gGACF;AAAA,EACF;AAAA,EACA,MAAM,eAAe,MAAM,IAAI,sBAAsB,MAAM,QAAQ,SAAS;AAAA,EAE5E,OAAO,MAAM,IAAI,gBAAgB;AAAA,IAC/B,cAAc,OAAO,SAAS,QAAQ,OAAO,IAAI,gBAAgB;AAAA,IACjE,MAAM,YAAY;AAAA,MAChB,MAAM,gBAAgB,qBAAqB,MAAM,QAAQ,YAAY;AAAA,MACrE,MAAM,mBAAmB,qBAAqB,MAAM,QAAQ,eAAe;AAAA,MAC3E,MAAM,qBAAqB,cAAc,SAAS,KAAK,iBAAiB,SAAS;AAAA,MAEjF,IAAI,OAAO,SAAS,OAAO;AAAA,QACzB,IAAI,oBAAoB;AAAA,UACtB,MAAM,IAAI,MACR,4FACF;AAAA,QACF;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,wBAAwB,GAAG;AAAA,QAC3B,QAAQ,iBAAQ,gBAAS,MAAM,MAAM,IAAI,sBAAsB,IAAI,aAAa;AAAA,QAChF,MAAM,oBAAmB,QAAQ,MAAM,QAAQ,gBAAgB;AAAA,QAC/D,MAAM,MAAM,MAAM,aAAa,SAAQ,EAAE,KAAK,oCAAiB,CAAC;AAAA,QAChE,MAAM,UAAS,IAAI,aAAa,IAAI;AAAA,QACpC,MAAM,kBAAiB,MAAM,YAAY,SAAQ;AAAA,UAC/C,WAAW,IAAI;AAAA,UACf,UAAU;AAAA,UACV;AAAA,QACF,CAAC;AAAA,QACD,MAAM,mBAAkB,MAAM,qBAAqB,EAAE,aAAM,UAAU,gBAAe,CAAC;AAAA,QACrF,MAAM,gBAAe,OAAO,SAAS,MAAM,QAAQ,cAAc,EAAE;AAAA,QACnE,OAAO,WAAW;AAAA,UAChB,UAAU,gBACP,IAAI,CAAC,MAAM,iBAAiB,GAAG,EAAE,6BAAc,qCAAkB,kCAAgB,CAAC,CAAC,EACnF,IAAI,mBAAmB;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,MAEA,QAAQ,QAAQ,MAAM,kBAAkB,MAAM,MAAM,IAAI,sBAAsB,YAAY;AAAA,MAE1F,MAAM,MAAM,IAAI,wCAAwC;AAAA,QACtD;AAAA,QACA,UAAU,CAAC,OAAO,OAAO;AAAA,MAC3B,CAAC;AAAA,MAED,MAAM,YAAY,MAAM,iBAAiB,QAAQ,OAAO,OAAO;AAAA,MAE/D,MAAM,WAAW,MAAM,QAAQ,UAAU,KAAK;AAAA,MAC9C,MAAM,KAAK,MAAM,QAAQ,IAAI,KAAK;AAAA,MAGlC,IAAI,CAAC,YAAY,CAAC,IAAI;AAAA,QACpB,MAAM,oBAAmB,QAAQ,MAAM,QAAQ,gBAAgB;AAAA,QAC/D,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAAA,QAC5C,MAAM,SAAS,qCAAqC;AAAA,UAClD,QAAQ,MAAM,QAAQ;AAAA,UACtB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,MAAM,kBAAkB,MAAM,oBAAoB,QAAQ;AAAA,UACxD;AAAA,UACA;AAAA,UACA,QAAQ,MAAM,QAAQ,QAAQ,KAAK;AAAA,UACnC;AAAA,UACA,kBAAkB,qBAAoB;AAAA,UACtC;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,MAAM,mBAAkB,MAAM,qBAAqB,EAAE,MAAM,UAAU,gBAAgB,CAAC;AAAA,QACtF,MAAM,gBAAe,OAAO,SAAS,MAAM,QAAQ,cAAc,EAAE;AAAA,QACnE,OAAO,WAAW;AAAA,UAChB,YAAY;AAAA,UACZ,UAAU,gBAAgB,IAAI,CAAC,MAC7B,iBAAiB,GAAG,EAAE,6BAAc,qCAAkB,kCAAgB,CAAC,CACzE;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEA,IAAI,oBAAoB;AAAA,QACtB,MAAM,IAAI,MACR,yFACF;AAAA,MACF;AAAA,MAEA,MAAM,SACJ,YACC,OAAO,YAAY;AAAA,QAClB,MAAM,MAAM;AAAA,UACV,eAAe,iBAAiB,gBAAgB;AAAA,UAChD,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,KAAK,MAAM;AAAA,QACb;AAAA,QACA,MAAM,oBAAmB,QAAQ,MAAM,QAAQ,gBAAgB;AAAA,QAC/D,MAAM,MAAM,MAAM,aAAa,QAAQ,EAAE,KAAK,oCAAiB,CAAC;AAAA,QAChE,OAAO,IAAI,aAAa,IAAI;AAAA,SAC3B;AAAA,MAEL,MAAM,mBAAmB,QAAQ,MAAM,QAAQ,gBAAgB;AAAA,MAC/D,MAAM,iBAAiB,MAAM,YAAY,QAAQ;AAAA,QAC/C;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,MACD,MAAM,kBAAkB,MAAM,qBAAqB,EAAE,MAAM,UAAU,eAAe,CAAC;AAAA,MACrF,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,cAAc,EAAE;AAAA,MACnE,OAAO,WAAW;AAAA,QAChB,UAAU,eACP,IAAI,CAAC,MAAM,iBAAiB,GAAG,EAAE,cAAc,kBAAkB,gBAAgB,CAAC,CAAC,EACnF,IAAI,mBAAmB;AAAA,MAC5B,CAAC;AAAA;AAAA,EAEL,CAAC;AAAA;AAGH,eAAsB,WAAW,CAAC,OAKG;AAAA,EACnC,MAAM,SAAS,eAAe,OAAO,MAAM,WAAW,CAAC;AAAA,EACvD,IAAI,OAAO,SAAS,OAAO;AAAA,IACzB,QAAQ,QAAQ;AAAA,IAChB,wBAAwB,GAAG;AAAA,IAC3B,MAAM,MAAM,IAAI,gBAAgB;AAAA,MAC9B,cAAc,IAAI;AAAA,MAClB,MAAM,YAAY;AAAA,QAChB,QAAQ,WAAW,MAAM,MAAM,IAAI,sBAAsB,IAAI,aAAa;AAAA,QAC1E,MAAM,MAAM,MAAM,aAAa,QAAQ,EAAE,IAAI,CAAC;AAAA,QAC9C,MAAM,WAAW,IAAI,aAAa,IAAI;AAAA,QACtC,MAAM,OAAO,IAAI,oBAAoB;AAAA,UACnC,SAAS,IAAI;AAAA,UACb,MAAM,MAAM;AAAA,UACZ,WAAW;AAAA,QACb,CAAC;AAAA;AAAA,IAEL,CAAC;AAAA,IACD,OAAO,EAAE,IAAI,KAAK;AAAA,EACpB;AAAA,EAEA,IAAI,OAAO,SAAS,QAAQ;AAAA,IAC1B,MAAM,gBAAe,MAAM,IAAI,sBAAsB,MAAM,QAAQ,SAAS;AAAA,IAC5E,MAAM,MAAM,IAAI,gBAAgB;AAAA,MAC9B;AAAA,MACA,MAAM,YAAY;AAAA,QAChB,QAAQ,WAAW,MAAM,MAAM,IAAI,sBAAsB,aAAY;AAAA,QACrE,MAAM,cAAc,MAAM,cAAc,QAAQ,OAAO,MAAM;AAAA,QAC7D,MAAM,OAAO,IAAI,oBAAoB;AAAA,UACnC,SAAS;AAAA,UACT,MAAM,MAAM;AAAA,QACd,CAAC;AAAA;AAAA,IAEL,CAAC;AAAA,IACD,OAAO,EAAE,IAAI,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,eAAe,MAAM,IAAI,sBAAsB,MAAM,QAAQ,SAAS;AAAA,EAC5E,MAAM,MAAM,IAAI,wCAAwC;AAAA,IACtD;AAAA,IACA,UAAU,CAAC,OAAO,OAAO,OAAO,CAAC;AAAA,EACnC,CAAC;AAAA,EACD,MAAM,MAAM,IAAI,gBAAgB;AAAA,IAC9B;AAAA,IACA,MAAM,YAAY;AAAA,MAChB,QAAQ,WAAW,MAAM,MAAM,IAAI,sBAAsB,YAAY;AAAA,MACrE,MAAM,YAAY,MAAM,iBAAiB,QAAQ,OAAO,OAAO,OAAO,CAAC;AAAA,MACvE,MAAM,OAAO,IAAI,oBAAoB;AAAA,QACnC,SAAS;AAAA,QACT,MAAM,MAAM;AAAA,QACZ,WAAW,MAAM,QAAQ,WAAW,OAAO,MAAM,QAAQ,QAAQ,IAAI;AAAA,MACvE,CAAC;AAAA;AAAA,EAEL,CAAC;AAAA,EACD,OAAO,EAAE,IAAI,KAAK;AAAA;AAGpB,eAAsB,WAAW,CAAC,OAKG;AAAA,EACnC,MAAM,SAAS,eAAe,OAAO,MAAM,WAAW,CAAC;AAAA,EACvD,IAAI,OAAO,SAAS,QAAQ;AAAA,IAC1B,MAAM,IAAI,MACR,gGACF;AAAA,EACF;AAAA,EACA,MAAM,eAAe,MAAM,IAAI,sBAAsB,MAAM,QAAQ,SAAS;AAAA,EAE5E,MAAM,MAAM,IAAI,gBAAgB;AAAA,IAC9B,cAAc,OAAO,SAAS,QAAQ,OAAO,IAAI,gBAAgB;AAAA,IACjE,MAAM,YAAY;AAAA,MAChB,IAAI,OAAO,SAAS,OAAO;AAAA,QACzB,QAAQ,QAAQ;AAAA,QAChB,wBAAwB,GAAG;AAAA,QAC3B,QAAQ,oBAAW,MAAM,MAAM,IAAI,sBAAsB,IAAI,aAAa;AAAA,QAC1E,MAAM,QAAO,IAAI,eAAe;AAAA,UAC9B,SAAS,IAAI;AAAA,UACb,IAAI,IAAI;AAAA,UACR,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,QACD;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,iBAAiB,MAAM,QAAQ,EAAE;AAAA,MAC5C,MAAM,MAAM,IAAI,wCAAwC;AAAA,QACtD;AAAA,QACA,UAAU,CAAC,OAAO,OAAO;AAAA,MAC3B,CAAC;AAAA,MACD,QAAQ,WAAW,MAAM,MAAM,IAAI,sBAAsB,YAAY;AAAA,MACrE,MAAM,YAAY,MAAM,iBAAiB,QAAQ,OAAO,OAAO;AAAA,MAC/D,MAAM,OAAO,IAAI,eAAe;AAAA,QAC9B,SAAS;AAAA,QACT;AAAA,QACA,MAAM,MAAM;AAAA,MACd,CAAC;AAAA;AAAA,EAEL,CAAC;AAAA,EAED,OAAO,EAAE,IAAI,KAAK;AAAA;AAGpB,eAAsB,aAAa,CAAC,OAIC;AAAA,EACnC,MAAM,SAAS,eAAe,OAAO,MAAM,WAAW,CAAC;AAAA,EACvD,IAAI,OAAO,SAAS,QAAQ;AAAA,IAC1B,MAAM,IAAI,MACR,kGACF;AAAA,EACF;AAAA,EACA,MAAM,eAAe,MAAM,IAAI,sBAAsB,MAAM,QAAQ,SAAS;AAAA,EAE5E,MAAM,MAAM,IAAI,gBAAgB;AAAA,IAC9B,cAAc,OAAO,SAAS,QAAQ,OAAO,IAAI,gBAAgB;AAAA,IACjE,MAAM,YAAY;AAAA,MAChB,IAAI,OAAO,SAAS,OAAO;AAAA,QACzB,QAAQ,QAAQ;AAAA,QAChB,wBAAwB,GAAG;AAAA,QAC3B,QAAQ,oBAAW,MAAM,MAAM,IAAI,sBAAsB,IAAI,aAAa;AAAA,QAC1E,MAAM,QAAO,IAAI,eAAe;AAAA,UAC9B,SAAS,IAAI;AAAA,UACb,IAAI,IAAI;AAAA,QACV,CAAC;AAAA,QACD;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,iBAAiB,MAAM,QAAQ,EAAE;AAAA,MAC5C,MAAM,MAAM,IAAI,wCAAwC;AAAA,QACtD;AAAA,QACA,UAAU,CAAC,OAAO,OAAO;AAAA,MAC3B,CAAC;AAAA,MACD,QAAQ,WAAW,MAAM,MAAM,IAAI,sBAAsB,YAAY;AAAA,MACrE,MAAM,YAAY,MAAM,iBAAiB,QAAQ,OAAO,OAAO;AAAA,MAC/D,MAAM,OAAO,IAAI,eAAe;AAAA,QAC9B,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA;AAAA,EAEL,CAAC;AAAA,EAED,OAAO,EAAE,IAAI,KAAK;AAAA;AAGpB,eAAsB,aAAa,CAAC,OAMC;AAAA,EACnC,MAAM,SAAS,eAAe,MAAM,WAAW;AAAA,EAC/C,IAAI,OAAO,SAAS,QAAQ;AAAA,IAC1B,MAAM,IAAI,MACR,yFACF;AAAA,EACF;AAAA,EACA,MAAM,eAAe,MAAM,IAAI,sBAAsB,MAAM,SAAS,SAAS;AAAA,EAE7E,MAAM,MAAM,IAAI,gBAAgB;AAAA,IAC9B,cAAc,OAAO,SAAS,QAAQ,OAAO,IAAI,gBAAgB;AAAA,IACjE,MAAM,YAAY;AAAA,MAChB,IAAI,OAAO,SAAS,OAAO;AAAA,QACzB,QAAQ,QAAQ;AAAA,QAChB,wBAAwB,GAAG;AAAA,QAC3B,QAAQ,oBAAW,MAAM,MAAM,IAAI,sBAAsB,IAAI,aAAa;AAAA,QAC1E,MAAM,QAAO,2BAA2B,MAAM,KAAK;AAAA,QACnD,MAAM,QAAO,IAAI,aAAa,MAAM,UAAU;AAAA,UAC5C,SAAS,IAAI;AAAA,UACb,WAAW,IAAI;AAAA,UACf;AAAA,QACF,CAAC;AAAA,QACD;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,iBAAiB,MAAM,SAAS,EAAE;AAAA,MAE7C,MAAM,MAAM,IAAI,wCAAwC;AAAA,QACtD;AAAA,QACA,UAAU,CAAC,OAAO,OAAO;AAAA,MAC3B,CAAC;AAAA,MAED,QAAQ,WAAW,MAAM,MAAM,IAAI,sBAAsB,YAAY;AAAA,MACrE,MAAM,YAAY,MAAM,iBAAiB,QAAQ,OAAO,OAAO;AAAA,MAC/D,MAAM,OAAO,2BAA2B,MAAM,KAAK;AAAA,MACnD,MAAM,OAAO,IAAI,aAAa,MAAM,UAAU;AAAA,QAC5C,SAAS;AAAA,QACT,WAAW;AAAA,QACX;AAAA,MACF,CAAC;AAAA;AAAA,EAEL,CAAC;AAAA,EAED,OAAO,EAAE,IAAI,KAAK;AAAA;;;AChdpB;AACA;AAaO,SAAS,eAAe,CAAC,QAAiD;AAAA,EAC/E,OAAO,IAAI,QAAqB,CAAC,UAAS,WAAW;AAAA,IACnD,IAAI,UAAU;AAAA,IAEd,MAAM,SAAiB,aAAa,OAAO,KAAK,QAAQ;AAAA,MACtD,IAAI,IAAI,WAAW,UAAU,IAAI,QAAQ,OAAO,IAAI,QAAQ,gBAAgB;AAAA,QAC1E,MAAM,OAAO,gBAAgB,MAAM;AAAA,QACnC,IAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AAAA,QACjE,IAAI,IAAI,IAAI;AAAA,QACZ;AAAA,MACF;AAAA,MAEA,IAAI,IAAI,WAAW,UAAU,IAAI,QAAQ,SAAS;AAAA,QAChD,IAAI;AAAA,UACF,MAAM,OAAO,MAAM,SAAS,GAAG;AAAA,UAC/B,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,UAC5B,IAAI,OAAO,KAAK,SAAS,YAAY,CAAC,KAAK,KAAK,KAAK,GAAG;AAAA,YACtD,IAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AAAA,YACzD,IAAI,IAAI,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,mBAAmB,CAAC,CAAC;AAAA,YAChE;AAAA,UACF;AAAA,UACA,MAAM,aAAa,MAAM,OAAO,OAAO,KAAK,IAAI;AAAA,UAChD,IAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AAAA,UACzD,IAAI,IAAI,KAAK,UAAU,EAAE,IAAI,MAAM,IAAI,WAAW,GAAG,CAAC,CAAC;AAAA,UACvD,UAAU;AAAA,UACV,SAAQ,EAAE,MAAM,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,UACvC,WAAW,MAAM,OAAO,MAAM,GAAG,GAAG;AAAA,UACpC,OAAO,KAAc;AAAA,UACrB,IAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AAAA,UACzD,IAAI,IAAI,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,OAAO,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA,QAE3D;AAAA,MACF;AAAA,MAEA,IAAI,IAAI,WAAW,UAAU,IAAI,QAAQ,WAAW;AAAA,QAClD,IAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AAAA,QACzD,IAAI,IAAI,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC,CAAC;AAAA,QACpC,UAAU;AAAA,QACV,SAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,QAC3B,WAAW,MAAM,OAAO,MAAM,GAAG,GAAG;AAAA,QACpC;AAAA,MACF;AAAA,MAEA,IAAI,UAAU,GAAG;AAAA,MACjB,IAAI,IAAI,WAAW;AAAA,KACpB;AAAA,IAED,OAAO,GAAG,SAAS,CAAC,QAAQ;AAAA,MAC1B,IAAI,CAAC,SAAS;AAAA,QACZ,OAAO,GAAG;AAAA,MACZ;AAAA,KACD;AAAA,IAED,OAAO,GAAG,SAAS,MAAM;AAAA,MACvB,aAAa,WAAW;AAAA,MACxB,IAAI,CAAC,SAAS;AAAA,QACZ,UAAU;AAAA,QACV,SAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,MAC7B;AAAA,KACD;AAAA,IAED,MAAM,cAAc,WAClB,MAAM;AAAA,MACJ,IAAI,CAAC,SAAS;AAAA,QACZ,OAAO,MAAM;AAAA,MACf;AAAA,OAEF,KAAK,KAAK,IACZ;AAAA,IAEA,OAAO,OAAO,GAAG,aAAa,MAAM;AAAA,MAClC,MAAM,OAAO,OAAO,QAAQ;AAAA,MAC5B,MAAM,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,OAAO;AAAA,MAC5D,MAAM,MAAM,oBAAoB;AAAA,MAChC,QAAQ,OAAO,MAAM,iBAAiB;AAAA,CAAO;AAAA,MAC7C,YAAY,GAAG;AAAA,KAChB;AAAA,GACF;AAAA;AAGH,SAAS,QAAQ,CAAC,KAAuC;AAAA,EACvD,OAAO,IAAI,QAAQ,CAAC,UAAS,WAAW;AAAA,IACtC,MAAM,SAAmB,CAAC;AAAA,IAC1B,IAAI,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AAAA,IACpD,IAAI,GAAG,OAAO,MAAM,SAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,CAAC,CAAC;AAAA,IAC7D,IAAI,GAAG,SAAS,MAAM;AAAA,GACvB;AAAA;AAGH,SAAS,WAAW,CAAC,KAAmB;AAAA,EACtC,MAAM,MACJ,QAAQ,aAAa,WAAW,SAAS,QAAQ,aAAa,UAAU,UAAU;AAAA,EACpF,KAAK,GAAG,QAAQ,QAAQ,MAAM,EAAE;AAAA;AAGlC,SAAS,mBAAmB,CAAC,QAA0C;AAAA,EACrE,IAAI,CAAC,OAAO,gBAAgB,CAAC,OAAO,aAAa,CAAC,OAAO,UAAU;AAAA,IACjE,OAAO;AAAA,EACT;AAAA,EACA,MAAM,UAAU,OAAO,SAAS,QAAQ,KAAK,EAAE;AAAA,EAC/C,OAAO,GAAG,OAAO,aAAa,QAAQ,OAAO,EAAE,cAAc,OAAO,cAAc;AAAA;AAGpF,SAAS,oBAAoB,CAAC,KAA6B;AAAA,EACzD,IAAI,CAAC,KAAK;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,MAAM,OAAO,IAAI,IAAI,GAAG,EAAE;AAAA,IAC1B,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA,IAC5B,IAAI,MAAM,UAAU,KAAK,MAAM,GAAG,EAAE,MAAM,SAAS;AAAA,MACjD,OAAO,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAIX,SAAS,eAAe,CAAC,QAAmC;AAAA,EAC1D,MAAM,YAAY,oBAAoB,MAAM;AAAA,EAC5C,MAAM,gBAAgB,qBAAqB,OAAO,YAAY;AAAA,EAC9D,MAAM,iBAAiB,KAAK,UAAU;AAAA,IACpC,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO,aAAa;AAAA,IAC/B,cAAc,OAAO,gBAAgB;AAAA,IACrC;AAAA,IACA,UAAU,OAAO,YAAY;AAAA,IAC7B;AAAA,IACA,aAAa,OAAO,eAAe;AAAA,EACrC,CAAC;AAAA,EAED,OAAO,YAAY,QAAQ,oBAAoB,eAAe,QAAQ,MAAM,SAAS,CAAC;AAAA;AASxF,IAAM,cAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
|
|
61
|
-
"debugId": "
|
|
67
|
+
"mappings": "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",
|
|
68
|
+
"debugId": "DBCD03BFA3C520AC64756E2164756E21",
|
|
62
69
|
"names": []
|
|
63
70
|
}
|