@furlow/builtins 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/afk/index.js +7 -7
- package/dist/afk/index.js.map +1 -1
- package/dist/auto-responder/index.js +17 -17
- package/dist/auto-responder/index.js.map +1 -1
- package/dist/giveaways/index.js +8 -8
- package/dist/giveaways/index.js.map +1 -1
- package/dist/index.js +181 -181
- package/dist/index.js.map +1 -1
- package/dist/leveling/index.js +15 -15
- package/dist/leveling/index.js.map +1 -1
- package/dist/logging/index.js +25 -25
- package/dist/logging/index.js.map +1 -1
- package/dist/music/index.js +10 -10
- package/dist/music/index.js.map +1 -1
- package/dist/polls/index.js +7 -7
- package/dist/polls/index.js.map +1 -1
- package/dist/reaction-roles/index.js +14 -14
- package/dist/reaction-roles/index.js.map +1 -1
- package/dist/reminders/index.js +4 -4
- package/dist/reminders/index.js.map +1 -1
- package/dist/starboard/index.js +16 -16
- package/dist/starboard/index.js.map +1 -1
- package/dist/tickets/index.js +18 -18
- package/dist/tickets/index.js.map +1 -1
- package/dist/utilities/index.js +23 -23
- package/dist/utilities/index.js.map +1 -1
- package/dist/welcome/index.js +17 -17
- package/dist/welcome/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/moderation/index.ts","../src/welcome/index.ts","../src/logging/index.ts","../src/tickets/index.ts","../src/reaction-roles/index.ts","../src/leveling/index.ts","../src/music/index.ts","../src/starboard/index.ts","../src/polls/index.ts","../src/giveaways/index.ts","../src/auto-responder/index.ts","../src/afk/index.ts","../src/reminders/index.ts","../src/utilities/index.ts"],"sourcesContent":["/**\n * Moderation builtin module\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler } from '@furlow/schema';\n\nexport interface ModerationConfig {\n /** Log channel for moderation actions */\n logChannel?: string;\n /** Whether to DM users on moderation actions */\n dmOnAction?: boolean;\n /** Roles exempt from moderation */\n exemptRoles?: string[];\n /** Enable warning system */\n warnings?: {\n enabled?: boolean;\n maxWarnings?: number;\n escalation?: Array<{\n count: number;\n action: 'kick' | 'ban' | 'timeout';\n duration?: string;\n }>;\n };\n}\n\nexport const moderationCommands: CommandDefinition[] = [\n {\n name: 'warn',\n description: 'Warn a user',\n options: [\n { name: 'user', description: 'User to warn', type: 'user', required: true },\n { name: 'reason', description: 'Reason for warning', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_insert',\n table: 'warnings',\n data: {\n user_id: '${args.user.id}',\n guild_id: '${guild.id}',\n moderator_id: '${user.id}',\n reason: '${args.reason}',\n created_at: '${now()}',\n },\n },\n {\n action: 'reply',\n content: 'Warned ${args.user.username} for: ${args.reason}',\n ephemeral: true,\n },\n {\n action: 'send_dm',\n user: '${args.user.id}',\n embed: {\n title: 'Warning Received',\n description: 'You have been warned in ${guild.name}',\n fields: [\n { name: 'Reason', value: '${args.reason}' },\n { name: 'Moderator', value: '${user.username}' },\n ],\n color: '#ffa500',\n },\n },\n ],\n },\n {\n name: 'kick',\n description: 'Kick a user from the server',\n options: [\n { name: 'user', description: 'User to kick', type: 'user', required: true },\n { name: 'reason', description: 'Reason for kick', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'kick',\n user: '${args.user.id}',\n reason: '${args.reason || \"No reason provided\"}',\n dm_user: true,\n dm_message: 'You have been kicked from ${guild.name}. Reason: ${args.reason || \"No reason provided\"}',\n },\n {\n action: 'reply',\n content: 'Kicked ${args.user.username}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'ban',\n description: 'Ban a user from the server',\n options: [\n { name: 'user', description: 'User to ban', type: 'user', required: true },\n { name: 'reason', description: 'Reason for ban', type: 'string', required: false },\n { name: 'delete_days', description: 'Days of messages to delete (0-7)', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'ban',\n user: '${args.user.id}',\n reason: '${args.reason || \"No reason provided\"}',\n delete_message_days: '${args.delete_days || 0}' as unknown as number,\n dm_user: true,\n dm_message: 'You have been banned from ${guild.name}. Reason: ${args.reason || \"No reason provided\"}',\n },\n {\n action: 'reply',\n content: 'Banned ${args.user.username}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'unban',\n description: 'Unban a user',\n options: [\n { name: 'user_id', description: 'User ID to unban', type: 'string', required: true },\n { name: 'reason', description: 'Reason for unban', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'unban',\n user: '${args.user_id}',\n reason: '${args.reason || \"No reason provided\"}',\n },\n {\n action: 'reply',\n content: 'Unbanned user ${args.user_id}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'timeout',\n description: 'Timeout a user',\n options: [\n { name: 'user', description: 'User to timeout', type: 'user', required: true },\n { name: 'duration', description: 'Duration (e.g., 10m, 1h, 1d)', type: 'string', required: true },\n { name: 'reason', description: 'Reason for timeout', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'timeout',\n user: '${args.user.id}',\n duration: '${args.duration}',\n reason: '${args.reason || \"No reason provided\"}',\n dm_user: true,\n dm_message: 'You have been timed out in ${guild.name} for ${args.duration}. Reason: ${args.reason || \"No reason provided\"}',\n },\n {\n action: 'reply',\n content: 'Timed out ${args.user.username} for ${args.duration}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'warnings',\n description: 'View warnings for a user',\n options: [\n { name: 'user', description: 'User to check', type: 'user', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'warnings',\n where: {\n user_id: '${args.user.id}',\n guild_id: '${guild.id}',\n },\n order_by: 'created_at DESC',\n limit: 10,\n as: 'warnings',\n },\n {\n action: 'reply',\n embed: {\n title: 'Warnings for ${args.user.username}',\n description: '${warnings.length == 0 ? \"No warnings found\" : warnings | map(\"- \" + .reason) | join(\"\\\\n\")}',\n color: '${warnings.length > 0 ? \"#ffa500\" : \"#00ff00\"}',\n footer: {\n text: 'Total: ${warnings.length} warnings',\n },\n },\n },\n ],\n },\n {\n name: 'purge',\n description: 'Delete multiple messages',\n options: [\n { name: 'count', description: 'Number of messages to delete (1-100)', type: 'integer', required: true },\n { name: 'user', description: 'Only delete messages from this user', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'bulk_delete',\n channel: '${channel.id}',\n count: '${args.count}' as unknown as number,\n filter: '${args.user ? \"message.author.id == \\\\\"\" + args.user.id + \"\\\\\"\" : null}',\n },\n {\n action: 'reply',\n content: 'Deleted messages',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport const moderationTables = {\n warnings: {\n columns: {\n id: { type: 'number' as const, primary: true },\n user_id: { type: 'string' as const, index: true },\n guild_id: { type: 'string' as const, index: true },\n moderator_id: { type: 'string' as const },\n reason: { type: 'string' as const },\n created_at: { type: 'timestamp' as const },\n },\n },\n mod_cases: {\n columns: {\n id: { type: 'number' as const, primary: true },\n guild_id: { type: 'string' as const, index: true },\n user_id: { type: 'string' as const, index: true },\n moderator_id: { type: 'string' as const },\n action: { type: 'string' as const },\n reason: { type: 'string' as const },\n created_at: { type: 'timestamp' as const },\n },\n },\n};\n\nexport function getModerationSpec(config: ModerationConfig = {}): Partial<FurlowSpec> {\n return {\n commands: moderationCommands,\n state: {\n tables: moderationTables,\n },\n };\n}\n","/**\n * Welcome builtin module\n * Handles member join/leave messages, auto-role assignment, and welcome images\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, CanvasGenerator } from '@furlow/schema';\n\nexport interface WelcomeConfig {\n /** Channel to send welcome messages */\n channel?: string;\n /** Welcome message template */\n message?: string;\n /** Embed for welcome messages */\n embed?: {\n title?: string;\n description?: string;\n color?: string;\n thumbnail?: string;\n image?: string;\n footer?: string;\n };\n /** Use welcome image */\n useImage?: boolean;\n /** Welcome image generator name */\n imageGenerator?: string;\n /** Roles to assign on join */\n autoRoles?: string[];\n /** Leave channel (defaults to welcome channel) */\n leaveChannel?: string;\n /** Leave message template */\n leaveMessage?: string;\n /** Leave embed */\n leaveEmbed?: {\n title?: string;\n description?: string;\n color?: string;\n };\n /** DM new members */\n dmNewMembers?: boolean;\n /** DM message */\n dmMessage?: string;\n}\n\nexport const welcomeEventHandlers: EventHandler[] = [\n {\n event: 'member_join',\n actions: [\n // Auto-role assignment\n {\n action: 'flow_if',\n condition: '${config.welcome.autoRoles && config.welcome.autoRoles.length > 0}',\n then: [\n {\n action: 'assign_role',\n user: '${member.id}',\n role: '${config.welcome.autoRoles}',\n },\n ],\n },\n // DM new member\n {\n action: 'flow_if',\n condition: '${config.welcome.dmNewMembers}',\n then: [\n {\n action: 'send_dm',\n user: '${member.id}',\n content: '${config.welcome.dmMessage || \"Welcome to \" + guild.name + \"!\"}',\n },\n ],\n },\n // Welcome message with image\n {\n action: 'flow_if',\n condition: '${config.welcome.useImage}',\n then: [\n {\n action: 'canvas_render',\n generator: '${config.welcome.imageGenerator || \"welcome_card\"}',\n context: {\n member: '${member}',\n guild: '${guild}',\n memberCount: '${guild.memberCount}',\n },\n as: 'welcomeImage',\n },\n {\n action: 'send_message',\n channel: '${config.welcome.channel}',\n content: '${config.welcome.message || \"Welcome to the server, \" + member.displayName + \"!\"}',\n files: [\n {\n attachment: '${welcomeImage}',\n name: 'welcome.png',\n },\n ],\n },\n ],\n else: [\n // Welcome message without image\n {\n action: 'flow_if',\n condition: '${config.welcome.embed}',\n then: [\n {\n action: 'send_message',\n channel: '${config.welcome.channel}',\n content: '${config.welcome.message}',\n embed: {\n title: '${config.welcome.embed.title || \"Welcome!\"}',\n description: '${config.welcome.embed.description || \"Welcome to \" + guild.name + \", \" + member.displayName + \"!\"}',\n color: '${config.welcome.embed.color || \"#5865f2\"}',\n thumbnail: '${config.welcome.embed.thumbnail || member.avatarURL}',\n footer: {\n text: '${config.welcome.embed.footer || \"Member #\" + guild.memberCount}',\n },\n },\n },\n ],\n else: [\n {\n action: 'send_message',\n channel: '${config.welcome.channel}',\n content: '${config.welcome.message || \"Welcome to the server, \" + member.displayName + \"!\"}',\n },\n ],\n },\n ],\n },\n ],\n },\n {\n event: 'member_leave',\n actions: [\n {\n action: 'flow_if',\n condition: '${config.welcome.leaveChannel || config.welcome.channel}',\n then: [\n {\n action: 'flow_if',\n condition: '${config.welcome.leaveEmbed}',\n then: [\n {\n action: 'send_message',\n channel: '${config.welcome.leaveChannel || config.welcome.channel}',\n embed: {\n title: '${config.welcome.leaveEmbed.title || \"Goodbye!\"}',\n description: '${config.welcome.leaveEmbed.description || member.displayName + \" has left the server.\"}',\n color: '${config.welcome.leaveEmbed.color || \"#ed4245\"}',\n },\n },\n ],\n else: [\n {\n action: 'send_message',\n channel: '${config.welcome.leaveChannel || config.welcome.channel}',\n content: '${config.welcome.leaveMessage || member.displayName + \" has left the server.\"}',\n },\n ],\n },\n ],\n },\n ],\n },\n];\n\nexport const welcomeCommands: CommandDefinition[] = [\n {\n name: 'welcome',\n description: 'Welcome system commands',\n subcommands: [\n {\n name: 'test',\n description: 'Test the welcome message',\n actions: [\n {\n action: 'emit',\n event: 'member_join',\n data: {\n member: '${member}',\n guild: '${guild}',\n },\n },\n {\n action: 'reply',\n content: 'Welcome message test triggered!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'set-channel',\n description: 'Set the welcome channel',\n options: [\n { name: 'channel', description: 'Channel for welcome messages', type: 'channel', required: true },\n ],\n actions: [\n {\n action: 'set',\n key: 'config.welcome.channel',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: 'Welcome channel set to ${args.channel}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'set-message',\n description: 'Set the welcome message',\n options: [\n { name: 'message', description: 'Welcome message (use {member} and {guild})', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'set',\n key: 'config.welcome.message',\n value: '${args.message}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: 'Welcome message updated!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'add-autorole',\n description: 'Add an auto-role',\n options: [\n { name: 'role', description: 'Role to assign on join', type: 'role', required: true },\n ],\n actions: [\n {\n action: 'list_push',\n key: 'config.welcome.autoRoles',\n value: '${args.role.id}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: 'Auto-role ${args.role.name} added!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'remove-autorole',\n description: 'Remove an auto-role',\n options: [\n { name: 'role', description: 'Role to remove', type: 'role', required: true },\n ],\n actions: [\n {\n action: 'list_remove',\n key: 'config.welcome.autoRoles',\n value: '${args.role.id}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: 'Auto-role ${args.role.name} removed!',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport const welcomeCanvasGenerators: Record<string, CanvasGenerator> = {\n welcome_card: {\n width: 800,\n height: 300,\n background: '#2f3136',\n layers: [\n {\n type: 'rect',\n x: 0,\n y: 0,\n width: 800,\n height: 300,\n color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n radius: 16,\n },\n {\n type: 'circle_image',\n url: '${member.avatarURL || member.defaultAvatarURL}',\n x: 400,\n y: 100,\n radius: 64,\n border: {\n width: 4,\n color: '#ffffff',\n },\n },\n {\n type: 'text',\n text: 'Welcome!',\n x: 400,\n y: 200,\n font: '32px \"Poppins\", sans-serif',\n color: '#ffffff',\n align: 'center',\n },\n {\n type: 'text',\n text: '${member.displayName}',\n x: 400,\n y: 240,\n font: 'bold 28px \"Poppins\", sans-serif',\n color: '#ffffff',\n align: 'center',\n },\n {\n type: 'text',\n text: 'Member #${guild.memberCount}',\n x: 400,\n y: 275,\n font: '16px \"Poppins\", sans-serif',\n color: 'rgba(255, 255, 255, 0.8)',\n align: 'center',\n },\n ],\n },\n};\n\nexport function getWelcomeSpec(config: WelcomeConfig = {}): Partial<FurlowSpec> {\n return {\n events: welcomeEventHandlers,\n commands: welcomeCommands,\n canvas: {\n generators: welcomeCanvasGenerators,\n },\n };\n}\n","/**\n * Logging builtin module\n * Handles comprehensive server logging for messages, members, voice, and moderation\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler } from '@furlow/schema';\n\nexport interface LoggingConfig {\n /** Default log channel */\n channel?: string;\n /** Separate channels per category */\n channels?: {\n messages?: string;\n members?: string;\n voice?: string;\n server?: string;\n moderation?: string;\n };\n /** Ignored channels */\n ignoredChannels?: string[];\n /** Ignored roles (users with these roles won't be logged) */\n ignoredRoles?: string[];\n /** Events to log */\n events?: {\n messageDelete?: boolean;\n messageEdit?: boolean;\n messageBulkDelete?: boolean;\n memberJoin?: boolean;\n memberLeave?: boolean;\n memberUpdate?: boolean;\n memberBan?: boolean;\n memberUnban?: boolean;\n voiceJoin?: boolean;\n voiceLeave?: boolean;\n voiceMove?: boolean;\n channelCreate?: boolean;\n channelDelete?: boolean;\n channelUpdate?: boolean;\n roleCreate?: boolean;\n roleDelete?: boolean;\n roleUpdate?: boolean;\n inviteCreate?: boolean;\n inviteDelete?: boolean;\n };\n /** Include images in logs */\n includeImages?: boolean;\n}\n\nexport const loggingEventHandlers: EventHandler[] = [\n // Message Delete\n {\n event: 'message_delete',\n condition: '${config.logging.events?.messageDelete !== false && !config.logging.ignoredChannels?.includes(channel.id)}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.messages || config.logging.channel}',\n embed: {\n title: 'Message Deleted',\n description: '${message.content || \"*No text content*\"}',\n color: '#ed4245',\n fields: [\n { name: 'Author', value: '${message.author ? \"<@\" + message.author.id + \">\" : \"Unknown\"}', inline: true },\n { name: 'Channel', value: '<#${channel.id}>', inline: true },\n { name: 'Message ID', value: '${message.id}', inline: true },\n ],\n footer: {\n text: 'User ID: ${message.author?.id || \"Unknown\"}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Message Edit\n {\n event: 'message_update',\n condition: '${config.logging.events?.messageEdit !== false && oldMessage.content !== newMessage.content && !config.logging.ignoredChannels?.includes(channel.id)}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.messages || config.logging.channel}',\n embed: {\n title: 'Message Edited',\n color: '#fee75c',\n fields: [\n { name: 'Before', value: '${truncate(oldMessage.content || \"*Empty*\", 1024)}' },\n { name: 'After', value: '${truncate(newMessage.content || \"*Empty*\", 1024)}' },\n { name: 'Author', value: '<@${newMessage.author.id}>', inline: true },\n { name: 'Channel', value: '<#${channel.id}>', inline: true },\n { name: 'Jump to Message', value: '[Click here](${newMessage.url})', inline: true },\n ],\n footer: {\n text: 'User ID: ${newMessage.author.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Bulk Message Delete\n {\n event: 'message_bulk_delete',\n condition: '${config.logging.events?.messageBulkDelete !== false}',\n actions: [\n {\n action: 'set',\n key: 'logContent',\n value: '${messages | map(m => \"[\" + (m.author?.tag || \"Unknown\") + \"]: \" + (m.content || \"*attachment/embed*\")) | join(\"\\\\n\")}',\n },\n {\n action: 'send_message',\n channel: '${config.logging.channels?.messages || config.logging.channel}',\n embed: {\n title: 'Bulk Messages Deleted',\n description: '${messages.length} messages were deleted in <#${channel.id}>',\n color: '#ed4245',\n timestamp: '${now()}',\n },\n files: [\n {\n attachment: '${Buffer.from(logContent)}',\n name: 'deleted-messages.txt',\n },\n ],\n },\n ],\n },\n // Member Join\n {\n event: 'member_join',\n condition: '${config.logging.events?.memberJoin !== false}',\n actions: [\n {\n action: 'set',\n key: 'accountAge',\n value: '${floor((now() - member.user.createdAt) / (1000 * 60 * 60 * 24))}',\n },\n {\n action: 'send_message',\n channel: '${config.logging.channels?.members || config.logging.channel}',\n embed: {\n title: 'Member Joined',\n description: '<@${member.id}> joined the server',\n color: '#57f287',\n thumbnail: '${member.user.avatarURL}',\n fields: [\n { name: 'Username', value: '${member.user.tag}', inline: true },\n { name: 'Account Age', value: '${accountAge} days', inline: true },\n { name: 'Member Count', value: '${guild.memberCount}', inline: true },\n ],\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Member Leave\n {\n event: 'member_leave',\n condition: '${config.logging.events?.memberLeave !== false}',\n actions: [\n {\n action: 'set',\n key: 'roles',\n value: '${member.roles?.cache?.filter(r => r.id !== guild.id)?.map(r => r.name)?.join(\", \") || \"None\"}',\n },\n {\n action: 'send_message',\n channel: '${config.logging.channels?.members || config.logging.channel}',\n embed: {\n title: 'Member Left',\n description: '<@${member.id}> left the server',\n color: '#ed4245',\n thumbnail: '${member.user.avatarURL}',\n fields: [\n { name: 'Username', value: '${member.user.tag}', inline: true },\n { name: 'Roles', value: '${truncate(roles, 1024)}', inline: false },\n { name: 'Joined At', value: '${timestamp(member.joinedAt, \"R\")}', inline: true },\n ],\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Member Update (roles, nickname)\n {\n event: 'member_update',\n condition: '${config.logging.events?.memberUpdate !== false}',\n actions: [\n // Role changes\n {\n action: 'flow_if',\n condition: '${oldMember.roles.cache.size !== newMember.roles.cache.size}',\n then: [\n {\n action: 'set',\n key: 'addedRoles',\n value: '${newMember.roles.cache.filter(r => !oldMember.roles.cache.has(r.id)).map(r => r.name).join(\", \")}',\n },\n {\n action: 'set',\n key: 'removedRoles',\n value: '${oldMember.roles.cache.filter(r => !newMember.roles.cache.has(r.id)).map(r => r.name).join(\", \")}',\n },\n {\n action: 'send_message',\n channel: '${config.logging.channels?.members || config.logging.channel}',\n embed: {\n title: 'Member Roles Updated',\n description: '<@${newMember.id}>\\'s roles were changed',\n color: '#5865f2',\n fields: [\n { name: 'Added Roles', value: '${addedRoles || \"None\"}', inline: true },\n { name: 'Removed Roles', value: '${removedRoles || \"None\"}', inline: true },\n ],\n footer: {\n text: 'User ID: ${newMember.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Nickname changes\n {\n action: 'flow_if',\n condition: '${oldMember.nickname !== newMember.nickname}',\n then: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.members || config.logging.channel}',\n embed: {\n title: 'Nickname Changed',\n description: '<@${newMember.id}>\\'s nickname was changed',\n color: '#5865f2',\n fields: [\n { name: 'Before', value: '${oldMember.nickname || oldMember.user.username}', inline: true },\n { name: 'After', value: '${newMember.nickname || newMember.user.username}', inline: true },\n ],\n footer: {\n text: 'User ID: ${newMember.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n ],\n },\n // Member Ban\n {\n event: 'member_ban',\n condition: '${config.logging.events?.memberBan !== false}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.moderation || config.logging.channel}',\n embed: {\n title: 'Member Banned',\n description: '<@${user.id}> was banned',\n color: '#ed4245',\n thumbnail: '${user.avatarURL}',\n fields: [\n { name: 'Username', value: '${user.tag}', inline: true },\n { name: 'Reason', value: '${ban.reason || \"No reason provided\"}', inline: false },\n ],\n footer: {\n text: 'User ID: ${user.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Member Unban\n {\n event: 'member_unban',\n condition: '${config.logging.events?.memberUnban !== false}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.moderation || config.logging.channel}',\n embed: {\n title: 'Member Unbanned',\n description: '<@${user.id}> was unbanned',\n color: '#57f287',\n thumbnail: '${user.avatarURL}',\n fields: [\n { name: 'Username', value: '${user.tag}', inline: true },\n ],\n footer: {\n text: 'User ID: ${user.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Voice Join\n {\n event: 'voice_join',\n condition: '${config.logging.events?.voiceJoin !== false}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.voice || config.logging.channel}',\n embed: {\n title: 'Voice Channel Joined',\n description: '<@${member.id}> joined <#${channel.id}>',\n color: '#57f287',\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Voice Leave\n {\n event: 'voice_leave',\n condition: '${config.logging.events?.voiceLeave !== false}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.voice || config.logging.channel}',\n embed: {\n title: 'Voice Channel Left',\n description: '<@${member.id}> left <#${channel.id}>',\n color: '#ed4245',\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Voice Move\n {\n event: 'voice_move',\n condition: '${config.logging.events?.voiceMove !== false}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.voice || config.logging.channel}',\n embed: {\n title: 'Voice Channel Switch',\n description: '<@${member.id}> switched voice channels',\n color: '#5865f2',\n fields: [\n { name: 'From', value: '<#${oldChannel.id}>', inline: true },\n { name: 'To', value: '<#${newChannel.id}>', inline: true },\n ],\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Channel Create\n {\n event: 'channel_create',\n condition: '${config.logging.events?.channelCreate !== false}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.server || config.logging.channel}',\n embed: {\n title: 'Channel Created',\n description: '<#${channel.id}> was created',\n color: '#57f287',\n fields: [\n { name: 'Name', value: '${channel.name}', inline: true },\n { name: 'Type', value: '${channel.type}', inline: true },\n ],\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Channel Delete\n {\n event: 'channel_delete',\n condition: '${config.logging.events?.channelDelete !== false}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.server || config.logging.channel}',\n embed: {\n title: 'Channel Deleted',\n description: '#${channel.name} was deleted',\n color: '#ed4245',\n fields: [\n { name: 'Type', value: '${channel.type}', inline: true },\n ],\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Role Create\n {\n event: 'role_create',\n condition: '${config.logging.events?.roleCreate !== false}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.server || config.logging.channel}',\n embed: {\n title: 'Role Created',\n description: '${role.name} was created',\n color: '${role.hexColor || \"#57f287\"}',\n fields: [\n { name: 'Color', value: '${role.hexColor || \"None\"}', inline: true },\n { name: 'Hoisted', value: '${role.hoist ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Mentionable', value: '${role.mentionable ? \"Yes\" : \"No\"}', inline: true },\n ],\n footer: {\n text: 'Role ID: ${role.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Role Delete\n {\n event: 'role_delete',\n condition: '${config.logging.events?.roleDelete !== false}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.server || config.logging.channel}',\n embed: {\n title: 'Role Deleted',\n description: '${role.name} was deleted',\n color: '#ed4245',\n footer: {\n text: 'Role ID: ${role.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n];\n\nexport const loggingCommands: CommandDefinition[] = [\n {\n name: 'logging',\n description: 'Logging configuration commands',\n subcommands: [\n {\n name: 'set-channel',\n description: 'Set the logging channel',\n options: [\n { name: 'channel', description: 'Channel for logs', type: 'channel', required: true },\n { name: 'category', description: 'Log category', type: 'string', required: false, choices: [\n { name: 'All', value: 'all' },\n { name: 'Messages', value: 'messages' },\n { name: 'Members', value: 'members' },\n { name: 'Voice', value: 'voice' },\n { name: 'Server', value: 'server' },\n { name: 'Moderation', value: 'moderation' },\n ]},\n ],\n actions: [\n {\n action: 'flow_if',\n condition: '${!args.category || args.category === \"all\"}',\n then: [\n {\n action: 'set',\n key: 'config.logging.channel',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n ],\n else: [\n {\n action: 'set',\n key: 'config.logging.channels.${args.category}',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n ],\n },\n {\n action: 'reply',\n content: 'Logging channel updated!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'toggle',\n description: 'Toggle a logging event',\n options: [\n { name: 'event', description: 'Event to toggle', type: 'string', required: true, choices: [\n { name: 'Message Delete', value: 'messageDelete' },\n { name: 'Message Edit', value: 'messageEdit' },\n { name: 'Member Join', value: 'memberJoin' },\n { name: 'Member Leave', value: 'memberLeave' },\n { name: 'Member Ban', value: 'memberBan' },\n { name: 'Voice Join', value: 'voiceJoin' },\n { name: 'Voice Leave', value: 'voiceLeave' },\n ]},\n { name: 'enabled', description: 'Enable or disable', type: 'boolean', required: true },\n ],\n actions: [\n {\n action: 'set',\n key: 'config.logging.events.${args.event}',\n value: '${args.enabled}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: '${args.event} logging ${args.enabled ? \"enabled\" : \"disabled\"}!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'ignore-channel',\n description: 'Ignore a channel from logging',\n options: [\n { name: 'channel', description: 'Channel to ignore', type: 'channel', required: true },\n ],\n actions: [\n {\n action: 'list_push',\n key: 'config.logging.ignoredChannels',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: '${args.channel} will now be ignored from logs.',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport function getLoggingSpec(config: LoggingConfig = {}): Partial<FurlowSpec> {\n return {\n events: loggingEventHandlers,\n commands: loggingCommands,\n };\n}\n","/**\n * Tickets builtin module\n * Handles ticket creation, claiming, closing, and transcripts\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition, ComponentDefinition } from '@furlow/schema';\n\nexport interface TicketsConfig {\n /** Category to create tickets in */\n category?: string;\n /** Support roles that can see tickets */\n supportRoles?: string[];\n /** Ticket channel naming pattern */\n channelPattern?: string;\n /** Maximum open tickets per user */\n maxTicketsPerUser?: number;\n /** Ticket panel channel */\n panelChannel?: string;\n /** Log channel for ticket transcripts */\n logChannel?: string;\n /** Auto-close inactive tickets (hours) */\n autoCloseAfter?: number;\n /** Ticket categories/types */\n categories?: Array<{\n id: string;\n name: string;\n description?: string;\n emoji?: string;\n supportRoles?: string[];\n }>;\n /** DM user on ticket close */\n dmOnClose?: boolean;\n /** Include transcript on close */\n includeTranscript?: boolean;\n}\n\nexport const ticketsTables: Record<string, TableDefinition> = {\n tickets: {\n columns: {\n id: { type: 'number', primary: true },\n channel_id: { type: 'string', unique: true },\n guild_id: { type: 'string', index: true },\n user_id: { type: 'string', index: true },\n category: { type: 'string' },\n claimed_by: { type: 'string' },\n status: { type: 'string', default: 'open' },\n created_at: { type: 'timestamp' },\n closed_at: { type: 'timestamp' },\n },\n },\n ticket_messages: {\n columns: {\n id: { type: 'number', primary: true },\n ticket_id: { type: 'number', index: true },\n author_id: { type: 'string' },\n author_name: { type: 'string' },\n content: { type: 'string' },\n attachments: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const ticketPanelComponents: ComponentDefinition[] = [\n {\n type: 'action_row',\n components: [\n {\n type: 'button',\n style: 'primary',\n label: 'Create Ticket',\n emoji: '📩',\n custom_id: 'ticket_create',\n },\n ],\n },\n];\n\nexport const ticketControlComponents: ComponentDefinition[] = [\n {\n type: 'action_row',\n components: [\n {\n type: 'button',\n style: 'secondary',\n label: 'Claim',\n emoji: '🙋',\n custom_id: 'ticket_claim',\n },\n {\n type: 'button',\n style: 'danger',\n label: 'Close',\n emoji: '🔒',\n custom_id: 'ticket_close',\n },\n {\n type: 'button',\n style: 'secondary',\n label: 'Transcript',\n emoji: '📜',\n custom_id: 'ticket_transcript',\n },\n ],\n },\n];\n\nexport const ticketsEventHandlers: EventHandler[] = [\n // Handle ticket creation button\n {\n event: 'button_click',\n condition: '${interaction.customId === \"ticket_create\"}',\n actions: [\n // Check max tickets\n {\n action: 'db_query',\n table: 'tickets',\n where: {\n guild_id: '${guild.id}',\n user_id: '${user.id}',\n status: 'open',\n },\n as: 'userTickets',\n },\n {\n action: 'flow_if',\n condition: '${userTickets.length >= (config.tickets.maxTicketsPerUser || 1)}',\n then: [\n {\n action: 'reply',\n content: 'You already have the maximum number of open tickets!',\n ephemeral: true,\n },\n { action: 'abort' },\n ],\n },\n // Show category selector if configured\n {\n action: 'flow_if',\n condition: '${config.tickets.categories && config.tickets.categories.length > 0}',\n then: [\n {\n action: 'reply',\n content: 'Select a ticket category:',\n ephemeral: true,\n components: [\n {\n type: 'action_row',\n components: [\n {\n type: 'select_menu',\n custom_id: 'ticket_category_select',\n placeholder: 'Select category...',\n options: '${config.tickets.categories | map(c => ({ label: c.name, value: c.id, description: c.description, emoji: c.emoji }))}',\n },\n ],\n },\n ],\n },\n ],\n else: [\n { action: 'emit', event: 'ticket_create_confirmed', data: { category: 'general' } },\n ],\n },\n ],\n },\n // Handle category selection\n {\n event: 'select_menu',\n condition: '${interaction.customId === \"ticket_category_select\"}',\n actions: [\n {\n action: 'emit',\n event: 'ticket_create_confirmed',\n data: { category: '${interaction.values[0]}' },\n },\n ],\n },\n // Create the ticket channel\n {\n event: 'ticket_create_confirmed',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { guild_id: '${guild.id}' },\n order_by: 'id DESC',\n limit: 1,\n as: 'lastTicket',\n },\n {\n action: 'set',\n key: 'ticketNumber',\n value: '${(lastTicket[0]?.id || 0) + 1}',\n },\n {\n action: 'set',\n key: 'channelName',\n value: '${(config.tickets.channelPattern || \"ticket-{number}\") | replace(\"{number}\", ticketNumber) | replace(\"{user}\", user.username) | replace(\"{category}\", event.data.category)}',\n },\n // Get support roles for this category\n {\n action: 'set',\n key: 'categoryConfig',\n value: '${config.tickets.categories?.find(c => c.id === event.data.category)}',\n },\n {\n action: 'set',\n key: 'supportRoles',\n value: '${categoryConfig?.supportRoles || config.tickets.supportRoles || []}',\n },\n // Create channel with permissions\n {\n action: 'create_channel',\n name: '${channelName}',\n type: 'text',\n parent: '${config.tickets.category}',\n permission_overwrites: [\n {\n id: '${guild.id}',\n type: 'role',\n deny: ['VIEW_CHANNEL'],\n },\n {\n id: '${user.id}',\n type: 'member',\n allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'READ_MESSAGE_HISTORY', 'ATTACH_FILES'],\n },\n '${supportRoles | map(r => ({ id: r, type: \"role\", allow: [\"VIEW_CHANNEL\", \"SEND_MESSAGES\", \"READ_MESSAGE_HISTORY\", \"ATTACH_FILES\", \"MANAGE_MESSAGES\"] }))}',\n ],\n as: 'ticketChannel',\n },\n // Store in database\n {\n action: 'db_insert',\n table: 'tickets',\n data: {\n channel_id: '${ticketChannel.id}',\n guild_id: '${guild.id}',\n user_id: '${user.id}',\n category: '${event.data.category}',\n status: 'open',\n created_at: '${now()}',\n },\n },\n // Send opening message\n {\n action: 'send_message',\n channel: '${ticketChannel.id}',\n content: 'Welcome ${user}! Support will be with you shortly.',\n embed: {\n title: 'Ticket #${ticketNumber}',\n description: 'Please describe your issue and a staff member will assist you.',\n color: '#5865f2',\n fields: [\n { name: 'Category', value: '${categoryConfig?.name || \"General\"}', inline: true },\n { name: 'Created by', value: '${user}', inline: true },\n ],\n timestamp: '${now()}',\n },\n components: '${ticketControlComponents}',\n },\n // Reply to original interaction\n {\n action: 'update_message',\n content: 'Your ticket has been created: ${ticketChannel}',\n components: [],\n },\n ],\n },\n // Handle claim button\n {\n event: 'button_click',\n condition: '${interaction.customId === \"ticket_claim\"}',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '${!ticket[0]}',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'flow_if',\n condition: '${ticket[0].claimed_by}',\n then: [\n { action: 'reply', content: 'This ticket is already claimed by <@${ticket[0].claimed_by}>!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_update',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n data: { claimed_by: '${user.id}' },\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n description: '${user} has claimed this ticket.',\n color: '#57f287',\n },\n },\n { action: 'reply', content: 'You have claimed this ticket!', ephemeral: true },\n ],\n },\n // Handle close button\n {\n event: 'button_click',\n condition: '${interaction.customId === \"ticket_close\"}',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '${!ticket[0]}',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Confirm close\n {\n action: 'reply',\n content: 'Are you sure you want to close this ticket?',\n ephemeral: true,\n components: [\n {\n type: 'action_row',\n components: [\n { type: 'button', style: 'danger', label: 'Close Ticket', custom_id: 'ticket_close_confirm' },\n { type: 'button', style: 'secondary', label: 'Cancel', custom_id: 'ticket_close_cancel' },\n ],\n },\n ],\n },\n ],\n },\n // Handle close confirmation\n {\n event: 'button_click',\n condition: '${interaction.customId === \"ticket_close_confirm\"}',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n // Generate transcript if configured\n {\n action: 'flow_if',\n condition: '${config.tickets.includeTranscript && config.tickets.logChannel}',\n then: [\n {\n action: 'db_query',\n table: 'ticket_messages',\n where: { ticket_id: '${ticket[0].id}' },\n order_by: 'created_at ASC',\n as: 'messages',\n },\n {\n action: 'set',\n key: 'transcriptText',\n value: '${messages | map(m => \"[\" + formatDate(m.created_at, \"YYYY-MM-DD HH:mm:ss\") + \"] \" + m.author_name + \": \" + m.content) | join(\"\\\\n\")}',\n },\n {\n action: 'send_message',\n channel: '${config.tickets.logChannel}',\n embed: {\n title: 'Ticket Closed',\n fields: [\n { name: 'Ticket ID', value: '${ticket[0].id}', inline: true },\n { name: 'Opened by', value: '<@${ticket[0].user_id}>', inline: true },\n { name: 'Closed by', value: '${user}', inline: true },\n { name: 'Category', value: '${ticket[0].category}', inline: true },\n ],\n color: '#ed4245',\n timestamp: '${now()}',\n },\n files: [\n {\n attachment: '${Buffer.from(transcriptText)}',\n name: 'transcript-${ticket[0].id}.txt',\n },\n ],\n },\n ],\n },\n // Update database\n {\n action: 'db_update',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n data: { status: 'closed', closed_at: '${now()}' },\n },\n // DM user if configured\n {\n action: 'flow_if',\n condition: '${config.tickets.dmOnClose}',\n then: [\n {\n action: 'send_dm',\n user: '${ticket[0].user_id}',\n embed: {\n title: 'Ticket Closed',\n description: 'Your ticket in ${guild.name} has been closed.',\n color: '#ed4245',\n },\n },\n ],\n },\n // Delete channel after delay\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: 'This ticket will be deleted in 5 seconds...',\n },\n { action: 'wait', duration: 5000 },\n { action: 'delete_channel', channel: '${channel.id}' },\n ],\n },\n // Handle transcript button\n {\n event: 'button_click',\n condition: '${interaction.customId === \"ticket_transcript\"}',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'db_query',\n table: 'ticket_messages',\n where: { ticket_id: '${ticket[0].id}' },\n order_by: 'created_at ASC',\n as: 'messages',\n },\n {\n action: 'set',\n key: 'transcriptText',\n value: '${messages | map(m => \"[\" + formatDate(m.created_at, \"YYYY-MM-DD HH:mm:ss\") + \"] \" + m.author_name + \": \" + m.content) | join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n content: 'Here is the transcript:',\n ephemeral: true,\n files: [\n {\n attachment: '${Buffer.from(transcriptText)}',\n name: 'transcript-${ticket[0].id}.txt',\n },\n ],\n },\n ],\n },\n // Log ticket messages\n {\n event: 'message',\n condition: '${channel.parentId === config.tickets.category}',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '${ticket[0]}',\n then: [\n {\n action: 'db_insert',\n table: 'ticket_messages',\n data: {\n ticket_id: '${ticket[0].id}',\n author_id: '${user.id}',\n author_name: '${user.tag}',\n content: '${message.content}',\n attachments: '${message.attachments | map(a => a.url)}',\n created_at: '${now()}',\n },\n },\n ],\n },\n ],\n },\n];\n\nexport const ticketsCommands: CommandDefinition[] = [\n {\n name: 'ticket',\n description: 'Ticket management commands',\n subcommands: [\n {\n name: 'panel',\n description: 'Create a ticket panel',\n options: [\n { name: 'channel', description: 'Channel to send panel', type: 'channel', required: false },\n { name: 'message', description: 'Custom panel message', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'send_message',\n channel: '${args.channel?.id || channel.id}',\n embed: {\n title: 'Support Tickets',\n description: '${args.message || \"Need help? Click the button below to create a support ticket.\"}',\n color: '#5865f2',\n },\n components: '${ticketPanelComponents}',\n },\n {\n action: 'reply',\n content: 'Ticket panel created!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'add',\n description: 'Add a user to the ticket',\n options: [\n { name: 'user', description: 'User to add', type: 'user', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '${!ticket[0]}',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set_channel_permissions',\n channel: '${channel.id}',\n user: '${args.user.id}',\n allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'READ_MESSAGE_HISTORY'],\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: '${args.user} has been added to the ticket.',\n },\n { action: 'reply', content: 'User added!', ephemeral: true },\n ],\n },\n {\n name: 'remove',\n description: 'Remove a user from the ticket',\n options: [\n { name: 'user', description: 'User to remove', type: 'user', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '${!ticket[0]}',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set_channel_permissions',\n channel: '${channel.id}',\n user: '${args.user.id}',\n deny: ['VIEW_CHANNEL'],\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: '${args.user.username} has been removed from the ticket.',\n },\n { action: 'reply', content: 'User removed!', ephemeral: true },\n ],\n },\n {\n name: 'rename',\n description: 'Rename the ticket channel',\n options: [\n { name: 'name', description: 'New channel name', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '${!ticket[0]}',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'edit_channel',\n channel: '${channel.id}',\n name: '${args.name}',\n },\n { action: 'reply', content: 'Ticket renamed!', ephemeral: true },\n ],\n },\n ],\n },\n];\n\nexport function getTicketsSpec(config: TicketsConfig = {}): Partial<FurlowSpec> {\n return {\n events: ticketsEventHandlers,\n commands: ticketsCommands,\n state: {\n tables: ticketsTables,\n },\n };\n}\n","/**\n * Reaction Roles builtin module\n * Handles button roles, reaction roles, and select menu roles\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface ReactionRolesConfig {\n /** Maximum roles a user can have from a single panel */\n maxRolesPerPanel?: number;\n /** Log channel for role assignments */\n logChannel?: string;\n}\n\nexport const reactionRolesTables: Record<string, TableDefinition> = {\n reaction_role_panels: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n channel_id: { type: 'string' },\n message_id: { type: 'string', unique: true },\n type: { type: 'string' }, // 'button', 'reaction', 'select'\n mode: { type: 'string', default: 'toggle' }, // 'toggle', 'give', 'take', 'unique'\n max_roles: { type: 'number' },\n created_at: { type: 'timestamp' },\n },\n },\n reaction_role_entries: {\n columns: {\n id: { type: 'number', primary: true },\n panel_id: { type: 'number', index: true },\n role_id: { type: 'string' },\n emoji: { type: 'string' },\n label: { type: 'string' },\n description: { type: 'string' },\n style: { type: 'string' }, // button style\n },\n },\n};\n\nexport const reactionRolesEventHandlers: EventHandler[] = [\n // Handle button clicks\n {\n event: 'button_click',\n condition: '${interaction.customId.startsWith(\"rr_\")}',\n actions: [\n {\n action: 'set',\n key: 'roleId',\n value: '${interaction.customId.replace(\"rr_\", \"\")}',\n },\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${interaction.message.id}' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '${!panel[0]}',\n then: [\n { action: 'reply', content: 'This role panel is no longer valid.', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'hasRole',\n value: '${member.roles.cache.has(roleId)}',\n },\n // Handle based on mode\n {\n action: 'flow_switch',\n value: '${panel[0].mode}',\n cases: {\n toggle: [\n {\n action: 'flow_if',\n condition: '${hasRole}',\n then: [\n { action: 'remove_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Removed <@&${roleId}>', ephemeral: true },\n ],\n else: [\n { action: 'assign_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Added <@&${roleId}>', ephemeral: true },\n ],\n },\n ],\n give: [\n {\n action: 'flow_if',\n condition: '${hasRole}',\n then: [\n { action: 'reply', content: 'You already have <@&${roleId}>', ephemeral: true },\n ],\n else: [\n { action: 'assign_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Added <@&${roleId}>', ephemeral: true },\n ],\n },\n ],\n take: [\n {\n action: 'flow_if',\n condition: '${!hasRole}',\n then: [\n { action: 'reply', content: 'You don\\'t have <@&${roleId}>', ephemeral: true },\n ],\n else: [\n { action: 'remove_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Removed <@&${roleId}>', ephemeral: true },\n ],\n },\n ],\n unique: [\n // Remove other roles from this panel first\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}' },\n as: 'entries',\n },\n {\n action: 'batch',\n items: '${entries.filter(e => e.role_id !== roleId && member.roles.cache.has(e.role_id))}',\n each: { action: 'remove_role', user: '${member.id}', role: '${item.role_id}' },\n },\n { action: 'assign_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Set role to <@&${roleId}>', ephemeral: true },\n ],\n },\n },\n // Log if configured\n {\n action: 'flow_if',\n condition: '${config.reactionRoles?.logChannel}',\n then: [\n {\n action: 'send_message',\n channel: '${config.reactionRoles.logChannel}',\n embed: {\n description: '${member} ${hasRole ? \"removed\" : \"added\"} <@&${roleId}>',\n color: '${hasRole ? \"#ed4245\" : \"#57f287\"}',\n timestamp: '${now()}',\n },\n },\n ],\n },\n ],\n },\n // Handle select menu\n {\n event: 'select_menu',\n condition: '${interaction.customId.startsWith(\"rr_select_\")}',\n actions: [\n {\n action: 'set',\n key: 'panelId',\n value: '${interaction.customId.replace(\"rr_select_\", \"\")}',\n },\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { id: '${panelId}' },\n as: 'panel',\n },\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panelId}' },\n as: 'entries',\n },\n // Get selected role IDs\n {\n action: 'set',\n key: 'selectedRoles',\n value: '${interaction.values}',\n },\n // Remove roles not selected\n {\n action: 'batch',\n items: '${entries.filter(e => !selectedRoles.includes(e.role_id) && member.roles.cache.has(e.role_id))}',\n each: { action: 'remove_role', user: '${member.id}', role: '${item.role_id}' },\n },\n // Add selected roles\n {\n action: 'batch',\n items: '${selectedRoles.filter(r => !member.roles.cache.has(r))}',\n each: { action: 'assign_role', user: '${member.id}', role: '${item}' },\n },\n {\n action: 'reply',\n content: 'Roles updated!',\n ephemeral: true,\n },\n ],\n },\n // Handle reactions\n {\n event: 'reaction_add',\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${message.id}', type: 'reaction' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '${panel[0]}',\n then: [\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}', emoji: '${reaction.emoji.name || reaction.emoji.id}' },\n as: 'entry',\n },\n {\n action: 'flow_if',\n condition: '${entry[0]}',\n then: [\n { action: 'assign_role', user: '${user.id}', role: '${entry[0].role_id}' },\n ],\n },\n ],\n },\n ],\n },\n // Handle reaction remove\n {\n event: 'reaction_remove',\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${message.id}', type: 'reaction' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '${panel[0] && panel[0].mode !== \"give\"}',\n then: [\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}', emoji: '${reaction.emoji.name || reaction.emoji.id}' },\n as: 'entry',\n },\n {\n action: 'flow_if',\n condition: '${entry[0]}',\n then: [\n { action: 'remove_role', user: '${user.id}', role: '${entry[0].role_id}' },\n ],\n },\n ],\n },\n ],\n },\n];\n\nexport const reactionRolesCommands: CommandDefinition[] = [\n {\n name: 'reactionroles',\n description: 'Reaction roles management',\n subcommands: [\n {\n name: 'create-button',\n description: 'Create a button role panel',\n options: [\n { name: 'title', description: 'Panel title', type: 'string', required: false },\n { name: 'description', description: 'Panel description', type: 'string', required: false },\n { name: 'mode', description: 'Role mode', type: 'string', required: false, choices: [\n { name: 'Toggle (add/remove)', value: 'toggle' },\n { name: 'Give only', value: 'give' },\n { name: 'Take only', value: 'take' },\n { name: 'Unique (one at a time)', value: 'unique' },\n ]},\n ],\n actions: [\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n title: '${args.title || \"Role Selection\"}',\n description: '${args.description || \"Click a button to get a role!\"}',\n color: '#5865f2',\n },\n as: 'panelMessage',\n },\n {\n action: 'db_insert',\n table: 'reaction_role_panels',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n message_id: '${panelMessage.id}',\n type: 'button',\n mode: '${args.mode || \"toggle\"}',\n created_at: '${now()}',\n },\n as: 'panel',\n },\n {\n action: 'reply',\n content: 'Button role panel created! Use `/reactionroles add-button` to add roles.\\nPanel ID: ${panel.id}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'add-button',\n description: 'Add a button to a role panel',\n options: [\n { name: 'message_id', description: 'Panel message ID', type: 'string', required: true },\n { name: 'role', description: 'Role to assign', type: 'role', required: true },\n { name: 'label', description: 'Button label', type: 'string', required: false },\n { name: 'emoji', description: 'Button emoji', type: 'string', required: false },\n { name: 'style', description: 'Button style', type: 'string', required: false, choices: [\n { name: 'Blue (Primary)', value: 'primary' },\n { name: 'Gray (Secondary)', value: 'secondary' },\n { name: 'Green (Success)', value: 'success' },\n { name: 'Red (Danger)', value: 'danger' },\n ]},\n ],\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${args.message_id}' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '${!panel[0]}',\n then: [\n { action: 'reply', content: 'Panel not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_insert',\n table: 'reaction_role_entries',\n data: {\n panel_id: '${panel[0].id}',\n role_id: '${args.role.id}',\n label: '${args.label || args.role.name}',\n emoji: '${args.emoji}',\n style: '${args.style || \"primary\"}',\n },\n },\n // Get all entries for this panel\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}' },\n as: 'entries',\n },\n // Build components\n {\n action: 'set',\n key: 'buttons',\n value: '${entries.map(e => ({ type: \"button\", style: e.style, label: e.label, emoji: e.emoji, custom_id: \"rr_\" + e.role_id }))}',\n },\n {\n action: 'set',\n key: 'rows',\n value: '${chunk(buttons, 5).map(row => ({ type: \"action_row\", components: row }))}',\n },\n // Update message\n {\n action: 'edit_message',\n channel: '${panel[0].channel_id}',\n message: '${panel[0].message_id}',\n components: '${rows}',\n },\n {\n action: 'reply',\n content: 'Added ${args.role.name} to the panel!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'create-select',\n description: 'Create a select menu role panel',\n options: [\n { name: 'title', description: 'Panel title', type: 'string', required: false },\n { name: 'description', description: 'Panel description', type: 'string', required: false },\n { name: 'max_roles', description: 'Maximum roles that can be selected', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n title: '${args.title || \"Role Selection\"}',\n description: '${args.description || \"Select your roles from the menu below!\"}',\n color: '#5865f2',\n },\n as: 'panelMessage',\n },\n {\n action: 'db_insert',\n table: 'reaction_role_panels',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n message_id: '${panelMessage.id}',\n type: 'select',\n mode: 'toggle',\n max_roles: '${args.max_roles}',\n created_at: '${now()}',\n },\n as: 'panel',\n },\n {\n action: 'reply',\n content: 'Select menu role panel created! Use `/reactionroles add-option` to add roles.\\nPanel ID: ${panel.id}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'add-option',\n description: 'Add an option to a select menu panel',\n options: [\n { name: 'message_id', description: 'Panel message ID', type: 'string', required: true },\n { name: 'role', description: 'Role to assign', type: 'role', required: true },\n { name: 'label', description: 'Option label', type: 'string', required: false },\n { name: 'description', description: 'Option description', type: 'string', required: false },\n { name: 'emoji', description: 'Option emoji', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${args.message_id}', type: 'select' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '${!panel[0]}',\n then: [\n { action: 'reply', content: 'Select menu panel not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_insert',\n table: 'reaction_role_entries',\n data: {\n panel_id: '${panel[0].id}',\n role_id: '${args.role.id}',\n label: '${args.label || args.role.name}',\n description: '${args.description}',\n emoji: '${args.emoji}',\n },\n },\n // Get all entries for this panel\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}' },\n as: 'entries',\n },\n // Build select menu\n {\n action: 'set',\n key: 'options',\n value: '${entries.map(e => ({ label: e.label, value: e.role_id, description: e.description, emoji: e.emoji }))}',\n },\n // Update message\n {\n action: 'edit_message',\n channel: '${panel[0].channel_id}',\n message: '${panel[0].message_id}',\n components: [\n {\n type: 'action_row',\n components: [\n {\n type: 'select_menu',\n custom_id: 'rr_select_${panel[0].id}',\n placeholder: 'Select roles...',\n min_values: 0,\n max_values: '${panel[0].max_roles || entries.length}',\n options: '${options}',\n },\n ],\n },\n ],\n },\n {\n action: 'reply',\n content: 'Added ${args.role.name} to the panel!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'delete',\n description: 'Delete a role panel',\n options: [\n { name: 'message_id', description: 'Panel message ID', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${args.message_id}' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '${!panel[0]}',\n then: [\n { action: 'reply', content: 'Panel not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_delete',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}' },\n },\n {\n action: 'db_delete',\n table: 'reaction_role_panels',\n where: { id: '${panel[0].id}' },\n },\n {\n action: 'delete_message',\n channel: '${panel[0].channel_id}',\n message: '${panel[0].message_id}',\n },\n {\n action: 'reply',\n content: 'Panel deleted!',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport function getReactionRolesSpec(config: ReactionRolesConfig = {}): Partial<FurlowSpec> {\n return {\n events: reactionRolesEventHandlers,\n commands: reactionRolesCommands,\n state: {\n tables: reactionRolesTables,\n },\n };\n}\n","/**\n * Leveling builtin module\n * Handles XP, levels, rewards, leaderboards, and rank cards\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, CanvasGenerator, TableDefinition } from '@furlow/schema';\n\nexport interface LevelingConfig {\n /** XP per message range [min, max] */\n xpPerMessage?: [number, number];\n /** Cooldown between XP gains (seconds) */\n xpCooldown?: number;\n /** XP multiplier for roles */\n roleMultipliers?: Record<string, number>;\n /** Channels where XP is disabled */\n ignoredChannels?: string[];\n /** Roles that don't earn XP */\n ignoredRoles?: string[];\n /** Channel for level up announcements */\n announceChannel?: string;\n /** Level up message */\n levelUpMessage?: string;\n /** Use embed for level up */\n levelUpEmbed?: boolean;\n /** Level rewards (level -> role IDs) */\n rewards?: Record<number, string[]>;\n /** Stack rewards or remove previous */\n stackRewards?: boolean;\n /** Use rank card images */\n useRankCard?: boolean;\n /** Rank card generator name */\n rankCardGenerator?: string;\n /** XP curve formula */\n xpCurve?: 'linear' | 'exponential' | 'custom';\n /** Base XP for level 1 */\n baseXP?: number;\n /** XP multiplier per level */\n xpMultiplier?: number;\n}\n\nexport const levelingTables: Record<string, TableDefinition> = {\n levels: {\n columns: {\n id: { type: 'number', primary: true },\n user_id: { type: 'string', index: true },\n guild_id: { type: 'string', index: true },\n xp: { type: 'number', default: 0 },\n level: { type: 'number', default: 0 },\n total_messages: { type: 'number', default: 0 },\n last_xp_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const levelingEventHandlers: EventHandler[] = [\n {\n event: 'message',\n condition: '${!message.author.bot && !config.leveling.ignoredChannels?.includes(channel.id)}',\n actions: [\n // Check cooldown\n {\n action: 'db_query',\n table: 'levels',\n where: {\n user_id: '${user.id}',\n guild_id: '${guild.id}',\n },\n as: 'userData',\n },\n // Initialize if new user\n {\n action: 'flow_if',\n condition: '${!userData || userData.length === 0}',\n then: [\n {\n action: 'db_insert',\n table: 'levels',\n data: {\n user_id: '${user.id}',\n guild_id: '${guild.id}',\n xp: 0,\n level: 0,\n total_messages: 0,\n last_xp_at: '${now()}',\n },\n },\n {\n action: 'set',\n key: 'userData',\n value: [{ xp: 0, level: 0, total_messages: 0, last_xp_at: null }],\n },\n ],\n },\n // Check cooldown\n {\n action: 'set',\n key: 'cooldownPassed',\n value: '${!userData[0].last_xp_at || (now() - userData[0].last_xp_at) > (config.leveling.xpCooldown || 60) * 1000}',\n },\n {\n action: 'flow_if',\n condition: '${cooldownPassed}',\n then: [\n // Calculate XP gain\n {\n action: 'set',\n key: 'xpRange',\n value: '${config.leveling.xpPerMessage || [15, 25]}',\n },\n {\n action: 'set',\n key: 'baseXpGain',\n value: '${random(xpRange[0], xpRange[1])}',\n },\n // Apply role multiplier\n {\n action: 'set',\n key: 'multiplier',\n value: '${config.leveling.roleMultipliers ? (member.roles | map(r => config.leveling.roleMultipliers[r.id] || 1) | max) : 1}',\n },\n {\n action: 'set',\n key: 'xpGain',\n value: '${floor(baseXpGain * multiplier)}',\n },\n // Calculate new XP and level\n {\n action: 'set',\n key: 'newXP',\n value: '${userData[0].xp + xpGain}',\n },\n {\n action: 'set',\n key: 'currentLevel',\n value: '${userData[0].level}',\n },\n // Calculate XP needed for next level\n {\n action: 'set',\n key: 'xpForNextLevel',\n value: '${config.leveling.xpCurve === \"exponential\" ? floor((config.leveling.baseXP || 100) * pow(config.leveling.xpMultiplier || 1.5, currentLevel)) : (config.leveling.baseXP || 100) * (currentLevel + 1)}',\n },\n // Check for level up\n {\n action: 'set',\n key: 'newLevel',\n value: '${newXP >= xpForNextLevel ? currentLevel + 1 : currentLevel}',\n },\n {\n action: 'set',\n key: 'leveledUp',\n value: '${newLevel > currentLevel}',\n },\n // Update database\n {\n action: 'db_update',\n table: 'levels',\n where: {\n user_id: '${user.id}',\n guild_id: '${guild.id}',\n },\n data: {\n xp: '${leveledUp ? newXP - xpForNextLevel : newXP}',\n level: '${newLevel}',\n total_messages: '${userData[0].total_messages + 1}',\n last_xp_at: '${now()}',\n },\n },\n // Handle level up\n {\n action: 'flow_if',\n condition: '${leveledUp}',\n then: [\n // Announce level up\n {\n action: 'flow_if',\n condition: '${config.leveling.announceChannel}',\n then: [\n {\n action: 'flow_if',\n condition: '${config.leveling.levelUpEmbed}',\n then: [\n {\n action: 'send_message',\n channel: '${config.leveling.announceChannel}',\n embed: {\n title: 'Level Up!',\n description: '${config.leveling.levelUpMessage || member.displayName + \" has reached level \" + newLevel + \"!\"}',\n color: '#ffd700',\n thumbnail: '${member.avatarURL}',\n },\n },\n ],\n else: [\n {\n action: 'send_message',\n channel: '${config.leveling.announceChannel}',\n content: '${config.leveling.levelUpMessage || \"Congratulations \" + member.displayName + \"! You reached level \" + newLevel + \"!\"}',\n },\n ],\n },\n ],\n },\n // Award role rewards\n {\n action: 'flow_if',\n condition: '${config.leveling.rewards && config.leveling.rewards[newLevel]}',\n then: [\n // Remove previous rewards if not stacking\n {\n action: 'flow_if',\n condition: '${!config.leveling.stackRewards && currentLevel > 0 && config.leveling.rewards[currentLevel]}',\n then: [\n {\n action: 'remove_role',\n user: '${member.id}',\n role: '${config.leveling.rewards[currentLevel]}',\n },\n ],\n },\n {\n action: 'assign_role',\n user: '${member.id}',\n role: '${config.leveling.rewards[newLevel]}',\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n];\n\nexport const levelingCommands: CommandDefinition[] = [\n {\n name: 'rank',\n description: 'View your rank or another user\\'s rank',\n options: [\n { name: 'user', description: 'User to check', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'db_query',\n table: 'levels',\n where: {\n user_id: '${targetUser.id}',\n guild_id: '${guild.id}',\n },\n as: 'userData',\n },\n {\n action: 'flow_if',\n condition: '${!userData || userData.length === 0}',\n then: [\n {\n action: 'reply',\n content: '${targetUser.username} has no XP yet!',\n ephemeral: true,\n },\n ],\n else: [\n // Get leaderboard position\n {\n action: 'db_query',\n table: 'levels',\n where: {\n guild_id: '${guild.id}',\n },\n order_by: 'level DESC, xp DESC',\n as: 'leaderboard',\n },\n {\n action: 'set',\n key: 'rank',\n value: '${(leaderboard | findIndex(u => u.user_id === targetUser.id)) + 1}',\n },\n {\n action: 'set',\n key: 'xpForNextLevel',\n value: '${config.leveling.xpCurve === \"exponential\" ? floor((config.leveling.baseXP || 100) * pow(config.leveling.xpMultiplier || 1.5, userData[0].level)) : (config.leveling.baseXP || 100) * (userData[0].level + 1)}',\n },\n // Render rank card or embed\n {\n action: 'flow_if',\n condition: '${config.leveling.useRankCard}',\n then: [\n {\n action: 'canvas_render',\n generator: '${config.leveling.rankCardGenerator || \"rank_card\"}',\n context: {\n user: '${targetUser}',\n member: '${guild.members.cache.get(targetUser.id)}',\n level: '${userData[0].level}',\n xp: '${userData[0].xp}',\n xpNeeded: '${xpForNextLevel}',\n rank: '${rank}',\n totalMessages: '${userData[0].total_messages}',\n },\n as: 'rankCard',\n },\n {\n action: 'reply',\n files: [\n {\n attachment: '${rankCard}',\n name: 'rank.png',\n },\n ],\n },\n ],\n else: [\n {\n action: 'reply',\n embed: {\n title: '${targetUser.username}\\'s Rank',\n color: '#5865f2',\n thumbnail: '${targetUser.avatarURL}',\n fields: [\n { name: 'Rank', value: '#${rank}', inline: true },\n { name: 'Level', value: '${userData[0].level}', inline: true },\n { name: 'XP', value: '${userData[0].xp}/${xpForNextLevel}', inline: true },\n { name: 'Messages', value: '${userData[0].total_messages}', inline: true },\n ],\n },\n },\n ],\n },\n ],\n },\n ],\n },\n {\n name: 'leaderboard',\n description: 'View the server leaderboard',\n options: [\n { name: 'page', description: 'Page number', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'page',\n value: '${args.page || 1}',\n },\n {\n action: 'set',\n key: 'perPage',\n value: 10,\n },\n {\n action: 'db_query',\n table: 'levels',\n where: {\n guild_id: '${guild.id}',\n },\n order_by: 'level DESC, xp DESC',\n limit: '${perPage}',\n offset: '${(page - 1) * perPage}',\n as: 'leaderboard',\n },\n {\n action: 'set',\n key: 'leaderboardText',\n value: '${leaderboard | mapIndex((entry, i) => \"#\" + ((page - 1) * perPage + i + 1) + \" <@\" + entry.user_id + \"> - Level \" + entry.level + \" (\" + entry.xp + \" XP)\") | join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name} Leaderboard',\n description: '${leaderboardText || \"No entries yet!\"}',\n color: '#ffd700',\n footer: {\n text: 'Page ${page}',\n },\n },\n },\n ],\n },\n {\n name: 'setxp',\n description: 'Set a user\\'s XP (admin)',\n options: [\n { name: 'user', description: 'User to modify', type: 'user', required: true },\n { name: 'xp', description: 'XP amount', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'db_update',\n table: 'levels',\n where: {\n user_id: '${args.user.id}',\n guild_id: '${guild.id}',\n },\n data: {\n xp: '${args.xp}',\n },\n upsert: true,\n },\n {\n action: 'reply',\n content: 'Set ${args.user.username}\\'s XP to ${args.xp}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'setlevel',\n description: 'Set a user\\'s level (admin)',\n options: [\n { name: 'user', description: 'User to modify', type: 'user', required: true },\n { name: 'level', description: 'Level', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'db_update',\n table: 'levels',\n where: {\n user_id: '${args.user.id}',\n guild_id: '${guild.id}',\n },\n data: {\n level: '${args.level}',\n xp: 0,\n },\n upsert: true,\n },\n {\n action: 'reply',\n content: 'Set ${args.user.username}\\'s level to ${args.level}',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport const levelingCanvasGenerators: Record<string, CanvasGenerator> = {\n rank_card: {\n width: 934,\n height: 282,\n background: '#23272a',\n layers: [\n // Background gradient\n {\n type: 'rect',\n x: 0,\n y: 0,\n width: 934,\n height: 282,\n color: 'linear-gradient(135deg, #1a1c20 0%, #2c2f33 100%)',\n radius: 20,\n },\n // User avatar\n {\n type: 'circle_image',\n url: '${user.avatarURL || user.defaultAvatarURL}',\n x: 120,\n y: 141,\n radius: 80,\n border: {\n width: 5,\n color: '#5865f2',\n },\n },\n // Username\n {\n type: 'text',\n text: '${user.username}',\n x: 260,\n y: 120,\n font: 'bold 36px \"Poppins\", sans-serif',\n color: '#ffffff',\n align: 'left',\n },\n // Rank badge\n {\n type: 'text',\n text: 'RANK #${rank}',\n x: 850,\n y: 60,\n font: 'bold 24px \"Poppins\", sans-serif',\n color: '#7289da',\n align: 'right',\n },\n // Level badge\n {\n type: 'text',\n text: 'LEVEL ${level}',\n x: 850,\n y: 90,\n font: 'bold 32px \"Poppins\", sans-serif',\n color: '#ffffff',\n align: 'right',\n },\n // XP Progress bar background\n {\n type: 'rect',\n x: 260,\n y: 180,\n width: 600,\n height: 30,\n color: '#484b4e',\n radius: 15,\n },\n // XP Progress bar fill\n {\n type: 'progress_bar',\n x: 260,\n y: 180,\n width: 600,\n height: 30,\n progress: '${xp / xpNeeded}',\n color: 'linear-gradient(90deg, #5865f2 0%, #7289da 100%)',\n radius: 15,\n },\n // XP Text\n {\n type: 'text',\n text: '${xp} / ${xpNeeded} XP',\n x: 560,\n y: 160,\n font: '18px \"Poppins\", sans-serif',\n color: '#99aab5',\n align: 'center',\n },\n // Messages count\n {\n type: 'text',\n text: '${totalMessages} messages',\n x: 260,\n y: 240,\n font: '16px \"Poppins\", sans-serif',\n color: '#72767d',\n align: 'left',\n },\n ],\n },\n};\n\nexport function getLevelingSpec(config: LevelingConfig = {}): Partial<FurlowSpec> {\n return {\n events: levelingEventHandlers,\n commands: levelingCommands,\n state: {\n tables: levelingTables,\n },\n canvas: {\n generators: levelingCanvasGenerators,\n },\n };\n}\n","/**\n * Music builtin module\n * Handles audio playback, queue management, and filters\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface MusicConfig {\n /** Default volume (0-100) */\n defaultVolume?: number;\n /** Maximum queue size */\n maxQueueSize?: number;\n /** DJ role (required for some commands) */\n djRole?: string;\n /** Stay in channel when queue empty */\n stayInChannel?: boolean;\n /** Leave after idle (seconds) */\n leaveAfterIdle?: number;\n /** Allow seeking */\n allowSeeking?: boolean;\n /** Allow filters */\n allowFilters?: boolean;\n /** Show now playing messages */\n announceNowPlaying?: boolean;\n /** Announce channel */\n announceChannel?: string;\n}\n\nexport const musicTables: Record<string, TableDefinition> = {\n music_playlists: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n user_id: { type: 'string', index: true },\n name: { type: 'string' },\n tracks: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const musicCommands: CommandDefinition[] = [\n {\n name: 'play',\n description: 'Play a song or add to queue',\n options: [\n { name: 'query', description: 'Song URL or search query', type: 'string', required: true },\n ],\n actions: [\n // Check if user is in voice channel\n {\n action: 'flow_if',\n condition: '${!member.voice.channel}',\n then: [\n { action: 'reply', content: 'You must be in a voice channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Join voice channel if not already\n {\n action: 'voice_join',\n channel: '${member.voice.channel.id}',\n },\n // Search/resolve track\n {\n action: 'voice_search',\n query: '${args.query}',\n as: 'track',\n },\n {\n action: 'flow_if',\n condition: '${!track}',\n then: [\n { action: 'reply', content: 'No results found for: ${args.query}', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Add to queue\n {\n action: 'queue_add',\n track: '${track}',\n requester: '${user.id}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Added to Queue',\n description: '[${track.title}](${track.url})',\n thumbnail: '${track.thumbnail}',\n color: '#57f287',\n fields: [\n { name: 'Duration', value: '${formatDuration(track.duration)}', inline: true },\n { name: 'Requested by', value: '${user}', inline: true },\n ],\n },\n },\n ],\n },\n {\n name: 'skip',\n description: 'Skip the current song',\n actions: [\n {\n action: 'voice_skip',\n },\n {\n action: 'reply',\n content: 'Skipped the current song.',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'stop',\n description: 'Stop playback and clear the queue',\n actions: [\n {\n action: 'voice_stop',\n },\n {\n action: 'queue_clear',\n },\n {\n action: 'reply',\n content: 'Stopped playback and cleared the queue.',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'pause',\n description: 'Pause playback',\n actions: [\n {\n action: 'voice_pause',\n },\n {\n action: 'reply',\n content: 'Paused playback.',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'resume',\n description: 'Resume playback',\n actions: [\n {\n action: 'voice_resume',\n },\n {\n action: 'reply',\n content: 'Resumed playback.',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'queue',\n description: 'View the current queue',\n options: [\n { name: 'page', description: 'Page number', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'queue_get',\n as: 'queue',\n },\n {\n action: 'flow_if',\n condition: '${queue.tracks.length === 0}',\n then: [\n { action: 'reply', content: 'The queue is empty!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'page',\n value: '${args.page || 1}',\n },\n {\n action: 'set',\n key: 'perPage',\n value: 10,\n },\n {\n action: 'set',\n key: 'start',\n value: '${(page - 1) * perPage}',\n },\n {\n action: 'set',\n key: 'queueList',\n value: '${queue.tracks.slice(start, start + perPage).map((t, i) => (start + i + 1) + \". [\" + truncate(t.title, 40) + \"](\" + t.url + \") - \" + formatDuration(t.duration)).join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Queue',\n description: '**Now Playing:**\\n[${queue.current.title}](${queue.current.url})\\n\\n**Up Next:**\\n${queueList}',\n color: '#5865f2',\n footer: {\n text: 'Page ${page} | ${queue.tracks.length} tracks | Total: ${formatDuration(queue.totalDuration)}',\n },\n },\n },\n ],\n },\n {\n name: 'nowplaying',\n description: 'Show the currently playing song',\n actions: [\n {\n action: 'queue_get',\n as: 'queue',\n },\n {\n action: 'flow_if',\n condition: '${!queue.current}',\n then: [\n { action: 'reply', content: 'Nothing is playing!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'progress',\n value: '${queue.position / queue.current.duration}',\n },\n {\n action: 'set',\n key: 'progressBar',\n value: '${repeat(\"▓\", floor(progress * 20)) + repeat(\"░\", 20 - floor(progress * 20))}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Now Playing',\n description: '[${queue.current.title}](${queue.current.url})',\n thumbnail: '${queue.current.thumbnail}',\n color: '#5865f2',\n fields: [\n { name: 'Progress', value: '${progressBar}\\n${formatDuration(queue.position)} / ${formatDuration(queue.current.duration)}' },\n { name: 'Requested by', value: '<@${queue.current.requester}>', inline: true },\n { name: 'Volume', value: '${queue.volume}%', inline: true },\n ],\n },\n },\n ],\n },\n {\n name: 'volume',\n description: 'Set the volume',\n options: [\n { name: 'level', description: 'Volume level (0-100)', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'flow_if',\n condition: '${args.level < 0 || args.level > 100}',\n then: [\n { action: 'reply', content: 'Volume must be between 0 and 100!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'voice_volume',\n level: '${args.level}',\n },\n {\n action: 'reply',\n content: 'Volume set to ${args.level}%',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'shuffle',\n description: 'Shuffle the queue',\n actions: [\n {\n action: 'queue_shuffle',\n },\n {\n action: 'reply',\n content: 'Shuffled the queue!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'loop',\n description: 'Set loop mode',\n options: [\n { name: 'mode', description: 'Loop mode', type: 'string', required: true, choices: [\n { name: 'Off', value: 'off' },\n { name: 'Track', value: 'track' },\n { name: 'Queue', value: 'queue' },\n ]},\n ],\n actions: [\n {\n action: 'queue_loop',\n mode: '${args.mode}',\n },\n {\n action: 'reply',\n content: 'Loop mode set to: ${args.mode}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'seek',\n description: 'Seek to a position in the song',\n options: [\n { name: 'position', description: 'Position (e.g., 1:30, 90)', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'flow_if',\n condition: '${!config.music?.allowSeeking}',\n then: [\n { action: 'reply', content: 'Seeking is disabled!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'voice_seek',\n position: '${parseDuration(args.position)}',\n },\n {\n action: 'reply',\n content: 'Seeked to ${args.position}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'filter',\n description: 'Apply an audio filter',\n options: [\n { name: 'filter', description: 'Filter to apply', type: 'string', required: true, choices: [\n { name: 'None', value: 'none' },\n { name: 'Bass Boost', value: 'bassboost' },\n { name: 'Nightcore', value: 'nightcore' },\n { name: 'Vaporwave', value: 'vaporwave' },\n { name: '8D', value: '8d' },\n { name: 'Tremolo', value: 'tremolo' },\n { name: 'Vibrato', value: 'vibrato' },\n ]},\n ],\n actions: [\n {\n action: 'flow_if',\n condition: '${!config.music?.allowFilters}',\n then: [\n { action: 'reply', content: 'Filters are disabled!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'voice_set_filter',\n filter: '${args.filter}',\n },\n {\n action: 'reply',\n content: 'Applied filter: ${args.filter}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'leave',\n description: 'Leave the voice channel',\n actions: [\n {\n action: 'voice_leave',\n },\n {\n action: 'reply',\n content: 'Left the voice channel.',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport const musicEventHandlers: EventHandler[] = [\n // Announce now playing\n {\n event: 'voice_track_start',\n condition: '${config.music?.announceNowPlaying}',\n actions: [\n {\n action: 'send_message',\n channel: '${config.music.announceChannel || channel.id}',\n embed: {\n title: 'Now Playing',\n description: '[${track.title}](${track.url})',\n thumbnail: '${track.thumbnail}',\n color: '#5865f2',\n fields: [\n { name: 'Duration', value: '${formatDuration(track.duration)}', inline: true },\n { name: 'Requested by', value: '<@${track.requester}>', inline: true },\n ],\n },\n },\n ],\n },\n // Auto-leave when alone\n {\n event: 'voice_leave',\n condition: '${voiceChannel.members.filter(m => !m.user.bot).size === 0 && !config.music?.stayInChannel}',\n actions: [\n { action: 'wait', duration: 30000 },\n {\n action: 'flow_if',\n condition: '${voiceChannel.members.filter(m => !m.user.bot).size === 0}',\n then: [\n { action: 'voice_leave' },\n ],\n },\n ],\n },\n];\n\nexport function getMusicSpec(config: MusicConfig = {}): Partial<FurlowSpec> {\n return {\n commands: musicCommands,\n events: musicEventHandlers,\n state: {\n tables: musicTables,\n },\n };\n}\n","/**\n * Starboard builtin module\n * Handles star reactions and hall of fame\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface StarboardConfig {\n /** Starboard channel */\n channel?: string;\n /** Minimum stars required */\n threshold?: number;\n /** Emoji to use (default: star) */\n emoji?: string;\n /** Self-starring allowed */\n selfStar?: boolean;\n /** Bot messages can be starred */\n botMessages?: boolean;\n /** Ignored channels */\n ignoredChannels?: string[];\n /** NSFW channel handling */\n nsfwAllowed?: boolean;\n /** Star tiers with different thresholds */\n tiers?: Array<{\n threshold: number;\n emoji: string;\n color?: string;\n }>;\n}\n\nexport const starboardTables: Record<string, TableDefinition> = {\n starboard_messages: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n source_channel_id: { type: 'string' },\n source_message_id: { type: 'string', unique: true },\n starboard_message_id: { type: 'string' },\n author_id: { type: 'string', index: true },\n star_count: { type: 'number', default: 0 },\n created_at: { type: 'timestamp' },\n },\n },\n starboard_stars: {\n columns: {\n id: { type: 'number', primary: true },\n message_id: { type: 'string', index: true },\n user_id: { type: 'string' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const starboardEventHandlers: EventHandler[] = [\n // Handle star reactions\n {\n event: 'reaction_add',\n condition: '${(reaction.emoji.name === (config.starboard?.emoji || \"⭐\") || reaction.emoji.name === \"🌟\") && config.starboard?.channel}',\n actions: [\n // Check if channel is ignored\n {\n action: 'flow_if',\n condition: '${config.starboard.ignoredChannels?.includes(channel.id)}',\n then: [{ action: 'abort' }],\n },\n // Check NSFW\n {\n action: 'flow_if',\n condition: '${channel.nsfw && !config.starboard.nsfwAllowed}',\n then: [{ action: 'abort' }],\n },\n // Check self-star\n {\n action: 'flow_if',\n condition: '${!config.starboard.selfStar && user.id === message.author.id}',\n then: [{ action: 'abort' }],\n },\n // Check bot messages\n {\n action: 'flow_if',\n condition: '${!config.starboard.botMessages && message.author.bot}',\n then: [{ action: 'abort' }],\n },\n // Check if already starred by this user\n {\n action: 'db_query',\n table: 'starboard_stars',\n where: { message_id: '${message.id}', user_id: '${user.id}' },\n as: 'existingStar',\n },\n {\n action: 'flow_if',\n condition: '${existingStar.length > 0}',\n then: [{ action: 'abort' }],\n },\n // Add star\n {\n action: 'db_insert',\n table: 'starboard_stars',\n data: {\n message_id: '${message.id}',\n user_id: '${user.id}',\n created_at: '${now()}',\n },\n },\n // Count stars\n {\n action: 'db_query',\n table: 'starboard_stars',\n where: { message_id: '${message.id}' },\n as: 'allStars',\n },\n {\n action: 'set',\n key: 'starCount',\n value: '${allStars.length}',\n },\n // Get threshold\n {\n action: 'set',\n key: 'threshold',\n value: '${config.starboard.threshold || 3}',\n },\n // Get appropriate tier\n {\n action: 'set',\n key: 'tier',\n value: '${config.starboard.tiers ? config.starboard.tiers.filter(t => starCount >= t.threshold).pop() : null}',\n },\n {\n action: 'set',\n key: 'displayEmoji',\n value: '${tier?.emoji || config.starboard.emoji || \"⭐\"}',\n },\n {\n action: 'set',\n key: 'embedColor',\n value: '${tier?.color || \"#ffd700\"}',\n },\n // Check if already on starboard\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: '${existing.length > 0}',\n then: [\n // Update existing starboard message\n {\n action: 'db_update',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n data: { star_count: '${starCount}' },\n },\n {\n action: 'edit_message',\n channel: '${config.starboard.channel}',\n message: '${existing[0].starboard_message_id}',\n content: '${displayEmoji} **${starCount}** | <#${channel.id}>',\n },\n ],\n else: [\n // Create new starboard entry if threshold met\n {\n action: 'flow_if',\n condition: '${starCount >= threshold}',\n then: [\n // Build embed\n {\n action: 'set',\n key: 'imageUrl',\n value: '${message.attachments.first()?.url || message.embeds[0]?.image?.url || message.embeds[0]?.thumbnail?.url}',\n },\n {\n action: 'send_message',\n channel: '${config.starboard.channel}',\n content: '${displayEmoji} **${starCount}** | <#${channel.id}>',\n embed: {\n author: {\n name: '${message.author.tag}',\n icon_url: '${message.author.avatarURL}',\n },\n description: '${message.content}\\n\\n[Jump to message](${message.url})',\n color: '${embedColor}',\n image: '${imageUrl ? { url: imageUrl } : null}',\n timestamp: '${message.createdAt}',\n footer: {\n text: 'ID: ${message.id}',\n },\n },\n as: 'starboardMessage',\n },\n {\n action: 'db_insert',\n table: 'starboard_messages',\n data: {\n guild_id: '${guild.id}',\n source_channel_id: '${channel.id}',\n source_message_id: '${message.id}',\n starboard_message_id: '${starboardMessage.id}',\n author_id: '${message.author.id}',\n star_count: '${starCount}',\n created_at: '${now()}',\n },\n },\n ],\n },\n ],\n },\n ],\n },\n // Handle star removal\n {\n event: 'reaction_remove',\n condition: '${(reaction.emoji.name === (config.starboard?.emoji || \"⭐\") || reaction.emoji.name === \"🌟\") && config.starboard?.channel}',\n actions: [\n // Remove star record\n {\n action: 'db_delete',\n table: 'starboard_stars',\n where: { message_id: '${message.id}', user_id: '${user.id}' },\n },\n // Count remaining stars\n {\n action: 'db_query',\n table: 'starboard_stars',\n where: { message_id: '${message.id}' },\n as: 'allStars',\n },\n {\n action: 'set',\n key: 'starCount',\n value: '${allStars.length}',\n },\n // Check if on starboard\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: '${existing.length > 0}',\n then: [\n {\n action: 'flow_if',\n condition: '${starCount < (config.starboard.threshold || 3)}',\n then: [\n // Remove from starboard\n {\n action: 'delete_message',\n channel: '${config.starboard.channel}',\n message: '${existing[0].starboard_message_id}',\n },\n {\n action: 'db_delete',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n },\n ],\n else: [\n // Update count\n {\n action: 'set',\n key: 'tier',\n value: '${config.starboard.tiers ? config.starboard.tiers.filter(t => starCount >= t.threshold).pop() : null}',\n },\n {\n action: 'set',\n key: 'displayEmoji',\n value: '${tier?.emoji || config.starboard.emoji || \"⭐\"}',\n },\n {\n action: 'db_update',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n data: { star_count: '${starCount}' },\n },\n {\n action: 'edit_message',\n channel: '${config.starboard.channel}',\n message: '${existing[0].starboard_message_id}',\n content: '${displayEmoji} **${starCount}** | <#${channel.id}>',\n },\n ],\n },\n ],\n },\n ],\n },\n];\n\nexport const starboardCommands: CommandDefinition[] = [\n {\n name: 'starboard',\n description: 'Starboard commands',\n subcommands: [\n {\n name: 'setup',\n description: 'Set up the starboard',\n options: [\n { name: 'channel', description: 'Starboard channel', type: 'channel', required: true },\n { name: 'threshold', description: 'Minimum stars required', type: 'integer', required: false },\n { name: 'emoji', description: 'Star emoji', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'config.starboard.channel',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n {\n action: 'flow_if',\n condition: '${args.threshold}',\n then: [\n {\n action: 'set',\n key: 'config.starboard.threshold',\n value: '${args.threshold}',\n scope: 'guild',\n },\n ],\n },\n {\n action: 'flow_if',\n condition: '${args.emoji}',\n then: [\n {\n action: 'set',\n key: 'config.starboard.emoji',\n value: '${args.emoji}',\n scope: 'guild',\n },\n ],\n },\n {\n action: 'reply',\n content: 'Starboard set up in ${args.channel}!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'stats',\n description: 'View starboard statistics',\n actions: [\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { guild_id: '${guild.id}' },\n order_by: 'star_count DESC',\n limit: 5,\n as: 'topMessages',\n },\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { guild_id: '${guild.id}' },\n as: 'allMessages',\n },\n {\n action: 'set',\n key: 'totalStars',\n value: '${allMessages.reduce((sum, m) => sum + m.star_count, 0)}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Starboard Statistics',\n color: '#ffd700',\n fields: [\n { name: 'Total Starred Messages', value: '${allMessages.length}', inline: true },\n { name: 'Total Stars', value: '${totalStars}', inline: true },\n { name: 'Top Starred Messages', value: '${topMessages.map((m, i) => (i + 1) + \". \" + m.star_count + \" stars - <@\" + m.author_id + \">\").join(\"\\\\n\") || \"None yet!\"}' },\n ],\n },\n },\n ],\n },\n {\n name: 'random',\n description: 'Get a random starred message',\n actions: [\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { guild_id: '${guild.id}' },\n as: 'allMessages',\n },\n {\n action: 'flow_if',\n condition: '${allMessages.length === 0}',\n then: [\n { action: 'reply', content: 'No starred messages yet!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'randomMessage',\n value: '${allMessages[floor(random(0, allMessages.length))]}',\n },\n {\n action: 'reply',\n content: '⭐ **${randomMessage.star_count}** - https://discord.com/channels/${guild.id}/${randomMessage.source_channel_id}/${randomMessage.source_message_id}',\n },\n ],\n },\n ],\n },\n];\n\nexport function getStarboardSpec(config: StarboardConfig = {}): Partial<FurlowSpec> {\n return {\n events: starboardEventHandlers,\n commands: starboardCommands,\n state: {\n tables: starboardTables,\n },\n };\n}\n","/**\n * Polls builtin module\n * Handles poll creation and voting\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface PollsConfig {\n /** Maximum poll options */\n maxOptions?: number;\n /** Default poll duration */\n defaultDuration?: string;\n /** Allow anonymous polls */\n allowAnonymous?: boolean;\n}\n\nexport const pollsTables: Record<string, TableDefinition> = {\n polls: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n channel_id: { type: 'string' },\n message_id: { type: 'string', unique: true },\n creator_id: { type: 'string' },\n question: { type: 'string' },\n options: { type: 'json' },\n multiple_choice: { type: 'boolean', default: false },\n anonymous: { type: 'boolean', default: false },\n ends_at: { type: 'timestamp' },\n ended: { type: 'boolean', default: false },\n created_at: { type: 'timestamp' },\n },\n },\n poll_votes: {\n columns: {\n id: { type: 'number', primary: true },\n poll_id: { type: 'number', index: true },\n user_id: { type: 'string' },\n option_index: { type: 'number' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const pollsEventHandlers: EventHandler[] = [\n // Handle vote button\n {\n event: 'button_click',\n condition: '${interaction.customId.startsWith(\"poll_vote_\")}',\n actions: [\n {\n action: 'set',\n key: 'parts',\n value: '${interaction.customId.split(\"_\")}',\n },\n {\n action: 'set',\n key: 'pollId',\n value: '${parts[2]}',\n },\n {\n action: 'set',\n key: 'optionIndex',\n value: '${parseInt(parts[3])}',\n },\n {\n action: 'db_query',\n table: 'polls',\n where: { id: '${pollId}' },\n as: 'poll',\n },\n {\n action: 'flow_if',\n condition: '${!poll[0] || poll[0].ended}',\n then: [\n { action: 'reply', content: 'This poll has ended!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Check existing vote\n {\n action: 'db_query',\n table: 'poll_votes',\n where: { poll_id: '${pollId}', user_id: '${user.id}' },\n as: 'existingVotes',\n },\n {\n action: 'flow_if',\n condition: '${!poll[0].multiple_choice && existingVotes.length > 0}',\n then: [\n // Change vote\n {\n action: 'db_update',\n table: 'poll_votes',\n where: { poll_id: '${pollId}', user_id: '${user.id}' },\n data: { option_index: '${optionIndex}' },\n },\n { action: 'reply', content: 'Vote changed!', ephemeral: true },\n ],\n else: [\n // Add vote\n {\n action: 'db_insert',\n table: 'poll_votes',\n data: {\n poll_id: '${pollId}',\n user_id: '${user.id}',\n option_index: '${optionIndex}',\n created_at: '${now()}',\n },\n },\n { action: 'reply', content: 'Vote recorded!', ephemeral: true },\n ],\n },\n // Update poll message\n {\n action: 'db_query',\n table: 'poll_votes',\n where: { poll_id: '${pollId}' },\n as: 'allVotes',\n },\n {\n action: 'set',\n key: 'totalVotes',\n value: '${allVotes.length}',\n },\n {\n action: 'set',\n key: 'options',\n value: '${poll[0].options}',\n },\n {\n action: 'set',\n key: 'voteCounts',\n value: '${options.map((_, i) => allVotes.filter(v => v.option_index === i).length)}',\n },\n {\n action: 'set',\n key: 'optionText',\n value: '${options.map((opt, i) => opt.emoji + \" \" + opt.text + \" - **\" + voteCounts[i] + \"** (\" + (totalVotes > 0 ? floor(voteCounts[i] / totalVotes * 100) : 0) + \"%)\").join(\"\\\\n\")}',\n },\n {\n action: 'edit_message',\n channel: '${poll[0].channel_id}',\n message: '${poll[0].message_id}',\n embed: {\n title: '📊 ${poll[0].question}',\n description: '${optionText}\\n\\n**Total votes:** ${totalVotes}',\n color: '#5865f2',\n footer: { text: '${poll[0].ends_at ? \"Ends \" + timestamp(poll[0].ends_at, \"R\") : \"No end time\"}' },\n },\n },\n ],\n },\n // Poll end scheduler\n {\n event: 'scheduler_tick',\n actions: [\n {\n action: 'db_query',\n table: 'polls',\n where: { ended: false },\n as: 'activePolls',\n },\n {\n action: 'batch',\n items: '${activePolls.filter(p => p.ends_at && new Date(p.ends_at) <= now())}',\n each: { action: 'emit', event: 'poll_end', data: { pollId: '${item.id}' } },\n },\n ],\n },\n // End poll\n {\n event: 'poll_end',\n actions: [\n {\n action: 'db_query',\n table: 'polls',\n where: { id: '${event.data.pollId}' },\n as: 'poll',\n },\n {\n action: 'db_query',\n table: 'poll_votes',\n where: { poll_id: '${event.data.pollId}' },\n as: 'allVotes',\n },\n {\n action: 'db_update',\n table: 'polls',\n where: { id: '${event.data.pollId}' },\n data: { ended: true },\n },\n {\n action: 'set',\n key: 'options',\n value: '${poll[0].options}',\n },\n {\n action: 'set',\n key: 'totalVotes',\n value: '${allVotes.length}',\n },\n {\n action: 'set',\n key: 'voteCounts',\n value: '${options.map((_, i) => allVotes.filter(v => v.option_index === i).length)}',\n },\n {\n action: 'set',\n key: 'maxVotes',\n value: '${Math.max(...voteCounts)}',\n },\n {\n action: 'set',\n key: 'winners',\n value: '${options.filter((_, i) => voteCounts[i] === maxVotes).map(o => o.text)}',\n },\n {\n action: 'set',\n key: 'optionText',\n value: '${options.map((opt, i) => (voteCounts[i] === maxVotes ? \"🏆 \" : \"\") + opt.emoji + \" \" + opt.text + \" - **\" + voteCounts[i] + \"** (\" + (totalVotes > 0 ? floor(voteCounts[i] / totalVotes * 100) : 0) + \"%)\").join(\"\\\\n\")}',\n },\n {\n action: 'edit_message',\n channel: '${poll[0].channel_id}',\n message: '${poll[0].message_id}',\n embed: {\n title: '📊 ${poll[0].question} (ENDED)',\n description: '${optionText}\\n\\n**Total votes:** ${totalVotes}',\n color: '#72767d',\n footer: { text: 'Poll ended' },\n },\n components: [],\n },\n ],\n },\n];\n\nexport const pollsCommands: CommandDefinition[] = [\n {\n name: 'poll',\n description: 'Create a poll',\n options: [\n { name: 'question', description: 'Poll question', type: 'string', required: true },\n { name: 'options', description: 'Options separated by |', type: 'string', required: true },\n { name: 'duration', description: 'Poll duration (e.g., 1h, 1d)', type: 'string', required: false },\n { name: 'multiple', description: 'Allow multiple choices', type: 'boolean', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'optionTexts',\n value: '${args.options.split(\"|\").map(o => o.trim()).filter(o => o)}',\n },\n {\n action: 'flow_if',\n condition: '${optionTexts.length < 2}',\n then: [\n { action: 'reply', content: 'You need at least 2 options!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'flow_if',\n condition: '${optionTexts.length > (config.polls?.maxOptions || 10)}',\n then: [\n { action: 'reply', content: 'Maximum ${config.polls?.maxOptions || 10} options allowed!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'emojis',\n value: '[\"1️⃣\", \"2️⃣\", \"3️⃣\", \"4️⃣\", \"5️⃣\", \"6️⃣\", \"7️⃣\", \"8️⃣\", \"9️⃣\", \"🔟\"]',\n },\n {\n action: 'set',\n key: 'options',\n value: '${optionTexts.map((text, i) => ({ text, emoji: emojis[i] }))}',\n },\n {\n action: 'set',\n key: 'endsAt',\n value: '${args.duration ? addDuration(now(), args.duration) : null}',\n },\n {\n action: 'set',\n key: 'optionDisplay',\n value: '${options.map(o => o.emoji + \" \" + o.text + \" - **0** (0%)\").join(\"\\\\n\")}',\n },\n // Create buttons\n {\n action: 'set',\n key: 'buttons',\n value: '${options.map((o, i) => ({ type: \"button\", style: \"secondary\", emoji: o.emoji, custom_id: \"poll_vote_PLACEHOLDER_\" + i }))}',\n },\n {\n action: 'set',\n key: 'rows',\n value: '${chunk(buttons, 5).map(row => ({ type: \"action_row\", components: row }))}',\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n title: '📊 ${args.question}',\n description: '${optionDisplay}\\n\\n**Total votes:** 0',\n color: '#5865f2',\n footer: { text: '${endsAt ? \"Ends \" + timestamp(endsAt, \"R\") : \"No end time\"}' },\n },\n components: '${rows}',\n as: 'pollMessage',\n },\n {\n action: 'db_insert',\n table: 'polls',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n message_id: '${pollMessage.id}',\n creator_id: '${user.id}',\n question: '${args.question}',\n options: '${options}',\n multiple_choice: '${args.multiple || false}',\n ends_at: '${endsAt}',\n created_at: '${now()}',\n },\n as: 'poll',\n },\n // Update buttons with correct poll ID\n {\n action: 'set',\n key: 'buttons',\n value: '${options.map((o, i) => ({ type: \"button\", style: \"secondary\", emoji: o.emoji, custom_id: \"poll_vote_\" + poll.id + \"_\" + i }))}',\n },\n {\n action: 'set',\n key: 'rows',\n value: '${chunk(buttons, 5).map(row => ({ type: \"action_row\", components: row }))}',\n },\n {\n action: 'edit_message',\n channel: '${channel.id}',\n message: '${pollMessage.id}',\n components: '${rows}',\n },\n {\n action: 'reply',\n content: 'Poll created!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'endpoll',\n description: 'End a poll early',\n options: [\n { name: 'message_id', description: 'Poll message ID', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'polls',\n where: { message_id: '${args.message_id}' },\n as: 'poll',\n },\n {\n action: 'flow_if',\n condition: '${!poll[0]}',\n then: [\n { action: 'reply', content: 'Poll not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'flow_if',\n condition: '${poll[0].creator_id !== user.id && !member.permissions.has(\"MANAGE_MESSAGES\")}',\n then: [\n { action: 'reply', content: 'You can only end your own polls!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'emit',\n event: 'poll_end',\n data: { pollId: '${poll[0].id}' },\n },\n {\n action: 'reply',\n content: 'Poll ended!',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport function getPollsSpec(config: PollsConfig = {}): Partial<FurlowSpec> {\n return {\n commands: pollsCommands,\n events: pollsEventHandlers,\n state: {\n tables: pollsTables,\n },\n };\n}\n","/**\n * Giveaways builtin module\n * Handles giveaway creation, entries, and winner selection\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface GiveawaysConfig {\n /** Default giveaway duration */\n defaultDuration?: string;\n /** Giveaway manager role */\n managerRole?: string;\n /** Require role to enter */\n requireRole?: string;\n /** Embed color */\n embedColor?: string;\n /** End emoji */\n emoji?: string;\n}\n\nexport const giveawaysTables: Record<string, TableDefinition> = {\n giveaways: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n channel_id: { type: 'string' },\n message_id: { type: 'string', unique: true },\n host_id: { type: 'string' },\n prize: { type: 'string' },\n winners_count: { type: 'number', default: 1 },\n ends_at: { type: 'timestamp', index: true },\n ended: { type: 'boolean', default: false },\n require_role: { type: 'string' },\n created_at: { type: 'timestamp' },\n },\n },\n giveaway_entries: {\n columns: {\n id: { type: 'number', primary: true },\n giveaway_id: { type: 'number', index: true },\n user_id: { type: 'string' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const giveawaysEventHandlers: EventHandler[] = [\n // Handle giveaway button click\n {\n event: 'button_click',\n condition: '${interaction.customId.startsWith(\"giveaway_enter_\")}',\n actions: [\n {\n action: 'set',\n key: 'giveawayId',\n value: '${interaction.customId.replace(\"giveaway_enter_\", \"\")}',\n },\n {\n action: 'db_query',\n table: 'giveaways',\n where: { id: '${giveawayId}' },\n as: 'giveaway',\n },\n {\n action: 'flow_if',\n condition: '${!giveaway[0] || giveaway[0].ended}',\n then: [\n { action: 'reply', content: 'This giveaway has ended!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Check role requirement\n {\n action: 'flow_if',\n condition: '${giveaway[0].require_role && !member.roles.cache.has(giveaway[0].require_role)}',\n then: [\n { action: 'reply', content: 'You need the <@&${giveaway[0].require_role}> role to enter!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Check if already entered\n {\n action: 'db_query',\n table: 'giveaway_entries',\n where: { giveaway_id: '${giveawayId}', user_id: '${user.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: '${existing.length > 0}',\n then: [\n // Remove entry\n {\n action: 'db_delete',\n table: 'giveaway_entries',\n where: { giveaway_id: '${giveawayId}', user_id: '${user.id}' },\n },\n { action: 'reply', content: 'You have left the giveaway!', ephemeral: true },\n ],\n else: [\n // Add entry\n {\n action: 'db_insert',\n table: 'giveaway_entries',\n data: {\n giveaway_id: '${giveawayId}',\n user_id: '${user.id}',\n created_at: '${now()}',\n },\n },\n { action: 'reply', content: 'You have entered the giveaway!', ephemeral: true },\n ],\n },\n // Update entry count on message\n {\n action: 'db_query',\n table: 'giveaway_entries',\n where: { giveaway_id: '${giveawayId}' },\n as: 'entries',\n },\n {\n action: 'edit_message',\n channel: '${giveaway[0].channel_id}',\n message: '${giveaway[0].message_id}',\n embed: {\n title: '${config.giveaways?.emoji || \"🎉\"} GIVEAWAY ${config.giveaways?.emoji || \"🎉\"}',\n description: '**Prize:** ${giveaway[0].prize}\\n**Hosted by:** <@${giveaway[0].host_id}>\\n**Winners:** ${giveaway[0].winners_count}\\n**Entries:** ${entries.length}\\n\\nEnds: ${timestamp(giveaway[0].ends_at, \"R\")}',\n color: '${config.giveaways?.embedColor || \"#ff73fa\"}',\n footer: { text: 'ID: ${giveaway[0].id}' },\n },\n },\n ],\n },\n // Scheduled giveaway end\n {\n event: 'scheduler_tick',\n actions: [\n {\n action: 'db_query',\n table: 'giveaways',\n where: { ended: false },\n as: 'activeGiveaways',\n },\n {\n action: 'batch',\n items: '${activeGiveaways.filter(g => new Date(g.ends_at) <= now())}',\n each: { action: 'emit', event: 'giveaway_end', data: { giveawayId: '${item.id}' } },\n },\n ],\n },\n // End giveaway\n {\n event: 'giveaway_end',\n actions: [\n {\n action: 'db_query',\n table: 'giveaways',\n where: { id: '${event.data.giveawayId}' },\n as: 'giveaway',\n },\n {\n action: 'db_query',\n table: 'giveaway_entries',\n where: { giveaway_id: '${event.data.giveawayId}' },\n as: 'entries',\n },\n // Select winners\n {\n action: 'set',\n key: 'shuffled',\n value: '${shuffle(entries)}',\n },\n {\n action: 'set',\n key: 'winners',\n value: '${shuffled.slice(0, giveaway[0].winners_count)}',\n },\n // Mark as ended\n {\n action: 'db_update',\n table: 'giveaways',\n where: { id: '${event.data.giveawayId}' },\n data: { ended: true },\n },\n // Update message\n {\n action: 'flow_if',\n condition: '${winners.length === 0}',\n then: [\n {\n action: 'edit_message',\n channel: '${giveaway[0].channel_id}',\n message: '${giveaway[0].message_id}',\n embed: {\n title: 'GIVEAWAY ENDED',\n description: '**Prize:** ${giveaway[0].prize}\\n\\nNo valid entries.',\n color: '#72767d',\n },\n components: [],\n },\n ],\n else: [\n {\n action: 'set',\n key: 'winnerMentions',\n value: '${winners.map(w => \"<@\" + w.user_id + \">\").join(\", \")}',\n },\n {\n action: 'edit_message',\n channel: '${giveaway[0].channel_id}',\n message: '${giveaway[0].message_id}',\n embed: {\n title: 'GIVEAWAY ENDED',\n description: '**Prize:** ${giveaway[0].prize}\\n\\n**Winners:** ${winnerMentions}',\n color: '#57f287',\n },\n components: [],\n },\n {\n action: 'send_message',\n channel: '${giveaway[0].channel_id}',\n content: 'Congratulations ${winnerMentions}! You won **${giveaway[0].prize}**!',\n },\n ],\n },\n ],\n },\n];\n\nexport const giveawaysCommands: CommandDefinition[] = [\n {\n name: 'giveaway',\n description: 'Giveaway management',\n subcommands: [\n {\n name: 'start',\n description: 'Start a giveaway',\n options: [\n { name: 'prize', description: 'Prize to give away', type: 'string', required: true },\n { name: 'duration', description: 'Duration (e.g., 1h, 1d, 1w)', type: 'string', required: true },\n { name: 'winners', description: 'Number of winners', type: 'integer', required: false },\n { name: 'require_role', description: 'Required role to enter', type: 'role', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'endsAt',\n value: '${addDuration(now(), args.duration)}',\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n title: '${config.giveaways?.emoji || \"🎉\"} GIVEAWAY ${config.giveaways?.emoji || \"🎉\"}',\n description: '**Prize:** ${args.prize}\\n**Hosted by:** ${user}\\n**Winners:** ${args.winners || 1}\\n**Entries:** 0\\n\\nEnds: ${timestamp(endsAt, \"R\")}',\n color: '${config.giveaways?.embedColor || \"#ff73fa\"}',\n },\n components: [\n {\n type: 'action_row',\n components: [\n {\n type: 'button',\n style: 'primary',\n label: 'Enter',\n emoji: '🎉',\n custom_id: 'giveaway_enter_PLACEHOLDER',\n },\n ],\n },\n ],\n as: 'giveawayMessage',\n },\n {\n action: 'db_insert',\n table: 'giveaways',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n message_id: '${giveawayMessage.id}',\n host_id: '${user.id}',\n prize: '${args.prize}',\n winners_count: '${args.winners || 1}',\n ends_at: '${endsAt}',\n require_role: '${args.require_role?.id}',\n created_at: '${now()}',\n },\n as: 'giveaway',\n },\n // Update button with correct ID\n {\n action: 'edit_message',\n channel: '${channel.id}',\n message: '${giveawayMessage.id}',\n embed: {\n title: '${config.giveaways?.emoji || \"🎉\"} GIVEAWAY ${config.giveaways?.emoji || \"🎉\"}',\n description: '**Prize:** ${args.prize}\\n**Hosted by:** ${user}\\n**Winners:** ${args.winners || 1}\\n**Entries:** 0\\n\\nEnds: ${timestamp(endsAt, \"R\")}',\n color: '${config.giveaways?.embedColor || \"#ff73fa\"}',\n footer: { text: 'ID: ${giveaway.id}' },\n },\n components: [\n {\n type: 'action_row',\n components: [\n {\n type: 'button',\n style: 'primary',\n label: 'Enter',\n emoji: '🎉',\n custom_id: 'giveaway_enter_${giveaway.id}',\n },\n ],\n },\n ],\n },\n {\n action: 'reply',\n content: 'Giveaway started!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'end',\n description: 'End a giveaway early',\n options: [\n { name: 'message_id', description: 'Giveaway message ID', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'giveaways',\n where: { message_id: '${args.message_id}' },\n as: 'giveaway',\n },\n {\n action: 'flow_if',\n condition: '${!giveaway[0]}',\n then: [\n { action: 'reply', content: 'Giveaway not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'emit',\n event: 'giveaway_end',\n data: { giveawayId: '${giveaway[0].id}' },\n },\n {\n action: 'reply',\n content: 'Giveaway ended!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'reroll',\n description: 'Reroll winners for an ended giveaway',\n options: [\n { name: 'message_id', description: 'Giveaway message ID', type: 'string', required: true },\n { name: 'winners', description: 'Number of new winners', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'giveaways',\n where: { message_id: '${args.message_id}' },\n as: 'giveaway',\n },\n {\n action: 'flow_if',\n condition: '${!giveaway[0] || !giveaway[0].ended}',\n then: [\n { action: 'reply', content: 'Giveaway not found or not ended!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_query',\n table: 'giveaway_entries',\n where: { giveaway_id: '${giveaway[0].id}' },\n as: 'entries',\n },\n {\n action: 'set',\n key: 'shuffled',\n value: '${shuffle(entries)}',\n },\n {\n action: 'set',\n key: 'winners',\n value: '${shuffled.slice(0, args.winners || 1)}',\n },\n {\n action: 'flow_if',\n condition: '${winners.length === 0}',\n then: [\n { action: 'reply', content: 'No valid entries to reroll!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'winnerMentions',\n value: '${winners.map(w => \"<@\" + w.user_id + \">\").join(\", \")}',\n },\n {\n action: 'send_message',\n channel: '${giveaway[0].channel_id}',\n content: 'New winner(s): ${winnerMentions}! Congratulations on winning **${giveaway[0].prize}**!',\n },\n {\n action: 'reply',\n content: 'Rerolled successfully!',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport function getGiveawaysSpec(config: GiveawaysConfig = {}): Partial<FurlowSpec> {\n return {\n commands: giveawaysCommands,\n events: giveawaysEventHandlers,\n state: {\n tables: giveawaysTables,\n },\n };\n}\n","/**\n * Auto-Responder builtin module\n * Handles trigger-based automatic responses\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface AutoResponderConfig {\n /** Maximum triggers per guild */\n maxTriggers?: number;\n /** Ignore bots */\n ignoreBots?: boolean;\n /** Global cooldown (seconds) */\n globalCooldown?: number;\n}\n\nexport const autoResponderTables: Record<string, TableDefinition> = {\n auto_responses: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n trigger: { type: 'string' },\n trigger_type: { type: 'string', default: 'contains' }, // exact, contains, startswith, endswith, regex\n response: { type: 'string' },\n response_type: { type: 'string', default: 'message' }, // message, embed, reaction\n embed_data: { type: 'json' },\n reaction: { type: 'string' },\n chance: { type: 'number', default: 100 }, // 0-100 percentage\n cooldown: { type: 'number', default: 0 }, // seconds\n ignore_case: { type: 'boolean', default: true },\n delete_trigger: { type: 'boolean', default: false },\n dm_response: { type: 'boolean', default: false },\n allowed_channels: { type: 'json' },\n ignored_channels: { type: 'json' },\n allowed_roles: { type: 'json' },\n ignored_roles: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n },\n auto_response_cooldowns: {\n columns: {\n id: { type: 'number', primary: true },\n response_id: { type: 'number', index: true },\n guild_id: { type: 'string' },\n last_triggered: { type: 'timestamp' },\n },\n },\n};\n\nexport const autoResponderEventHandlers: EventHandler[] = [\n {\n event: 'message',\n condition: '${!message.author.bot || !config.autoResponder?.ignoreBots}',\n actions: [\n // Get all triggers for this guild\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { guild_id: '${guild.id}' },\n as: 'triggers',\n },\n // Check each trigger\n {\n action: 'batch',\n items: '${triggers}',\n each: {\n action: 'flow_if',\n condition: '${(() => { const t = item; const msg = t.ignore_case ? message.content.toLowerCase() : message.content; const trig = t.ignore_case ? t.trigger.toLowerCase() : t.trigger; switch(t.trigger_type) { case \"exact\": return msg === trig; case \"contains\": return msg.includes(trig); case \"startswith\": return msg.startsWith(trig); case \"endswith\": return msg.endsWith(trig); case \"regex\": return new RegExp(t.trigger, t.ignore_case ? \"i\" : \"\").test(message.content); default: return false; } })()}',\n then: [\n // Check channel restrictions\n {\n action: 'flow_if',\n condition: '${item.allowed_channels?.length && !item.allowed_channels.includes(channel.id)}',\n then: [{ action: 'abort' }],\n },\n {\n action: 'flow_if',\n condition: '${item.ignored_channels?.includes(channel.id)}',\n then: [{ action: 'abort' }],\n },\n // Check role restrictions\n {\n action: 'flow_if',\n condition: '${item.allowed_roles?.length && !item.allowed_roles.some(r => member.roles.cache.has(r))}',\n then: [{ action: 'abort' }],\n },\n {\n action: 'flow_if',\n condition: '${item.ignored_roles?.some(r => member.roles.cache.has(r))}',\n then: [{ action: 'abort' }],\n },\n // Check cooldown\n {\n action: 'flow_if',\n condition: '${item.cooldown > 0}',\n then: [\n {\n action: 'db_query',\n table: 'auto_response_cooldowns',\n where: { response_id: '${item.id}', guild_id: '${guild.id}' },\n as: 'cooldown',\n },\n {\n action: 'flow_if',\n condition: '${cooldown[0] && (now() - new Date(cooldown[0].last_triggered)) < item.cooldown * 1000}',\n then: [{ action: 'abort' }],\n },\n ],\n },\n // Check chance\n {\n action: 'flow_if',\n condition: '${item.chance < 100 && random(1, 100) > item.chance}',\n then: [{ action: 'abort' }],\n },\n // Execute response\n {\n action: 'flow_switch',\n value: '${item.response_type}',\n cases: {\n message: [\n {\n action: 'flow_if',\n condition: '${item.dm_response}',\n then: [\n { action: 'send_dm', user: '${user.id}', content: '${item.response}' },\n ],\n else: [\n { action: 'send_message', channel: '${channel.id}', content: '${item.response}' },\n ],\n },\n ],\n embed: [\n {\n action: 'flow_if',\n condition: '${item.dm_response}',\n then: [\n { action: 'send_dm', user: '${user.id}', embed: '${item.embed_data}' },\n ],\n else: [\n { action: 'send_message', channel: '${channel.id}', embed: '${item.embed_data}' },\n ],\n },\n ],\n reaction: [\n { action: 'add_reaction', message: '${message.id}', channel: '${channel.id}', emoji: '${item.reaction}' },\n ],\n },\n },\n // Delete trigger message if configured\n {\n action: 'flow_if',\n condition: '${item.delete_trigger}',\n then: [\n { action: 'delete_message', channel: '${channel.id}', message: '${message.id}' },\n ],\n },\n // Update cooldown\n {\n action: 'flow_if',\n condition: '${item.cooldown > 0}',\n then: [\n {\n action: 'db_update',\n table: 'auto_response_cooldowns',\n where: { response_id: '${item.id}', guild_id: '${guild.id}' },\n data: { last_triggered: '${now()}' },\n upsert: true,\n },\n ],\n },\n ],\n },\n },\n ],\n },\n];\n\nexport const autoResponderCommands: CommandDefinition[] = [\n {\n name: 'autoresponder',\n description: 'Auto-responder management',\n subcommands: [\n {\n name: 'add',\n description: 'Add an auto-response',\n options: [\n { name: 'trigger', description: 'Trigger text', type: 'string', required: true },\n { name: 'response', description: 'Response text', type: 'string', required: true },\n { name: 'type', description: 'Match type', type: 'string', required: false, choices: [\n { name: 'Contains', value: 'contains' },\n { name: 'Exact match', value: 'exact' },\n { name: 'Starts with', value: 'startswith' },\n { name: 'Ends with', value: 'endswith' },\n { name: 'Regex', value: 'regex' },\n ]},\n { name: 'chance', description: 'Response chance (1-100)', type: 'integer', required: false },\n ],\n actions: [\n // Check max triggers\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { guild_id: '${guild.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: '${existing.length >= (config.autoResponder?.maxTriggers || 50)}',\n then: [\n { action: 'reply', content: 'Maximum triggers reached!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_insert',\n table: 'auto_responses',\n data: {\n guild_id: '${guild.id}',\n trigger: '${args.trigger}',\n trigger_type: '${args.type || \"contains\"}',\n response: '${args.response}',\n chance: '${args.chance || 100}',\n created_at: '${now()}',\n },\n as: 'newTrigger',\n },\n {\n action: 'reply',\n content: 'Auto-response added! ID: ${newTrigger.id}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'list',\n description: 'List auto-responses',\n actions: [\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { guild_id: '${guild.id}' },\n as: 'triggers',\n },\n {\n action: 'flow_if',\n condition: '${triggers.length === 0}',\n then: [\n { action: 'reply', content: 'No auto-responses configured!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'triggerList',\n value: '${triggers.map(t => \"**\" + t.id + \".** `\" + truncate(t.trigger, 30) + \"` → `\" + truncate(t.response, 30) + \"` (\" + t.trigger_type + \")\").join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Auto-Responses',\n description: '${triggerList}',\n color: '#5865f2',\n footer: { text: '${triggers.length} trigger(s)' },\n },\n ephemeral: true,\n },\n ],\n },\n {\n name: 'delete',\n description: 'Delete an auto-response',\n options: [\n { name: 'id', description: 'Trigger ID', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { id: '${args.id}', guild_id: '${guild.id}' },\n as: 'trigger',\n },\n {\n action: 'flow_if',\n condition: '${trigger.length === 0}',\n then: [\n { action: 'reply', content: 'Trigger not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_delete',\n table: 'auto_responses',\n where: { id: '${args.id}' },\n },\n {\n action: 'db_delete',\n table: 'auto_response_cooldowns',\n where: { response_id: '${args.id}' },\n },\n {\n action: 'reply',\n content: 'Auto-response deleted!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'edit',\n description: 'Edit an auto-response',\n options: [\n { name: 'id', description: 'Trigger ID', type: 'integer', required: true },\n { name: 'trigger', description: 'New trigger', type: 'string', required: false },\n { name: 'response', description: 'New response', type: 'string', required: false },\n { name: 'cooldown', description: 'Cooldown in seconds', type: 'integer', required: false },\n { name: 'chance', description: 'Response chance (1-100)', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { id: '${args.id}', guild_id: '${guild.id}' },\n as: 'trigger',\n },\n {\n action: 'flow_if',\n condition: '${trigger.length === 0}',\n then: [\n { action: 'reply', content: 'Trigger not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'updates',\n value: '${Object.fromEntries(Object.entries({ trigger: args.trigger, response: args.response, cooldown: args.cooldown, chance: args.chance }).filter(([_, v]) => v !== undefined))}',\n },\n {\n action: 'db_update',\n table: 'auto_responses',\n where: { id: '${args.id}' },\n data: '${updates}',\n },\n {\n action: 'reply',\n content: 'Auto-response updated!',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport function getAutoResponderSpec(config: AutoResponderConfig = {}): Partial<FurlowSpec> {\n return {\n commands: autoResponderCommands,\n events: autoResponderEventHandlers,\n state: {\n tables: autoResponderTables,\n },\n };\n}\n","/**\n * AFK builtin module\n * Handles AFK status and mention notifications\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface AfkConfig {\n /** Maximum AFK reason length */\n maxReasonLength?: number;\n /** Add prefix to nickname */\n nicknamePrefix?: string;\n /** Ignore bot mentions */\n ignoreBots?: boolean;\n}\n\nexport const afkTables: Record<string, TableDefinition> = {\n afk_users: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n user_id: { type: 'string', index: true },\n reason: { type: 'string' },\n set_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const afkEventHandlers: EventHandler[] = [\n // Remove AFK when user sends message\n {\n event: 'message',\n condition: '${!message.author.bot}',\n actions: [\n {\n action: 'db_query',\n table: 'afk_users',\n where: { guild_id: '${guild.id}', user_id: '${user.id}' },\n as: 'afkStatus',\n },\n {\n action: 'flow_if',\n condition: '${afkStatus.length > 0}',\n then: [\n // Remove AFK\n {\n action: 'db_delete',\n table: 'afk_users',\n where: { guild_id: '${guild.id}', user_id: '${user.id}' },\n },\n // Remove nickname prefix if set\n {\n action: 'flow_if',\n condition: '${config.afk?.nicknamePrefix && member.nickname?.startsWith(config.afk.nicknamePrefix)}',\n then: [\n {\n action: 'set_nickname',\n user: '${user.id}',\n nickname: '${member.nickname.replace(config.afk.nicknamePrefix, \"\")}',\n },\n ],\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: 'Welcome back ${user}! I removed your AFK status.',\n as: 'welcomeBack',\n },\n {\n action: 'wait',\n duration: 5000,\n },\n {\n action: 'delete_message',\n channel: '${channel.id}',\n message: '${welcomeBack.id}',\n },\n ],\n },\n ],\n },\n // Notify when AFK user is mentioned\n {\n event: 'message',\n condition: '${message.mentions.users.size > 0 && !message.author.bot}',\n actions: [\n {\n action: 'set',\n key: 'mentionedIds',\n value: '${[...message.mentions.users.keys()]}',\n },\n {\n action: 'db_query',\n table: 'afk_users',\n where: { guild_id: '${guild.id}' },\n as: 'allAfk',\n },\n {\n action: 'set',\n key: 'afkMentioned',\n value: '${allAfk.filter(a => mentionedIds.includes(a.user_id))}',\n },\n {\n action: 'flow_if',\n condition: '${afkMentioned.length > 0}',\n then: [\n {\n action: 'set',\n key: 'afkMessages',\n value: '${afkMentioned.map(a => \"<@\" + a.user_id + \"> is AFK: \" + a.reason + \" (since \" + timestamp(a.set_at, \"R\") + \")\").join(\"\\\\n\")}',\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: '${afkMessages}',\n as: 'afkNotice',\n },\n {\n action: 'wait',\n duration: 10000,\n },\n {\n action: 'delete_message',\n channel: '${channel.id}',\n message: '${afkNotice.id}',\n },\n ],\n },\n ],\n },\n];\n\nexport const afkCommands: CommandDefinition[] = [\n {\n name: 'afk',\n description: 'Set your AFK status',\n options: [\n { name: 'reason', description: 'AFK reason', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'reason',\n value: '${truncate(args.reason || \"AFK\", config.afk?.maxReasonLength || 100)}',\n },\n // Check if already AFK\n {\n action: 'db_query',\n table: 'afk_users',\n where: { guild_id: '${guild.id}', user_id: '${user.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: '${existing.length > 0}',\n then: [\n {\n action: 'db_update',\n table: 'afk_users',\n where: { guild_id: '${guild.id}', user_id: '${user.id}' },\n data: { reason: '${reason}', set_at: '${now()}' },\n },\n ],\n else: [\n {\n action: 'db_insert',\n table: 'afk_users',\n data: {\n guild_id: '${guild.id}',\n user_id: '${user.id}',\n reason: '${reason}',\n set_at: '${now()}',\n },\n },\n ],\n },\n // Add nickname prefix if configured\n {\n action: 'flow_if',\n condition: '${config.afk?.nicknamePrefix && !member.nickname?.startsWith(config.afk.nicknamePrefix)}',\n then: [\n {\n action: 'set_nickname',\n user: '${user.id}',\n nickname: '${config.afk.nicknamePrefix + (member.nickname || user.username)}',\n },\n ],\n },\n {\n action: 'reply',\n content: 'I set your AFK: ${reason}',\n ephemeral: false,\n },\n ],\n },\n];\n\nexport function getAfkSpec(config: AfkConfig = {}): Partial<FurlowSpec> {\n return {\n commands: afkCommands,\n events: afkEventHandlers,\n state: {\n tables: afkTables,\n },\n };\n}\n","/**\n * Reminders builtin module\n * Handles scheduled reminders with DM delivery\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface RemindersConfig {\n /** Maximum reminders per user */\n maxRemindersPerUser?: number;\n /** Minimum reminder duration */\n minDuration?: string;\n /** Maximum reminder duration */\n maxDuration?: string;\n /** Allow DM reminders */\n allowDM?: boolean;\n}\n\nexport const remindersTables: Record<string, TableDefinition> = {\n reminders: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n channel_id: { type: 'string' },\n user_id: { type: 'string', index: true },\n message: { type: 'string' },\n remind_at: { type: 'timestamp', index: true },\n dm: { type: 'boolean', default: false },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const remindersEventHandlers: EventHandler[] = [\n // Check reminders on scheduler tick\n {\n event: 'scheduler_tick',\n actions: [\n {\n action: 'db_query',\n table: 'reminders',\n where: {},\n as: 'allReminders',\n },\n {\n action: 'set',\n key: 'dueReminders',\n value: '${allReminders.filter(r => new Date(r.remind_at) <= now())}',\n },\n {\n action: 'batch',\n items: '${dueReminders}',\n each: { action: 'emit', event: 'reminder_due', data: { reminder: '${item}' } },\n },\n ],\n },\n // Handle due reminder\n {\n event: 'reminder_due',\n actions: [\n {\n action: 'set',\n key: 'reminder',\n value: '${event.data.reminder}',\n },\n // Delete the reminder\n {\n action: 'db_delete',\n table: 'reminders',\n where: { id: '${reminder.id}' },\n },\n // Send reminder\n {\n action: 'flow_if',\n condition: '${reminder.dm}',\n then: [\n {\n action: 'send_dm',\n user: '${reminder.user_id}',\n embed: {\n title: 'Reminder',\n description: '${reminder.message}',\n color: '#5865f2',\n footer: { text: 'Set ${timestamp(reminder.created_at, \"R\")}' },\n },\n },\n ],\n else: [\n {\n action: 'send_message',\n channel: '${reminder.channel_id}',\n content: '<@${reminder.user_id}> Reminder: ${reminder.message}',\n },\n ],\n },\n ],\n },\n];\n\nexport const remindersCommands: CommandDefinition[] = [\n {\n name: 'remind',\n description: 'Set a reminder',\n options: [\n { name: 'time', description: 'When to remind (e.g., 10m, 2h, 1d)', type: 'string', required: true },\n { name: 'message', description: 'Reminder message', type: 'string', required: true },\n { name: 'dm', description: 'Send reminder via DM', type: 'boolean', required: false },\n ],\n actions: [\n // Check max reminders\n {\n action: 'db_query',\n table: 'reminders',\n where: { user_id: '${user.id}' },\n as: 'userReminders',\n },\n {\n action: 'flow_if',\n condition: '${userReminders.length >= (config.reminders?.maxRemindersPerUser || 25)}',\n then: [\n { action: 'reply', content: 'You have too many reminders! Delete some first.', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Calculate remind time\n {\n action: 'set',\n key: 'remindAt',\n value: '${addDuration(now(), args.time)}',\n },\n // Create reminder\n {\n action: 'db_insert',\n table: 'reminders',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n user_id: '${user.id}',\n message: '${args.message}',\n remind_at: '${remindAt}',\n dm: '${args.dm || false}',\n created_at: '${now()}',\n },\n as: 'reminder',\n },\n {\n action: 'reply',\n embed: {\n title: 'Reminder Set',\n description: 'I\\'ll remind you ${timestamp(remindAt, \"R\")}: ${args.message}',\n color: '#57f287',\n footer: { text: 'ID: ${reminder.id}' },\n },\n ephemeral: true,\n },\n ],\n },\n {\n name: 'reminders',\n description: 'View your reminders',\n actions: [\n {\n action: 'db_query',\n table: 'reminders',\n where: { user_id: '${user.id}' },\n order_by: 'remind_at ASC',\n as: 'reminders',\n },\n {\n action: 'flow_if',\n condition: '${reminders.length === 0}',\n then: [\n { action: 'reply', content: 'You have no reminders!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'reminderList',\n value: '${reminders.map((r, i) => \"**\" + (i + 1) + \".** \" + truncate(r.message, 50) + \" - \" + timestamp(r.remind_at, \"R\") + \" (ID: \" + r.id + \")\").join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Your Reminders',\n description: '${reminderList}',\n color: '#5865f2',\n footer: { text: '${reminders.length} reminder(s)' },\n },\n ephemeral: true,\n },\n ],\n },\n {\n name: 'delreminder',\n description: 'Delete a reminder',\n options: [\n { name: 'id', description: 'Reminder ID', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'reminders',\n where: { id: '${args.id}', user_id: '${user.id}' },\n as: 'reminder',\n },\n {\n action: 'flow_if',\n condition: '${reminder.length === 0}',\n then: [\n { action: 'reply', content: 'Reminder not found or not yours!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_delete',\n table: 'reminders',\n where: { id: '${args.id}' },\n },\n {\n action: 'reply',\n content: 'Reminder deleted!',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport function getRemindersSpec(config: RemindersConfig = {}): Partial<FurlowSpec> {\n return {\n commands: remindersCommands,\n events: remindersEventHandlers,\n state: {\n tables: remindersTables,\n },\n };\n}\n","/**\n * Utilities builtin module\n * Common utility commands: serverinfo, userinfo, avatar, etc.\n */\n\nimport type { FurlowSpec, CommandDefinition } from '@furlow/schema';\n\nexport interface UtilitiesConfig {\n /** Commands to enable/disable */\n enabledCommands?: string[];\n}\n\nexport const utilitiesCommands: CommandDefinition[] = [\n {\n name: 'serverinfo',\n description: 'View server information',\n actions: [\n {\n action: 'set',\n key: 'boostLevel',\n value: '${[\"None\", \"Level 1\", \"Level 2\", \"Level 3\"][guild.premiumTier]}',\n },\n {\n action: 'set',\n key: 'verificationLevel',\n value: '${[\"None\", \"Low\", \"Medium\", \"High\", \"Highest\"][guild.verificationLevel]}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name}',\n thumbnail: '${guild.iconURL({ size: 256 })}',\n color: '#5865f2',\n fields: [\n { name: 'Owner', value: '<@${guild.ownerId}>', inline: true },\n { name: 'Created', value: '${timestamp(guild.createdAt, \"R\")}', inline: true },\n { name: 'Members', value: '${guild.memberCount}', inline: true },\n { name: 'Channels', value: '${guild.channels.cache.size}', inline: true },\n { name: 'Roles', value: '${guild.roles.cache.size}', inline: true },\n { name: 'Emojis', value: '${guild.emojis.cache.size}', inline: true },\n { name: 'Boost Level', value: '${boostLevel}', inline: true },\n { name: 'Boosts', value: '${guild.premiumSubscriptionCount || 0}', inline: true },\n { name: 'Verification', value: '${verificationLevel}', inline: true },\n ],\n footer: { text: 'ID: ${guild.id}' },\n },\n },\n ],\n },\n {\n name: 'userinfo',\n description: 'View user information',\n options: [\n { name: 'user', description: 'User to view', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'set',\n key: 'targetMember',\n value: '${guild.members.cache.get(targetUser.id)}',\n },\n {\n action: 'set',\n key: 'roles',\n value: '${targetMember?.roles?.cache?.filter(r => r.id !== guild.id)?.sort((a, b) => b.position - a.position)?.map(r => r.toString())?.slice(0, 10)?.join(\", \") || \"None\"}',\n },\n {\n action: 'reply',\n embed: {\n title: '${targetUser.tag}',\n thumbnail: '${targetUser.avatarURL({ size: 256 })}',\n color: '${targetMember?.displayHexColor || \"#5865f2\"}',\n fields: [\n { name: 'Username', value: '${targetUser.username}', inline: true },\n { name: 'Nickname', value: '${targetMember?.nickname || \"None\"}', inline: true },\n { name: 'Bot', value: '${targetUser.bot ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Created', value: '${timestamp(targetUser.createdAt, \"R\")}', inline: true },\n { name: 'Joined', value: '${targetMember?.joinedAt ? timestamp(targetMember.joinedAt, \"R\") : \"N/A\"}', inline: true },\n { name: 'Highest Role', value: '${targetMember?.roles?.highest?.toString() || \"None\"}', inline: true },\n { name: 'Roles (${targetMember?.roles?.cache?.size - 1 || 0})', value: '${roles}', inline: false },\n ],\n footer: { text: 'ID: ${targetUser.id}' },\n },\n },\n ],\n },\n {\n name: 'avatar',\n description: 'View user avatar',\n options: [\n { name: 'user', description: 'User to view', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'reply',\n embed: {\n title: '${targetUser.tag}\\'s Avatar',\n image: '${targetUser.avatarURL({ size: 1024 }) || targetUser.defaultAvatarURL}',\n color: '#5865f2',\n description: '[PNG](${targetUser.avatarURL({ format: \"png\", size: 1024 })}) | [JPG](${targetUser.avatarURL({ format: \"jpg\", size: 1024 })}) | [WEBP](${targetUser.avatarURL({ format: \"webp\", size: 1024 })})',\n },\n },\n ],\n },\n {\n name: 'banner',\n description: 'View user banner',\n options: [\n { name: 'user', description: 'User to view', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'flow_if',\n condition: '${!targetUser.bannerURL()}',\n then: [\n { action: 'reply', content: 'This user has no banner!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'reply',\n embed: {\n title: '${targetUser.tag}\\'s Banner',\n image: '${targetUser.bannerURL({ size: 1024 })}',\n color: '#5865f2',\n },\n },\n ],\n },\n {\n name: 'roleinfo',\n description: 'View role information',\n options: [\n { name: 'role', description: 'Role to view', type: 'role', required: true },\n ],\n actions: [\n {\n action: 'reply',\n embed: {\n title: '${args.role.name}',\n color: '${args.role.hexColor}',\n fields: [\n { name: 'Color', value: '${args.role.hexColor}', inline: true },\n { name: 'Position', value: '${args.role.position}', inline: true },\n { name: 'Members', value: '${args.role.members.size}', inline: true },\n { name: 'Hoisted', value: '${args.role.hoist ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Mentionable', value: '${args.role.mentionable ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Managed', value: '${args.role.managed ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Created', value: '${timestamp(args.role.createdAt, \"R\")}', inline: true },\n ],\n footer: { text: 'ID: ${args.role.id}' },\n },\n },\n ],\n },\n {\n name: 'channelinfo',\n description: 'View channel information',\n options: [\n { name: 'channel', description: 'Channel to view', type: 'channel', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetChannel',\n value: '${args.channel || channel}',\n },\n {\n action: 'reply',\n embed: {\n title: '#${targetChannel.name}',\n color: '#5865f2',\n fields: [\n { name: 'Type', value: '${targetChannel.type}', inline: true },\n { name: 'Category', value: '${targetChannel.parent?.name || \"None\"}', inline: true },\n { name: 'Position', value: '${targetChannel.position}', inline: true },\n { name: 'NSFW', value: '${targetChannel.nsfw ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Created', value: '${timestamp(targetChannel.createdAt, \"R\")}', inline: true },\n { name: 'Topic', value: '${targetChannel.topic || \"None\"}', inline: false },\n ],\n footer: { text: 'ID: ${targetChannel.id}' },\n },\n },\n ],\n },\n {\n name: 'ping',\n description: 'Check bot latency',\n actions: [\n {\n action: 'reply',\n content: 'Pong! Latency: ${client.ws.ping}ms',\n },\n ],\n },\n {\n name: 'invite',\n description: 'Get bot invite link',\n actions: [\n {\n action: 'reply',\n embed: {\n title: 'Invite ${client.user.username}',\n description: '[Click here to invite](https://discord.com/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot%20applications.commands)',\n color: '#5865f2',\n },\n ephemeral: true,\n },\n ],\n },\n {\n name: 'membercount',\n description: 'View member count',\n actions: [\n {\n action: 'set',\n key: 'humans',\n value: '${guild.members.cache.filter(m => !m.user.bot).size}',\n },\n {\n action: 'set',\n key: 'bots',\n value: '${guild.members.cache.filter(m => m.user.bot).size}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Member Count',\n color: '#5865f2',\n fields: [\n { name: 'Total', value: '${guild.memberCount}', inline: true },\n { name: 'Humans', value: '${humans}', inline: true },\n { name: 'Bots', value: '${bots}', inline: true },\n ],\n },\n },\n ],\n },\n {\n name: 'emojis',\n description: 'List server emojis',\n actions: [\n {\n action: 'set',\n key: 'staticEmojis',\n value: '${guild.emojis.cache.filter(e => !e.animated).map(e => e.toString()).slice(0, 50).join(\" \")}',\n },\n {\n action: 'set',\n key: 'animatedEmojis',\n value: '${guild.emojis.cache.filter(e => e.animated).map(e => e.toString()).slice(0, 50).join(\" \")}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name} Emojis',\n color: '#5865f2',\n fields: [\n { name: 'Static (${guild.emojis.cache.filter(e => !e.animated).size})', value: '${staticEmojis || \"None\"}' },\n { name: 'Animated (${guild.emojis.cache.filter(e => e.animated).size})', value: '${animatedEmojis || \"None\"}' },\n ],\n },\n },\n ],\n },\n {\n name: 'roles',\n description: 'List server roles',\n actions: [\n {\n action: 'set',\n key: 'roleList',\n value: '${guild.roles.cache.filter(r => r.id !== guild.id).sort((a, b) => b.position - a.position).map(r => r.toString()).slice(0, 40).join(\", \")}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name} Roles (${guild.roles.cache.size - 1})',\n description: '${roleList}',\n color: '#5865f2',\n },\n },\n ],\n },\n];\n\nexport function getUtilitiesSpec(config: UtilitiesConfig = {}): Partial<FurlowSpec> {\n return {\n commands: utilitiesCommands,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/moderation/index.ts","../src/welcome/index.ts","../src/logging/index.ts","../src/tickets/index.ts","../src/reaction-roles/index.ts","../src/leveling/index.ts","../src/music/index.ts","../src/starboard/index.ts","../src/polls/index.ts","../src/giveaways/index.ts","../src/auto-responder/index.ts","../src/afk/index.ts","../src/reminders/index.ts","../src/utilities/index.ts"],"sourcesContent":["/**\n * Moderation builtin module\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler } from '@furlow/schema';\n\nexport interface ModerationConfig {\n /** Log channel for moderation actions */\n logChannel?: string;\n /** Whether to DM users on moderation actions */\n dmOnAction?: boolean;\n /** Roles exempt from moderation */\n exemptRoles?: string[];\n /** Enable warning system */\n warnings?: {\n enabled?: boolean;\n maxWarnings?: number;\n escalation?: Array<{\n count: number;\n action: 'kick' | 'ban' | 'timeout';\n duration?: string;\n }>;\n };\n}\n\nexport const moderationCommands: CommandDefinition[] = [\n {\n name: 'warn',\n description: 'Warn a user',\n options: [\n { name: 'user', description: 'User to warn', type: 'user', required: true },\n { name: 'reason', description: 'Reason for warning', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_insert',\n table: 'warnings',\n data: {\n user_id: '${args.user.id}',\n guild_id: '${guild.id}',\n moderator_id: '${user.id}',\n reason: '${args.reason}',\n created_at: '${now()}',\n },\n },\n {\n action: 'reply',\n content: 'Warned ${args.user.username} for: ${args.reason}',\n ephemeral: true,\n },\n {\n action: 'send_dm',\n user: '${args.user.id}',\n embed: {\n title: 'Warning Received',\n description: 'You have been warned in ${guild.name}',\n fields: [\n { name: 'Reason', value: '${args.reason}' },\n { name: 'Moderator', value: '${user.username}' },\n ],\n color: '#ffa500',\n },\n },\n ],\n },\n {\n name: 'kick',\n description: 'Kick a user from the server',\n options: [\n { name: 'user', description: 'User to kick', type: 'user', required: true },\n { name: 'reason', description: 'Reason for kick', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'kick',\n user: '${args.user.id}',\n reason: '${args.reason || \"No reason provided\"}',\n dm_user: true,\n dm_message: 'You have been kicked from ${guild.name}. Reason: ${args.reason || \"No reason provided\"}',\n },\n {\n action: 'reply',\n content: 'Kicked ${args.user.username}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'ban',\n description: 'Ban a user from the server',\n options: [\n { name: 'user', description: 'User to ban', type: 'user', required: true },\n { name: 'reason', description: 'Reason for ban', type: 'string', required: false },\n { name: 'delete_days', description: 'Days of messages to delete (0-7)', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'ban',\n user: '${args.user.id}',\n reason: '${args.reason || \"No reason provided\"}',\n delete_message_days: '${args.delete_days || 0}' as unknown as number,\n dm_user: true,\n dm_message: 'You have been banned from ${guild.name}. Reason: ${args.reason || \"No reason provided\"}',\n },\n {\n action: 'reply',\n content: 'Banned ${args.user.username}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'unban',\n description: 'Unban a user',\n options: [\n { name: 'user_id', description: 'User ID to unban', type: 'string', required: true },\n { name: 'reason', description: 'Reason for unban', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'unban',\n user: '${args.user_id}',\n reason: '${args.reason || \"No reason provided\"}',\n },\n {\n action: 'reply',\n content: 'Unbanned user ${args.user_id}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'timeout',\n description: 'Timeout a user',\n options: [\n { name: 'user', description: 'User to timeout', type: 'user', required: true },\n { name: 'duration', description: 'Duration (e.g., 10m, 1h, 1d)', type: 'string', required: true },\n { name: 'reason', description: 'Reason for timeout', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'timeout',\n user: '${args.user.id}',\n duration: '${args.duration}',\n reason: '${args.reason || \"No reason provided\"}',\n dm_user: true,\n dm_message: 'You have been timed out in ${guild.name} for ${args.duration}. Reason: ${args.reason || \"No reason provided\"}',\n },\n {\n action: 'reply',\n content: 'Timed out ${args.user.username} for ${args.duration}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'warnings',\n description: 'View warnings for a user',\n options: [\n { name: 'user', description: 'User to check', type: 'user', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'warnings',\n where: {\n user_id: '${args.user.id}',\n guild_id: '${guild.id}',\n },\n order_by: 'created_at DESC',\n limit: 10,\n as: 'warnings',\n },\n {\n action: 'reply',\n embed: {\n title: 'Warnings for ${args.user.username}',\n description: '${warnings.length == 0 ? \"No warnings found\" : warnings | map(\"- \" + .reason) | join(\"\\\\n\")}',\n color: '${warnings.length > 0 ? \"#ffa500\" : \"#00ff00\"}',\n footer: {\n text: 'Total: ${warnings.length} warnings',\n },\n },\n },\n ],\n },\n {\n name: 'purge',\n description: 'Delete multiple messages',\n options: [\n { name: 'count', description: 'Number of messages to delete (1-100)', type: 'integer', required: true },\n { name: 'user', description: 'Only delete messages from this user', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'bulk_delete',\n channel: '${channel.id}',\n count: '${args.count}' as unknown as number,\n filter: '${args.user ? \"message.author.id == \\\\\"\" + args.user.id + \"\\\\\"\" : null}',\n },\n {\n action: 'reply',\n content: 'Deleted messages',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport const moderationTables = {\n warnings: {\n columns: {\n id: { type: 'number' as const, primary: true },\n user_id: { type: 'string' as const, index: true },\n guild_id: { type: 'string' as const, index: true },\n moderator_id: { type: 'string' as const },\n reason: { type: 'string' as const },\n created_at: { type: 'timestamp' as const },\n },\n },\n mod_cases: {\n columns: {\n id: { type: 'number' as const, primary: true },\n guild_id: { type: 'string' as const, index: true },\n user_id: { type: 'string' as const, index: true },\n moderator_id: { type: 'string' as const },\n action: { type: 'string' as const },\n reason: { type: 'string' as const },\n created_at: { type: 'timestamp' as const },\n },\n },\n};\n\nexport function getModerationSpec(config: ModerationConfig = {}): Partial<FurlowSpec> {\n return {\n commands: moderationCommands,\n state: {\n tables: moderationTables,\n },\n };\n}\n","/**\n * Welcome builtin module\n * Handles member join/leave messages, auto-role assignment, and welcome images\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, CanvasGenerator } from '@furlow/schema';\n\nexport interface WelcomeConfig {\n /** Channel to send welcome messages */\n channel?: string;\n /** Welcome message template */\n message?: string;\n /** Embed for welcome messages */\n embed?: {\n title?: string;\n description?: string;\n color?: string;\n thumbnail?: string;\n image?: string;\n footer?: string;\n };\n /** Use welcome image */\n useImage?: boolean;\n /** Welcome image generator name */\n imageGenerator?: string;\n /** Roles to assign on join */\n autoRoles?: string[];\n /** Leave channel (defaults to welcome channel) */\n leaveChannel?: string;\n /** Leave message template */\n leaveMessage?: string;\n /** Leave embed */\n leaveEmbed?: {\n title?: string;\n description?: string;\n color?: string;\n };\n /** DM new members */\n dmNewMembers?: boolean;\n /** DM message */\n dmMessage?: string;\n}\n\nexport const welcomeEventHandlers: EventHandler[] = [\n {\n event: 'member_join',\n actions: [\n // Auto-role assignment\n {\n action: 'flow_if',\n condition: 'config.welcome.autoRoles && config.welcome.autoRoles.length > 0',\n then: [\n {\n action: 'assign_role',\n user: '${member.id}',\n role: '${config.welcome.autoRoles}',\n },\n ],\n },\n // DM new member\n {\n action: 'flow_if',\n condition: 'config.welcome.dmNewMembers',\n then: [\n {\n action: 'send_dm',\n user: '${member.id}',\n content: '${config.welcome.dmMessage || \"Welcome to \" + guild.name + \"!\"}',\n },\n ],\n },\n // Welcome message with image\n {\n action: 'flow_if',\n condition: 'config.welcome.useImage',\n then: [\n {\n action: 'canvas_render',\n generator: '${config.welcome.imageGenerator || \"welcome_card\"}',\n context: {\n member: '${member}',\n guild: '${guild}',\n memberCount: '${guild.member_count}',\n },\n as: 'welcomeImage',\n },\n {\n action: 'send_message',\n channel: '${config.welcome.channel}',\n content: '${config.welcome.message || \"Welcome to the server, \" + member.display_name + \"!\"}',\n files: [\n {\n attachment: '${welcomeImage}',\n name: 'welcome.png',\n },\n ],\n },\n ],\n else: [\n // Welcome message without image\n {\n action: 'flow_if',\n condition: 'config.welcome.embed',\n then: [\n {\n action: 'send_message',\n channel: '${config.welcome.channel}',\n content: '${config.welcome.message}',\n embed: {\n title: '${config.welcome.embed.title || \"Welcome!\"}',\n description: '${config.welcome.embed.description || \"Welcome to \" + guild.name + \", \" + member.display_name + \"!\"}',\n color: '${config.welcome.embed.color || \"#5865f2\"}',\n thumbnail: '${config.welcome.embed.thumbnail || member.avatar}',\n footer: {\n text: '${config.welcome.embed.footer || \"Member #\" + guild.member_count}',\n },\n },\n },\n ],\n else: [\n {\n action: 'send_message',\n channel: '${config.welcome.channel}',\n content: '${config.welcome.message || \"Welcome to the server, \" + member.display_name + \"!\"}',\n },\n ],\n },\n ],\n },\n ],\n },\n {\n event: 'member_leave',\n actions: [\n {\n action: 'flow_if',\n condition: 'config.welcome.leaveChannel || config.welcome.channel',\n then: [\n {\n action: 'flow_if',\n condition: 'config.welcome.leaveEmbed',\n then: [\n {\n action: 'send_message',\n channel: '${config.welcome.leaveChannel || config.welcome.channel}',\n embed: {\n title: '${config.welcome.leaveEmbed.title || \"Goodbye!\"}',\n description: '${config.welcome.leaveEmbed.description || member.display_name + \" has left the server.\"}',\n color: '${config.welcome.leaveEmbed.color || \"#ed4245\"}',\n },\n },\n ],\n else: [\n {\n action: 'send_message',\n channel: '${config.welcome.leaveChannel || config.welcome.channel}',\n content: '${config.welcome.leaveMessage || member.display_name + \" has left the server.\"}',\n },\n ],\n },\n ],\n },\n ],\n },\n];\n\nexport const welcomeCommands: CommandDefinition[] = [\n {\n name: 'welcome',\n description: 'Welcome system commands',\n subcommands: [\n {\n name: 'test',\n description: 'Test the welcome message',\n actions: [\n {\n action: 'emit',\n event: 'member_join',\n data: {\n member: '${member}',\n guild: '${guild}',\n },\n },\n {\n action: 'reply',\n content: 'Welcome message test triggered!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'set-channel',\n description: 'Set the welcome channel',\n options: [\n { name: 'channel', description: 'Channel for welcome messages', type: 'channel', required: true },\n ],\n actions: [\n {\n action: 'set',\n key: 'config.welcome.channel',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: 'Welcome channel set to ${args.channel}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'set-message',\n description: 'Set the welcome message',\n options: [\n { name: 'message', description: 'Welcome message (use {member} and {guild})', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'set',\n key: 'config.welcome.message',\n value: '${args.message}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: 'Welcome message updated!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'add-autorole',\n description: 'Add an auto-role',\n options: [\n { name: 'role', description: 'Role to assign on join', type: 'role', required: true },\n ],\n actions: [\n {\n action: 'list_push',\n key: 'config.welcome.autoRoles',\n value: '${args.role.id}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: 'Auto-role ${args.role.name} added!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'remove-autorole',\n description: 'Remove an auto-role',\n options: [\n { name: 'role', description: 'Role to remove', type: 'role', required: true },\n ],\n actions: [\n {\n action: 'list_remove',\n key: 'config.welcome.autoRoles',\n value: '${args.role.id}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: 'Auto-role ${args.role.name} removed!',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport const welcomeCanvasGenerators: Record<string, CanvasGenerator> = {\n welcome_card: {\n width: 800,\n height: 300,\n background: '#2f3136',\n layers: [\n {\n type: 'rect',\n x: 0,\n y: 0,\n width: 800,\n height: 300,\n color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n radius: 16,\n },\n {\n type: 'circle_image',\n url: '${member.avatar}',\n x: 400,\n y: 100,\n radius: 64,\n border: {\n width: 4,\n color: '#ffffff',\n },\n },\n {\n type: 'text',\n text: 'Welcome!',\n x: 400,\n y: 200,\n font: '32px \"Poppins\", sans-serif',\n color: '#ffffff',\n align: 'center',\n },\n {\n type: 'text',\n text: '${member.display_name}',\n x: 400,\n y: 240,\n font: 'bold 28px \"Poppins\", sans-serif',\n color: '#ffffff',\n align: 'center',\n },\n {\n type: 'text',\n text: 'Member #${guild.member_count}',\n x: 400,\n y: 275,\n font: '16px \"Poppins\", sans-serif',\n color: 'rgba(255, 255, 255, 0.8)',\n align: 'center',\n },\n ],\n },\n};\n\nexport function getWelcomeSpec(config: WelcomeConfig = {}): Partial<FurlowSpec> {\n return {\n events: welcomeEventHandlers,\n commands: welcomeCommands,\n canvas: {\n generators: welcomeCanvasGenerators,\n },\n };\n}\n","/**\n * Logging builtin module\n * Handles comprehensive server logging for messages, members, voice, and moderation\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler } from '@furlow/schema';\n\nexport interface LoggingConfig {\n /** Default log channel */\n channel?: string;\n /** Separate channels per category */\n channels?: {\n messages?: string;\n members?: string;\n voice?: string;\n server?: string;\n moderation?: string;\n };\n /** Ignored channels */\n ignoredChannels?: string[];\n /** Ignored roles (users with these roles won't be logged) */\n ignoredRoles?: string[];\n /** Events to log */\n events?: {\n messageDelete?: boolean;\n messageEdit?: boolean;\n messageBulkDelete?: boolean;\n memberJoin?: boolean;\n memberLeave?: boolean;\n memberUpdate?: boolean;\n memberBan?: boolean;\n memberUnban?: boolean;\n voiceJoin?: boolean;\n voiceLeave?: boolean;\n voiceMove?: boolean;\n channelCreate?: boolean;\n channelDelete?: boolean;\n channelUpdate?: boolean;\n roleCreate?: boolean;\n roleDelete?: boolean;\n roleUpdate?: boolean;\n inviteCreate?: boolean;\n inviteDelete?: boolean;\n };\n /** Include images in logs */\n includeImages?: boolean;\n}\n\nexport const loggingEventHandlers: EventHandler[] = [\n // Message Delete\n {\n event: 'message_delete',\n condition: 'config.logging.events?.messageDelete !== false && !config.logging.ignoredChannels?.includes(channel.id)',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.messages || config.logging.channel}',\n embed: {\n title: 'Message Deleted',\n description: '${message.content || \"*No text content*\"}',\n color: '#ed4245',\n fields: [\n { name: 'Author', value: '${message.author ? \"<@\" + message.author.id + \">\" : \"Unknown\"}', inline: true },\n { name: 'Channel', value: '<#${channel.id}>', inline: true },\n { name: 'Message ID', value: '${message.id}', inline: true },\n ],\n footer: {\n text: 'User ID: ${message.author?.id || \"Unknown\"}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Message Edit\n {\n event: 'message_update',\n condition: 'config.logging.events?.messageEdit !== false && oldMessage.content !== newMessage.content && !config.logging.ignoredChannels?.includes(channel.id)',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.messages || config.logging.channel}',\n embed: {\n title: 'Message Edited',\n color: '#fee75c',\n fields: [\n { name: 'Before', value: '${truncate(oldMessage.content || \"*Empty*\", 1024)}' },\n { name: 'After', value: '${truncate(newMessage.content || \"*Empty*\", 1024)}' },\n { name: 'Author', value: '<@${newMessage.author.id}>', inline: true },\n { name: 'Channel', value: '<#${channel.id}>', inline: true },\n { name: 'Jump to Message', value: '[Click here](${newMessage.url})', inline: true },\n ],\n footer: {\n text: 'User ID: ${newMessage.author.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Bulk Message Delete\n {\n event: 'message_bulk_delete',\n condition: 'config.logging.events?.messageBulkDelete !== false',\n actions: [\n {\n action: 'set',\n key: 'logContent',\n value: '${messages | map(m => \"[\" + (m.author?.tag || \"Unknown\") + \"]: \" + (m.content || \"*attachment/embed*\")) | join(\"\\\\n\")}',\n },\n {\n action: 'send_message',\n channel: '${config.logging.channels?.messages || config.logging.channel}',\n embed: {\n title: 'Bulk Messages Deleted',\n description: '${messages.length} messages were deleted in <#${channel.id}>',\n color: '#ed4245',\n timestamp: '${now()}',\n },\n files: [\n {\n attachment: '${Buffer.from(logContent)}',\n name: 'deleted-messages.txt',\n },\n ],\n },\n ],\n },\n // Member Join\n {\n event: 'member_join',\n condition: 'config.logging.events?.memberJoin !== false',\n actions: [\n {\n action: 'set',\n key: 'accountAge',\n value: '${floor((now() - member.joined_at) / (1000 * 60 * 60 * 24))}',\n },\n {\n action: 'send_message',\n channel: '${config.logging.channels?.members || config.logging.channel}',\n embed: {\n title: 'Member Joined',\n description: '<@${member.id}> joined the server',\n color: '#57f287',\n thumbnail: '${member.avatar}',\n fields: [\n { name: 'Username', value: '${member.user.tag}', inline: true },\n { name: 'Account Age', value: '${accountAge} days', inline: true },\n { name: 'Member Count', value: '${guild.member_count}', inline: true },\n ],\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Member Leave\n {\n event: 'member_leave',\n condition: 'config.logging.events?.memberLeave !== false',\n actions: [\n {\n action: 'set',\n key: 'roles',\n value: '${member.roles?.cache?.filter(r => r.id !== guild.id)?.map(r => r.name)?.join(\", \") || \"None\"}',\n },\n {\n action: 'send_message',\n channel: '${config.logging.channels?.members || config.logging.channel}',\n embed: {\n title: 'Member Left',\n description: '<@${member.id}> left the server',\n color: '#ed4245',\n thumbnail: '${member.avatar}',\n fields: [\n { name: 'Username', value: '${member.user.tag}', inline: true },\n { name: 'Roles', value: '${truncate(roles, 1024)}', inline: false },\n { name: 'Joined At', value: '${timestamp(member.joined_at, \"R\")}', inline: true },\n ],\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Member Update (roles, nickname)\n {\n event: 'member_update',\n condition: 'config.logging.events?.memberUpdate !== false',\n actions: [\n // Role changes\n {\n action: 'flow_if',\n condition: 'oldMember.roles.cache.size !== newMember.roles.cache.size',\n then: [\n {\n action: 'set',\n key: 'addedRoles',\n value: '${newMember.roles.cache.filter(r => !oldMember.roles.cache.has(r.id)).map(r => r.name).join(\", \")}',\n },\n {\n action: 'set',\n key: 'removedRoles',\n value: '${oldMember.roles.cache.filter(r => !newMember.roles.cache.has(r.id)).map(r => r.name).join(\", \")}',\n },\n {\n action: 'send_message',\n channel: '${config.logging.channels?.members || config.logging.channel}',\n embed: {\n title: 'Member Roles Updated',\n description: '<@${newMember.id}>\\'s roles were changed',\n color: '#5865f2',\n fields: [\n { name: 'Added Roles', value: '${addedRoles || \"None\"}', inline: true },\n { name: 'Removed Roles', value: '${removedRoles || \"None\"}', inline: true },\n ],\n footer: {\n text: 'User ID: ${newMember.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Nickname changes\n {\n action: 'flow_if',\n condition: 'oldMember.nickname !== newMember.nickname',\n then: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.members || config.logging.channel}',\n embed: {\n title: 'Nickname Changed',\n description: '<@${newMember.id}>\\'s nickname was changed',\n color: '#5865f2',\n fields: [\n { name: 'Before', value: '${oldMember.nickname || oldMember.user.username}', inline: true },\n { name: 'After', value: '${newMember.nickname || newMember.user.username}', inline: true },\n ],\n footer: {\n text: 'User ID: ${newMember.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n ],\n },\n // Member Ban\n {\n event: 'member_ban',\n condition: 'config.logging.events?.memberBan !== false',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.moderation || config.logging.channel}',\n embed: {\n title: 'Member Banned',\n description: '<@${user.id}> was banned',\n color: '#ed4245',\n thumbnail: '${user.avatar}',\n fields: [\n { name: 'Username', value: '${user.tag}', inline: true },\n { name: 'Reason', value: '${ban.reason || \"No reason provided\"}', inline: false },\n ],\n footer: {\n text: 'User ID: ${user.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Member Unban\n {\n event: 'member_unban',\n condition: 'config.logging.events?.memberUnban !== false',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.moderation || config.logging.channel}',\n embed: {\n title: 'Member Unbanned',\n description: '<@${user.id}> was unbanned',\n color: '#57f287',\n thumbnail: '${user.avatar}',\n fields: [\n { name: 'Username', value: '${user.tag}', inline: true },\n ],\n footer: {\n text: 'User ID: ${user.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Voice Join\n {\n event: 'voice_join',\n condition: 'config.logging.events?.voiceJoin !== false',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.voice || config.logging.channel}',\n embed: {\n title: 'Voice Channel Joined',\n description: '<@${member.id}> joined <#${channel.id}>',\n color: '#57f287',\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Voice Leave\n {\n event: 'voice_leave',\n condition: 'config.logging.events?.voiceLeave !== false',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.voice || config.logging.channel}',\n embed: {\n title: 'Voice Channel Left',\n description: '<@${member.id}> left <#${channel.id}>',\n color: '#ed4245',\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Voice Move\n {\n event: 'voice_move',\n condition: 'config.logging.events?.voiceMove !== false',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.voice || config.logging.channel}',\n embed: {\n title: 'Voice Channel Switch',\n description: '<@${member.id}> switched voice channels',\n color: '#5865f2',\n fields: [\n { name: 'From', value: '<#${oldChannel.id}>', inline: true },\n { name: 'To', value: '<#${newChannel.id}>', inline: true },\n ],\n footer: {\n text: 'User ID: ${member.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Channel Create\n {\n event: 'channel_create',\n condition: 'config.logging.events?.channelCreate !== false',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.server || config.logging.channel}',\n embed: {\n title: 'Channel Created',\n description: '<#${channel.id}> was created',\n color: '#57f287',\n fields: [\n { name: 'Name', value: '${channel.name}', inline: true },\n { name: 'Type', value: '${channel.type}', inline: true },\n ],\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Channel Delete\n {\n event: 'channel_delete',\n condition: 'config.logging.events?.channelDelete !== false',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.server || config.logging.channel}',\n embed: {\n title: 'Channel Deleted',\n description: '#${channel.name} was deleted',\n color: '#ed4245',\n fields: [\n { name: 'Type', value: '${channel.type}', inline: true },\n ],\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Role Create\n {\n event: 'role_create',\n condition: 'config.logging.events?.roleCreate !== false',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.server || config.logging.channel}',\n embed: {\n title: 'Role Created',\n description: '${role.name} was created',\n color: '${role.hexColor || \"#57f287\"}',\n fields: [\n { name: 'Color', value: '${role.hexColor || \"None\"}', inline: true },\n { name: 'Hoisted', value: '${role.hoist ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Mentionable', value: '${role.mentionable ? \"Yes\" : \"No\"}', inline: true },\n ],\n footer: {\n text: 'Role ID: ${role.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n // Role Delete\n {\n event: 'role_delete',\n condition: 'config.logging.events?.roleDelete !== false',\n actions: [\n {\n action: 'send_message',\n channel: '${config.logging.channels?.server || config.logging.channel}',\n embed: {\n title: 'Role Deleted',\n description: '${role.name} was deleted',\n color: '#ed4245',\n footer: {\n text: 'Role ID: ${role.id}',\n },\n timestamp: '${now()}',\n },\n },\n ],\n },\n];\n\nexport const loggingCommands: CommandDefinition[] = [\n {\n name: 'logging',\n description: 'Logging configuration commands',\n subcommands: [\n {\n name: 'set-channel',\n description: 'Set the logging channel',\n options: [\n { name: 'channel', description: 'Channel for logs', type: 'channel', required: true },\n { name: 'category', description: 'Log category', type: 'string', required: false, choices: [\n { name: 'All', value: 'all' },\n { name: 'Messages', value: 'messages' },\n { name: 'Members', value: 'members' },\n { name: 'Voice', value: 'voice' },\n { name: 'Server', value: 'server' },\n { name: 'Moderation', value: 'moderation' },\n ]},\n ],\n actions: [\n {\n action: 'flow_if',\n condition: '!args.category || args.category === \"all\"',\n then: [\n {\n action: 'set',\n key: 'config.logging.channel',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n ],\n else: [\n {\n action: 'set',\n key: 'config.logging.channels.${args.category}',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n ],\n },\n {\n action: 'reply',\n content: 'Logging channel updated!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'toggle',\n description: 'Toggle a logging event',\n options: [\n { name: 'event', description: 'Event to toggle', type: 'string', required: true, choices: [\n { name: 'Message Delete', value: 'messageDelete' },\n { name: 'Message Edit', value: 'messageEdit' },\n { name: 'Member Join', value: 'memberJoin' },\n { name: 'Member Leave', value: 'memberLeave' },\n { name: 'Member Ban', value: 'memberBan' },\n { name: 'Voice Join', value: 'voiceJoin' },\n { name: 'Voice Leave', value: 'voiceLeave' },\n ]},\n { name: 'enabled', description: 'Enable or disable', type: 'boolean', required: true },\n ],\n actions: [\n {\n action: 'set',\n key: 'config.logging.events.${args.event}',\n value: '${args.enabled}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: '${args.event} logging ${args.enabled ? \"enabled\" : \"disabled\"}!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'ignore-channel',\n description: 'Ignore a channel from logging',\n options: [\n { name: 'channel', description: 'Channel to ignore', type: 'channel', required: true },\n ],\n actions: [\n {\n action: 'list_push',\n key: 'config.logging.ignoredChannels',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n {\n action: 'reply',\n content: '${args.channel} will now be ignored from logs.',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport function getLoggingSpec(config: LoggingConfig = {}): Partial<FurlowSpec> {\n return {\n events: loggingEventHandlers,\n commands: loggingCommands,\n };\n}\n","/**\n * Tickets builtin module\n * Handles ticket creation, claiming, closing, and transcripts\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition, ComponentDefinition } from '@furlow/schema';\n\nexport interface TicketsConfig {\n /** Category to create tickets in */\n category?: string;\n /** Support roles that can see tickets */\n supportRoles?: string[];\n /** Ticket channel naming pattern */\n channelPattern?: string;\n /** Maximum open tickets per user */\n maxTicketsPerUser?: number;\n /** Ticket panel channel */\n panelChannel?: string;\n /** Log channel for ticket transcripts */\n logChannel?: string;\n /** Auto-close inactive tickets (hours) */\n autoCloseAfter?: number;\n /** Ticket categories/types */\n categories?: Array<{\n id: string;\n name: string;\n description?: string;\n emoji?: string;\n supportRoles?: string[];\n }>;\n /** DM user on ticket close */\n dmOnClose?: boolean;\n /** Include transcript on close */\n includeTranscript?: boolean;\n}\n\nexport const ticketsTables: Record<string, TableDefinition> = {\n tickets: {\n columns: {\n id: { type: 'number', primary: true },\n channel_id: { type: 'string', unique: true },\n guild_id: { type: 'string', index: true },\n user_id: { type: 'string', index: true },\n category: { type: 'string' },\n claimed_by: { type: 'string' },\n status: { type: 'string', default: 'open' },\n created_at: { type: 'timestamp' },\n closed_at: { type: 'timestamp' },\n },\n },\n ticket_messages: {\n columns: {\n id: { type: 'number', primary: true },\n ticket_id: { type: 'number', index: true },\n author_id: { type: 'string' },\n author_name: { type: 'string' },\n content: { type: 'string' },\n attachments: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const ticketPanelComponents: ComponentDefinition[] = [\n {\n type: 'action_row',\n components: [\n {\n type: 'button',\n style: 'primary',\n label: 'Create Ticket',\n emoji: '📩',\n custom_id: 'ticket_create',\n },\n ],\n },\n];\n\nexport const ticketControlComponents: ComponentDefinition[] = [\n {\n type: 'action_row',\n components: [\n {\n type: 'button',\n style: 'secondary',\n label: 'Claim',\n emoji: '🙋',\n custom_id: 'ticket_claim',\n },\n {\n type: 'button',\n style: 'danger',\n label: 'Close',\n emoji: '🔒',\n custom_id: 'ticket_close',\n },\n {\n type: 'button',\n style: 'secondary',\n label: 'Transcript',\n emoji: '📜',\n custom_id: 'ticket_transcript',\n },\n ],\n },\n];\n\nexport const ticketsEventHandlers: EventHandler[] = [\n // Handle ticket creation button\n {\n event: 'button_click',\n condition: 'interaction.customId === \"ticket_create\"',\n actions: [\n // Check max tickets\n {\n action: 'db_query',\n table: 'tickets',\n where: {\n guild_id: '${guild.id}',\n user_id: '${user.id}',\n status: 'open',\n },\n as: 'userTickets',\n },\n {\n action: 'flow_if',\n condition: 'userTickets.length >= (config.tickets.maxTicketsPerUser || 1)',\n then: [\n {\n action: 'reply',\n content: 'You already have the maximum number of open tickets!',\n ephemeral: true,\n },\n { action: 'abort' },\n ],\n },\n // Show category selector if configured\n {\n action: 'flow_if',\n condition: 'config.tickets.categories && config.tickets.categories.length > 0',\n then: [\n {\n action: 'reply',\n content: 'Select a ticket category:',\n ephemeral: true,\n components: [\n {\n type: 'action_row',\n components: [\n {\n type: 'select_menu',\n custom_id: 'ticket_category_select',\n placeholder: 'Select category...',\n options: '${config.tickets.categories | map(c => ({ label: c.name, value: c.id, description: c.description, emoji: c.emoji }))}',\n },\n ],\n },\n ],\n },\n ],\n else: [\n { action: 'emit', event: 'ticket_create_confirmed', data: { category: 'general' } },\n ],\n },\n ],\n },\n // Handle category selection\n {\n event: 'select_menu',\n condition: 'interaction.customId === \"ticket_category_select\"',\n actions: [\n {\n action: 'emit',\n event: 'ticket_create_confirmed',\n data: { category: '${interaction.values[0]}' },\n },\n ],\n },\n // Create the ticket channel\n {\n event: 'ticket_create_confirmed',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { guild_id: '${guild.id}' },\n order_by: 'id DESC',\n limit: 1,\n as: 'lastTicket',\n },\n {\n action: 'set',\n key: 'ticketNumber',\n value: '${(lastTicket[0]?.id || 0) + 1}',\n },\n {\n action: 'set',\n key: 'channelName',\n value: '${(config.tickets.channelPattern || \"ticket-{number}\") | replace(\"{number}\", ticketNumber) | replace(\"{user}\", user.username) | replace(\"{category}\", event.data.category)}',\n },\n // Get support roles for this category\n {\n action: 'set',\n key: 'categoryConfig',\n value: '${config.tickets.categories?.find(c => c.id === event.data.category)}',\n },\n {\n action: 'set',\n key: 'supportRoles',\n value: '${categoryConfig?.supportRoles || config.tickets.supportRoles || []}',\n },\n // Create channel with permissions\n {\n action: 'create_channel',\n name: '${channelName}',\n type: 'text',\n parent: '${config.tickets.category}',\n permission_overwrites: [\n {\n id: '${guild.id}',\n type: 'role',\n deny: ['VIEW_CHANNEL'],\n },\n {\n id: '${user.id}',\n type: 'member',\n allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'READ_MESSAGE_HISTORY', 'ATTACH_FILES'],\n },\n '${supportRoles | map(r => ({ id: r, type: \"role\", allow: [\"VIEW_CHANNEL\", \"SEND_MESSAGES\", \"READ_MESSAGE_HISTORY\", \"ATTACH_FILES\", \"MANAGE_MESSAGES\"] }))}',\n ],\n as: 'ticketChannel',\n },\n // Store in database\n {\n action: 'db_insert',\n table: 'tickets',\n data: {\n channel_id: '${ticketChannel.id}',\n guild_id: '${guild.id}',\n user_id: '${user.id}',\n category: '${event.data.category}',\n status: 'open',\n created_at: '${now()}',\n },\n },\n // Send opening message\n {\n action: 'send_message',\n channel: '${ticketChannel.id}',\n content: 'Welcome ${user}! Support will be with you shortly.',\n embed: {\n title: 'Ticket #${ticketNumber}',\n description: 'Please describe your issue and a staff member will assist you.',\n color: '#5865f2',\n fields: [\n { name: 'Category', value: '${categoryConfig?.name || \"General\"}', inline: true },\n { name: 'Created by', value: '${user}', inline: true },\n ],\n timestamp: '${now()}',\n },\n components: '${ticketControlComponents}',\n },\n // Reply to original interaction\n {\n action: 'update_message',\n content: 'Your ticket has been created: ${ticketChannel}',\n components: [],\n },\n ],\n },\n // Handle claim button\n {\n event: 'button_click',\n condition: 'interaction.customId === \"ticket_claim\"',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '!ticket[0]',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'flow_if',\n condition: 'ticket[0].claimed_by',\n then: [\n { action: 'reply', content: 'This ticket is already claimed by <@${ticket[0].claimed_by}>!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_update',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n data: { claimed_by: '${user.id}' },\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n description: '${user} has claimed this ticket.',\n color: '#57f287',\n },\n },\n { action: 'reply', content: 'You have claimed this ticket!', ephemeral: true },\n ],\n },\n // Handle close button\n {\n event: 'button_click',\n condition: 'interaction.customId === \"ticket_close\"',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '!ticket[0]',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Confirm close\n {\n action: 'reply',\n content: 'Are you sure you want to close this ticket?',\n ephemeral: true,\n components: [\n {\n type: 'action_row',\n components: [\n { type: 'button', style: 'danger', label: 'Close Ticket', custom_id: 'ticket_close_confirm' },\n { type: 'button', style: 'secondary', label: 'Cancel', custom_id: 'ticket_close_cancel' },\n ],\n },\n ],\n },\n ],\n },\n // Handle close confirmation\n {\n event: 'button_click',\n condition: 'interaction.customId === \"ticket_close_confirm\"',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n // Generate transcript if configured\n {\n action: 'flow_if',\n condition: 'config.tickets.includeTranscript && config.tickets.logChannel',\n then: [\n {\n action: 'db_query',\n table: 'ticket_messages',\n where: { ticket_id: '${ticket[0].id}' },\n order_by: 'created_at ASC',\n as: 'messages',\n },\n {\n action: 'set',\n key: 'transcriptText',\n value: '${messages | map(m => \"[\" + formatDate(m.created_at, \"YYYY-MM-DD HH:mm:ss\") + \"] \" + m.author_name + \": \" + m.content) | join(\"\\\\n\")}',\n },\n {\n action: 'send_message',\n channel: '${config.tickets.logChannel}',\n embed: {\n title: 'Ticket Closed',\n fields: [\n { name: 'Ticket ID', value: '${ticket[0].id}', inline: true },\n { name: 'Opened by', value: '<@${ticket[0].user_id}>', inline: true },\n { name: 'Closed by', value: '${user}', inline: true },\n { name: 'Category', value: '${ticket[0].category}', inline: true },\n ],\n color: '#ed4245',\n timestamp: '${now()}',\n },\n files: [\n {\n attachment: '${Buffer.from(transcriptText)}',\n name: 'transcript-${ticket[0].id}.txt',\n },\n ],\n },\n ],\n },\n // Update database\n {\n action: 'db_update',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n data: { status: 'closed', closed_at: '${now()}' },\n },\n // DM user if configured\n {\n action: 'flow_if',\n condition: 'config.tickets.dmOnClose',\n then: [\n {\n action: 'send_dm',\n user: '${ticket[0].user_id}',\n embed: {\n title: 'Ticket Closed',\n description: 'Your ticket in ${guild.name} has been closed.',\n color: '#ed4245',\n },\n },\n ],\n },\n // Delete channel after delay\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: 'This ticket will be deleted in 5 seconds...',\n },\n { action: 'wait', duration: 5000 },\n { action: 'delete_channel', channel: '${channel.id}' },\n ],\n },\n // Handle transcript button\n {\n event: 'button_click',\n condition: 'interaction.customId === \"ticket_transcript\"',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'db_query',\n table: 'ticket_messages',\n where: { ticket_id: '${ticket[0].id}' },\n order_by: 'created_at ASC',\n as: 'messages',\n },\n {\n action: 'set',\n key: 'transcriptText',\n value: '${messages | map(m => \"[\" + formatDate(m.created_at, \"YYYY-MM-DD HH:mm:ss\") + \"] \" + m.author_name + \": \" + m.content) | join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n content: 'Here is the transcript:',\n ephemeral: true,\n files: [\n {\n attachment: '${Buffer.from(transcriptText)}',\n name: 'transcript-${ticket[0].id}.txt',\n },\n ],\n },\n ],\n },\n // Log ticket messages\n {\n event: 'message',\n condition: 'channel.parentId === config.tickets.category',\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: 'ticket[0]',\n then: [\n {\n action: 'db_insert',\n table: 'ticket_messages',\n data: {\n ticket_id: '${ticket[0].id}',\n author_id: '${user.id}',\n author_name: '${user.tag}',\n content: '${message.content}',\n attachments: '${message.attachments | map(a => a.url)}',\n created_at: '${now()}',\n },\n },\n ],\n },\n ],\n },\n];\n\nexport const ticketsCommands: CommandDefinition[] = [\n {\n name: 'ticket',\n description: 'Ticket management commands',\n subcommands: [\n {\n name: 'panel',\n description: 'Create a ticket panel',\n options: [\n { name: 'channel', description: 'Channel to send panel', type: 'channel', required: false },\n { name: 'message', description: 'Custom panel message', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'send_message',\n channel: '${args.channel?.id || channel.id}',\n embed: {\n title: 'Support Tickets',\n description: '${args.message || \"Need help? Click the button below to create a support ticket.\"}',\n color: '#5865f2',\n },\n components: '${ticketPanelComponents}',\n },\n {\n action: 'reply',\n content: 'Ticket panel created!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'add',\n description: 'Add a user to the ticket',\n options: [\n { name: 'user', description: 'User to add', type: 'user', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '!ticket[0]',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set_channel_permissions',\n channel: '${channel.id}',\n user: '${args.user.id}',\n allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'READ_MESSAGE_HISTORY'],\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: '${args.user} has been added to the ticket.',\n },\n { action: 'reply', content: 'User added!', ephemeral: true },\n ],\n },\n {\n name: 'remove',\n description: 'Remove a user from the ticket',\n options: [\n { name: 'user', description: 'User to remove', type: 'user', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '!ticket[0]',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set_channel_permissions',\n channel: '${channel.id}',\n user: '${args.user.id}',\n deny: ['VIEW_CHANNEL'],\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: '${args.user.username} has been removed from the ticket.',\n },\n { action: 'reply', content: 'User removed!', ephemeral: true },\n ],\n },\n {\n name: 'rename',\n description: 'Rename the ticket channel',\n options: [\n { name: 'name', description: 'New channel name', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'tickets',\n where: { channel_id: '${channel.id}' },\n as: 'ticket',\n },\n {\n action: 'flow_if',\n condition: '!ticket[0]',\n then: [\n { action: 'reply', content: 'This is not a ticket channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'edit_channel',\n channel: '${channel.id}',\n name: '${args.name}',\n },\n { action: 'reply', content: 'Ticket renamed!', ephemeral: true },\n ],\n },\n ],\n },\n];\n\nexport function getTicketsSpec(config: TicketsConfig = {}): Partial<FurlowSpec> {\n return {\n events: ticketsEventHandlers,\n commands: ticketsCommands,\n state: {\n tables: ticketsTables,\n },\n };\n}\n","/**\n * Reaction Roles builtin module\n * Handles button roles, reaction roles, and select menu roles\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface ReactionRolesConfig {\n /** Maximum roles a user can have from a single panel */\n maxRolesPerPanel?: number;\n /** Log channel for role assignments */\n logChannel?: string;\n}\n\nexport const reactionRolesTables: Record<string, TableDefinition> = {\n reaction_role_panels: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n channel_id: { type: 'string' },\n message_id: { type: 'string', unique: true },\n type: { type: 'string' }, // 'button', 'reaction', 'select'\n mode: { type: 'string', default: 'toggle' }, // 'toggle', 'give', 'take', 'unique'\n max_roles: { type: 'number' },\n created_at: { type: 'timestamp' },\n },\n },\n reaction_role_entries: {\n columns: {\n id: { type: 'number', primary: true },\n panel_id: { type: 'number', index: true },\n role_id: { type: 'string' },\n emoji: { type: 'string' },\n label: { type: 'string' },\n description: { type: 'string' },\n style: { type: 'string' }, // button style\n },\n },\n};\n\nexport const reactionRolesEventHandlers: EventHandler[] = [\n // Handle button clicks\n {\n event: 'button_click',\n condition: 'interaction.customId.startsWith(\"rr_\")',\n actions: [\n {\n action: 'set',\n key: 'roleId',\n value: '${interaction.customId.replace(\"rr_\", \"\")}',\n },\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${interaction.message.id}' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '!panel[0]',\n then: [\n { action: 'reply', content: 'This role panel is no longer valid.', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'hasRole',\n value: '${member.roles.cache.has(roleId)}',\n },\n // Handle based on mode\n {\n action: 'flow_switch',\n value: '${panel[0].mode}',\n cases: {\n toggle: [\n {\n action: 'flow_if',\n condition: 'hasRole',\n then: [\n { action: 'remove_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Removed <@&${roleId}>', ephemeral: true },\n ],\n else: [\n { action: 'assign_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Added <@&${roleId}>', ephemeral: true },\n ],\n },\n ],\n give: [\n {\n action: 'flow_if',\n condition: 'hasRole',\n then: [\n { action: 'reply', content: 'You already have <@&${roleId}>', ephemeral: true },\n ],\n else: [\n { action: 'assign_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Added <@&${roleId}>', ephemeral: true },\n ],\n },\n ],\n take: [\n {\n action: 'flow_if',\n condition: '!hasRole',\n then: [\n { action: 'reply', content: 'You don\\'t have <@&${roleId}>', ephemeral: true },\n ],\n else: [\n { action: 'remove_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Removed <@&${roleId}>', ephemeral: true },\n ],\n },\n ],\n unique: [\n // Remove other roles from this panel first\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}' },\n as: 'entries',\n },\n {\n action: 'batch',\n items: '${entries.filter(e => e.role_id !== roleId && member.roles.cache.has(e.role_id))}',\n each: { action: 'remove_role', user: '${member.id}', role: '${item.role_id}' },\n },\n { action: 'assign_role', user: '${member.id}', role: '${roleId}' },\n { action: 'reply', content: 'Set role to <@&${roleId}>', ephemeral: true },\n ],\n },\n },\n // Log if configured\n {\n action: 'flow_if',\n condition: 'config.reactionRoles?.logChannel',\n then: [\n {\n action: 'send_message',\n channel: '${config.reactionRoles.logChannel}',\n embed: {\n description: '${member} ${hasRole ? \"removed\" : \"added\"} <@&${roleId}>',\n color: '${hasRole ? \"#ed4245\" : \"#57f287\"}',\n timestamp: '${now()}',\n },\n },\n ],\n },\n ],\n },\n // Handle select menu\n {\n event: 'select_menu',\n condition: 'interaction.customId.startsWith(\"rr_select_\")',\n actions: [\n {\n action: 'set',\n key: 'panelId',\n value: '${interaction.customId.replace(\"rr_select_\", \"\")}',\n },\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { id: '${panelId}' },\n as: 'panel',\n },\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panelId}' },\n as: 'entries',\n },\n // Get selected role IDs\n {\n action: 'set',\n key: 'selectedRoles',\n value: '${interaction.values}',\n },\n // Remove roles not selected\n {\n action: 'batch',\n items: '${entries.filter(e => !selectedRoles.includes(e.role_id) && member.roles.cache.has(e.role_id))}',\n each: { action: 'remove_role', user: '${member.id}', role: '${item.role_id}' },\n },\n // Add selected roles\n {\n action: 'batch',\n items: '${selectedRoles.filter(r => !member.roles.cache.has(r))}',\n each: { action: 'assign_role', user: '${member.id}', role: '${item}' },\n },\n {\n action: 'reply',\n content: 'Roles updated!',\n ephemeral: true,\n },\n ],\n },\n // Handle reactions\n {\n event: 'reaction_add',\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${message.id}', type: 'reaction' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: 'panel[0]',\n then: [\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}', emoji: '${reaction.emoji.name || reaction.emoji.id}' },\n as: 'entry',\n },\n {\n action: 'flow_if',\n condition: 'entry[0]',\n then: [\n { action: 'assign_role', user: '${user.id}', role: '${entry[0].role_id}' },\n ],\n },\n ],\n },\n ],\n },\n // Handle reaction remove\n {\n event: 'reaction_remove',\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${message.id}', type: 'reaction' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: 'panel[0] && panel[0].mode !== \"give\"',\n then: [\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}', emoji: '${reaction.emoji.name || reaction.emoji.id}' },\n as: 'entry',\n },\n {\n action: 'flow_if',\n condition: 'entry[0]',\n then: [\n { action: 'remove_role', user: '${user.id}', role: '${entry[0].role_id}' },\n ],\n },\n ],\n },\n ],\n },\n];\n\nexport const reactionRolesCommands: CommandDefinition[] = [\n {\n name: 'reactionroles',\n description: 'Reaction roles management',\n subcommands: [\n {\n name: 'create-button',\n description: 'Create a button role panel',\n options: [\n { name: 'title', description: 'Panel title', type: 'string', required: false },\n { name: 'description', description: 'Panel description', type: 'string', required: false },\n { name: 'mode', description: 'Role mode', type: 'string', required: false, choices: [\n { name: 'Toggle (add/remove)', value: 'toggle' },\n { name: 'Give only', value: 'give' },\n { name: 'Take only', value: 'take' },\n { name: 'Unique (one at a time)', value: 'unique' },\n ]},\n ],\n actions: [\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n title: '${args.title || \"Role Selection\"}',\n description: '${args.description || \"Click a button to get a role!\"}',\n color: '#5865f2',\n },\n as: 'panelMessage',\n },\n {\n action: 'db_insert',\n table: 'reaction_role_panels',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n message_id: '${panelMessage.id}',\n type: 'button',\n mode: '${args.mode || \"toggle\"}',\n created_at: '${now()}',\n },\n as: 'panel',\n },\n {\n action: 'reply',\n content: 'Button role panel created! Use `/reactionroles add-button` to add roles.\\nPanel ID: ${panel.id}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'add-button',\n description: 'Add a button to a role panel',\n options: [\n { name: 'message_id', description: 'Panel message ID', type: 'string', required: true },\n { name: 'role', description: 'Role to assign', type: 'role', required: true },\n { name: 'label', description: 'Button label', type: 'string', required: false },\n { name: 'emoji', description: 'Button emoji', type: 'string', required: false },\n { name: 'style', description: 'Button style', type: 'string', required: false, choices: [\n { name: 'Blue (Primary)', value: 'primary' },\n { name: 'Gray (Secondary)', value: 'secondary' },\n { name: 'Green (Success)', value: 'success' },\n { name: 'Red (Danger)', value: 'danger' },\n ]},\n ],\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${args.message_id}' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '!panel[0]',\n then: [\n { action: 'reply', content: 'Panel not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_insert',\n table: 'reaction_role_entries',\n data: {\n panel_id: '${panel[0].id}',\n role_id: '${args.role.id}',\n label: '${args.label || args.role.name}',\n emoji: '${args.emoji}',\n style: '${args.style || \"primary\"}',\n },\n },\n // Get all entries for this panel\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}' },\n as: 'entries',\n },\n // Build components\n {\n action: 'set',\n key: 'buttons',\n value: '${entries.map(e => ({ type: \"button\", style: e.style, label: e.label, emoji: e.emoji, custom_id: \"rr_\" + e.role_id }))}',\n },\n {\n action: 'set',\n key: 'rows',\n value: '${chunk(buttons, 5).map(row => ({ type: \"action_row\", components: row }))}',\n },\n // Update message\n {\n action: 'edit_message',\n channel: '${panel[0].channel_id}',\n message: '${panel[0].message_id}',\n components: '${rows}',\n },\n {\n action: 'reply',\n content: 'Added ${args.role.name} to the panel!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'create-select',\n description: 'Create a select menu role panel',\n options: [\n { name: 'title', description: 'Panel title', type: 'string', required: false },\n { name: 'description', description: 'Panel description', type: 'string', required: false },\n { name: 'max_roles', description: 'Maximum roles that can be selected', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n title: '${args.title || \"Role Selection\"}',\n description: '${args.description || \"Select your roles from the menu below!\"}',\n color: '#5865f2',\n },\n as: 'panelMessage',\n },\n {\n action: 'db_insert',\n table: 'reaction_role_panels',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n message_id: '${panelMessage.id}',\n type: 'select',\n mode: 'toggle',\n max_roles: '${args.max_roles}',\n created_at: '${now()}',\n },\n as: 'panel',\n },\n {\n action: 'reply',\n content: 'Select menu role panel created! Use `/reactionroles add-option` to add roles.\\nPanel ID: ${panel.id}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'add-option',\n description: 'Add an option to a select menu panel',\n options: [\n { name: 'message_id', description: 'Panel message ID', type: 'string', required: true },\n { name: 'role', description: 'Role to assign', type: 'role', required: true },\n { name: 'label', description: 'Option label', type: 'string', required: false },\n { name: 'description', description: 'Option description', type: 'string', required: false },\n { name: 'emoji', description: 'Option emoji', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${args.message_id}', type: 'select' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '!panel[0]',\n then: [\n { action: 'reply', content: 'Select menu panel not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_insert',\n table: 'reaction_role_entries',\n data: {\n panel_id: '${panel[0].id}',\n role_id: '${args.role.id}',\n label: '${args.label || args.role.name}',\n description: '${args.description}',\n emoji: '${args.emoji}',\n },\n },\n // Get all entries for this panel\n {\n action: 'db_query',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}' },\n as: 'entries',\n },\n // Build select menu\n {\n action: 'set',\n key: 'options',\n value: '${entries.map(e => ({ label: e.label, value: e.role_id, description: e.description, emoji: e.emoji }))}',\n },\n // Update message\n {\n action: 'edit_message',\n channel: '${panel[0].channel_id}',\n message: '${panel[0].message_id}',\n components: [\n {\n type: 'action_row',\n components: [\n {\n type: 'select_menu',\n custom_id: 'rr_select_${panel[0].id}',\n placeholder: 'Select roles...',\n min_values: 0,\n max_values: '${panel[0].max_roles || entries.length}',\n options: '${options}',\n },\n ],\n },\n ],\n },\n {\n action: 'reply',\n content: 'Added ${args.role.name} to the panel!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'delete',\n description: 'Delete a role panel',\n options: [\n { name: 'message_id', description: 'Panel message ID', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'reaction_role_panels',\n where: { message_id: '${args.message_id}' },\n as: 'panel',\n },\n {\n action: 'flow_if',\n condition: '!panel[0]',\n then: [\n { action: 'reply', content: 'Panel not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_delete',\n table: 'reaction_role_entries',\n where: { panel_id: '${panel[0].id}' },\n },\n {\n action: 'db_delete',\n table: 'reaction_role_panels',\n where: { id: '${panel[0].id}' },\n },\n {\n action: 'delete_message',\n channel: '${panel[0].channel_id}',\n message: '${panel[0].message_id}',\n },\n {\n action: 'reply',\n content: 'Panel deleted!',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport function getReactionRolesSpec(config: ReactionRolesConfig = {}): Partial<FurlowSpec> {\n return {\n events: reactionRolesEventHandlers,\n commands: reactionRolesCommands,\n state: {\n tables: reactionRolesTables,\n },\n };\n}\n","/**\n * Leveling builtin module\n * Handles XP, levels, rewards, leaderboards, and rank cards\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, CanvasGenerator, TableDefinition } from '@furlow/schema';\n\nexport interface LevelingConfig {\n /** XP per message range [min, max] */\n xpPerMessage?: [number, number];\n /** Cooldown between XP gains (seconds) */\n xpCooldown?: number;\n /** XP multiplier for roles */\n roleMultipliers?: Record<string, number>;\n /** Channels where XP is disabled */\n ignoredChannels?: string[];\n /** Roles that don't earn XP */\n ignoredRoles?: string[];\n /** Channel for level up announcements */\n announceChannel?: string;\n /** Level up message */\n levelUpMessage?: string;\n /** Use embed for level up */\n levelUpEmbed?: boolean;\n /** Level rewards (level -> role IDs) */\n rewards?: Record<number, string[]>;\n /** Stack rewards or remove previous */\n stackRewards?: boolean;\n /** Use rank card images */\n useRankCard?: boolean;\n /** Rank card generator name */\n rankCardGenerator?: string;\n /** XP curve formula */\n xpCurve?: 'linear' | 'exponential' | 'custom';\n /** Base XP for level 1 */\n baseXP?: number;\n /** XP multiplier per level */\n xpMultiplier?: number;\n}\n\nexport const levelingTables: Record<string, TableDefinition> = {\n levels: {\n columns: {\n id: { type: 'number', primary: true },\n user_id: { type: 'string', index: true },\n guild_id: { type: 'string', index: true },\n xp: { type: 'number', default: 0 },\n level: { type: 'number', default: 0 },\n total_messages: { type: 'number', default: 0 },\n last_xp_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const levelingEventHandlers: EventHandler[] = [\n {\n event: 'message',\n condition: '!message.author.bot && !config.leveling.ignoredChannels?.includes(channel.id)',\n actions: [\n // Check cooldown\n {\n action: 'db_query',\n table: 'levels',\n where: {\n user_id: '${user.id}',\n guild_id: '${guild.id}',\n },\n as: 'userData',\n },\n // Initialize if new user\n {\n action: 'flow_if',\n condition: '!userData || userData.length === 0',\n then: [\n {\n action: 'db_insert',\n table: 'levels',\n data: {\n user_id: '${user.id}',\n guild_id: '${guild.id}',\n xp: 0,\n level: 0,\n total_messages: 0,\n last_xp_at: '${now()}',\n },\n },\n {\n action: 'set',\n key: 'userData',\n value: [{ xp: 0, level: 0, total_messages: 0, last_xp_at: null }],\n },\n ],\n },\n // Check cooldown\n {\n action: 'set',\n key: 'cooldownPassed',\n value: '${!userData[0].last_xp_at || (now() - userData[0].last_xp_at) > (config.leveling.xpCooldown || 60) * 1000}',\n },\n {\n action: 'flow_if',\n condition: 'cooldownPassed',\n then: [\n // Calculate XP gain\n {\n action: 'set',\n key: 'xpRange',\n value: '${config.leveling.xpPerMessage || [15, 25]}',\n },\n {\n action: 'set',\n key: 'baseXpGain',\n value: '${random(xpRange[0], xpRange[1])}',\n },\n // Apply role multiplier\n {\n action: 'set',\n key: 'multiplier',\n value: '${config.leveling.roleMultipliers ? (member.roles | map(r => config.leveling.roleMultipliers[r.id] || 1) | max) : 1}',\n },\n {\n action: 'set',\n key: 'xpGain',\n value: '${floor(baseXpGain * multiplier)}',\n },\n // Calculate new XP and level\n {\n action: 'set',\n key: 'newXP',\n value: '${userData[0].xp + xpGain}',\n },\n {\n action: 'set',\n key: 'currentLevel',\n value: '${userData[0].level}',\n },\n // Calculate XP needed for next level\n {\n action: 'set',\n key: 'xpForNextLevel',\n value: '${config.leveling.xpCurve === \"exponential\" ? floor((config.leveling.baseXP || 100) * pow(config.leveling.xpMultiplier || 1.5, currentLevel)) : (config.leveling.baseXP || 100) * (currentLevel + 1)}',\n },\n // Check for level up\n {\n action: 'set',\n key: 'newLevel',\n value: '${newXP >= xpForNextLevel ? currentLevel + 1 : currentLevel}',\n },\n {\n action: 'set',\n key: 'leveledUp',\n value: '${newLevel > currentLevel}',\n },\n // Update database\n {\n action: 'db_update',\n table: 'levels',\n where: {\n user_id: '${user.id}',\n guild_id: '${guild.id}',\n },\n data: {\n xp: '${leveledUp ? newXP - xpForNextLevel : newXP}',\n level: '${newLevel}',\n total_messages: '${userData[0].total_messages + 1}',\n last_xp_at: '${now()}',\n },\n },\n // Handle level up\n {\n action: 'flow_if',\n condition: 'leveledUp',\n then: [\n // Announce level up\n {\n action: 'flow_if',\n condition: 'config.leveling.announceChannel',\n then: [\n {\n action: 'flow_if',\n condition: 'config.leveling.levelUpEmbed',\n then: [\n {\n action: 'send_message',\n channel: '${config.leveling.announceChannel}',\n embed: {\n title: 'Level Up!',\n description: '${config.leveling.levelUpMessage || member.display_name + \" has reached level \" + newLevel + \"!\"}',\n color: '#ffd700',\n thumbnail: '${member.avatar}',\n },\n },\n ],\n else: [\n {\n action: 'send_message',\n channel: '${config.leveling.announceChannel}',\n content: '${config.leveling.levelUpMessage || \"Congratulations \" + member.display_name + \"! You reached level \" + newLevel + \"!\"}',\n },\n ],\n },\n ],\n },\n // Award role rewards\n {\n action: 'flow_if',\n condition: 'config.leveling.rewards && config.leveling.rewards[newLevel]',\n then: [\n // Remove previous rewards if not stacking\n {\n action: 'flow_if',\n condition: '!config.leveling.stackRewards && currentLevel > 0 && config.leveling.rewards[currentLevel]',\n then: [\n {\n action: 'remove_role',\n user: '${member.id}',\n role: '${config.leveling.rewards[currentLevel]}',\n },\n ],\n },\n {\n action: 'assign_role',\n user: '${member.id}',\n role: '${config.leveling.rewards[newLevel]}',\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n];\n\nexport const levelingCommands: CommandDefinition[] = [\n {\n name: 'rank',\n description: 'View your rank or another user\\'s rank',\n options: [\n { name: 'user', description: 'User to check', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'db_query',\n table: 'levels',\n where: {\n user_id: '${targetUser.id}',\n guild_id: '${guild.id}',\n },\n as: 'userData',\n },\n {\n action: 'flow_if',\n condition: '!userData || userData.length === 0',\n then: [\n {\n action: 'reply',\n content: '${targetUser.username} has no XP yet!',\n ephemeral: true,\n },\n ],\n else: [\n // Get leaderboard position\n {\n action: 'db_query',\n table: 'levels',\n where: {\n guild_id: '${guild.id}',\n },\n order_by: 'level DESC, xp DESC',\n as: 'leaderboard',\n },\n {\n action: 'set',\n key: 'rank',\n value: '${(leaderboard | findIndex(u => u.user_id === targetUser.id)) + 1}',\n },\n {\n action: 'set',\n key: 'xpForNextLevel',\n value: '${config.leveling.xpCurve === \"exponential\" ? floor((config.leveling.baseXP || 100) * pow(config.leveling.xpMultiplier || 1.5, userData[0].level)) : (config.leveling.baseXP || 100) * (userData[0].level + 1)}',\n },\n // Render rank card or embed\n {\n action: 'flow_if',\n condition: 'config.leveling.useRankCard',\n then: [\n {\n action: 'canvas_render',\n generator: '${config.leveling.rankCardGenerator || \"rank_card\"}',\n context: {\n user: '${targetUser}',\n member: '${guild.members.cache.get(targetUser.id)}',\n level: '${userData[0].level}',\n xp: '${userData[0].xp}',\n xpNeeded: '${xpForNextLevel}',\n rank: '${rank}',\n totalMessages: '${userData[0].total_messages}',\n },\n as: 'rankCard',\n },\n {\n action: 'reply',\n files: [\n {\n attachment: '${rankCard}',\n name: 'rank.png',\n },\n ],\n },\n ],\n else: [\n {\n action: 'reply',\n embed: {\n title: '${targetUser.username}\\'s Rank',\n color: '#5865f2',\n thumbnail: '${targetUser.avatar}',\n fields: [\n { name: 'Rank', value: '#${rank}', inline: true },\n { name: 'Level', value: '${userData[0].level}', inline: true },\n { name: 'XP', value: '${userData[0].xp}/${xpForNextLevel}', inline: true },\n { name: 'Messages', value: '${userData[0].total_messages}', inline: true },\n ],\n },\n },\n ],\n },\n ],\n },\n ],\n },\n {\n name: 'leaderboard',\n description: 'View the server leaderboard',\n options: [\n { name: 'page', description: 'Page number', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'page',\n value: '${args.page || 1}',\n },\n {\n action: 'set',\n key: 'perPage',\n value: 10,\n },\n {\n action: 'db_query',\n table: 'levels',\n where: {\n guild_id: '${guild.id}',\n },\n order_by: 'level DESC, xp DESC',\n limit: '${perPage}',\n offset: '${(page - 1) * perPage}',\n as: 'leaderboard',\n },\n {\n action: 'set',\n key: 'leaderboardText',\n value: '${leaderboard | mapIndex((entry, i) => \"#\" + ((page - 1) * perPage + i + 1) + \" <@\" + entry.user_id + \"> - Level \" + entry.level + \" (\" + entry.xp + \" XP)\") | join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name} Leaderboard',\n description: '${leaderboardText || \"No entries yet!\"}',\n color: '#ffd700',\n footer: {\n text: 'Page ${page}',\n },\n },\n },\n ],\n },\n {\n name: 'setxp',\n description: 'Set a user\\'s XP (admin)',\n options: [\n { name: 'user', description: 'User to modify', type: 'user', required: true },\n { name: 'xp', description: 'XP amount', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'db_update',\n table: 'levels',\n where: {\n user_id: '${args.user.id}',\n guild_id: '${guild.id}',\n },\n data: {\n xp: '${args.xp}',\n },\n upsert: true,\n },\n {\n action: 'reply',\n content: 'Set ${args.user.username}\\'s XP to ${args.xp}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'setlevel',\n description: 'Set a user\\'s level (admin)',\n options: [\n { name: 'user', description: 'User to modify', type: 'user', required: true },\n { name: 'level', description: 'Level', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'db_update',\n table: 'levels',\n where: {\n user_id: '${args.user.id}',\n guild_id: '${guild.id}',\n },\n data: {\n level: '${args.level}',\n xp: 0,\n },\n upsert: true,\n },\n {\n action: 'reply',\n content: 'Set ${args.user.username}\\'s level to ${args.level}',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport const levelingCanvasGenerators: Record<string, CanvasGenerator> = {\n rank_card: {\n width: 934,\n height: 282,\n background: '#23272a',\n layers: [\n // Background gradient\n {\n type: 'rect',\n x: 0,\n y: 0,\n width: 934,\n height: 282,\n color: 'linear-gradient(135deg, #1a1c20 0%, #2c2f33 100%)',\n radius: 20,\n },\n // User avatar\n {\n type: 'circle_image',\n url: '${user.avatar}',\n x: 120,\n y: 141,\n radius: 80,\n border: {\n width: 5,\n color: '#5865f2',\n },\n },\n // Username\n {\n type: 'text',\n text: '${user.username}',\n x: 260,\n y: 120,\n font: 'bold 36px \"Poppins\", sans-serif',\n color: '#ffffff',\n align: 'left',\n },\n // Rank badge\n {\n type: 'text',\n text: 'RANK #${rank}',\n x: 850,\n y: 60,\n font: 'bold 24px \"Poppins\", sans-serif',\n color: '#7289da',\n align: 'right',\n },\n // Level badge\n {\n type: 'text',\n text: 'LEVEL ${level}',\n x: 850,\n y: 90,\n font: 'bold 32px \"Poppins\", sans-serif',\n color: '#ffffff',\n align: 'right',\n },\n // XP Progress bar background\n {\n type: 'rect',\n x: 260,\n y: 180,\n width: 600,\n height: 30,\n color: '#484b4e',\n radius: 15,\n },\n // XP Progress bar fill\n {\n type: 'progress_bar',\n x: 260,\n y: 180,\n width: 600,\n height: 30,\n progress: '${xp / xpNeeded}',\n color: 'linear-gradient(90deg, #5865f2 0%, #7289da 100%)',\n radius: 15,\n },\n // XP Text\n {\n type: 'text',\n text: '${xp} / ${xpNeeded} XP',\n x: 560,\n y: 160,\n font: '18px \"Poppins\", sans-serif',\n color: '#99aab5',\n align: 'center',\n },\n // Messages count\n {\n type: 'text',\n text: '${totalMessages} messages',\n x: 260,\n y: 240,\n font: '16px \"Poppins\", sans-serif',\n color: '#72767d',\n align: 'left',\n },\n ],\n },\n};\n\nexport function getLevelingSpec(config: LevelingConfig = {}): Partial<FurlowSpec> {\n return {\n events: levelingEventHandlers,\n commands: levelingCommands,\n state: {\n tables: levelingTables,\n },\n canvas: {\n generators: levelingCanvasGenerators,\n },\n };\n}\n","/**\n * Music builtin module\n * Handles audio playback, queue management, and filters\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface MusicConfig {\n /** Default volume (0-100) */\n defaultVolume?: number;\n /** Maximum queue size */\n maxQueueSize?: number;\n /** DJ role (required for some commands) */\n djRole?: string;\n /** Stay in channel when queue empty */\n stayInChannel?: boolean;\n /** Leave after idle (seconds) */\n leaveAfterIdle?: number;\n /** Allow seeking */\n allowSeeking?: boolean;\n /** Allow filters */\n allowFilters?: boolean;\n /** Show now playing messages */\n announceNowPlaying?: boolean;\n /** Announce channel */\n announceChannel?: string;\n}\n\nexport const musicTables: Record<string, TableDefinition> = {\n music_playlists: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n user_id: { type: 'string', index: true },\n name: { type: 'string' },\n tracks: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const musicCommands: CommandDefinition[] = [\n {\n name: 'play',\n description: 'Play a song or add to queue',\n options: [\n { name: 'query', description: 'Song URL or search query', type: 'string', required: true },\n ],\n actions: [\n // Check if user is in voice channel\n {\n action: 'flow_if',\n condition: '!member.voice.channel',\n then: [\n { action: 'reply', content: 'You must be in a voice channel!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Join voice channel if not already\n {\n action: 'voice_join',\n channel: '${member.voice.channel.id}',\n },\n // Search/resolve track\n {\n action: 'voice_search',\n query: '${args.query}',\n as: 'track',\n },\n {\n action: 'flow_if',\n condition: '!track',\n then: [\n { action: 'reply', content: 'No results found for: ${args.query}', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Add to queue\n {\n action: 'queue_add',\n track: '${track}',\n requester: '${user.id}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Added to Queue',\n description: '[${track.title}](${track.url})',\n thumbnail: '${track.thumbnail}',\n color: '#57f287',\n fields: [\n { name: 'Duration', value: '${formatDuration(track.duration)}', inline: true },\n { name: 'Requested by', value: '${user}', inline: true },\n ],\n },\n },\n ],\n },\n {\n name: 'skip',\n description: 'Skip the current song',\n actions: [\n {\n action: 'voice_skip',\n },\n {\n action: 'reply',\n content: 'Skipped the current song.',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'stop',\n description: 'Stop playback and clear the queue',\n actions: [\n {\n action: 'voice_stop',\n },\n {\n action: 'queue_clear',\n },\n {\n action: 'reply',\n content: 'Stopped playback and cleared the queue.',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'pause',\n description: 'Pause playback',\n actions: [\n {\n action: 'voice_pause',\n },\n {\n action: 'reply',\n content: 'Paused playback.',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'resume',\n description: 'Resume playback',\n actions: [\n {\n action: 'voice_resume',\n },\n {\n action: 'reply',\n content: 'Resumed playback.',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'queue',\n description: 'View the current queue',\n options: [\n { name: 'page', description: 'Page number', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'queue_get',\n as: 'queue',\n },\n {\n action: 'flow_if',\n condition: 'queue.tracks.length === 0',\n then: [\n { action: 'reply', content: 'The queue is empty!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'page',\n value: '${args.page || 1}',\n },\n {\n action: 'set',\n key: 'perPage',\n value: 10,\n },\n {\n action: 'set',\n key: 'start',\n value: '${(page - 1) * perPage}',\n },\n {\n action: 'set',\n key: 'queueList',\n value: '${queue.tracks.slice(start, start + perPage).map((t, i) => (start + i + 1) + \". [\" + truncate(t.title, 40) + \"](\" + t.url + \") - \" + formatDuration(t.duration)).join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Queue',\n description: '**Now Playing:**\\n[${queue.current.title}](${queue.current.url})\\n\\n**Up Next:**\\n${queueList}',\n color: '#5865f2',\n footer: {\n text: 'Page ${page} | ${queue.tracks.length} tracks | Total: ${formatDuration(queue.totalDuration)}',\n },\n },\n },\n ],\n },\n {\n name: 'nowplaying',\n description: 'Show the currently playing song',\n actions: [\n {\n action: 'queue_get',\n as: 'queue',\n },\n {\n action: 'flow_if',\n condition: '!queue.current',\n then: [\n { action: 'reply', content: 'Nothing is playing!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'progress',\n value: '${queue.position / queue.current.duration}',\n },\n {\n action: 'set',\n key: 'progressBar',\n value: '${repeat(\"▓\", floor(progress * 20)) + repeat(\"░\", 20 - floor(progress * 20))}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Now Playing',\n description: '[${queue.current.title}](${queue.current.url})',\n thumbnail: '${queue.current.thumbnail}',\n color: '#5865f2',\n fields: [\n { name: 'Progress', value: '${progressBar}\\n${formatDuration(queue.position)} / ${formatDuration(queue.current.duration)}' },\n { name: 'Requested by', value: '<@${queue.current.requester}>', inline: true },\n { name: 'Volume', value: '${queue.volume}%', inline: true },\n ],\n },\n },\n ],\n },\n {\n name: 'volume',\n description: 'Set the volume',\n options: [\n { name: 'level', description: 'Volume level (0-100)', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'flow_if',\n condition: 'args.level < 0 || args.level > 100',\n then: [\n { action: 'reply', content: 'Volume must be between 0 and 100!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'voice_volume',\n level: '${args.level}',\n },\n {\n action: 'reply',\n content: 'Volume set to ${args.level}%',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'shuffle',\n description: 'Shuffle the queue',\n actions: [\n {\n action: 'queue_shuffle',\n },\n {\n action: 'reply',\n content: 'Shuffled the queue!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'loop',\n description: 'Set loop mode',\n options: [\n { name: 'mode', description: 'Loop mode', type: 'string', required: true, choices: [\n { name: 'Off', value: 'off' },\n { name: 'Track', value: 'track' },\n { name: 'Queue', value: 'queue' },\n ]},\n ],\n actions: [\n {\n action: 'queue_loop',\n mode: '${args.mode}',\n },\n {\n action: 'reply',\n content: 'Loop mode set to: ${args.mode}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'seek',\n description: 'Seek to a position in the song',\n options: [\n { name: 'position', description: 'Position (e.g., 1:30, 90)', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'flow_if',\n condition: '!config.music?.allowSeeking',\n then: [\n { action: 'reply', content: 'Seeking is disabled!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'voice_seek',\n position: '${parseDuration(args.position)}',\n },\n {\n action: 'reply',\n content: 'Seeked to ${args.position}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'filter',\n description: 'Apply an audio filter',\n options: [\n { name: 'filter', description: 'Filter to apply', type: 'string', required: true, choices: [\n { name: 'None', value: 'none' },\n { name: 'Bass Boost', value: 'bassboost' },\n { name: 'Nightcore', value: 'nightcore' },\n { name: 'Vaporwave', value: 'vaporwave' },\n { name: '8D', value: '8d' },\n { name: 'Tremolo', value: 'tremolo' },\n { name: 'Vibrato', value: 'vibrato' },\n ]},\n ],\n actions: [\n {\n action: 'flow_if',\n condition: '!config.music?.allowFilters',\n then: [\n { action: 'reply', content: 'Filters are disabled!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'voice_set_filter',\n filter: '${args.filter}',\n },\n {\n action: 'reply',\n content: 'Applied filter: ${args.filter}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'leave',\n description: 'Leave the voice channel',\n actions: [\n {\n action: 'voice_leave',\n },\n {\n action: 'reply',\n content: 'Left the voice channel.',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport const musicEventHandlers: EventHandler[] = [\n // Announce now playing\n {\n event: 'voice_track_start',\n condition: 'config.music?.announceNowPlaying',\n actions: [\n {\n action: 'send_message',\n channel: '${config.music.announceChannel || channel.id}',\n embed: {\n title: 'Now Playing',\n description: '[${track.title}](${track.url})',\n thumbnail: '${track.thumbnail}',\n color: '#5865f2',\n fields: [\n { name: 'Duration', value: '${formatDuration(track.duration)}', inline: true },\n { name: 'Requested by', value: '<@${track.requester}>', inline: true },\n ],\n },\n },\n ],\n },\n // Auto-leave when alone\n {\n event: 'voice_leave',\n condition: 'voiceChannel.members.filter(m => !m.user.bot).size === 0 && !config.music?.stayInChannel',\n actions: [\n { action: 'wait', duration: 30000 },\n {\n action: 'flow_if',\n condition: 'voiceChannel.members.filter(m => !m.user.bot).size === 0',\n then: [\n { action: 'voice_leave' },\n ],\n },\n ],\n },\n];\n\nexport function getMusicSpec(config: MusicConfig = {}): Partial<FurlowSpec> {\n return {\n commands: musicCommands,\n events: musicEventHandlers,\n state: {\n tables: musicTables,\n },\n };\n}\n","/**\n * Starboard builtin module\n * Handles star reactions and hall of fame\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface StarboardConfig {\n /** Starboard channel */\n channel?: string;\n /** Minimum stars required */\n threshold?: number;\n /** Emoji to use (default: star) */\n emoji?: string;\n /** Self-starring allowed */\n selfStar?: boolean;\n /** Bot messages can be starred */\n botMessages?: boolean;\n /** Ignored channels */\n ignoredChannels?: string[];\n /** NSFW channel handling */\n nsfwAllowed?: boolean;\n /** Star tiers with different thresholds */\n tiers?: Array<{\n threshold: number;\n emoji: string;\n color?: string;\n }>;\n}\n\nexport const starboardTables: Record<string, TableDefinition> = {\n starboard_messages: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n source_channel_id: { type: 'string' },\n source_message_id: { type: 'string', unique: true },\n starboard_message_id: { type: 'string' },\n author_id: { type: 'string', index: true },\n star_count: { type: 'number', default: 0 },\n created_at: { type: 'timestamp' },\n },\n },\n starboard_stars: {\n columns: {\n id: { type: 'number', primary: true },\n message_id: { type: 'string', index: true },\n user_id: { type: 'string' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const starboardEventHandlers: EventHandler[] = [\n // Handle star reactions\n {\n event: 'reaction_add',\n condition: '(reaction.emoji.name === (config.starboard?.emoji || \"⭐\") || reaction.emoji.name === \"🌟\") && config.starboard?.channel',\n actions: [\n // Check if channel is ignored\n {\n action: 'flow_if',\n condition: 'config.starboard.ignoredChannels?.includes(channel.id)',\n then: [{ action: 'abort' }],\n },\n // Check NSFW\n {\n action: 'flow_if',\n condition: 'channel.nsfw && !config.starboard.nsfwAllowed',\n then: [{ action: 'abort' }],\n },\n // Check self-star\n {\n action: 'flow_if',\n condition: '!config.starboard.selfStar && user.id === message.author.id',\n then: [{ action: 'abort' }],\n },\n // Check bot messages\n {\n action: 'flow_if',\n condition: '!config.starboard.botMessages && message.author.bot',\n then: [{ action: 'abort' }],\n },\n // Check if already starred by this user\n {\n action: 'db_query',\n table: 'starboard_stars',\n where: { message_id: '${message.id}', user_id: '${user.id}' },\n as: 'existingStar',\n },\n {\n action: 'flow_if',\n condition: 'existingStar.length > 0',\n then: [{ action: 'abort' }],\n },\n // Add star\n {\n action: 'db_insert',\n table: 'starboard_stars',\n data: {\n message_id: '${message.id}',\n user_id: '${user.id}',\n created_at: '${now()}',\n },\n },\n // Count stars\n {\n action: 'db_query',\n table: 'starboard_stars',\n where: { message_id: '${message.id}' },\n as: 'allStars',\n },\n {\n action: 'set',\n key: 'starCount',\n value: '${allStars.length}',\n },\n // Get threshold\n {\n action: 'set',\n key: 'threshold',\n value: '${config.starboard.threshold || 3}',\n },\n // Get appropriate tier\n {\n action: 'set',\n key: 'tier',\n value: '${config.starboard.tiers ? config.starboard.tiers.filter(t => starCount >= t.threshold).pop() : null}',\n },\n {\n action: 'set',\n key: 'displayEmoji',\n value: '${tier?.emoji || config.starboard.emoji || \"⭐\"}',\n },\n {\n action: 'set',\n key: 'embedColor',\n value: '${tier?.color || \"#ffd700\"}',\n },\n // Check if already on starboard\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: 'existing.length > 0',\n then: [\n // Update existing starboard message\n {\n action: 'db_update',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n data: { star_count: '${starCount}' },\n },\n {\n action: 'edit_message',\n channel: '${config.starboard.channel}',\n message: '${existing[0].starboard_message_id}',\n content: '${displayEmoji} **${starCount}** | <#${channel.id}>',\n },\n ],\n else: [\n // Create new starboard entry if threshold met\n {\n action: 'flow_if',\n condition: 'starCount >= threshold',\n then: [\n // Build embed\n {\n action: 'set',\n key: 'imageUrl',\n value: '${message.attachments.first()?.url || message.embeds[0]?.image?.url || message.embeds[0]?.thumbnail?.url}',\n },\n {\n action: 'send_message',\n channel: '${config.starboard.channel}',\n content: '${displayEmoji} **${starCount}** | <#${channel.id}>',\n embed: {\n author: {\n name: '${message.author.tag}',\n icon_url: '${message.author.avatar}',\n },\n description: '${message.content}\\n\\n[Jump to message](${message.url})',\n color: '${embedColor}',\n image: '${imageUrl ? { url: imageUrl } : null}',\n timestamp: '${message.created_at}',\n footer: {\n text: 'ID: ${message.id}',\n },\n },\n as: 'starboardMessage',\n },\n {\n action: 'db_insert',\n table: 'starboard_messages',\n data: {\n guild_id: '${guild.id}',\n source_channel_id: '${channel.id}',\n source_message_id: '${message.id}',\n starboard_message_id: '${starboardMessage.id}',\n author_id: '${message.author.id}',\n star_count: '${starCount}',\n created_at: '${now()}',\n },\n },\n ],\n },\n ],\n },\n ],\n },\n // Handle star removal\n {\n event: 'reaction_remove',\n condition: '(reaction.emoji.name === (config.starboard?.emoji || \"⭐\") || reaction.emoji.name === \"🌟\") && config.starboard?.channel',\n actions: [\n // Remove star record\n {\n action: 'db_delete',\n table: 'starboard_stars',\n where: { message_id: '${message.id}', user_id: '${user.id}' },\n },\n // Count remaining stars\n {\n action: 'db_query',\n table: 'starboard_stars',\n where: { message_id: '${message.id}' },\n as: 'allStars',\n },\n {\n action: 'set',\n key: 'starCount',\n value: '${allStars.length}',\n },\n // Check if on starboard\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: 'existing.length > 0',\n then: [\n {\n action: 'flow_if',\n condition: 'starCount < (config.starboard.threshold || 3)',\n then: [\n // Remove from starboard\n {\n action: 'delete_message',\n channel: '${config.starboard.channel}',\n message: '${existing[0].starboard_message_id}',\n },\n {\n action: 'db_delete',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n },\n ],\n else: [\n // Update count\n {\n action: 'set',\n key: 'tier',\n value: '${config.starboard.tiers ? config.starboard.tiers.filter(t => starCount >= t.threshold).pop() : null}',\n },\n {\n action: 'set',\n key: 'displayEmoji',\n value: '${tier?.emoji || config.starboard.emoji || \"⭐\"}',\n },\n {\n action: 'db_update',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n data: { star_count: '${starCount}' },\n },\n {\n action: 'edit_message',\n channel: '${config.starboard.channel}',\n message: '${existing[0].starboard_message_id}',\n content: '${displayEmoji} **${starCount}** | <#${channel.id}>',\n },\n ],\n },\n ],\n },\n ],\n },\n];\n\nexport const starboardCommands: CommandDefinition[] = [\n {\n name: 'starboard',\n description: 'Starboard commands',\n subcommands: [\n {\n name: 'setup',\n description: 'Set up the starboard',\n options: [\n { name: 'channel', description: 'Starboard channel', type: 'channel', required: true },\n { name: 'threshold', description: 'Minimum stars required', type: 'integer', required: false },\n { name: 'emoji', description: 'Star emoji', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'config.starboard.channel',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n {\n action: 'flow_if',\n condition: 'args.threshold',\n then: [\n {\n action: 'set',\n key: 'config.starboard.threshold',\n value: '${args.threshold}',\n scope: 'guild',\n },\n ],\n },\n {\n action: 'flow_if',\n condition: 'args.emoji',\n then: [\n {\n action: 'set',\n key: 'config.starboard.emoji',\n value: '${args.emoji}',\n scope: 'guild',\n },\n ],\n },\n {\n action: 'reply',\n content: 'Starboard set up in ${args.channel}!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'stats',\n description: 'View starboard statistics',\n actions: [\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { guild_id: '${guild.id}' },\n order_by: 'star_count DESC',\n limit: 5,\n as: 'topMessages',\n },\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { guild_id: '${guild.id}' },\n as: 'allMessages',\n },\n {\n action: 'set',\n key: 'totalStars',\n value: '${allMessages.reduce((sum, m) => sum + m.star_count, 0)}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Starboard Statistics',\n color: '#ffd700',\n fields: [\n { name: 'Total Starred Messages', value: '${allMessages.length}', inline: true },\n { name: 'Total Stars', value: '${totalStars}', inline: true },\n { name: 'Top Starred Messages', value: '${topMessages.map((m, i) => (i + 1) + \". \" + m.star_count + \" stars - <@\" + m.author_id + \">\").join(\"\\\\n\") || \"None yet!\"}' },\n ],\n },\n },\n ],\n },\n {\n name: 'random',\n description: 'Get a random starred message',\n actions: [\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { guild_id: '${guild.id}' },\n as: 'allMessages',\n },\n {\n action: 'flow_if',\n condition: 'allMessages.length === 0',\n then: [\n { action: 'reply', content: 'No starred messages yet!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'randomMessage',\n value: '${allMessages[floor(random(0, allMessages.length))]}',\n },\n {\n action: 'reply',\n content: '⭐ **${randomMessage.star_count}** - https://discord.com/channels/${guild.id}/${randomMessage.source_channel_id}/${randomMessage.source_message_id}',\n },\n ],\n },\n ],\n },\n];\n\nexport function getStarboardSpec(config: StarboardConfig = {}): Partial<FurlowSpec> {\n return {\n events: starboardEventHandlers,\n commands: starboardCommands,\n state: {\n tables: starboardTables,\n },\n };\n}\n","/**\n * Polls builtin module\n * Handles poll creation and voting\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface PollsConfig {\n /** Maximum poll options */\n maxOptions?: number;\n /** Default poll duration */\n defaultDuration?: string;\n /** Allow anonymous polls */\n allowAnonymous?: boolean;\n}\n\nexport const pollsTables: Record<string, TableDefinition> = {\n polls: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n channel_id: { type: 'string' },\n message_id: { type: 'string', unique: true },\n creator_id: { type: 'string' },\n question: { type: 'string' },\n options: { type: 'json' },\n multiple_choice: { type: 'boolean', default: false },\n anonymous: { type: 'boolean', default: false },\n ends_at: { type: 'timestamp' },\n ended: { type: 'boolean', default: false },\n created_at: { type: 'timestamp' },\n },\n },\n poll_votes: {\n columns: {\n id: { type: 'number', primary: true },\n poll_id: { type: 'number', index: true },\n user_id: { type: 'string' },\n option_index: { type: 'number' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const pollsEventHandlers: EventHandler[] = [\n // Handle vote button\n {\n event: 'button_click',\n condition: 'interaction.customId.startsWith(\"poll_vote_\")',\n actions: [\n {\n action: 'set',\n key: 'parts',\n value: '${interaction.customId.split(\"_\")}',\n },\n {\n action: 'set',\n key: 'pollId',\n value: '${parts[2]}',\n },\n {\n action: 'set',\n key: 'optionIndex',\n value: '${parseInt(parts[3])}',\n },\n {\n action: 'db_query',\n table: 'polls',\n where: { id: '${pollId}' },\n as: 'poll',\n },\n {\n action: 'flow_if',\n condition: '!poll[0] || poll[0].ended',\n then: [\n { action: 'reply', content: 'This poll has ended!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Check existing vote\n {\n action: 'db_query',\n table: 'poll_votes',\n where: { poll_id: '${pollId}', user_id: '${user.id}' },\n as: 'existingVotes',\n },\n {\n action: 'flow_if',\n condition: '!poll[0].multiple_choice && existingVotes.length > 0',\n then: [\n // Change vote\n {\n action: 'db_update',\n table: 'poll_votes',\n where: { poll_id: '${pollId}', user_id: '${user.id}' },\n data: { option_index: '${optionIndex}' },\n },\n { action: 'reply', content: 'Vote changed!', ephemeral: true },\n ],\n else: [\n // Add vote\n {\n action: 'db_insert',\n table: 'poll_votes',\n data: {\n poll_id: '${pollId}',\n user_id: '${user.id}',\n option_index: '${optionIndex}',\n created_at: '${now()}',\n },\n },\n { action: 'reply', content: 'Vote recorded!', ephemeral: true },\n ],\n },\n // Update poll message\n {\n action: 'db_query',\n table: 'poll_votes',\n where: { poll_id: '${pollId}' },\n as: 'allVotes',\n },\n {\n action: 'set',\n key: 'totalVotes',\n value: '${allVotes.length}',\n },\n {\n action: 'set',\n key: 'options',\n value: '${poll[0].options}',\n },\n {\n action: 'set',\n key: 'voteCounts',\n value: '${options.map((_, i) => allVotes.filter(v => v.option_index === i).length)}',\n },\n {\n action: 'set',\n key: 'optionText',\n value: '${options.map((opt, i) => opt.emoji + \" \" + opt.text + \" - **\" + voteCounts[i] + \"** (\" + (totalVotes > 0 ? floor(voteCounts[i] / totalVotes * 100) : 0) + \"%)\").join(\"\\\\n\")}',\n },\n {\n action: 'edit_message',\n channel: '${poll[0].channel_id}',\n message: '${poll[0].message_id}',\n embed: {\n title: '📊 ${poll[0].question}',\n description: '${optionText}\\n\\n**Total votes:** ${totalVotes}',\n color: '#5865f2',\n footer: { text: '${poll[0].ends_at ? \"Ends \" + timestamp(poll[0].ends_at, \"R\") : \"No end time\"}' },\n },\n },\n ],\n },\n // Poll end scheduler\n {\n event: 'scheduler_tick',\n actions: [\n {\n action: 'db_query',\n table: 'polls',\n where: { ended: false },\n as: 'activePolls',\n },\n {\n action: 'batch',\n items: '${activePolls.filter(p => p.ends_at && new Date(p.ends_at) <= now())}',\n each: { action: 'emit', event: 'poll_end', data: { pollId: '${item.id}' } },\n },\n ],\n },\n // End poll\n {\n event: 'poll_end',\n actions: [\n {\n action: 'db_query',\n table: 'polls',\n where: { id: '${event.data.pollId}' },\n as: 'poll',\n },\n {\n action: 'db_query',\n table: 'poll_votes',\n where: { poll_id: '${event.data.pollId}' },\n as: 'allVotes',\n },\n {\n action: 'db_update',\n table: 'polls',\n where: { id: '${event.data.pollId}' },\n data: { ended: true },\n },\n {\n action: 'set',\n key: 'options',\n value: '${poll[0].options}',\n },\n {\n action: 'set',\n key: 'totalVotes',\n value: '${allVotes.length}',\n },\n {\n action: 'set',\n key: 'voteCounts',\n value: '${options.map((_, i) => allVotes.filter(v => v.option_index === i).length)}',\n },\n {\n action: 'set',\n key: 'maxVotes',\n value: '${Math.max(...voteCounts)}',\n },\n {\n action: 'set',\n key: 'winners',\n value: '${options.filter((_, i) => voteCounts[i] === maxVotes).map(o => o.text)}',\n },\n {\n action: 'set',\n key: 'optionText',\n value: '${options.map((opt, i) => (voteCounts[i] === maxVotes ? \"🏆 \" : \"\") + opt.emoji + \" \" + opt.text + \" - **\" + voteCounts[i] + \"** (\" + (totalVotes > 0 ? floor(voteCounts[i] / totalVotes * 100) : 0) + \"%)\").join(\"\\\\n\")}',\n },\n {\n action: 'edit_message',\n channel: '${poll[0].channel_id}',\n message: '${poll[0].message_id}',\n embed: {\n title: '📊 ${poll[0].question} (ENDED)',\n description: '${optionText}\\n\\n**Total votes:** ${totalVotes}',\n color: '#72767d',\n footer: { text: 'Poll ended' },\n },\n components: [],\n },\n ],\n },\n];\n\nexport const pollsCommands: CommandDefinition[] = [\n {\n name: 'poll',\n description: 'Create a poll',\n options: [\n { name: 'question', description: 'Poll question', type: 'string', required: true },\n { name: 'options', description: 'Options separated by |', type: 'string', required: true },\n { name: 'duration', description: 'Poll duration (e.g., 1h, 1d)', type: 'string', required: false },\n { name: 'multiple', description: 'Allow multiple choices', type: 'boolean', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'optionTexts',\n value: '${args.options.split(\"|\").map(o => o.trim()).filter(o => o)}',\n },\n {\n action: 'flow_if',\n condition: 'optionTexts.length < 2',\n then: [\n { action: 'reply', content: 'You need at least 2 options!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'flow_if',\n condition: 'optionTexts.length > (config.polls?.maxOptions || 10)',\n then: [\n { action: 'reply', content: 'Maximum ${config.polls?.maxOptions || 10} options allowed!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'emojis',\n value: '[\"1️⃣\", \"2️⃣\", \"3️⃣\", \"4️⃣\", \"5️⃣\", \"6️⃣\", \"7️⃣\", \"8️⃣\", \"9️⃣\", \"🔟\"]',\n },\n {\n action: 'set',\n key: 'options',\n value: '${optionTexts.map((text, i) => ({ text, emoji: emojis[i] }))}',\n },\n {\n action: 'set',\n key: 'endsAt',\n value: '${args.duration ? addDuration(now(), args.duration) : null}',\n },\n {\n action: 'set',\n key: 'optionDisplay',\n value: '${options.map(o => o.emoji + \" \" + o.text + \" - **0** (0%)\").join(\"\\\\n\")}',\n },\n // Create buttons\n {\n action: 'set',\n key: 'buttons',\n value: '${options.map((o, i) => ({ type: \"button\", style: \"secondary\", emoji: o.emoji, custom_id: \"poll_vote_PLACEHOLDER_\" + i }))}',\n },\n {\n action: 'set',\n key: 'rows',\n value: '${chunk(buttons, 5).map(row => ({ type: \"action_row\", components: row }))}',\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n title: '📊 ${args.question}',\n description: '${optionDisplay}\\n\\n**Total votes:** 0',\n color: '#5865f2',\n footer: { text: '${endsAt ? \"Ends \" + timestamp(endsAt, \"R\") : \"No end time\"}' },\n },\n components: '${rows}',\n as: 'pollMessage',\n },\n {\n action: 'db_insert',\n table: 'polls',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n message_id: '${pollMessage.id}',\n creator_id: '${user.id}',\n question: '${args.question}',\n options: '${options}',\n multiple_choice: '${args.multiple || false}',\n ends_at: '${endsAt}',\n created_at: '${now()}',\n },\n as: 'poll',\n },\n // Update buttons with correct poll ID\n {\n action: 'set',\n key: 'buttons',\n value: '${options.map((o, i) => ({ type: \"button\", style: \"secondary\", emoji: o.emoji, custom_id: \"poll_vote_\" + poll.id + \"_\" + i }))}',\n },\n {\n action: 'set',\n key: 'rows',\n value: '${chunk(buttons, 5).map(row => ({ type: \"action_row\", components: row }))}',\n },\n {\n action: 'edit_message',\n channel: '${channel.id}',\n message: '${pollMessage.id}',\n components: '${rows}',\n },\n {\n action: 'reply',\n content: 'Poll created!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'endpoll',\n description: 'End a poll early',\n options: [\n { name: 'message_id', description: 'Poll message ID', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'polls',\n where: { message_id: '${args.message_id}' },\n as: 'poll',\n },\n {\n action: 'flow_if',\n condition: '!poll[0]',\n then: [\n { action: 'reply', content: 'Poll not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'flow_if',\n condition: 'poll[0].creator_id !== user.id && !member.permissions.has(\"MANAGE_MESSAGES\")',\n then: [\n { action: 'reply', content: 'You can only end your own polls!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'emit',\n event: 'poll_end',\n data: { pollId: '${poll[0].id}' },\n },\n {\n action: 'reply',\n content: 'Poll ended!',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport function getPollsSpec(config: PollsConfig = {}): Partial<FurlowSpec> {\n return {\n commands: pollsCommands,\n events: pollsEventHandlers,\n state: {\n tables: pollsTables,\n },\n };\n}\n","/**\n * Giveaways builtin module\n * Handles giveaway creation, entries, and winner selection\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface GiveawaysConfig {\n /** Default giveaway duration */\n defaultDuration?: string;\n /** Giveaway manager role */\n managerRole?: string;\n /** Require role to enter */\n requireRole?: string;\n /** Embed color */\n embedColor?: string;\n /** End emoji */\n emoji?: string;\n}\n\nexport const giveawaysTables: Record<string, TableDefinition> = {\n giveaways: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n channel_id: { type: 'string' },\n message_id: { type: 'string', unique: true },\n host_id: { type: 'string' },\n prize: { type: 'string' },\n winners_count: { type: 'number', default: 1 },\n ends_at: { type: 'timestamp', index: true },\n ended: { type: 'boolean', default: false },\n require_role: { type: 'string' },\n created_at: { type: 'timestamp' },\n },\n },\n giveaway_entries: {\n columns: {\n id: { type: 'number', primary: true },\n giveaway_id: { type: 'number', index: true },\n user_id: { type: 'string' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const giveawaysEventHandlers: EventHandler[] = [\n // Handle giveaway button click\n {\n event: 'button_click',\n condition: 'interaction.customId.startsWith(\"giveaway_enter_\")',\n actions: [\n {\n action: 'set',\n key: 'giveawayId',\n value: '${interaction.customId.replace(\"giveaway_enter_\", \"\")}',\n },\n {\n action: 'db_query',\n table: 'giveaways',\n where: { id: '${giveawayId}' },\n as: 'giveaway',\n },\n {\n action: 'flow_if',\n condition: '!giveaway[0] || giveaway[0].ended',\n then: [\n { action: 'reply', content: 'This giveaway has ended!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Check role requirement\n {\n action: 'flow_if',\n condition: 'giveaway[0].require_role && !member.roles.cache.has(giveaway[0].require_role)',\n then: [\n { action: 'reply', content: 'You need the <@&${giveaway[0].require_role}> role to enter!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Check if already entered\n {\n action: 'db_query',\n table: 'giveaway_entries',\n where: { giveaway_id: '${giveawayId}', user_id: '${user.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: 'existing.length > 0',\n then: [\n // Remove entry\n {\n action: 'db_delete',\n table: 'giveaway_entries',\n where: { giveaway_id: '${giveawayId}', user_id: '${user.id}' },\n },\n { action: 'reply', content: 'You have left the giveaway!', ephemeral: true },\n ],\n else: [\n // Add entry\n {\n action: 'db_insert',\n table: 'giveaway_entries',\n data: {\n giveaway_id: '${giveawayId}',\n user_id: '${user.id}',\n created_at: '${now()}',\n },\n },\n { action: 'reply', content: 'You have entered the giveaway!', ephemeral: true },\n ],\n },\n // Update entry count on message\n {\n action: 'db_query',\n table: 'giveaway_entries',\n where: { giveaway_id: '${giveawayId}' },\n as: 'entries',\n },\n {\n action: 'edit_message',\n channel: '${giveaway[0].channel_id}',\n message: '${giveaway[0].message_id}',\n embed: {\n title: '${config.giveaways?.emoji || \"🎉\"} GIVEAWAY ${config.giveaways?.emoji || \"🎉\"}',\n description: '**Prize:** ${giveaway[0].prize}\\n**Hosted by:** <@${giveaway[0].host_id}>\\n**Winners:** ${giveaway[0].winners_count}\\n**Entries:** ${entries.length}\\n\\nEnds: ${timestamp(giveaway[0].ends_at, \"R\")}',\n color: '${config.giveaways?.embedColor || \"#ff73fa\"}',\n footer: { text: 'ID: ${giveaway[0].id}' },\n },\n },\n ],\n },\n // Scheduled giveaway end\n {\n event: 'scheduler_tick',\n actions: [\n {\n action: 'db_query',\n table: 'giveaways',\n where: { ended: false },\n as: 'activeGiveaways',\n },\n {\n action: 'batch',\n items: '${activeGiveaways.filter(g => new Date(g.ends_at) <= now())}',\n each: { action: 'emit', event: 'giveaway_end', data: { giveawayId: '${item.id}' } },\n },\n ],\n },\n // End giveaway\n {\n event: 'giveaway_end',\n actions: [\n {\n action: 'db_query',\n table: 'giveaways',\n where: { id: '${event.data.giveawayId}' },\n as: 'giveaway',\n },\n {\n action: 'db_query',\n table: 'giveaway_entries',\n where: { giveaway_id: '${event.data.giveawayId}' },\n as: 'entries',\n },\n // Select winners\n {\n action: 'set',\n key: 'shuffled',\n value: '${shuffle(entries)}',\n },\n {\n action: 'set',\n key: 'winners',\n value: '${shuffled.slice(0, giveaway[0].winners_count)}',\n },\n // Mark as ended\n {\n action: 'db_update',\n table: 'giveaways',\n where: { id: '${event.data.giveawayId}' },\n data: { ended: true },\n },\n // Update message\n {\n action: 'flow_if',\n condition: 'winners.length === 0',\n then: [\n {\n action: 'edit_message',\n channel: '${giveaway[0].channel_id}',\n message: '${giveaway[0].message_id}',\n embed: {\n title: 'GIVEAWAY ENDED',\n description: '**Prize:** ${giveaway[0].prize}\\n\\nNo valid entries.',\n color: '#72767d',\n },\n components: [],\n },\n ],\n else: [\n {\n action: 'set',\n key: 'winnerMentions',\n value: '${winners.map(w => \"<@\" + w.user_id + \">\").join(\", \")}',\n },\n {\n action: 'edit_message',\n channel: '${giveaway[0].channel_id}',\n message: '${giveaway[0].message_id}',\n embed: {\n title: 'GIVEAWAY ENDED',\n description: '**Prize:** ${giveaway[0].prize}\\n\\n**Winners:** ${winnerMentions}',\n color: '#57f287',\n },\n components: [],\n },\n {\n action: 'send_message',\n channel: '${giveaway[0].channel_id}',\n content: 'Congratulations ${winnerMentions}! You won **${giveaway[0].prize}**!',\n },\n ],\n },\n ],\n },\n];\n\nexport const giveawaysCommands: CommandDefinition[] = [\n {\n name: 'giveaway',\n description: 'Giveaway management',\n subcommands: [\n {\n name: 'start',\n description: 'Start a giveaway',\n options: [\n { name: 'prize', description: 'Prize to give away', type: 'string', required: true },\n { name: 'duration', description: 'Duration (e.g., 1h, 1d, 1w)', type: 'string', required: true },\n { name: 'winners', description: 'Number of winners', type: 'integer', required: false },\n { name: 'require_role', description: 'Required role to enter', type: 'role', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'endsAt',\n value: '${addDuration(now(), args.duration)}',\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n embed: {\n title: '${config.giveaways?.emoji || \"🎉\"} GIVEAWAY ${config.giveaways?.emoji || \"🎉\"}',\n description: '**Prize:** ${args.prize}\\n**Hosted by:** ${user}\\n**Winners:** ${args.winners || 1}\\n**Entries:** 0\\n\\nEnds: ${timestamp(endsAt, \"R\")}',\n color: '${config.giveaways?.embedColor || \"#ff73fa\"}',\n },\n components: [\n {\n type: 'action_row',\n components: [\n {\n type: 'button',\n style: 'primary',\n label: 'Enter',\n emoji: '🎉',\n custom_id: 'giveaway_enter_PLACEHOLDER',\n },\n ],\n },\n ],\n as: 'giveawayMessage',\n },\n {\n action: 'db_insert',\n table: 'giveaways',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n message_id: '${giveawayMessage.id}',\n host_id: '${user.id}',\n prize: '${args.prize}',\n winners_count: '${args.winners || 1}',\n ends_at: '${endsAt}',\n require_role: '${args.require_role?.id}',\n created_at: '${now()}',\n },\n as: 'giveaway',\n },\n // Update button with correct ID\n {\n action: 'edit_message',\n channel: '${channel.id}',\n message: '${giveawayMessage.id}',\n embed: {\n title: '${config.giveaways?.emoji || \"🎉\"} GIVEAWAY ${config.giveaways?.emoji || \"🎉\"}',\n description: '**Prize:** ${args.prize}\\n**Hosted by:** ${user}\\n**Winners:** ${args.winners || 1}\\n**Entries:** 0\\n\\nEnds: ${timestamp(endsAt, \"R\")}',\n color: '${config.giveaways?.embedColor || \"#ff73fa\"}',\n footer: { text: 'ID: ${giveaway.id}' },\n },\n components: [\n {\n type: 'action_row',\n components: [\n {\n type: 'button',\n style: 'primary',\n label: 'Enter',\n emoji: '🎉',\n custom_id: 'giveaway_enter_${giveaway.id}',\n },\n ],\n },\n ],\n },\n {\n action: 'reply',\n content: 'Giveaway started!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'end',\n description: 'End a giveaway early',\n options: [\n { name: 'message_id', description: 'Giveaway message ID', type: 'string', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'giveaways',\n where: { message_id: '${args.message_id}' },\n as: 'giveaway',\n },\n {\n action: 'flow_if',\n condition: '!giveaway[0]',\n then: [\n { action: 'reply', content: 'Giveaway not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'emit',\n event: 'giveaway_end',\n data: { giveawayId: '${giveaway[0].id}' },\n },\n {\n action: 'reply',\n content: 'Giveaway ended!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'reroll',\n description: 'Reroll winners for an ended giveaway',\n options: [\n { name: 'message_id', description: 'Giveaway message ID', type: 'string', required: true },\n { name: 'winners', description: 'Number of new winners', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'giveaways',\n where: { message_id: '${args.message_id}' },\n as: 'giveaway',\n },\n {\n action: 'flow_if',\n condition: '!giveaway[0] || !giveaway[0].ended',\n then: [\n { action: 'reply', content: 'Giveaway not found or not ended!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_query',\n table: 'giveaway_entries',\n where: { giveaway_id: '${giveaway[0].id}' },\n as: 'entries',\n },\n {\n action: 'set',\n key: 'shuffled',\n value: '${shuffle(entries)}',\n },\n {\n action: 'set',\n key: 'winners',\n value: '${shuffled.slice(0, args.winners || 1)}',\n },\n {\n action: 'flow_if',\n condition: 'winners.length === 0',\n then: [\n { action: 'reply', content: 'No valid entries to reroll!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'winnerMentions',\n value: '${winners.map(w => \"<@\" + w.user_id + \">\").join(\", \")}',\n },\n {\n action: 'send_message',\n channel: '${giveaway[0].channel_id}',\n content: 'New winner(s): ${winnerMentions}! Congratulations on winning **${giveaway[0].prize}**!',\n },\n {\n action: 'reply',\n content: 'Rerolled successfully!',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport function getGiveawaysSpec(config: GiveawaysConfig = {}): Partial<FurlowSpec> {\n return {\n commands: giveawaysCommands,\n events: giveawaysEventHandlers,\n state: {\n tables: giveawaysTables,\n },\n };\n}\n","/**\n * Auto-Responder builtin module\n * Handles trigger-based automatic responses\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface AutoResponderConfig {\n /** Maximum triggers per guild */\n maxTriggers?: number;\n /** Ignore bots */\n ignoreBots?: boolean;\n /** Global cooldown (seconds) */\n globalCooldown?: number;\n}\n\nexport const autoResponderTables: Record<string, TableDefinition> = {\n auto_responses: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n trigger: { type: 'string' },\n trigger_type: { type: 'string', default: 'contains' }, // exact, contains, startswith, endswith, regex\n response: { type: 'string' },\n response_type: { type: 'string', default: 'message' }, // message, embed, reaction\n embed_data: { type: 'json' },\n reaction: { type: 'string' },\n chance: { type: 'number', default: 100 }, // 0-100 percentage\n cooldown: { type: 'number', default: 0 }, // seconds\n ignore_case: { type: 'boolean', default: true },\n delete_trigger: { type: 'boolean', default: false },\n dm_response: { type: 'boolean', default: false },\n allowed_channels: { type: 'json' },\n ignored_channels: { type: 'json' },\n allowed_roles: { type: 'json' },\n ignored_roles: { type: 'json' },\n created_at: { type: 'timestamp' },\n },\n },\n auto_response_cooldowns: {\n columns: {\n id: { type: 'number', primary: true },\n response_id: { type: 'number', index: true },\n guild_id: { type: 'string' },\n last_triggered: { type: 'timestamp' },\n },\n },\n};\n\nexport const autoResponderEventHandlers: EventHandler[] = [\n {\n event: 'message',\n condition: '!message.author.bot || !config.autoResponder?.ignoreBots',\n actions: [\n // Get all triggers for this guild\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { guild_id: '${guild.id}' },\n as: 'triggers',\n },\n // Check each trigger\n {\n action: 'batch',\n items: '${triggers}',\n each: {\n action: 'flow_if',\n condition: '(() => { const t = item; const msg = t.ignore_case ? message.content.toLowerCase() : message.content; const trig = t.ignore_case ? t.trigger.toLowerCase() : t.trigger; switch(t.trigger_type) { case \"exact\": return msg === trig; case \"contains\": return msg.includes(trig); case \"startswith\": return msg.startsWith(trig); case \"endswith\": return msg.endsWith(trig); case \"regex\": return new RegExp(t.trigger, t.ignore_case ? \"i\" : \"\").test(message.content); default: return false; } })()',\n then: [\n // Check channel restrictions\n {\n action: 'flow_if',\n condition: 'item.allowed_channels?.length && !item.allowed_channels.includes(channel.id)',\n then: [{ action: 'abort' }],\n },\n {\n action: 'flow_if',\n condition: 'item.ignored_channels?.includes(channel.id)',\n then: [{ action: 'abort' }],\n },\n // Check role restrictions\n {\n action: 'flow_if',\n condition: 'item.allowed_roles?.length && !item.allowed_roles.some(r => member.roles.cache.has(r))',\n then: [{ action: 'abort' }],\n },\n {\n action: 'flow_if',\n condition: 'item.ignored_roles?.some(r => member.roles.cache.has(r))',\n then: [{ action: 'abort' }],\n },\n // Check cooldown\n {\n action: 'flow_if',\n condition: 'item.cooldown > 0',\n then: [\n {\n action: 'db_query',\n table: 'auto_response_cooldowns',\n where: { response_id: '${item.id}', guild_id: '${guild.id}' },\n as: 'cooldown',\n },\n {\n action: 'flow_if',\n condition: 'cooldown[0] && (now() - new Date(cooldown[0].last_triggered)) < item.cooldown * 1000',\n then: [{ action: 'abort' }],\n },\n ],\n },\n // Check chance\n {\n action: 'flow_if',\n condition: 'item.chance < 100 && random(1, 100) > item.chance',\n then: [{ action: 'abort' }],\n },\n // Execute response\n {\n action: 'flow_switch',\n value: '${item.response_type}',\n cases: {\n message: [\n {\n action: 'flow_if',\n condition: 'item.dm_response',\n then: [\n { action: 'send_dm', user: '${user.id}', content: '${item.response}' },\n ],\n else: [\n { action: 'send_message', channel: '${channel.id}', content: '${item.response}' },\n ],\n },\n ],\n embed: [\n {\n action: 'flow_if',\n condition: 'item.dm_response',\n then: [\n { action: 'send_dm', user: '${user.id}', embed: '${item.embed_data}' },\n ],\n else: [\n { action: 'send_message', channel: '${channel.id}', embed: '${item.embed_data}' },\n ],\n },\n ],\n reaction: [\n { action: 'add_reaction', message: '${message.id}', channel: '${channel.id}', emoji: '${item.reaction}' },\n ],\n },\n },\n // Delete trigger message if configured\n {\n action: 'flow_if',\n condition: 'item.delete_trigger',\n then: [\n { action: 'delete_message', channel: '${channel.id}', message: '${message.id}' },\n ],\n },\n // Update cooldown\n {\n action: 'flow_if',\n condition: 'item.cooldown > 0',\n then: [\n {\n action: 'db_update',\n table: 'auto_response_cooldowns',\n where: { response_id: '${item.id}', guild_id: '${guild.id}' },\n data: { last_triggered: '${now()}' },\n upsert: true,\n },\n ],\n },\n ],\n },\n },\n ],\n },\n];\n\nexport const autoResponderCommands: CommandDefinition[] = [\n {\n name: 'autoresponder',\n description: 'Auto-responder management',\n subcommands: [\n {\n name: 'add',\n description: 'Add an auto-response',\n options: [\n { name: 'trigger', description: 'Trigger text', type: 'string', required: true },\n { name: 'response', description: 'Response text', type: 'string', required: true },\n { name: 'type', description: 'Match type', type: 'string', required: false, choices: [\n { name: 'Contains', value: 'contains' },\n { name: 'Exact match', value: 'exact' },\n { name: 'Starts with', value: 'startswith' },\n { name: 'Ends with', value: 'endswith' },\n { name: 'Regex', value: 'regex' },\n ]},\n { name: 'chance', description: 'Response chance (1-100)', type: 'integer', required: false },\n ],\n actions: [\n // Check max triggers\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { guild_id: '${guild.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: 'existing.length >= (config.autoResponder?.maxTriggers || 50)',\n then: [\n { action: 'reply', content: 'Maximum triggers reached!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_insert',\n table: 'auto_responses',\n data: {\n guild_id: '${guild.id}',\n trigger: '${args.trigger}',\n trigger_type: '${args.type || \"contains\"}',\n response: '${args.response}',\n chance: '${args.chance || 100}',\n created_at: '${now()}',\n },\n as: 'newTrigger',\n },\n {\n action: 'reply',\n content: 'Auto-response added! ID: ${newTrigger.id}',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'list',\n description: 'List auto-responses',\n actions: [\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { guild_id: '${guild.id}' },\n as: 'triggers',\n },\n {\n action: 'flow_if',\n condition: 'triggers.length === 0',\n then: [\n { action: 'reply', content: 'No auto-responses configured!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'triggerList',\n value: '${triggers.map(t => \"**\" + t.id + \".** `\" + truncate(t.trigger, 30) + \"` → `\" + truncate(t.response, 30) + \"` (\" + t.trigger_type + \")\").join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Auto-Responses',\n description: '${triggerList}',\n color: '#5865f2',\n footer: { text: '${triggers.length} trigger(s)' },\n },\n ephemeral: true,\n },\n ],\n },\n {\n name: 'delete',\n description: 'Delete an auto-response',\n options: [\n { name: 'id', description: 'Trigger ID', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { id: '${args.id}', guild_id: '${guild.id}' },\n as: 'trigger',\n },\n {\n action: 'flow_if',\n condition: 'trigger.length === 0',\n then: [\n { action: 'reply', content: 'Trigger not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_delete',\n table: 'auto_responses',\n where: { id: '${args.id}' },\n },\n {\n action: 'db_delete',\n table: 'auto_response_cooldowns',\n where: { response_id: '${args.id}' },\n },\n {\n action: 'reply',\n content: 'Auto-response deleted!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'edit',\n description: 'Edit an auto-response',\n options: [\n { name: 'id', description: 'Trigger ID', type: 'integer', required: true },\n { name: 'trigger', description: 'New trigger', type: 'string', required: false },\n { name: 'response', description: 'New response', type: 'string', required: false },\n { name: 'cooldown', description: 'Cooldown in seconds', type: 'integer', required: false },\n { name: 'chance', description: 'Response chance (1-100)', type: 'integer', required: false },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'auto_responses',\n where: { id: '${args.id}', guild_id: '${guild.id}' },\n as: 'trigger',\n },\n {\n action: 'flow_if',\n condition: 'trigger.length === 0',\n then: [\n { action: 'reply', content: 'Trigger not found!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'updates',\n value: '${Object.fromEntries(Object.entries({ trigger: args.trigger, response: args.response, cooldown: args.cooldown, chance: args.chance }).filter(([_, v]) => v !== undefined))}',\n },\n {\n action: 'db_update',\n table: 'auto_responses',\n where: { id: '${args.id}' },\n data: '${updates}',\n },\n {\n action: 'reply',\n content: 'Auto-response updated!',\n ephemeral: true,\n },\n ],\n },\n ],\n },\n];\n\nexport function getAutoResponderSpec(config: AutoResponderConfig = {}): Partial<FurlowSpec> {\n return {\n commands: autoResponderCommands,\n events: autoResponderEventHandlers,\n state: {\n tables: autoResponderTables,\n },\n };\n}\n","/**\n * AFK builtin module\n * Handles AFK status and mention notifications\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface AfkConfig {\n /** Maximum AFK reason length */\n maxReasonLength?: number;\n /** Add prefix to nickname */\n nicknamePrefix?: string;\n /** Ignore bot mentions */\n ignoreBots?: boolean;\n}\n\nexport const afkTables: Record<string, TableDefinition> = {\n afk_users: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n user_id: { type: 'string', index: true },\n reason: { type: 'string' },\n set_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const afkEventHandlers: EventHandler[] = [\n // Remove AFK when user sends message\n {\n event: 'message',\n condition: '!message.author.bot',\n actions: [\n {\n action: 'db_query',\n table: 'afk_users',\n where: { guild_id: '${guild.id}', user_id: '${user.id}' },\n as: 'afkStatus',\n },\n {\n action: 'flow_if',\n condition: 'afkStatus.length > 0',\n then: [\n // Remove AFK\n {\n action: 'db_delete',\n table: 'afk_users',\n where: { guild_id: '${guild.id}', user_id: '${user.id}' },\n },\n // Remove nickname prefix if set\n {\n action: 'flow_if',\n condition: 'config.afk?.nicknamePrefix && member.nickname?.startsWith(config.afk.nicknamePrefix)',\n then: [\n {\n action: 'set_nickname',\n user: '${user.id}',\n nickname: '${member.nickname.replace(config.afk.nicknamePrefix, \"\")}',\n },\n ],\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: 'Welcome back ${user}! I removed your AFK status.',\n as: 'welcomeBack',\n },\n {\n action: 'wait',\n duration: 5000,\n },\n {\n action: 'delete_message',\n channel: '${channel.id}',\n message: '${welcomeBack.id}',\n },\n ],\n },\n ],\n },\n // Notify when AFK user is mentioned\n {\n event: 'message',\n condition: 'message.mentions.users.size > 0 && !message.author.bot',\n actions: [\n {\n action: 'set',\n key: 'mentionedIds',\n value: '${[...message.mentions.users.keys()]}',\n },\n {\n action: 'db_query',\n table: 'afk_users',\n where: { guild_id: '${guild.id}' },\n as: 'allAfk',\n },\n {\n action: 'set',\n key: 'afkMentioned',\n value: '${allAfk.filter(a => mentionedIds.includes(a.user_id))}',\n },\n {\n action: 'flow_if',\n condition: 'afkMentioned.length > 0',\n then: [\n {\n action: 'set',\n key: 'afkMessages',\n value: '${afkMentioned.map(a => \"<@\" + a.user_id + \"> is AFK: \" + a.reason + \" (since \" + timestamp(a.set_at, \"R\") + \")\").join(\"\\\\n\")}',\n },\n {\n action: 'send_message',\n channel: '${channel.id}',\n content: '${afkMessages}',\n as: 'afkNotice',\n },\n {\n action: 'wait',\n duration: 10000,\n },\n {\n action: 'delete_message',\n channel: '${channel.id}',\n message: '${afkNotice.id}',\n },\n ],\n },\n ],\n },\n];\n\nexport const afkCommands: CommandDefinition[] = [\n {\n name: 'afk',\n description: 'Set your AFK status',\n options: [\n { name: 'reason', description: 'AFK reason', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'reason',\n value: '${truncate(args.reason || \"AFK\", config.afk?.maxReasonLength || 100)}',\n },\n // Check if already AFK\n {\n action: 'db_query',\n table: 'afk_users',\n where: { guild_id: '${guild.id}', user_id: '${user.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: 'existing.length > 0',\n then: [\n {\n action: 'db_update',\n table: 'afk_users',\n where: { guild_id: '${guild.id}', user_id: '${user.id}' },\n data: { reason: '${reason}', set_at: '${now()}' },\n },\n ],\n else: [\n {\n action: 'db_insert',\n table: 'afk_users',\n data: {\n guild_id: '${guild.id}',\n user_id: '${user.id}',\n reason: '${reason}',\n set_at: '${now()}',\n },\n },\n ],\n },\n // Add nickname prefix if configured\n {\n action: 'flow_if',\n condition: 'config.afk?.nicknamePrefix && !member.nickname?.startsWith(config.afk.nicknamePrefix)',\n then: [\n {\n action: 'set_nickname',\n user: '${user.id}',\n nickname: '${config.afk.nicknamePrefix + (member.nickname || user.username)}',\n },\n ],\n },\n {\n action: 'reply',\n content: 'I set your AFK: ${reason}',\n ephemeral: false,\n },\n ],\n },\n];\n\nexport function getAfkSpec(config: AfkConfig = {}): Partial<FurlowSpec> {\n return {\n commands: afkCommands,\n events: afkEventHandlers,\n state: {\n tables: afkTables,\n },\n };\n}\n","/**\n * Reminders builtin module\n * Handles scheduled reminders with DM delivery\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface RemindersConfig {\n /** Maximum reminders per user */\n maxRemindersPerUser?: number;\n /** Minimum reminder duration */\n minDuration?: string;\n /** Maximum reminder duration */\n maxDuration?: string;\n /** Allow DM reminders */\n allowDM?: boolean;\n}\n\nexport const remindersTables: Record<string, TableDefinition> = {\n reminders: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n channel_id: { type: 'string' },\n user_id: { type: 'string', index: true },\n message: { type: 'string' },\n remind_at: { type: 'timestamp', index: true },\n dm: { type: 'boolean', default: false },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const remindersEventHandlers: EventHandler[] = [\n // Check reminders on scheduler tick\n {\n event: 'scheduler_tick',\n actions: [\n {\n action: 'db_query',\n table: 'reminders',\n where: {},\n as: 'allReminders',\n },\n {\n action: 'set',\n key: 'dueReminders',\n value: '${allReminders.filter(r => new Date(r.remind_at) <= now())}',\n },\n {\n action: 'batch',\n items: '${dueReminders}',\n each: { action: 'emit', event: 'reminder_due', data: { reminder: '${item}' } },\n },\n ],\n },\n // Handle due reminder\n {\n event: 'reminder_due',\n actions: [\n {\n action: 'set',\n key: 'reminder',\n value: '${event.data.reminder}',\n },\n // Delete the reminder\n {\n action: 'db_delete',\n table: 'reminders',\n where: { id: '${reminder.id}' },\n },\n // Send reminder\n {\n action: 'flow_if',\n condition: 'reminder.dm',\n then: [\n {\n action: 'send_dm',\n user: '${reminder.user_id}',\n embed: {\n title: 'Reminder',\n description: '${reminder.message}',\n color: '#5865f2',\n footer: { text: 'Set ${timestamp(reminder.created_at, \"R\")}' },\n },\n },\n ],\n else: [\n {\n action: 'send_message',\n channel: '${reminder.channel_id}',\n content: '<@${reminder.user_id}> Reminder: ${reminder.message}',\n },\n ],\n },\n ],\n },\n];\n\nexport const remindersCommands: CommandDefinition[] = [\n {\n name: 'remind',\n description: 'Set a reminder',\n options: [\n { name: 'time', description: 'When to remind (e.g., 10m, 2h, 1d)', type: 'string', required: true },\n { name: 'message', description: 'Reminder message', type: 'string', required: true },\n { name: 'dm', description: 'Send reminder via DM', type: 'boolean', required: false },\n ],\n actions: [\n // Check max reminders\n {\n action: 'db_query',\n table: 'reminders',\n where: { user_id: '${user.id}' },\n as: 'userReminders',\n },\n {\n action: 'flow_if',\n condition: 'userReminders.length >= (config.reminders?.maxRemindersPerUser || 25)',\n then: [\n { action: 'reply', content: 'You have too many reminders! Delete some first.', ephemeral: true },\n { action: 'abort' },\n ],\n },\n // Calculate remind time\n {\n action: 'set',\n key: 'remindAt',\n value: '${addDuration(now(), args.time)}',\n },\n // Create reminder\n {\n action: 'db_insert',\n table: 'reminders',\n data: {\n guild_id: '${guild.id}',\n channel_id: '${channel.id}',\n user_id: '${user.id}',\n message: '${args.message}',\n remind_at: '${remindAt}',\n dm: '${args.dm || false}',\n created_at: '${now()}',\n },\n as: 'reminder',\n },\n {\n action: 'reply',\n embed: {\n title: 'Reminder Set',\n description: 'I\\'ll remind you ${timestamp(remindAt, \"R\")}: ${args.message}',\n color: '#57f287',\n footer: { text: 'ID: ${reminder.id}' },\n },\n ephemeral: true,\n },\n ],\n },\n {\n name: 'reminders',\n description: 'View your reminders',\n actions: [\n {\n action: 'db_query',\n table: 'reminders',\n where: { user_id: '${user.id}' },\n order_by: 'remind_at ASC',\n as: 'reminders',\n },\n {\n action: 'flow_if',\n condition: 'reminders.length === 0',\n then: [\n { action: 'reply', content: 'You have no reminders!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'reminderList',\n value: '${reminders.map((r, i) => \"**\" + (i + 1) + \".** \" + truncate(r.message, 50) + \" - \" + timestamp(r.remind_at, \"R\") + \" (ID: \" + r.id + \")\").join(\"\\\\n\")}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Your Reminders',\n description: '${reminderList}',\n color: '#5865f2',\n footer: { text: '${reminders.length} reminder(s)' },\n },\n ephemeral: true,\n },\n ],\n },\n {\n name: 'delreminder',\n description: 'Delete a reminder',\n options: [\n { name: 'id', description: 'Reminder ID', type: 'integer', required: true },\n ],\n actions: [\n {\n action: 'db_query',\n table: 'reminders',\n where: { id: '${args.id}', user_id: '${user.id}' },\n as: 'reminder',\n },\n {\n action: 'flow_if',\n condition: 'reminder.length === 0',\n then: [\n { action: 'reply', content: 'Reminder not found or not yours!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'db_delete',\n table: 'reminders',\n where: { id: '${args.id}' },\n },\n {\n action: 'reply',\n content: 'Reminder deleted!',\n ephemeral: true,\n },\n ],\n },\n];\n\nexport function getRemindersSpec(config: RemindersConfig = {}): Partial<FurlowSpec> {\n return {\n commands: remindersCommands,\n events: remindersEventHandlers,\n state: {\n tables: remindersTables,\n },\n };\n}\n","/**\n * Utilities builtin module\n * Common utility commands: serverinfo, userinfo, avatar, etc.\n */\n\nimport type { FurlowSpec, CommandDefinition } from '@furlow/schema';\n\nexport interface UtilitiesConfig {\n /** Commands to enable/disable */\n enabledCommands?: string[];\n}\n\nexport const utilitiesCommands: CommandDefinition[] = [\n {\n name: 'serverinfo',\n description: 'View server information',\n actions: [\n {\n action: 'set',\n key: 'boostLevel',\n value: '${[\"None\", \"Level 1\", \"Level 2\", \"Level 3\"][guild.premium_tier]}',\n },\n {\n action: 'set',\n key: 'verificationLevel',\n value: '${[\"None\", \"Low\", \"Medium\", \"High\", \"Highest\"][guild.verificationLevel]}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name}',\n thumbnail: '${guild.icon}',\n color: '#5865f2',\n fields: [\n { name: 'Owner', value: '<@${guild.owner_id}>', inline: true },\n { name: 'Created', value: '${timestamp(guild.created_at, \"R\")}', inline: true },\n { name: 'Members', value: '${guild.member_count}', inline: true },\n { name: 'Channels', value: '${guild.channel_count}', inline: true },\n { name: 'Roles', value: '${guild.role_count}', inline: true },\n { name: 'Emojis', value: '${guild.emoji_count}', inline: true },\n { name: 'Boost Level', value: '${boostLevel}', inline: true },\n { name: 'Boosts', value: '${guild.boost_count || 0}', inline: true },\n { name: 'Verification', value: '${verificationLevel}', inline: true },\n ],\n footer: { text: 'ID: ${guild.id}' },\n },\n },\n ],\n },\n {\n name: 'userinfo',\n description: 'View user information',\n options: [\n { name: 'user', description: 'User to view', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'set',\n key: 'targetMember',\n value: '${options.member || member}',\n },\n {\n action: 'set',\n key: 'roles',\n value: '${targetMember.roles | slice(0, 10) | join(\", \") || \"None\"}',\n },\n {\n action: 'reply',\n embed: {\n title: '${targetUser.tag}',\n thumbnail: '${targetUser.avatar}',\n color: '#5865f2',\n fields: [\n { name: 'Username', value: '${targetUser.username}', inline: true },\n { name: 'Nickname', value: '${targetMember.nickname || \"None\"}', inline: true },\n { name: 'Bot', value: '${targetUser.bot ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Created', value: '${timestamp(targetUser.created_at, \"R\")}', inline: true },\n { name: 'Joined', value: '${timestamp(targetMember.joined_at, \"R\")}', inline: true },\n { name: 'Highest Role', value: '${targetMember.highest_role || \"None\"}', inline: true },\n { name: 'Roles', value: '${roles}', inline: false },\n ],\n footer: { text: 'ID: ${targetUser.id}' },\n },\n },\n ],\n },\n {\n name: 'avatar',\n description: 'View user avatar',\n options: [\n { name: 'user', description: 'User to view', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'reply',\n embed: {\n title: '${targetUser.tag}\\'s Avatar',\n image: '${targetUser.avatar}',\n color: '#5865f2',\n description: 'Click the image to view full size',\n },\n },\n ],\n },\n {\n name: 'banner',\n description: 'View user banner',\n options: [\n { name: 'user', description: 'User to view', type: 'user', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetUser',\n value: '${args.user || user}',\n },\n {\n action: 'flow_if',\n condition: '!targetUser.banner',\n then: [\n { action: 'reply', content: 'This user has no banner!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'reply',\n embed: {\n title: '${targetUser.tag}\\'s Banner',\n image: '${targetUser.banner}',\n color: '#5865f2',\n },\n },\n ],\n },\n {\n name: 'roleinfo',\n description: 'View role information',\n options: [\n { name: 'role', description: 'Role to view', type: 'role', required: true },\n ],\n actions: [\n {\n action: 'reply',\n embed: {\n title: '${args.role.name}',\n color: '${args.role.hexColor}',\n fields: [\n { name: 'Color', value: '${args.role.hexColor}', inline: true },\n { name: 'Position', value: '${args.role.position}', inline: true },\n { name: 'Members', value: '${args.role.members.size}', inline: true },\n { name: 'Hoisted', value: '${args.role.hoist ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Mentionable', value: '${args.role.mentionable ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Managed', value: '${args.role.managed ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Created', value: '${timestamp(args.role.createdAt, \"R\")}', inline: true },\n ],\n footer: { text: 'ID: ${args.role.id}' },\n },\n },\n ],\n },\n {\n name: 'channelinfo',\n description: 'View channel information',\n options: [\n { name: 'channel', description: 'Channel to view', type: 'channel', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'targetChannel',\n value: '${args.channel || channel}',\n },\n {\n action: 'reply',\n embed: {\n title: '#${targetChannel.name}',\n color: '#5865f2',\n fields: [\n { name: 'Type', value: '${targetChannel.type}', inline: true },\n { name: 'Category', value: '${targetChannel.parent?.name || \"None\"}', inline: true },\n { name: 'Position', value: '${targetChannel.position}', inline: true },\n { name: 'NSFW', value: '${targetChannel.nsfw ? \"Yes\" : \"No\"}', inline: true },\n { name: 'Created', value: '${timestamp(targetChannel.createdAt, \"R\")}', inline: true },\n { name: 'Topic', value: '${targetChannel.topic || \"None\"}', inline: false },\n ],\n footer: { text: 'ID: ${targetChannel.id}' },\n },\n },\n ],\n },\n {\n name: 'ping',\n description: 'Check bot latency',\n actions: [\n {\n action: 'reply',\n content: 'Pong! Latency: ${client.ws.ping}ms',\n },\n ],\n },\n {\n name: 'invite',\n description: 'Get bot invite link',\n actions: [\n {\n action: 'reply',\n embed: {\n title: 'Invite ${client.user.username}',\n description: '[Click here to invite](https://discord.com/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot%20applications.commands)',\n color: '#5865f2',\n },\n ephemeral: true,\n },\n ],\n },\n {\n name: 'membercount',\n description: 'View member count',\n actions: [\n {\n action: 'set',\n key: 'humans',\n value: '${guild.members.cache.filter(m => !m.user.bot).size}',\n },\n {\n action: 'set',\n key: 'bots',\n value: '${guild.members.cache.filter(m => m.user.bot).size}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Member Count',\n color: '#5865f2',\n fields: [\n { name: 'Total', value: '${guild.member_count}', inline: true },\n { name: 'Humans', value: '${humans}', inline: true },\n { name: 'Bots', value: '${bots}', inline: true },\n ],\n },\n },\n ],\n },\n {\n name: 'emojis',\n description: 'List server emojis',\n actions: [\n {\n action: 'set',\n key: 'staticEmojis',\n value: '${guild.emojis.cache.filter(e => !e.animated).map(e => e.toString()).slice(0, 50).join(\" \")}',\n },\n {\n action: 'set',\n key: 'animatedEmojis',\n value: '${guild.emojis.cache.filter(e => e.animated).map(e => e.toString()).slice(0, 50).join(\" \")}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name} Emojis',\n color: '#5865f2',\n fields: [\n { name: 'Static (${guild.emojis.cache.filter(e => !e.animated).size})', value: '${staticEmojis || \"None\"}' },\n { name: 'Animated (${guild.emojis.cache.filter(e => e.animated).size})', value: '${animatedEmojis || \"None\"}' },\n ],\n },\n },\n ],\n },\n {\n name: 'roles',\n description: 'List server roles',\n actions: [\n {\n action: 'set',\n key: 'roleList',\n value: '${guild.roles.cache.filter(r => r.id !== guild.id).sort((a, b) => b.position - a.position).map(r => r.toString()).slice(0, 40).join(\", \")}',\n },\n {\n action: 'reply',\n embed: {\n title: '${guild.name} Roles (${guild.roles.cache.size - 1})',\n description: '${roleList}',\n color: '#5865f2',\n },\n },\n ],\n },\n];\n\nexport function getUtilitiesSpec(config: UtilitiesConfig = {}): Partial<FurlowSpec> {\n return {\n commands: utilitiesCommands,\n };\n}\n"],"mappings":";AAyBO,IAAM,qBAA0C;AAAA,EACrD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,gBAAgB,MAAM,QAAQ,UAAU,KAAK;AAAA,MAC1E,EAAE,MAAM,UAAU,aAAa,sBAAsB,MAAM,UAAU,UAAU,KAAK;AAAA,IACtF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,SAAS;AAAA,UACT,UAAU;AAAA,UACV,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,YAAY;AAAA,QACd;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,QAAQ;AAAA,YACN,EAAE,MAAM,UAAU,OAAO,iBAAiB;AAAA,YAC1C,EAAE,MAAM,aAAa,OAAO,mBAAmB;AAAA,UACjD;AAAA,UACA,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,gBAAgB,MAAM,QAAQ,UAAU,KAAK;AAAA,MAC1E,EAAE,MAAM,UAAU,aAAa,mBAAmB,MAAM,UAAU,UAAU,MAAM;AAAA,IACpF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,eAAe,MAAM,QAAQ,UAAU,KAAK;AAAA,MACzE,EAAE,MAAM,UAAU,aAAa,kBAAkB,MAAM,UAAU,UAAU,MAAM;AAAA,MACjF,EAAE,MAAM,eAAe,aAAa,oCAAoC,MAAM,WAAW,UAAU,MAAM;AAAA,IAC3G;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,qBAAqB;AAAA,QACrB,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,WAAW,aAAa,oBAAoB,MAAM,UAAU,UAAU,KAAK;AAAA,MACnF,EAAE,MAAM,UAAU,aAAa,oBAAoB,MAAM,UAAU,UAAU,MAAM;AAAA,IACrF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,mBAAmB,MAAM,QAAQ,UAAU,KAAK;AAAA,MAC7E,EAAE,MAAM,YAAY,aAAa,gCAAgC,MAAM,UAAU,UAAU,KAAK;AAAA,MAChG,EAAE,MAAM,UAAU,aAAa,sBAAsB,MAAM,UAAU,UAAU,MAAM;AAAA,IACvF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,iBAAiB,MAAM,QAAQ,UAAU,KAAK;AAAA,IAC7E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,SAAS,aAAa,wCAAwC,MAAM,WAAW,UAAU,KAAK;AAAA,MACtG,EAAE,MAAM,QAAQ,aAAa,uCAAuC,MAAM,QAAQ,UAAU,MAAM;AAAA,IACpG;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,mBAAmB;AAAA,EAC9B,UAAU;AAAA,IACR,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAmB,SAAS,KAAK;AAAA,MAC7C,SAAS,EAAE,MAAM,UAAmB,OAAO,KAAK;AAAA,MAChD,UAAU,EAAE,MAAM,UAAmB,OAAO,KAAK;AAAA,MACjD,cAAc,EAAE,MAAM,SAAkB;AAAA,MACxC,QAAQ,EAAE,MAAM,SAAkB;AAAA,MAClC,YAAY,EAAE,MAAM,YAAqB;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAmB,SAAS,KAAK;AAAA,MAC7C,UAAU,EAAE,MAAM,UAAmB,OAAO,KAAK;AAAA,MACjD,SAAS,EAAE,MAAM,UAAmB,OAAO,KAAK;AAAA,MAChD,cAAc,EAAE,MAAM,SAAkB;AAAA,MACxC,QAAQ,EAAE,MAAM,SAAkB;AAAA,MAClC,QAAQ,EAAE,MAAM,SAAkB;AAAA,MAClC,YAAY,EAAE,MAAM,YAAqB;AAAA,IAC3C;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,SAA2B,CAAC,GAAwB;AACpF,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACrMO,IAAM,uBAAuC;AAAA,EAClD;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,SAAS;AAAA,cACP,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,aAAa;AAAA,YACf;AAAA,YACA,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,cACL;AAAA,gBACE,YAAY;AAAA,gBACZ,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,SAAS;AAAA,gBACT,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,QAAQ;AAAA,oBACN,MAAM;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,YACA,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,SAAS;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,OAAO;AAAA,gBACT;AAAA,cACF;AAAA,YACF;AAAA,YACA,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,SAAS;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,kBAAuC;AAAA,EAClD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,QAAQ;AAAA,cACR,OAAO;AAAA,YACT;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,WAAW,aAAa,gCAAgC,MAAM,WAAW,UAAU,KAAK;AAAA,QAClG;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,WAAW,aAAa,8CAA8C,MAAM,UAAU,UAAU,KAAK;AAAA,QAC/G;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,QAAQ,aAAa,0BAA0B,MAAM,QAAQ,UAAU,KAAK;AAAA,QACtF;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,QAAQ,aAAa,kBAAkB,MAAM,QAAQ,UAAU,KAAK;AAAA,QAC9E;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,0BAA2D;AAAA,EACtE,cAAc;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,eAAe,SAAwB,CAAC,GAAwB;AAC9E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,YAAY;AAAA,IACd;AAAA,EACF;AACF;;;ACnSO,IAAM,uBAAuC;AAAA;AAAA,EAElD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,UAAU,OAAO,kEAAkE,QAAQ,KAAK;AAAA,YACxG,EAAE,MAAM,WAAW,OAAO,oBAAoB,QAAQ,KAAK;AAAA,YAC3D,EAAE,MAAM,cAAc,OAAO,iBAAiB,QAAQ,KAAK;AAAA,UAC7D;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,UAAU,OAAO,qDAAqD;AAAA,YAC9E,EAAE,MAAM,SAAS,OAAO,qDAAqD;AAAA,YAC7E,EAAE,MAAM,UAAU,OAAO,8BAA8B,QAAQ,KAAK;AAAA,YACpE,EAAE,MAAM,WAAW,OAAO,oBAAoB,QAAQ,KAAK;AAAA,YAC3D,EAAE,MAAM,mBAAmB,OAAO,mCAAmC,QAAQ,KAAK;AAAA,UACpF;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,WAAW;AAAA,QACb;AAAA,QACA,OAAO;AAAA,UACL;AAAA,YACE,YAAY;AAAA,YACZ,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,OAAO,sBAAsB,QAAQ,KAAK;AAAA,YAC9D,EAAE,MAAM,eAAe,OAAO,sBAAsB,QAAQ,KAAK;AAAA,YACjE,EAAE,MAAM,gBAAgB,OAAO,yBAAyB,QAAQ,KAAK;AAAA,UACvE;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,OAAO,sBAAsB,QAAQ,KAAK;AAAA,YAC9D,EAAE,MAAM,SAAS,OAAO,4BAA4B,QAAQ,MAAM;AAAA,YAClE,EAAE,MAAM,aAAa,OAAO,uCAAuC,QAAQ,KAAK;AAAA,UAClF;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,EAAE,MAAM,eAAe,OAAO,2BAA2B,QAAQ,KAAK;AAAA,gBACtE,EAAE,MAAM,iBAAiB,OAAO,6BAA6B,QAAQ,KAAK;AAAA,cAC5E;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,cACA,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,EAAE,MAAM,UAAU,OAAO,oDAAoD,QAAQ,KAAK;AAAA,gBAC1F,EAAE,MAAM,SAAS,OAAO,oDAAoD,QAAQ,KAAK;AAAA,cAC3F;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,cACA,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,OAAO,eAAe,QAAQ,KAAK;AAAA,YACvD,EAAE,MAAM,UAAU,OAAO,yCAAyC,QAAQ,MAAM;AAAA,UAClF;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,OAAO,eAAe,QAAQ,KAAK;AAAA,UACzD;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,QAAQ,OAAO,uBAAuB,QAAQ,KAAK;AAAA,YAC3D,EAAE,MAAM,MAAM,OAAO,uBAAuB,QAAQ,KAAK;AAAA,UAC3D;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,QAAQ,OAAO,mBAAmB,QAAQ,KAAK;AAAA,YACvD,EAAE,MAAM,QAAQ,OAAO,mBAAmB,QAAQ,KAAK;AAAA,UACzD;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,QAAQ,OAAO,mBAAmB,QAAQ,KAAK;AAAA,UACzD;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,SAAS,OAAO,8BAA8B,QAAQ,KAAK;AAAA,YACnE,EAAE,MAAM,WAAW,OAAO,gCAAgC,QAAQ,KAAK;AAAA,YACvE,EAAE,MAAM,eAAe,OAAO,sCAAsC,QAAQ,KAAK;AAAA,UACnF;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,kBAAuC;AAAA,EAClD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,WAAW,aAAa,oBAAoB,MAAM,WAAW,UAAU,KAAK;AAAA,UACpF,EAAE,MAAM,YAAY,aAAa,gBAAgB,MAAM,UAAU,UAAU,OAAO,SAAS;AAAA,YACzF,EAAE,MAAM,OAAO,OAAO,MAAM;AAAA,YAC5B,EAAE,MAAM,YAAY,OAAO,WAAW;AAAA,YACtC,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,YACpC,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,YAChC,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,YAClC,EAAE,MAAM,cAAc,OAAO,aAAa;AAAA,UAC5C,EAAC;AAAA,QACH;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO;AAAA,cACT;AAAA,YACF;AAAA,YACA,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,SAAS,aAAa,mBAAmB,MAAM,UAAU,UAAU,MAAM,SAAS;AAAA,YACxF,EAAE,MAAM,kBAAkB,OAAO,gBAAgB;AAAA,YACjD,EAAE,MAAM,gBAAgB,OAAO,cAAc;AAAA,YAC7C,EAAE,MAAM,eAAe,OAAO,aAAa;AAAA,YAC3C,EAAE,MAAM,gBAAgB,OAAO,cAAc;AAAA,YAC7C,EAAE,MAAM,cAAc,OAAO,YAAY;AAAA,YACzC,EAAE,MAAM,cAAc,OAAO,YAAY;AAAA,YACzC,EAAE,MAAM,eAAe,OAAO,aAAa;AAAA,UAC7C,EAAC;AAAA,UACD,EAAE,MAAM,WAAW,aAAa,qBAAqB,MAAM,WAAW,UAAU,KAAK;AAAA,QACvF;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,WAAW,aAAa,qBAAqB,MAAM,WAAW,UAAU,KAAK;AAAA,QACvF;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,eAAe,SAAwB,CAAC,GAAwB;AAC9E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AACF;;;AC7gBO,IAAM,gBAAiD;AAAA,EAC5D,SAAS;AAAA,IACP,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,YAAY,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,MAC3C,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,SAAS,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACvC,UAAU,EAAE,MAAM,SAAS;AAAA,MAC3B,YAAY,EAAE,MAAM,SAAS;AAAA,MAC7B,QAAQ,EAAE,MAAM,UAAU,SAAS,OAAO;AAAA,MAC1C,YAAY,EAAE,MAAM,YAAY;AAAA,MAChC,WAAW,EAAE,MAAM,YAAY;AAAA,IACjC;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,WAAW,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACzC,WAAW,EAAE,MAAM,SAAS;AAAA,MAC5B,aAAa,EAAE,MAAM,SAAS;AAAA,MAC9B,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,aAAa,EAAE,MAAM,OAAO;AAAA,MAC5B,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAEO,IAAM,wBAA+C;AAAA,EAC1D;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,0BAAiD;AAAA,EAC5D;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,MACV;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,uBAAuC;AAAA;AAAA,EAElD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,QACA,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,UACA,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,YACX,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,aAAa;AAAA,oBACb,SAAS;AAAA,kBACX;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAM;AAAA,UACJ,EAAE,QAAQ,QAAQ,OAAO,2BAA2B,MAAM,EAAE,UAAU,UAAU,EAAE;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,UAAU,2BAA2B;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,UAAU,cAAc;AAAA,QACjC,UAAU;AAAA,QACV,OAAO;AAAA,QACP,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,uBAAuB;AAAA,UACrB;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,CAAC,cAAc;AAAA,UACvB;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,OAAO,CAAC,gBAAgB,iBAAiB,wBAAwB,cAAc;AAAA,UACjF;AAAA,UACA;AAAA,QACF;AAAA,QACA,IAAI;AAAA,MACN;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY;AAAA,QACd;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,OAAO,wCAAwC,QAAQ,KAAK;AAAA,YAChF,EAAE,MAAM,cAAc,OAAO,WAAW,QAAQ,KAAK;AAAA,UACvD;AAAA,UACA,WAAW;AAAA,QACb;AAAA,QACA,YAAY;AAAA,MACd;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,iCAAiC,WAAW,KAAK;AAAA,UAC7E,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,iEAAiE,WAAW,KAAK;AAAA,UAC7G,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,MAAM,EAAE,YAAY,aAAa;AAAA,MACnC;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,aAAa;AAAA,UACb,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,EAAE,QAAQ,SAAS,SAAS,iCAAiC,WAAW,KAAK;AAAA,IAC/E;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,iCAAiC,WAAW,KAAK;AAAA,UAC7E,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,UACV;AAAA,YACE,MAAM;AAAA,YACN,YAAY;AAAA,cACV,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,gBAAgB,WAAW,uBAAuB;AAAA,cAC5F,EAAE,MAAM,UAAU,OAAO,aAAa,OAAO,UAAU,WAAW,sBAAsB;AAAA,YAC1F;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,IAAI;AAAA,MACN;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,WAAW,kBAAkB;AAAA,YACtC,UAAU;AAAA,YACV,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,EAAE,MAAM,aAAa,OAAO,mBAAmB,QAAQ,KAAK;AAAA,gBAC5D,EAAE,MAAM,aAAa,OAAO,2BAA2B,QAAQ,KAAK;AAAA,gBACpE,EAAE,MAAM,aAAa,OAAO,WAAW,QAAQ,KAAK;AAAA,gBACpD,EAAE,MAAM,YAAY,OAAO,yBAAyB,QAAQ,KAAK;AAAA,cACnE;AAAA,cACA,OAAO;AAAA,cACP,WAAW;AAAA,YACb;AAAA,YACA,OAAO;AAAA,cACL;AAAA,gBACE,YAAY;AAAA,gBACZ,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,MAAM,EAAE,QAAQ,UAAU,WAAW,WAAW;AAAA,MAClD;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA,EAAE,QAAQ,QAAQ,UAAU,IAAK;AAAA,MACjC,EAAE,QAAQ,kBAAkB,SAAS,gBAAgB;AAAA,IACvD;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,WAAW,kBAAkB;AAAA,QACtC,UAAU;AAAA,QACV,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,UACL;AAAA,YACE,YAAY;AAAA,YACZ,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,WAAW;AAAA,cACX,WAAW;AAAA,cACX,aAAa;AAAA,cACb,SAAS;AAAA,cACT,aAAa;AAAA,cACb,YAAY;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,kBAAuC;AAAA,EAClD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,WAAW,aAAa,yBAAyB,MAAM,WAAW,UAAU,MAAM;AAAA,UAC1F,EAAE,MAAM,WAAW,aAAa,wBAAwB,MAAM,UAAU,UAAU,MAAM;AAAA,QAC1F;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AAAA,YACA,YAAY;AAAA,UACd;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,QAAQ,aAAa,eAAe,MAAM,QAAQ,UAAU,KAAK;AAAA,QAC3E;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,YACrC,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,iCAAiC,WAAW,KAAK;AAAA,cAC7E,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,YACN,OAAO,CAAC,gBAAgB,iBAAiB,sBAAsB;AAAA,UACjE;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,UACA,EAAE,QAAQ,SAAS,SAAS,eAAe,WAAW,KAAK;AAAA,QAC7D;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,QAAQ,aAAa,kBAAkB,MAAM,QAAQ,UAAU,KAAK;AAAA,QAC9E;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,YACrC,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,iCAAiC,WAAW,KAAK;AAAA,cAC7E,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,YACN,MAAM,CAAC,cAAc;AAAA,UACvB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,UACA,EAAE,QAAQ,SAAS,SAAS,iBAAiB,WAAW,KAAK;AAAA,QAC/D;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,QAAQ,aAAa,oBAAoB,MAAM,UAAU,UAAU,KAAK;AAAA,QAClF;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,YACrC,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,iCAAiC,WAAW,KAAK;AAAA,cAC7E,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,UACR;AAAA,UACA,EAAE,QAAQ,SAAS,SAAS,mBAAmB,WAAW,KAAK;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,eAAe,SAAwB,CAAC,GAAwB;AAC9E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACtnBO,IAAM,sBAAuD;AAAA,EAClE,sBAAsB;AAAA,IACpB,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,YAAY,EAAE,MAAM,SAAS;AAAA,MAC7B,YAAY,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,MAC3C,MAAM,EAAE,MAAM,SAAS;AAAA;AAAA,MACvB,MAAM,EAAE,MAAM,UAAU,SAAS,SAAS;AAAA;AAAA,MAC1C,WAAW,EAAE,MAAM,SAAS;AAAA,MAC5B,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,aAAa,EAAE,MAAM,SAAS;AAAA,MAC9B,OAAO,EAAE,MAAM,SAAS;AAAA;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,IAAM,6BAA6C;AAAA;AAAA,EAExD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,4BAA4B;AAAA,QACjD,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,uCAAuC,WAAW,KAAK;AAAA,UACnF,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,UACL,QAAQ;AAAA,YACN;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ,EAAE,QAAQ,eAAe,MAAM,gBAAgB,MAAM,YAAY;AAAA,gBACjE,EAAE,QAAQ,SAAS,SAAS,yBAAyB,WAAW,KAAK;AAAA,cACvE;AAAA,cACA,MAAM;AAAA,gBACJ,EAAE,QAAQ,eAAe,MAAM,gBAAgB,MAAM,YAAY;AAAA,gBACjE,EAAE,QAAQ,SAAS,SAAS,uBAAuB,WAAW,KAAK;AAAA,cACrE;AAAA,YACF;AAAA,UACF;AAAA,UACA,MAAM;AAAA,YACJ;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ,EAAE,QAAQ,SAAS,SAAS,kCAAkC,WAAW,KAAK;AAAA,cAChF;AAAA,cACA,MAAM;AAAA,gBACJ,EAAE,QAAQ,eAAe,MAAM,gBAAgB,MAAM,YAAY;AAAA,gBACjE,EAAE,QAAQ,SAAS,SAAS,uBAAuB,WAAW,KAAK;AAAA,cACrE;AAAA,YACF;AAAA,UACF;AAAA,UACA,MAAM;AAAA,YACJ;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ,EAAE,QAAQ,SAAS,SAAS,gCAAiC,WAAW,KAAK;AAAA,cAC/E;AAAA,cACA,MAAM;AAAA,gBACJ,EAAE,QAAQ,eAAe,MAAM,gBAAgB,MAAM,YAAY;AAAA,gBACjE,EAAE,QAAQ,SAAS,SAAS,yBAAyB,WAAW,KAAK;AAAA,cACvE;AAAA,YACF;AAAA,UACF;AAAA,UACA,QAAQ;AAAA;AAAA,YAEN;AAAA,cACE,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,OAAO,EAAE,UAAU,iBAAiB;AAAA,cACpC,IAAI;AAAA,YACN;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,MAAM,EAAE,QAAQ,eAAe,MAAM,gBAAgB,MAAM,kBAAkB;AAAA,YAC/E;AAAA,YACA,EAAE,QAAQ,eAAe,MAAM,gBAAgB,MAAM,YAAY;AAAA,YACjE,EAAE,QAAQ,SAAS,SAAS,6BAA6B,WAAW,KAAK;AAAA,UAC3E;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,cACL,aAAa;AAAA,cACb,OAAO;AAAA,cACP,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,aAAa;AAAA,QAC1B,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,UAAU,aAAa;AAAA,QAChC,IAAI;AAAA,MACN;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,QAAQ,eAAe,MAAM,gBAAgB,MAAM,kBAAkB;AAAA,MAC/E;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,QAAQ,eAAe,MAAM,gBAAgB,MAAM,UAAU;AAAA,MACvE;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,iBAAiB,MAAM,WAAW;AAAA,QACvD,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,kBAAkB,OAAO,8CAA8C;AAAA,YAC1F,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,eAAe,MAAM,cAAc,MAAM,sBAAsB;AAAA,YAC3E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,iBAAiB,MAAM,WAAW;AAAA,QACvD,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,kBAAkB,OAAO,8CAA8C;AAAA,YAC1F,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,eAAe,MAAM,cAAc,MAAM,sBAAsB;AAAA,YAC3E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,wBAA6C;AAAA,EACxD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,SAAS,aAAa,eAAe,MAAM,UAAU,UAAU,MAAM;AAAA,UAC7E,EAAE,MAAM,eAAe,aAAa,qBAAqB,MAAM,UAAU,UAAU,MAAM;AAAA,UACzF,EAAE,MAAM,QAAQ,aAAa,aAAa,MAAM,UAAU,UAAU,OAAO,SAAS;AAAA,YAClF,EAAE,MAAM,uBAAuB,OAAO,SAAS;AAAA,YAC/C,EAAE,MAAM,aAAa,OAAO,OAAO;AAAA,YACnC,EAAE,MAAM,aAAa,OAAO,OAAO;AAAA,YACnC,EAAE,MAAM,0BAA0B,OAAO,SAAS;AAAA,UACpD,EAAC;AAAA,QACH;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AAAA,YACA,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,MAAM;AAAA,cACN,MAAM;AAAA,cACN,YAAY;AAAA,YACd;AAAA,YACA,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,cAAc,aAAa,oBAAoB,MAAM,UAAU,UAAU,KAAK;AAAA,UACtF,EAAE,MAAM,QAAQ,aAAa,kBAAkB,MAAM,QAAQ,UAAU,KAAK;AAAA,UAC5E,EAAE,MAAM,SAAS,aAAa,gBAAgB,MAAM,UAAU,UAAU,MAAM;AAAA,UAC9E,EAAE,MAAM,SAAS,aAAa,gBAAgB,MAAM,UAAU,UAAU,MAAM;AAAA,UAC9E,EAAE,MAAM,SAAS,aAAa,gBAAgB,MAAM,UAAU,UAAU,OAAO,SAAS;AAAA,YACtF,EAAE,MAAM,kBAAkB,OAAO,UAAU;AAAA,YAC3C,EAAE,MAAM,oBAAoB,OAAO,YAAY;AAAA,YAC/C,EAAE,MAAM,mBAAmB,OAAO,UAAU;AAAA,YAC5C,EAAE,MAAM,gBAAgB,OAAO,SAAS;AAAA,UAC1C,EAAC;AAAA,QACH;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,YAAY,qBAAqB;AAAA,YAC1C,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,oBAAoB,WAAW,KAAK;AAAA,cAChE,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,SAAS;AAAA,cACT,OAAO;AAAA,cACP,OAAO;AAAA,cACP,OAAO;AAAA,YACT;AAAA,UACF;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,iBAAiB;AAAA,YACpC,IAAI;AAAA,UACN;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,YAAY;AAAA,UACd;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,SAAS,aAAa,eAAe,MAAM,UAAU,UAAU,MAAM;AAAA,UAC7E,EAAE,MAAM,eAAe,aAAa,qBAAqB,MAAM,UAAU,UAAU,MAAM;AAAA,UACzF,EAAE,MAAM,aAAa,aAAa,sCAAsC,MAAM,WAAW,UAAU,MAAM;AAAA,QAC3G;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AAAA,YACA,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,MAAM;AAAA,cACN,MAAM;AAAA,cACN,WAAW;AAAA,cACX,YAAY;AAAA,YACd;AAAA,YACA,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,cAAc,aAAa,oBAAoB,MAAM,UAAU,UAAU,KAAK;AAAA,UACtF,EAAE,MAAM,QAAQ,aAAa,kBAAkB,MAAM,QAAQ,UAAU,KAAK;AAAA,UAC5E,EAAE,MAAM,SAAS,aAAa,gBAAgB,MAAM,UAAU,UAAU,MAAM;AAAA,UAC9E,EAAE,MAAM,eAAe,aAAa,sBAAsB,MAAM,UAAU,UAAU,MAAM;AAAA,UAC1F,EAAE,MAAM,SAAS,aAAa,gBAAgB,MAAM,UAAU,UAAU,MAAM;AAAA,QAChF;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,YAAY,sBAAsB,MAAM,SAAS;AAAA,YAC1D,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,gCAAgC,WAAW,KAAK;AAAA,cAC5E,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,SAAS;AAAA,cACT,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AAAA,UACF;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,iBAAiB;AAAA,YACpC,IAAI;AAAA,UACN;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV;AAAA,oBACE,MAAM;AAAA,oBACN,WAAW;AAAA,oBACX,aAAa;AAAA,oBACb,YAAY;AAAA,oBACZ,YAAY;AAAA,oBACZ,SAAS;AAAA,kBACX;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,cAAc,aAAa,oBAAoB,MAAM,UAAU,UAAU,KAAK;AAAA,QACxF;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,YAAY,qBAAqB;AAAA,YAC1C,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,oBAAoB,WAAW,KAAK;AAAA,cAChE,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,iBAAiB;AAAA,UACtC;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,IAAI,iBAAiB;AAAA,UAChC;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,SAA8B,CAAC,GAAwB;AAC1F,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACpgBO,IAAM,iBAAkD;AAAA,EAC7D,QAAQ;AAAA,IACN,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,SAAS,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACvC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,IAAI,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,MACjC,OAAO,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,MACpC,gBAAgB,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,MAC7C,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAEO,IAAM,wBAAwC;AAAA,EACnD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,QACA,IAAI;AAAA,MACN;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,SAAS;AAAA,cACT,UAAU;AAAA,cACV,IAAI;AAAA,cACJ,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,YAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,gBAAgB,GAAG,YAAY,KAAK,CAAC;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,YACZ;AAAA,YACA,MAAM;AAAA,cACJ,IAAI;AAAA,cACJ,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,YAAY;AAAA,YACd;AAAA,UACF;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA;AAAA,cAEJ;AAAA,gBACE,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,MAAM;AAAA,kBACJ;AAAA,oBACE,QAAQ;AAAA,oBACR,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ;AAAA,wBACE,QAAQ;AAAA,wBACR,SAAS;AAAA,wBACT,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,aAAa;AAAA,0BACb,OAAO;AAAA,0BACP,WAAW;AAAA,wBACb;AAAA,sBACF;AAAA,oBACF;AAAA,oBACA,MAAM;AAAA,sBACJ;AAAA,wBACE,QAAQ;AAAA,wBACR,SAAS;AAAA,wBACT,SAAS;AAAA,sBACX;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA;AAAA,cAEA;AAAA,gBACE,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,MAAM;AAAA;AAAA,kBAEJ;AAAA,oBACE,QAAQ;AAAA,oBACR,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ;AAAA,wBACE,QAAQ;AAAA,wBACR,MAAM;AAAA,wBACN,MAAM;AAAA,sBACR;AAAA,oBACF;AAAA,kBACF;AAAA,kBACA;AAAA,oBACE,QAAQ;AAAA,oBACR,MAAM;AAAA,oBACN,MAAM;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,mBAAwC;AAAA,EACnD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,iBAAiB,MAAM,QAAQ,UAAU,MAAM;AAAA,IAC9E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,QACA,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,QACA,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO;AAAA,cACL,UAAU;AAAA,YACZ;AAAA,YACA,UAAU;AAAA,YACV,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,SAAS;AAAA,kBACP,MAAM;AAAA,kBACN,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,IAAI;AAAA,kBACJ,UAAU;AAAA,kBACV,MAAM;AAAA,kBACN,eAAe;AAAA,gBACjB;AAAA,gBACA,IAAI;AAAA,cACN;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,OAAO;AAAA,kBACL;AAAA,oBACE,YAAY;AAAA,oBACZ,MAAM;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,YACA,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,QAAQ;AAAA,oBACN,EAAE,MAAM,QAAQ,OAAO,YAAY,QAAQ,KAAK;AAAA,oBAChD,EAAE,MAAM,SAAS,OAAO,wBAAwB,QAAQ,KAAK;AAAA,oBAC7D,EAAE,MAAM,MAAM,OAAO,uCAAuC,QAAQ,KAAK;AAAA,oBACzE,EAAE,MAAM,YAAY,OAAO,iCAAiC,QAAQ,KAAK;AAAA,kBAC3E;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,eAAe,MAAM,WAAW,UAAU,MAAM;AAAA,IAC/E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,UACL,UAAU;AAAA,QACZ;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,kBAAkB,MAAM,QAAQ,UAAU,KAAK;AAAA,MAC5E,EAAE,MAAM,MAAM,aAAa,aAAa,MAAM,WAAW,UAAU,KAAK;AAAA,IAC1E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,QACA,MAAM;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,kBAAkB,MAAM,QAAQ,UAAU,KAAK;AAAA,MAC5E,EAAE,MAAM,SAAS,aAAa,SAAS,MAAM,WAAW,UAAU,KAAK;AAAA,IACzE;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,QACA,MAAM;AAAA,UACJ,OAAO;AAAA,UACP,IAAI;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,2BAA4D;AAAA,EACvE,WAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,QAAQ;AAAA;AAAA,MAEN;AAAA,QACE,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,SAAyB,CAAC,GAAwB;AAChF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,MACN,YAAY;AAAA,IACd;AAAA,EACF;AACF;;;AC/gBO,IAAM,cAA+C;AAAA,EAC1D,iBAAiB;AAAA,IACf,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,SAAS,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACvC,MAAM,EAAE,MAAM,SAAS;AAAA,MACvB,QAAQ,EAAE,MAAM,OAAO;AAAA,MACvB,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAEO,IAAM,gBAAqC;AAAA,EAChD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,SAAS,aAAa,4BAA4B,MAAM,UAAU,UAAU,KAAK;AAAA,IAC3F;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,mCAAmC,WAAW,KAAK;AAAA,UAC/E,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,uCAAuC,WAAW,KAAK;AAAA,UACnF,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,OAAO,qCAAqC,QAAQ,KAAK;AAAA,YAC7E,EAAE,MAAM,gBAAgB,OAAO,WAAW,QAAQ,KAAK;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,eAAe,MAAM,WAAW,UAAU,MAAM;AAAA,IAC/E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,uBAAuB,WAAW,KAAK;AAAA,UACnE,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,uBAAuB,WAAW,KAAK;AAAA,UACnE,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,OAAO,gGAAgG;AAAA,YAC3H,EAAE,MAAM,gBAAgB,OAAO,iCAAiC,QAAQ,KAAK;AAAA,YAC7E,EAAE,MAAM,UAAU,OAAO,oBAAoB,QAAQ,KAAK;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,SAAS,aAAa,wBAAwB,MAAM,WAAW,UAAU,KAAK;AAAA,IACxF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,qCAAqC,WAAW,KAAK;AAAA,UACjF,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,aAAa,MAAM,UAAU,UAAU,MAAM,SAAS;AAAA,QACjF,EAAE,MAAM,OAAO,OAAO,MAAM;AAAA,QAC5B,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,QAChC,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,MAClC,EAAC;AAAA,IACH;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,YAAY,aAAa,6BAA6B,MAAM,UAAU,UAAU,KAAK;AAAA,IAC/F;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,wBAAwB,WAAW,KAAK;AAAA,UACpE,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,UAAU,aAAa,mBAAmB,MAAM,UAAU,UAAU,MAAM,SAAS;AAAA,QACzF,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,QAC9B,EAAE,MAAM,cAAc,OAAO,YAAY;AAAA,QACzC,EAAE,MAAM,aAAa,OAAO,YAAY;AAAA,QACxC,EAAE,MAAM,aAAa,OAAO,YAAY;AAAA,QACxC,EAAE,MAAM,MAAM,OAAO,KAAK;AAAA,QAC1B,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,QACpC,EAAE,MAAM,WAAW,OAAO,UAAU;AAAA,MACtC,EAAC;AAAA,IACH;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,yBAAyB,WAAW,KAAK;AAAA,UACrE,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,qBAAqC;AAAA;AAAA,EAEhD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,OAAO,qCAAqC,QAAQ,KAAK;AAAA,YAC7E,EAAE,MAAM,gBAAgB,OAAO,yBAAyB,QAAQ,KAAK;AAAA,UACvE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP,EAAE,QAAQ,QAAQ,UAAU,IAAM;AAAA,MAClC;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,cAAc;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,aAAa,SAAsB,CAAC,GAAwB;AAC1E,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACtZO,IAAM,kBAAmD;AAAA,EAC9D,oBAAoB;AAAA,IAClB,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,mBAAmB,EAAE,MAAM,SAAS;AAAA,MACpC,mBAAmB,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,MAClD,sBAAsB,EAAE,MAAM,SAAS;AAAA,MACvC,WAAW,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACzC,YAAY,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,MACzC,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,YAAY,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MAC1C,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAEO,IAAM,yBAAyC;AAAA;AAAA,EAEpD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,iBAAiB,SAAS,aAAa;AAAA,QAC5D,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,QAC5C,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,YAC5C,MAAM,EAAE,YAAY,eAAe;AAAA,UACrC;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAAA,QACA,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA;AAAA,cAEJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,cACT;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,SAAS;AAAA,gBACT,OAAO;AAAA,kBACL,QAAQ;AAAA,oBACN,MAAM;AAAA,oBACN,UAAU;AAAA,kBACZ;AAAA,kBACA,aAAa;AAAA,kBACb,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,QAAQ;AAAA,oBACN,MAAM;AAAA,kBACR;AAAA,gBACF;AAAA,gBACA,IAAI;AAAA,cACN;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,MAAM;AAAA,kBACJ,UAAU;AAAA,kBACV,mBAAmB;AAAA,kBACnB,mBAAmB;AAAA,kBACnB,sBAAsB;AAAA,kBACtB,WAAW;AAAA,kBACX,YAAY;AAAA,kBACZ,YAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,iBAAiB,SAAS,aAAa;AAAA,MAC9D;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,QAC5C,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA;AAAA,cAEJ;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,SAAS;AAAA,cACX;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,cAC9C;AAAA,YACF;AAAA,YACA,MAAM;AAAA;AAAA,cAEJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,cACT;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,cACT;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,gBAC5C,MAAM,EAAE,YAAY,eAAe;AAAA,cACrC;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,SAAS;AAAA,gBACT,SAAS;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,oBAAyC;AAAA,EACpD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,WAAW,aAAa,qBAAqB,MAAM,WAAW,UAAU,KAAK;AAAA,UACrF,EAAE,MAAM,aAAa,aAAa,0BAA0B,MAAM,WAAW,UAAU,MAAM;AAAA,UAC7F,EAAE,MAAM,SAAS,aAAa,cAAc,MAAM,UAAU,UAAU,MAAM;AAAA,QAC9E;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,cAAc;AAAA,YACjC,UAAU;AAAA,YACV,OAAO;AAAA,YACP,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,cAAc;AAAA,YACjC,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,cACL,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,EAAE,MAAM,0BAA0B,OAAO,yBAAyB,QAAQ,KAAK;AAAA,gBAC/E,EAAE,MAAM,eAAe,OAAO,iBAAiB,QAAQ,KAAK;AAAA,gBAC5D,EAAE,MAAM,wBAAwB,OAAO,6HAA6H;AAAA,cACtK;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,cAAc;AAAA,YACjC,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,4BAA4B,WAAW,KAAK;AAAA,cACxE,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,SAA0B,CAAC,GAAwB;AAClF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACzZO,IAAM,cAA+C;AAAA,EAC1D,OAAO;AAAA,IACL,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,YAAY,EAAE,MAAM,SAAS;AAAA,MAC7B,YAAY,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,MAC3C,YAAY,EAAE,MAAM,SAAS;AAAA,MAC7B,UAAU,EAAE,MAAM,SAAS;AAAA,MAC3B,SAAS,EAAE,MAAM,OAAO;AAAA,MACxB,iBAAiB,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACnD,WAAW,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C,SAAS,EAAE,MAAM,YAAY;AAAA,MAC7B,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACzC,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,SAAS,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACvC,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,cAAc,EAAE,MAAM,SAAS;AAAA,MAC/B,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAEO,IAAM,qBAAqC;AAAA;AAAA,EAEhD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,YAAY;AAAA,QACzB,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,wBAAwB,WAAW,KAAK;AAAA,UACpE,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,SAAS,aAAa,SAAS,aAAa;AAAA,QACrD,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,SAAS,aAAa,SAAS,aAAa;AAAA,YACrD,MAAM,EAAE,cAAc,iBAAiB;AAAA,UACzC;AAAA,UACA,EAAE,QAAQ,SAAS,SAAS,iBAAiB,WAAW,KAAK;AAAA,QAC/D;AAAA,QACA,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,SAAS;AAAA,cACT,SAAS;AAAA,cACT,cAAc;AAAA,cACd,YAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,EAAE,QAAQ,SAAS,SAAS,kBAAkB,WAAW,KAAK;AAAA,QAChE;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,SAAS,YAAY;AAAA,QAC9B,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ,EAAE,MAAM,iFAAiF;AAAA,QACnG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,OAAO,MAAM;AAAA,QACtB,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,QAAQ,QAAQ,OAAO,YAAY,MAAM,EAAE,QAAQ,aAAa,EAAE;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,uBAAuB;AAAA,QACpC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,SAAS,uBAAuB;AAAA,QACzC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,uBAAuB;AAAA,QACpC,MAAM,EAAE,OAAO,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ,EAAE,MAAM,aAAa;AAAA,QAC/B;AAAA,QACA,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,gBAAqC;AAAA,EAChD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,YAAY,aAAa,iBAAiB,MAAM,UAAU,UAAU,KAAK;AAAA,MACjF,EAAE,MAAM,WAAW,aAAa,0BAA0B,MAAM,UAAU,UAAU,KAAK;AAAA,MACzF,EAAE,MAAM,YAAY,aAAa,gCAAgC,MAAM,UAAU,UAAU,MAAM;AAAA,MACjG,EAAE,MAAM,YAAY,aAAa,0BAA0B,MAAM,WAAW,UAAU,MAAM;AAAA,IAC9F;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,gCAAgC,WAAW,KAAK;AAAA,UAC5E,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,8DAA8D,WAAW,KAAK;AAAA,UAC1G,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ,EAAE,MAAM,+DAA+D;AAAA,QACjF;AAAA,QACA,YAAY;AAAA,QACZ,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,QACA,IAAI;AAAA,MACN;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,cAAc,aAAa,mBAAmB,MAAM,UAAU,UAAU,KAAK;AAAA,IACvF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,qBAAqB;AAAA,QAC1C,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,mBAAmB,WAAW,KAAK;AAAA,UAC/D,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,oCAAoC,WAAW,KAAK;AAAA,UAChF,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,QAAQ,gBAAgB;AAAA,MAClC;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,aAAa,SAAsB,CAAC,GAAwB;AAC1E,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACjYO,IAAM,kBAAmD;AAAA,EAC9D,WAAW;AAAA,IACT,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,YAAY,EAAE,MAAM,SAAS;AAAA,MAC7B,YAAY,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,MAC3C,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,eAAe,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,MAC5C,SAAS,EAAE,MAAM,aAAa,OAAO,KAAK;AAAA,MAC1C,OAAO,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACzC,cAAc,EAAE,MAAM,SAAS;AAAA,MAC/B,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,aAAa,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MAC3C,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAEO,IAAM,yBAAyC;AAAA;AAAA,EAEpD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,gBAAgB;AAAA,QAC7B,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,4BAA4B,WAAW,KAAK;AAAA,UACxE,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,+DAA+D,WAAW,KAAK;AAAA,UAC3G,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,aAAa,iBAAiB,SAAS,aAAa;AAAA,QAC7D,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,aAAa,iBAAiB,SAAS,aAAa;AAAA,UAC/D;AAAA,UACA,EAAE,QAAQ,SAAS,SAAS,+BAA+B,WAAW,KAAK;AAAA,QAC7E;AAAA,QACA,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,aAAa;AAAA,cACb,SAAS;AAAA,cACT,YAAY;AAAA,YACd;AAAA,UACF;AAAA,UACA,EAAE,QAAQ,SAAS,SAAS,kCAAkC,WAAW,KAAK;AAAA,QAChF;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,aAAa,gBAAgB;AAAA,QACtC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ,EAAE,MAAM,wBAAwB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,OAAO,MAAM;AAAA,QACtB,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,QAAQ,QAAQ,OAAO,gBAAgB,MAAM,EAAE,YAAY,aAAa,EAAE;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,2BAA2B;AAAA,QACxC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,aAAa,2BAA2B;AAAA,QACjD,IAAI;AAAA,MACN;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,2BAA2B;AAAA,QACxC,MAAM,EAAE,OAAO,KAAK;AAAA,MACtB;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AAAA,YACA,YAAY,CAAC;AAAA,UACf;AAAA,QACF;AAAA,QACA,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AAAA,YACA,YAAY,CAAC;AAAA,UACf;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,oBAAyC;AAAA,EACpD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,SAAS,aAAa,sBAAsB,MAAM,UAAU,UAAU,KAAK;AAAA,UACnF,EAAE,MAAM,YAAY,aAAa,+BAA+B,MAAM,UAAU,UAAU,KAAK;AAAA,UAC/F,EAAE,MAAM,WAAW,aAAa,qBAAqB,MAAM,WAAW,UAAU,MAAM;AAAA,UACtF,EAAE,MAAM,gBAAgB,aAAa,0BAA0B,MAAM,QAAQ,UAAU,MAAM;AAAA,QAC/F;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AAAA,YACA,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV;AAAA,oBACE,MAAM;AAAA,oBACN,OAAO;AAAA,oBACP,OAAO;AAAA,oBACP,OAAO;AAAA,oBACP,WAAW;AAAA,kBACb;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,YACA,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,OAAO;AAAA,cACP,eAAe;AAAA,cACf,SAAS;AAAA,cACT,cAAc;AAAA,cACd,YAAY;AAAA,YACd;AAAA,YACA,IAAI;AAAA,UACN;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,cACP,QAAQ,EAAE,MAAM,qBAAqB;AAAA,YACvC;AAAA,YACA,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV;AAAA,oBACE,MAAM;AAAA,oBACN,OAAO;AAAA,oBACP,OAAO;AAAA,oBACP,OAAO;AAAA,oBACP,WAAW;AAAA,kBACb;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,cAAc,aAAa,uBAAuB,MAAM,UAAU,UAAU,KAAK;AAAA,QAC3F;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,YAAY,qBAAqB;AAAA,YAC1C,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,uBAAuB,WAAW,KAAK;AAAA,cACnE,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM,EAAE,YAAY,oBAAoB;AAAA,UAC1C;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,cAAc,aAAa,uBAAuB,MAAM,UAAU,UAAU,KAAK;AAAA,UACzF,EAAE,MAAM,WAAW,aAAa,yBAAyB,MAAM,WAAW,UAAU,MAAM;AAAA,QAC5F;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,YAAY,qBAAqB;AAAA,YAC1C,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,oCAAoC,WAAW,KAAK;AAAA,cAChF,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,aAAa,oBAAoB;AAAA,YAC1C,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,+BAA+B,WAAW,KAAK;AAAA,cAC3E,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,SAA0B,CAAC,GAAwB;AAClF,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AC9ZO,IAAM,sBAAuD;AAAA,EAClE,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,cAAc,EAAE,MAAM,UAAU,SAAS,WAAW;AAAA;AAAA,MACpD,UAAU,EAAE,MAAM,SAAS;AAAA,MAC3B,eAAe,EAAE,MAAM,UAAU,SAAS,UAAU;AAAA;AAAA,MACpD,YAAY,EAAE,MAAM,OAAO;AAAA,MAC3B,UAAU,EAAE,MAAM,SAAS;AAAA,MAC3B,QAAQ,EAAE,MAAM,UAAU,SAAS,IAAI;AAAA;AAAA,MACvC,UAAU,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA;AAAA,MACvC,aAAa,EAAE,MAAM,WAAW,SAAS,KAAK;AAAA,MAC9C,gBAAgB,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAClD,aAAa,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC/C,kBAAkB,EAAE,MAAM,OAAO;AAAA,MACjC,kBAAkB,EAAE,MAAM,OAAO;AAAA,MACjC,eAAe,EAAE,MAAM,OAAO;AAAA,MAC9B,eAAe,EAAE,MAAM,OAAO;AAAA,MAC9B,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AAAA,EACA,yBAAyB;AAAA,IACvB,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,aAAa,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MAC3C,UAAU,EAAE,MAAM,SAAS;AAAA,MAC3B,gBAAgB,EAAE,MAAM,YAAY;AAAA,IACtC;AAAA,EACF;AACF;AAEO,IAAM,6BAA6C;AAAA,EACxD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,UAAU,cAAc;AAAA,QACjC,IAAI;AAAA,MACN;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,MAAM;AAAA;AAAA,YAEJ;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,YAC5B;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,YAC5B;AAAA;AAAA,YAEA;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,YAC5B;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,YAC5B;AAAA;AAAA,YAEA;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ;AAAA,kBACE,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,OAAO,EAAE,aAAa,cAAc,UAAU,cAAc;AAAA,kBAC5D,IAAI;AAAA,gBACN;AAAA,gBACA;AAAA,kBACE,QAAQ;AAAA,kBACR,WAAW;AAAA,kBACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,gBAC5B;AAAA,cACF;AAAA,YACF;AAAA;AAAA,YAEA;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,YAC5B;AAAA;AAAA,YAEA;AAAA,cACE,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,SAAS;AAAA,kBACP;AAAA,oBACE,QAAQ;AAAA,oBACR,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ,EAAE,QAAQ,WAAW,MAAM,cAAc,SAAS,mBAAmB;AAAA,oBACvE;AAAA,oBACA,MAAM;AAAA,sBACJ,EAAE,QAAQ,gBAAgB,SAAS,iBAAiB,SAAS,mBAAmB;AAAA,oBAClF;AAAA,kBACF;AAAA,gBACF;AAAA,gBACA,OAAO;AAAA,kBACL;AAAA,oBACE,QAAQ;AAAA,oBACR,WAAW;AAAA,oBACX,MAAM;AAAA,sBACJ,EAAE,QAAQ,WAAW,MAAM,cAAc,OAAO,qBAAqB;AAAA,oBACvE;AAAA,oBACA,MAAM;AAAA,sBACJ,EAAE,QAAQ,gBAAgB,SAAS,iBAAiB,OAAO,qBAAqB;AAAA,oBAClF;AAAA,kBACF;AAAA,gBACF;AAAA,gBACA,UAAU;AAAA,kBACR,EAAE,QAAQ,gBAAgB,SAAS,iBAAiB,SAAS,iBAAiB,OAAO,mBAAmB;AAAA,gBAC1G;AAAA,cACF;AAAA,YACF;AAAA;AAAA,YAEA;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ,EAAE,QAAQ,kBAAkB,SAAS,iBAAiB,SAAS,gBAAgB;AAAA,cACjF;AAAA,YACF;AAAA;AAAA,YAEA;AAAA,cACE,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,MAAM;AAAA,gBACJ;AAAA,kBACE,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,OAAO,EAAE,aAAa,cAAc,UAAU,cAAc;AAAA,kBAC5D,MAAM,EAAE,gBAAgB,WAAW;AAAA,kBACnC,QAAQ;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,wBAA6C;AAAA,EACxD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,WAAW,aAAa,gBAAgB,MAAM,UAAU,UAAU,KAAK;AAAA,UAC/E,EAAE,MAAM,YAAY,aAAa,iBAAiB,MAAM,UAAU,UAAU,KAAK;AAAA,UACjF,EAAE,MAAM,QAAQ,aAAa,cAAc,MAAM,UAAU,UAAU,OAAO,SAAS;AAAA,YACnF,EAAE,MAAM,YAAY,OAAO,WAAW;AAAA,YACtC,EAAE,MAAM,eAAe,OAAO,QAAQ;AAAA,YACtC,EAAE,MAAM,eAAe,OAAO,aAAa;AAAA,YAC3C,EAAE,MAAM,aAAa,OAAO,WAAW;AAAA,YACvC,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,UAClC,EAAC;AAAA,UACD,EAAE,MAAM,UAAU,aAAa,2BAA2B,MAAM,WAAW,UAAU,MAAM;AAAA,QAC7F;AAAA,QACA,SAAS;AAAA;AAAA,UAEP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,cAAc;AAAA,YACjC,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,6BAA6B,WAAW,KAAK;AAAA,cACzE,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,SAAS;AAAA,cACT,cAAc;AAAA,cACd,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YACA,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,cAAc;AAAA,YACjC,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,iCAAiC,WAAW,KAAK;AAAA,cAC7E,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,cACP,QAAQ,EAAE,MAAM,gCAAgC;AAAA,YAClD;AAAA,YACA,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,MAAM,aAAa,cAAc,MAAM,WAAW,UAAU,KAAK;AAAA,QAC3E;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,IAAI,cAAc,UAAU,cAAc;AAAA,YACnD,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,sBAAsB,WAAW,KAAK;AAAA,cAClE,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,IAAI,aAAa;AAAA,UAC5B;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,aAAa,aAAa;AAAA,UACrC;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,MAAM,aAAa,cAAc,MAAM,WAAW,UAAU,KAAK;AAAA,UACzE,EAAE,MAAM,WAAW,aAAa,eAAe,MAAM,UAAU,UAAU,MAAM;AAAA,UAC/E,EAAE,MAAM,YAAY,aAAa,gBAAgB,MAAM,UAAU,UAAU,MAAM;AAAA,UACjF,EAAE,MAAM,YAAY,aAAa,uBAAuB,MAAM,WAAW,UAAU,MAAM;AAAA,UACzF,EAAE,MAAM,UAAU,aAAa,2BAA2B,MAAM,WAAW,UAAU,MAAM;AAAA,QAC7F;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,IAAI,cAAc,UAAU,cAAc;AAAA,YACnD,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,sBAAsB,WAAW,KAAK;AAAA,cAClE,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,IAAI,aAAa;AAAA,YAC1B,MAAM;AAAA,UACR;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,SAA8B,CAAC,GAAwB;AAC1F,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AC1VO,IAAM,YAA6C;AAAA,EACxD,WAAW;AAAA,IACT,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,SAAS,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACvC,QAAQ,EAAE,MAAM,SAAS;AAAA,MACzB,QAAQ,EAAE,MAAM,YAAY;AAAA,IAC9B;AAAA,EACF;AACF;AAEO,IAAM,mBAAmC;AAAA;AAAA,EAE9C;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,UAAU,eAAe,SAAS,aAAa;AAAA,QACxD,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,eAAe,SAAS,aAAa;AAAA,UAC1D;AAAA;AAAA,UAEA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,UAAU;AAAA,cACZ;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,UAAU;AAAA,UACZ;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,UAAU,cAAc;AAAA,QACjC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,UAAU;AAAA,UACZ;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,cAAmC;AAAA,EAC9C;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,UAAU,aAAa,cAAc,MAAM,UAAU,UAAU,MAAM;AAAA,IAC/E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,UAAU,eAAe,SAAS,aAAa;AAAA,QACxD,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,eAAe,SAAS,aAAa;AAAA,YACxD,MAAM,EAAE,QAAQ,aAAa,QAAQ,WAAW;AAAA,UAClD;AAAA,QACF;AAAA,QACA,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,MAAM;AAAA,cACJ,UAAU;AAAA,cACV,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,WAAW,SAAoB,CAAC,GAAwB;AACtE,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AC3LO,IAAM,kBAAmD;AAAA,EAC9D,WAAW;AAAA,IACT,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,YAAY,EAAE,MAAM,SAAS;AAAA,MAC7B,SAAS,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACvC,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,WAAW,EAAE,MAAM,aAAa,OAAO,KAAK;AAAA,MAC5C,IAAI,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MACtC,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAEO,IAAM,yBAAyC;AAAA;AAAA,EAEpD;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,CAAC;AAAA,QACR,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,EAAE,QAAQ,QAAQ,OAAO,gBAAgB,MAAM,EAAE,UAAU,UAAU,EAAE;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,iBAAiB;AAAA,MAChC;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,OAAO;AAAA,cACL,OAAO;AAAA,cACP,aAAa;AAAA,cACb,OAAO;AAAA,cACP,QAAQ,EAAE,MAAM,6CAA6C;AAAA,YAC/D;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,oBAAyC;AAAA,EACpD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,sCAAsC,MAAM,UAAU,UAAU,KAAK;AAAA,MAClG,EAAE,MAAM,WAAW,aAAa,oBAAoB,MAAM,UAAU,UAAU,KAAK;AAAA,MACnF,EAAE,MAAM,MAAM,aAAa,wBAAwB,MAAM,WAAW,UAAU,MAAM;AAAA,IACtF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,SAAS,aAAa;AAAA,QAC/B,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,mDAAmD,WAAW,KAAK;AAAA,UAC/F,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,SAAS;AAAA,UACT,WAAW;AAAA,UACX,IAAI;AAAA,UACJ,YAAY;AAAA,QACd;AAAA,QACA,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ,EAAE,MAAM,qBAAqB;AAAA,QACvC;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,SAAS,aAAa;AAAA,QAC/B,UAAU;AAAA,QACV,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,0BAA0B,WAAW,KAAK;AAAA,UACtE,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,UACP,QAAQ,EAAE,MAAM,kCAAkC;AAAA,QACpD;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,MAAM,aAAa,eAAe,MAAM,WAAW,UAAU,KAAK;AAAA,IAC5E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,cAAc,SAAS,aAAa;AAAA,QACjD,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,oCAAoC,WAAW,KAAK;AAAA,UAChF,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,IAAI,aAAa;AAAA,MAC5B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,SAA0B,CAAC,GAAwB;AAClF,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AChOO,IAAM,oBAAyC;AAAA,EACpD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,SAAS,OAAO,wBAAwB,QAAQ,KAAK;AAAA,YAC7D,EAAE,MAAM,WAAW,OAAO,uCAAuC,QAAQ,KAAK;AAAA,YAC9E,EAAE,MAAM,WAAW,OAAO,yBAAyB,QAAQ,KAAK;AAAA,YAChE,EAAE,MAAM,YAAY,OAAO,0BAA0B,QAAQ,KAAK;AAAA,YAClE,EAAE,MAAM,SAAS,OAAO,uBAAuB,QAAQ,KAAK;AAAA,YAC5D,EAAE,MAAM,UAAU,OAAO,wBAAwB,QAAQ,KAAK;AAAA,YAC9D,EAAE,MAAM,eAAe,OAAO,iBAAiB,QAAQ,KAAK;AAAA,YAC5D,EAAE,MAAM,UAAU,OAAO,6BAA6B,QAAQ,KAAK;AAAA,YACnE,EAAE,MAAM,gBAAgB,OAAO,wBAAwB,QAAQ,KAAK;AAAA,UACtE;AAAA,UACA,QAAQ,EAAE,MAAM,kBAAkB;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,gBAAgB,MAAM,QAAQ,UAAU,MAAM;AAAA,IAC7E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,YAAY,OAAO,0BAA0B,QAAQ,KAAK;AAAA,YAClE,EAAE,MAAM,YAAY,OAAO,sCAAsC,QAAQ,KAAK;AAAA,YAC9E,EAAE,MAAM,OAAO,OAAO,oCAAoC,QAAQ,KAAK;AAAA,YACvE,EAAE,MAAM,WAAW,OAAO,4CAA4C,QAAQ,KAAK;AAAA,YACnF,EAAE,MAAM,UAAU,OAAO,6CAA6C,QAAQ,KAAK;AAAA,YACnF,EAAE,MAAM,gBAAgB,OAAO,0CAA0C,QAAQ,KAAK;AAAA,YACtF,EAAE,MAAM,SAAS,OAAO,YAAY,QAAQ,MAAM;AAAA,UACpD;AAAA,UACA,QAAQ,EAAE,MAAM,uBAAuB;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,gBAAgB,MAAM,QAAQ,UAAU,MAAM;AAAA,IAC7E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,gBAAgB,MAAM,QAAQ,UAAU,MAAM;AAAA,IAC7E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,EAAE,QAAQ,SAAS,SAAS,4BAA4B,WAAW,KAAK;AAAA,UACxE,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,QAAQ,aAAa,gBAAgB,MAAM,QAAQ,UAAU,KAAK;AAAA,IAC5E;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,SAAS,OAAO,yBAAyB,QAAQ,KAAK;AAAA,YAC9D,EAAE,MAAM,YAAY,OAAO,yBAAyB,QAAQ,KAAK;AAAA,YACjE,EAAE,MAAM,WAAW,OAAO,6BAA6B,QAAQ,KAAK;AAAA,YACpE,EAAE,MAAM,WAAW,OAAO,qCAAqC,QAAQ,KAAK;AAAA,YAC5E,EAAE,MAAM,eAAe,OAAO,2CAA2C,QAAQ,KAAK;AAAA,YACtF,EAAE,MAAM,WAAW,OAAO,uCAAuC,QAAQ,KAAK;AAAA,YAC9E,EAAE,MAAM,WAAW,OAAO,0CAA0C,QAAQ,KAAK;AAAA,UACnF;AAAA,UACA,QAAQ,EAAE,MAAM,sBAAsB;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP,EAAE,MAAM,WAAW,aAAa,mBAAmB,MAAM,WAAW,UAAU,MAAM;AAAA,IACtF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,QAAQ,OAAO,yBAAyB,QAAQ,KAAK;AAAA,YAC7D,EAAE,MAAM,YAAY,OAAO,2CAA2C,QAAQ,KAAK;AAAA,YACnF,EAAE,MAAM,YAAY,OAAO,6BAA6B,QAAQ,KAAK;AAAA,YACrE,EAAE,MAAM,QAAQ,OAAO,wCAAwC,QAAQ,KAAK;AAAA,YAC5E,EAAE,MAAM,WAAW,OAAO,8CAA8C,QAAQ,KAAK;AAAA,YACrF,EAAE,MAAM,SAAS,OAAO,oCAAoC,QAAQ,MAAM;AAAA,UAC5E;AAAA,UACA,QAAQ,EAAE,MAAM,0BAA0B;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,QACT;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,SAAS,OAAO,yBAAyB,QAAQ,KAAK;AAAA,YAC9D,EAAE,MAAM,UAAU,OAAO,aAAa,QAAQ,KAAK;AAAA,YACnD,EAAE,MAAM,QAAQ,OAAO,WAAW,QAAQ,KAAK;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,YACN,EAAE,MAAM,gEAAgE,OAAO,4BAA4B;AAAA,YAC3G,EAAE,MAAM,iEAAiE,OAAO,8BAA8B;AAAA,UAChH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa;AAAA,UACb,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,SAA0B,CAAC,GAAwB;AAClF,SAAO;AAAA,IACL,UAAU;AAAA,EACZ;AACF;","names":[]}
|