{ "version": 3, "sources": ["../../../../server/chat-plugins/blackjack.ts"], "sourcesContent": ["/**\r\n * Blackjack Game\r\n * Pokemon Showdown - http://pokemonshowdown.com/\r\n *\r\n * This allows users to play the classic blackjack card game.\r\n * Credits: jd, panpawn\r\n *\r\n * @license MIT license\r\n */\r\nimport {Utils} from '../../lib';\r\n\r\ntype Deck =\r\n\t'A\u2665' | 'A\u2666' | 'A\u2663' | 'A\u2660' | '2\u2665' | '2\u2666' | '2\u2663' | '2\u2660' | '3\u2665' | '3\u2666' | '3\u2663' | '3\u2660' | '4\u2665' | '4\u2666' | '4\u2663' |\r\n\t'4\u2660' | '5\u2665' | '5\u2666' | '5\u2663' | '5\u2660' | '6\u2665' | '6\u2666' | '6\u2663' | '6\u2660' | '7\u2665' | '7\u2666' | '7\u2663' | '7\u2660' | '8\u2665' | '8\u2666' |\r\n\t'8\u2663' | '8\u2660' | '9\u2665' | '9\u2666' | '9\u2663' | '9\u2660' | '10\u2665' | '10\u2666' | '10\u2663' | '10\u2660' | 'J\u2665' | 'J\u2666' | 'J\u2663' | 'J\u2660' |\r\n\t'Q\u2665' | 'Q\u2666' | 'Q\u2663' | 'Q\u2660' | 'K\u2665' | 'K\u2666' | 'K\u2663' | 'K\u2660';\r\ntype Symbols = '\u2665' | '\u2666' | '\u2663' | '\u2660';\r\ntype SymbolName = 'Hearts' | 'Diamonds' | 'Clubs' | 'Spades';\r\n\r\nexport class Blackjack extends Rooms.RoomGame {\r\n\troom: Room;\r\n\r\n\troomID: RoomID;\r\n\r\n\tautostart: NodeJS.Timer | null;\r\n\tdqTimer: NodeJS.Timer | null;\r\n\ttimerTick: NodeJS.Timer | null;\r\n\r\n\tcardHeight: number;\r\n\tcardWidth: number;\r\n\tminimumPlayers: number;\r\n\tplayerScrollWheel: number;\r\n\tturnTimeoutMinutes: number;\r\n\ttimerTickSeconds: number;\r\n\r\n\tbutton: string;\r\n\tcreatedBy: string;\r\n\tcurUsername: string;\r\n\tendedBy: string;\r\n\tinfoboxLimited: string;\r\n\tlastMessage: string;\r\n\tslideButton: string;\r\n\tspectateButton: string;\r\n\tstartedBy: string;\r\n\tstate: string;\r\n\tturnLog: string;\r\n\tuhtmlChange: string;\r\n\r\n\tspectators: {[k: string]: ID};\r\n\tsymbols: {[k in Symbols]: SymbolName};\r\n\r\n\tdealer: BlackjackDealer;\r\n\tdeck: Deck[];\r\n\tgameNumber: number;\r\n\r\n\tconstructor(room: Room, user: User, autostartMinutes = 0) {\r\n\t\tsuper(room);\r\n\t\tthis.gameNumber = room.nextGameNumber();\r\n\t\tthis.room = room;\r\n\r\n\t\tthis.turnTimeoutMinutes = 1;\r\n\t\tthis.timerTickSeconds = 5;\r\n\r\n\t\tthis.createdBy = user.name;\r\n\t\tthis.startedBy = '';\r\n\t\tthis.allowRenames = true;\r\n\r\n\t\tthis.playerCap = 16;\r\n\t\tthis.minimumPlayers = 2;\r\n\t\tthis.playerScrollWheel = 4;\r\n\t\tthis.cardWidth = 50;\r\n\t\tthis.cardHeight = 85;\r\n\r\n\t\tthis.spectators = Object.create(null);\r\n\t\tthis.dealer = new BlackjackDealer();\r\n\r\n\t\tthis.symbols = {\r\n\t\t\t'\u2665': 'Hearts',\r\n\t\t\t'\u2666': 'Diamonds',\r\n\t\t\t'\u2663': 'Clubs',\r\n\t\t\t'\u2660': 'Spades',\r\n\t\t};\r\n\t\tthis.deck = new BlackjackDeck().shuffle();\r\n\r\n\t\tthis.roomID = this.room.roomid;\r\n\t\tthis.title = `Blackjack (${room.title})`;\r\n\t\tthis.state = 'signups';\r\n\r\n\t\tthis.lastMessage = '';\r\n\t\tthis.turnLog = '';\r\n\t\tthis.uhtmlChange = '';\r\n\t\tthis.curUsername = '';\r\n\t\tthis.endedBy = '';\r\n\t\tthis.infoboxLimited = '';\r\n\r\n\t\tthis.button = ' | ';\r\n\t\tthis.spectateButton = '';\r\n\t\tthis.slideButton = '';\r\n\r\n\t\tthis.autostart = null;\r\n\t\tthis.dqTimer = null;\r\n\t\tthis.timerTick = null;\r\n\r\n\t\tthis.makeGame(autostartMinutes);\r\n\t}\r\n\r\n\t/**\r\n\t * Game Setup\r\n\t * makeGame - configures required settings for creating a game\r\n\t * makePlayer - adds blackjack-specific properties to player object\r\n\t * sendInvite - called when a game is created, or when a player joins/leaves\r\n\t */\r\n\tmakeGame(autostartMinutes = 0) {\r\n\t\tif (autostartMinutes > 0) {\r\n\t\t\tthis.autostart = setTimeout(() => this.start(), autostartMinutes * 60000);\r\n\t\t}\r\n\r\n\t\tthis.sendInvite();\r\n\t}\r\n\tmakePlayer(user: User) {\r\n\t\treturn new BlackjackPlayer(user, this);\r\n\t}\r\n\tsendInvite() {\r\n\t\tconst change = this.uhtmlChange;\r\n\t\tconst players = Object.keys(this.playerTable);\r\n\t\tconst playerList = [];\r\n\t\tfor (const player of players) playerList.push(Utils.escapeHTML(this.playerTable[player].name));\r\n\t\tthis.room.send(`|uhtml${change}|blackjack-${this.gameNumber}|
${this.createdBy} has created a game of Blackjack. ${this.button}
Players (${players.length}): ${!players.length ? '(None)' : playerList.join(', ')}
`);\r\n\t\tthis.uhtmlChange = 'change';\r\n\t}\r\n\r\n\t/**\r\n\t * Joining/Leaving/Viewing\r\n\t * joinGame - joins the game\r\n\t * leaveGame - leaves the game\r\n\t * spectate - spectates the game\r\n\t * unspectate - stops spectating the game\r\n\t */\r\n\tjoinGame(user: User) {\r\n\t\tif (!user.named) return this.errorMessage(user, `You must first choose a name to play Blackjack.`);\r\n\t\tif (this.state === 'started') return this.errorMessage(user, `Blackjack has already started.`);\r\n\t\tconst joined = this.addPlayer(user);\r\n\t\tif (!joined) {\r\n\t\t\tthis.errorMessage(user, `You are already in this game.`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.sendInvite();\r\n\r\n\t\tif (Object.keys(this.playerTable).length === this.playerCap) {\r\n\t\t\tthis.start();\r\n\t\t}\r\n\t\tif (this.spectators[user.id]) delete this.spectators[user.id]; // prevent player from spectating\r\n\t\treturn true;\r\n\t}\r\n\tleaveGame(user: User) {\r\n\t\tif (this.state === 'started') return this.errorMessage(user, `You cannot leave this game; it has already started.`);\r\n\t\tif (!this.playerTable[user.id]) return this.errorMessage(user, \"You are not in this game to leave.\");\r\n\t\tthis.removePlayer(user);\r\n\t\tthis.sendInvite();\r\n\t}\r\n\tspectate(user: User) {\r\n\t\tif (this.spectators[user.id]) return this.errorMessage(user, `You are already spectating this game.`);\r\n\t\tif (this.playerTable[user.id]) {\r\n\t\t\treturn this.errorMessage(user, `You don't need to spectate the game; you're playing the game.`);\r\n\t\t}\r\n\t\tthis.spectators[user.id] = user.id;\r\n\t\tuser.sendTo(this.roomid, `You are now spectating this game.`);\r\n\t}\r\n\tunspectate(user: User) {\r\n\t\tif (!this.spectators[user.id]) return this.errorMessage(user, `You are already not spectating this game.`);\r\n\t\tdelete this.spectators[user.id];\r\n\t\tuser.sendTo(this.roomid, `You are no longer spectating this game.`);\r\n\t}\r\n\r\n\t/**\r\n\t * Utility\r\n\t * errorMessage - sends a user an error message\r\n\t * add - adds/sends text to room\r\n\t * display - displays gameplay to players and spectators\r\n\t * clear - clears a user's gameplay screen\r\n\t * clearAllTimers - clears all possible existing timers pertaining to blackjack\r\n\t * slide - slides the game log down in the chat\r\n\t * onConnect - handles replies to send when a user joins the room, if any\r\n\t * onUpdateConnection - overrides default onUpdateConnection\r\n\t * createTimer - creates a timer with a countdown for a player\r\n\t * generateCard - generates the card for the UI\r\n\t * getWinners - returns an array of the winners and their cards\r\n\t */\r\n\terrorMessage(user: User, message: string) {\r\n\t\tuser.sendTo(this.room, Utils.html`|html|
${message}
`);\r\n\t}\r\n\tsend(message: string, clean = false) {\r\n\t\tconst change = this.uhtmlChange;\r\n\t\tthis.room.send(`|uhtml${change}|blackjack-${this.gameNumber}|
${(clean ? message : this.lastMessage + message)}
`);\r\n\t\tthis.lastMessage += message;\r\n\t\tthis.uhtmlChange = 'change';\r\n\t}\r\n\tdisplay(text: string, clean = false, playerName?: string, noChange = false, end = false) {\r\n\t\tconst force = (end && this.endedBy);\r\n\t\tlet change = this.uhtmlChange;\r\n\t\tif (noChange) change = '';\r\n\t\tif (clean) this.lastMessage = '';\r\n\t\tconst message = `|uhtml${change}|blackjack-${this.gameNumber}|
`;\r\n\t\tthis.lastMessage += text;\r\n\t\tif (end) {\r\n\t\t\ttext = `The game of blackjack has ${force ? `been forcibly ended by ${this.endedBy}` : 'ended'}.
View turn log${this.turnLog}
${text}`;\r\n\t\t\tthis.lastMessage = '';\r\n\t\t}\r\n\t\tfor (const player of Object.keys(this.playerTable)) {\r\n\t\t\tif (playerName && this.playerTable[player].name === playerName) { // turn highlighting\r\n\t\t\t\tthis.playerTable[player].gameLog += `${text}`;\r\n\t\t\t\tthis.playerTable[player].sendRoom(`${message}${end ? text : this.playerTable[player].gameLog}
`);\r\n\t\t\t} else {\r\n\t\t\t\tthis.playerTable[player].gameLog += text;\r\n\t\t\t\tthis.playerTable[player].sendRoom(`${message}${end ? text : this.playerTable[player].gameLog}`);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (const spectatorID of Object.keys(this.spectators)) {\r\n\t\t\tconst spectator = Users.get(this.spectators[spectatorID]);\r\n\t\t\tif (spectator) spectator.sendTo(this.roomid, `${message}${this.lastMessage + text}`);\r\n\t\t}\r\n\t}\r\n\tclear() {\r\n\t\tconst player = this.playerTable[this.curUsername];\r\n\t\tif (!player) throw new Error(`Player not in player table`); // this should never happen\r\n\t\tplayer.sendRoom(`|uhtmlchange|user-blackjack-${this.gameNumber}|`);\r\n\t}\r\n\tclearAllTimers() {\r\n\t\tif (this.dqTimer) {\r\n\t\t\tclearTimeout(this.dqTimer);\r\n\t\t\tthis.dqTimer = null;\r\n\t\t}\r\n\t\tif (this.timerTick) {\r\n\t\t\tclearInterval(this.timerTick);\r\n\t\t\tthis.timerTick = null;\r\n\t\t}\r\n\t\tif (this.autostart) {\r\n\t\t\tclearTimeout(this.autostart);\r\n\t\t\tthis.autostart = null;\r\n\t\t}\r\n\t}\r\n\tslide(user: User) {\r\n\t\tuser.sendTo(this.roomid, `|uhtml|blackjack-${this.gameNumber}|`);\r\n\t\tthis.display('', false, user.name);\r\n\t}\r\n\tonConnect(user: User) {\r\n\t\tconst message = `|uhtml|blackjack-${this.gameNumber}|
`;\r\n\t\tif (this.state === 'signups') {\r\n\t\t\tthis.sendInvite();\r\n\t\t} else if (this.state === 'started') {\r\n\t\t\tconst player = this.playerTable[user.id];\r\n\t\t\tconst spectator = this.spectators[user.id];\r\n\t\t\tif (player && user.id === toID(this.curUsername)) { // their turn; send gamelog and game screen\r\n\t\t\t\tplayer.sendRoom(`${message}${player.gameLog}`);\r\n\t\t\t\tplayer.sendRoom(player.playScreen.replace('|uhtmlchange|', '|uhtml|'));\r\n\t\t\t\treturn;\r\n\t\t\t} else if (player) { // a player, but not their turn; just send gamelog\r\n\t\t\t\tplayer.sendRoom(`${message}${player.gameLog}`);\r\n\t\t\t\treturn;\r\n\t\t\t} else if (spectator) { // spectator; send gamelog\r\n\t\t\t\tuser.sendTo(this.roomid, `${message}${this.lastMessage}`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tonUpdateConnection() {\r\n\t\t// This happens (runs onConnect) when a connection in the room\r\n\t\t// changes, such as going on a new name. We don't want to do\r\n\t\t// anything for such a situation, so we're overriding this.\r\n\t}\r\n\tcreateTimer(user: User) {\r\n\t\tconst player = this.playerTable[user.id];\r\n\t\tthis.dqTimer = setTimeout(() => {\r\n\t\t\tlet cards = '';\r\n\t\t\tfor (const card of player.cards) cards += `[${card}] `;\r\n\t\t\tplayer.status = 'stand';\r\n\t\t\tthis.display(\r\n\t\t\t\tUtils.html`
${player.name} stands with ${cards}` +\r\n\t\t\t\t` (${player.points}) (Auto-stand: took too long to move)`,\r\n\t\t\t\tfalse,\r\n\t\t\t\tthis.playerTable[this.curUsername].name\r\n\t\t\t);\r\n\t\t\tthis.clear();\r\n\t\t\tthis.next();\r\n\t\t}, this.turnTimeoutMinutes * 60 * 1000);\r\n\t\tthis.timerTick = setInterval(() => {\r\n\t\t\tconst display = player.playScreen.replace('|uhtml|', '|uhtmlchange|');\r\n\t\t\tif (display !== '') {\r\n\t\t\t\tconst timeLeft = player.timerTicksLeft - 5;\r\n\t\t\t\tconst buffer = (String(timeLeft).length === 1 ? '0' : '');\r\n\t\t\t\tconst half = (timeLeft <= ((this.turnTimeoutMinutes * 60) / 2));\r\n\t\t\t\tplayer.sendRoom(`${display} | [ 0:${buffer}${timeLeft}]`);\r\n\t\t\t\tplayer.timerTicksLeft -= this.timerTickSeconds;\r\n\t\t\t}\r\n\t\t}, this.timerTickSeconds * 1000);\r\n\t}\r\n\tgenerateCard(card: string) {\r\n\t\tconst value = toID(card).toUpperCase();\r\n\t\tconst symbolName = this.symbols[card.substr(-1) as Symbols];\r\n\t\tconst red = ['D', 'H'].includes(symbolName.charAt(0));\r\n\t\tlet cardUI = value;\r\n\t\tif (value === 'K') cardUI = 'King';\r\n\t\tif (value === 'Q') cardUI = 'Queen';\r\n\t\tif (value === 'A') cardUI = 'Ace';\r\n\t\tif (value === 'J') cardUI = 'Joker';\r\n\t\treturn `
${value}
${card.substr(-1)}
${value}
${card.substr(-1)}
`;\r\n\t}\r\n\tgetWinners(forceend = false) {\r\n\t\tconst winners = [];\r\n\t\tif (forceend) this.giveCard('dealer');\r\n\t\tif (this.dealer.points > 21) {\r\n\t\t\tfor (const player of Object.keys(this.playerTable)) {\r\n\t\t\t\tif (this.playerTable[player].status === 'bust') continue;\r\n\t\t\t\twinners.push(\r\n\t\t\t\t\tUtils.html`${this.playerTable[player].name} ` +\r\n\t\t\t\t\t`[${this.playerTable[player].cards.join(', ')}]`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (this.dealer.points !== 21) {\r\n\t\t\tfor (const player of Object.keys(this.playerTable)) {\r\n\t\t\t\tif (this.playerTable[player].status === 'bust' || this.playerTable[player].points <= this.dealer.points) continue;\r\n\t\t\t\twinners.push(\r\n\t\t\t\t\tUtils.html`${this.playerTable[player].name} ` +\r\n\t\t\t\t\t`[${this.playerTable[player].cards.join(', ')}]`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (this.dealer.points === 21) {\r\n\t\t\twinners.push(`${this.dealer.name} [${this.dealer.cards.join(', ')}]`);\r\n\t\t}\r\n\t\treturn winners;\r\n\t}\r\n\r\n\t/**\r\n\t * Game State Changes\r\n\t * start - starts the game\r\n\t * end - ends the game\r\n\t * destroy - destroys the game\r\n\t */\r\n\tstart(user?: User) {\r\n\t\tconst numberOfPlayers = Object.keys(this.playerTable).length;\r\n\t\tif (numberOfPlayers < this.minimumPlayers) {\r\n\t\t\tif (this.autostart) {\r\n\t\t\t\tclearTimeout(this.autostart);\r\n\t\t\t\tthis.autostart = null;\r\n\t\t\t}\r\n\t\t\tthis.send(\"
Not enough players to start; game canceled.\");\r\n\t\t\tthis.destroy();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (user) this.startedBy = Utils.escapeHTML(user.name);\r\n\t\tthis.infoboxLimited = (numberOfPlayers >= this.playerScrollWheel ? ' infobox-limited' : '');\r\n\t\tthis.send(`[Blackjack has started. ${this.spectateButton}]`, true);\r\n\r\n\t\tthis.curUsername = Object.keys(this.playerTable)[0];\r\n\r\n\t\tconst header = `The game of blackjack has started${(this.startedBy !== '' ? ` (started by ${this.startedBy})` : ``)}. ${this.slideButton}
`;\r\n\t\tthis.state = 'started';\r\n\r\n\t\tthis.giveCard('dealer');\r\n\t\tthis.giveCard('dealer');\r\n\t\tthis.turnLog += `${this.dealer.name}: [${this.dealer.cards[0]}]`;\r\n\r\n\t\tfor (const player of Object.keys(this.playerTable)) {\r\n\t\t\tthis.giveCard(this.playerTable[player].user.id);\r\n\t\t\tthis.giveCard(this.playerTable[player].user.id);\r\n\t\t\tthis.turnLog += Utils.html`
${this.playerTable[player].name}: ` +\r\n\t\t\t\t`[${this.playerTable[player].cards[0]}] [${this.playerTable[player].cards[1]}] (${this.playerTable[player].points})`;\r\n\t\t}\r\n\r\n\t\tthis.display(`${header}${this.turnLog}`, true, '');\r\n\t\tthis.next();\r\n\t}\r\n\tend(user: User | true, cmd?: string) {\r\n\t\tconst force = (cmd && toID(cmd) === 'forceend');\r\n\t\tif (user === true) {\r\n\t\t\tthis.state = 'ended';\r\n\t\t\tthis.destroy();\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif (this.state === 'started' && cmd && !force) {\r\n\t\t\treturn this.errorMessage(\r\n\t\t\t\tuser,\r\n\t\t\t\t`Because this game has started, you can only end this game by using /blackjack forceend.`\r\n\t\t\t);\r\n\t\t}\r\n\t\tlet winners = this.getWinners();\r\n\t\tif (force) {\r\n\t\t\twinners = this.getWinners(true);\r\n\t\t\tthis.endedBy = Utils.escapeHTML(user.name);\r\n\t\t\tif (this.curUsername) {\r\n\t\t\t\tthis.playerTable[this.curUsername].send(`|uhtmlchange|user-blackjack-${this.gameNumber}|`);\r\n\t\t\t}\r\n\t\t\tif (winners.length < 1) {\r\n\t\t\t\tthis.display(`There are no winners this time.`, false, undefined, false, true);\r\n\t\t\t} else {\r\n\t\t\t\tthis.display(`Winner${Chat.plural(winners.length)}: ${winners.join(', ')}`, false, undefined, false, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!force && this.state !== 'signups') {\r\n\t\t\tif (winners.length < 1) {\r\n\t\t\t\tthis.display(`There are no winners this time.`, false, undefined, false, true);\r\n\t\t\t} else {\r\n\t\t\t\tthis.display(`Winner${Chat.plural(winners.length)}: ${winners.join(', ')}`, false, undefined, false, true);\r\n\t\t\t}\r\n\t\t} else if (this.state === 'signups') {\r\n\t\t\tthis.send(\r\n\t\t\t\tUtils.html`The game of blackjack has been ended by ${user.name}, ` +\r\n\t\t\t\t`and there are no winners because the game never started.`,\r\n\t\t\t\ttrue\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tthis.state = 'ended';\r\n\r\n\t\tthis.destroy();\r\n\t\treturn true;\r\n\t}\r\n\tdestroy() {\r\n\t\tif (Object.keys(this.playerTable).length) {\r\n\t\t\tfor (const player of Object.keys(this.playerTable)) {\r\n\t\t\t\tthis.playerTable[player].destroy();\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.clearAllTimers();\r\n\t\tthis.room.game = null;\r\n\t}\r\n\r\n\t/**\r\n\t * Gameplay\r\n\t * hit - player decides to get a new card\r\n\t * stand - player decides to keep current cards\r\n\t * giveCard - gives a player a card from the deck\r\n\t * getCardPoints - returns the point value of a user's cards\r\n\t * next - game goes on to the next turn\r\n\t */\r\n\thit(user: User) {\r\n\t\tif (this.state !== 'started') return this.errorMessage(user, `Blackjack hasn't started yet.`);\r\n\t\tif (!this.playerTable[user.id]) return this.errorMessage(user, `You aren't a player in this game.`);\r\n\t\tif (this.curUsername !== user.id) return this.errorMessage(user, `It's not your turn.`);\r\n\t\tthis.playerTable[user.id].selfUhtml = 'change';\r\n\t\tthis.playerTable[user.id].resetTimerTicks();\r\n\r\n\t\tthis.giveCard(user.id);\r\n\t}\r\n\tstand(user: User) {\r\n\t\tconst player = this.playerTable[user.id];\r\n\t\tif (this.state !== 'started') return this.errorMessage(user, `Blackjack hasn't started yet.`);\r\n\t\tif (!player) return this.errorMessage(user, `You aren't a player in this game.`);\r\n\t\tif (this.curUsername !== user.id) return this.errorMessage(user, `It's not your turn.`);\r\n\t\tplayer.status = 'stand';\r\n\t\tlet cards = '';\r\n\t\tfor (const card of player.cards) cards += `[${card}] `;\r\n\t\tconst turnLine = Utils.html`
${player.name} stands with ${cards} ` +\r\n\t\t\t`(${player.points}${player.points === 21 ? ' - blackjack!' : ''})`;\r\n\r\n\t\tthis.turnLog += turnLine;\r\n\t\tthis.display(turnLine, false, player.name);\r\n\t\tthis.clear();\r\n\r\n\t\tthis.next();\r\n\t}\r\n\tgiveCard(userid: string) {\r\n\t\tif (this.deck.length < 1) this.deck = new BlackjackDeck().shuffle();\r\n\t\tconst player = (userid === 'dealer' ? this.dealer : this.playerTable[userid]);\r\n\t\tif (!player) return; // this should never happen\r\n\t\tplayer.cards.push(this.deck[0]);\r\n\r\n\t\tthis.deck.shift();\r\n\r\n\t\tif (this.deck.length === 0) {\r\n\t\t\tthis.display(`
${this.dealer.name} has ran out of cards in the deck; shuffling a new deck...`);\r\n\t\t\tthis.deck = new BlackjackDeck().shuffle();\r\n\t\t}\r\n\r\n\t\tplayer.points = this.getCardPoints(userid);\r\n\r\n\t\tif (player.cards.length < 3) return;\r\n\r\n\t\tlet turnLine = Utils.html`
${player.name} hit and received ` +\r\n\t\t\t`[${player.cards[player.cards.length - 1]}] (${player.points})`;\r\n\t\tthis.turnLog += turnLine;\r\n\t\tif (player.cards.length > 2) this.display(turnLine, false, player.name);\r\n\r\n\t\tif (player instanceof BlackjackDealer) {\r\n\t\t\tif (player.points > 21) {\r\n\t\t\t\tlet cards = '';\r\n\t\t\t\tfor (const card of player.cards) {\r\n\t\t\t\t\tcards += `[${card}] `;\r\n\t\t\t\t}\r\n\t\t\t\tturnLine = Utils.html`
${this.dealer.name} has busted with ${cards} (${player.points})`;\r\n\t\t\t\tthis.turnLog += turnLine;\r\n\t\t\t\tthis.display(turnLine);\r\n\t\t\t\tthis.end(true);\r\n\t\t\t\treturn;\r\n\t\t\t} else if (player.points === 21) {\r\n\t\t\t\tturnLine = Utils.html`
${this.dealer.name} has blackjack!`;\r\n\t\t\t\tthis.turnLog += turnLine;\r\n\t\t\t\tthis.display(turnLine);\r\n\t\t\t\tthis.end(true);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t} else if (player.points > 21) {\r\n\t\t\tplayer.status = 'bust';\r\n\t\t\tlet cards = '';\r\n\t\t\tfor (const card of player.cards) {\r\n\t\t\t\tcards += `[${card}] `;\r\n\t\t\t}\r\n\t\t\tturnLine = Utils.html`
${player.name} has busted with ${cards} (${player.points})`;\r\n\t\t\tthis.turnLog += turnLine;\r\n\t\t\tthis.display(turnLine, false, player.name);\r\n\t\t\tthis.clear();\r\n\t\t} else if (player.points === 21) {\r\n\t\t\tplayer.status = 'stand';\r\n\t\t\tturnLine = Utils.html`
${player.name} has blackjack!`;\r\n\t\t\tthis.turnLog += turnLine;\r\n\t\t\tthis.display(turnLine, false, player.name);\r\n\t\t\tthis.clear();\r\n\t\t}\r\n\t\tif (player !== this.dealer) this.playerTable[userid].cards = player.cards;\r\n\t\tthis.next();\r\n\t}\r\n\tgetCardPoints(playerid: string) {\r\n\t\tconst player = (playerid === 'dealer' ? this.dealer : this.playerTable[playerid]);\r\n\t\tlet points = 0;\r\n\t\tlet aceCount = 0;\r\n\t\tfor (const card of player.cards.map(x => toID(x).toUpperCase())) {\r\n\t\t\tif (!isNaN(Number(card))) {\r\n\t\t\t\tpoints += Number(card);\r\n\t\t\t} else if (['K', 'Q', 'J'].includes(card)) {\r\n\t\t\t\tpoints += 10;\r\n\t\t\t} else if (card === 'A') {\r\n\t\t\t\tpoints += 11;\r\n\t\t\t\taceCount++;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// At first, we value aces as 11, however, we will change their value\r\n\t\t// to be 1 if having them as 11 would cause an unnecessary bust. We will\r\n\t\t// do this by subtracting 10 for each ace that would otherwise cause a bust.\r\n\t\twhile (points > 21 && aceCount > 0) {\r\n\t\t\tpoints -= 10;\r\n\t\t\taceCount--;\r\n\t\t}\r\n\r\n\t\treturn points;\r\n\t}\r\n\tnext() {\r\n\t\tthis.clearAllTimers();\r\n\t\tif (\r\n\t\t\tObject.keys(this.playerTable)[Object.keys(this.playerTable).length - 1] === this.curUsername &&\r\n\t\t\tthis.playerTable[this.curUsername].status !== 'playing'\r\n\t\t) {\r\n\t\t\tif (this.dealer.points < 17) {\r\n\t\t\t\tthis.giveCard('dealer');\r\n\t\t\t} else if (this.dealer.points >= 17) {\r\n\t\t\t\tlet cards = '';\r\n\t\t\t\tfor (const card of this.dealer.cards) {\r\n\t\t\t\t\tcards += `[${card}] `;\r\n\t\t\t\t}\r\n\t\t\t\tconst turnLine = `
${this.dealer.name} stands with ${cards} (${this.dealer.points})`;\r\n\t\t\t\tthis.turnLog += turnLine;\r\n\t\t\t\tthis.display(turnLine);\r\n\t\t\t\tthis.end(true);\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (this.playerTable[this.curUsername].status !== 'playing') {\r\n\t\t\tlet num = 0;\r\n\t\t\twhile (this.playerTable[Object.keys(this.playerTable)[num]].status !== 'playing') {\r\n\t\t\t\tnum++;\r\n\t\t\t}\r\n\t\t\tthis.curUsername = Object.keys(this.playerTable)[num];\r\n\t\t}\r\n\t\tlet output = `|uhtml${this.playerTable[this.curUsername].selfUhtml}|user-blackjack-${this.gameNumber}|
`;\r\n\t\toutput += `It's your turn to move, ${this.playerTable[this.curUsername].name}
`;\r\n\t\tfor (const card of this.playerTable[this.curUsername].cards) {\r\n\t\t\toutput += this.generateCard(card);\r\n\t\t}\r\n\t\toutput += `
Score: ${this.playerTable[this.curUsername].points}${(this.playerTable[this.curUsername].points === 21 ? ` (you have blackjack!)` : ``)}`;\r\n\t\toutput += `
| `;\r\n\r\n\t\tthis.playerTable[this.curUsername].sendRoom(`|notify|Blackjack (${this.room.title})|It's your turn to play!`);\r\n\t\tthis.playerTable[this.curUsername].sendRoom(output);\r\n\t\tthis.playerTable[this.curUsername].playScreen = output;\r\n\r\n\t\tthis.createTimer(this.playerTable[this.curUsername].user);\r\n\t}\r\n}\r\n\r\nclass BlackjackPlayer extends Rooms.RoomGamePlayer {\r\n\tuser: User;\r\n\r\n\tpoints: number;\r\n\tslide: number;\r\n\ttimerTicksLeft: number;\r\n\r\n\tcards: string[];\r\n\r\n\tgameLog: string;\r\n\tplayScreen: string;\r\n\tselfUhtml: string;\r\n\tstatus: string;\r\n\r\n\tconstructor(user: User, game: Blackjack) {\r\n\t\tsuper(user, game);\r\n\t\tthis.user = user;\r\n\r\n\t\tthis.cards = [];\r\n\t\tthis.points = 0;\r\n\t\tthis.slide = 0;\r\n\t\tthis.status = 'playing';\r\n\r\n\t\tthis.selfUhtml = '';\r\n\t\tthis.gameLog = '';\r\n\t\tthis.playScreen = '';\r\n\t\tthis.timerTicksLeft = this.game.turnTimeoutMinutes * 60; // to get into seconds-format\r\n\t}\r\n\tresetTimerTicks() {\r\n\t\tthis.timerTicksLeft = this.game.turnTimeoutMinutes * 60;\r\n\t}\r\n}\r\n\r\nclass BlackjackDealer {\r\n\tcards: string[];\r\n\tpoints: number;\r\n\tname: string;\r\n\r\n\tconstructor() {\r\n\t\tthis.cards = [];\r\n\t\tthis.points = 0;\r\n\t\tthis.name = 'The Dealer';\r\n\t}\r\n}\r\n\r\nclass BlackjackDeck {\r\n\tdeck: Deck[];\r\n\tconstructor() {\r\n\t\tthis.deck = [\r\n\t\t\t'A\u2665', 'A\u2666', 'A\u2663', 'A\u2660', '2\u2665', '2\u2666', '2\u2663', '2\u2660', '3\u2665', '3\u2666', '3\u2663',\r\n\t\t\t'3\u2660', '4\u2665', '4\u2666', '4\u2663', '4\u2660', '5\u2665', '5\u2666', '5\u2663', '5\u2660', '6\u2665', '6\u2666', '6\u2663', '6\u2660',\r\n\t\t\t'7\u2665', '7\u2666', '7\u2663', '7\u2660', '8\u2665', '8\u2666', '8\u2663', '8\u2660', '9\u2665', '9\u2666', '9\u2663', '9\u2660', '10\u2665',\r\n\t\t\t'10\u2666', '10\u2663', '10\u2660', 'J\u2665', 'J\u2666', 'J\u2663', 'J\u2660', 'Q\u2665', 'Q\u2666', 'Q\u2663', 'Q\u2660', 'K\u2665', 'K\u2666',\r\n\t\t\t'K\u2663', 'K\u2660',\r\n\t\t];\r\n\t}\r\n\tshuffle() {\r\n\t\treturn Utils.shuffle(this.deck);\r\n\t}\r\n}\r\n\r\nexport const commands: Chat.ChatCommands = {\r\n\tblj: 'blackjack',\r\n\tblackjack: {\r\n\t\tnew: 'create',\r\n\t\tcreate(target, room, user) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tthis.checkCan('minigame', null, room);\r\n\t\t\tif (room.game) return this.errorReply(\"There is already a game running in this room.\");\r\n\t\t\tif (room.settings.blackjackDisabled) return this.errorReply(\"Blackjack is currently disabled in this room.\");\r\n\t\t\tconst autostartMinutes = target ? parseFloat(target) : 0;\r\n\t\t\tif (isNaN(autostartMinutes) || autostartMinutes <= 0 || (autostartMinutes * 60 * 1000) > Chat.MAX_TIMEOUT_DURATION) {\r\n\t\t\t\treturn this.errorReply(\"Usage: /blackjack create [autostart] - where autostart is an integer\");\r\n\t\t\t}\r\n\r\n\t\t\tthis.privateModAction(`A game of blackjack was created by ${user.name}.`);\r\n\t\t\tthis.modlog(`BLACKJACK CREATE`);\r\n\t\t\troom.game = new Blackjack(room, user, autostartMinutes);\r\n\t\t},\r\n\t\tstart(target, room, user) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tthis.checkCan('minigame', null, room);\r\n\t\t\tconst game = this.requireGame(Blackjack);\r\n\t\t\tif (game.state !== 'signups') return this.errorReply(\"This game of blackjack has already started.\");\r\n\r\n\t\t\tthis.privateModAction(`The game of blackjack was started by ${user.name}.`);\r\n\t\t\tthis.modlog(`BLACKJACK START`);\r\n\t\t\tgame.start(user);\r\n\t\t},\r\n\t\tforceend: 'end',\r\n\t\tend(target, room, user, connection, cmd) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tthis.checkCan('minigame', null, room);\r\n\t\t\tconst game = this.requireGame(Blackjack);\r\n\t\t\tconst force = cmd === 'forceend' ? 'forcibly ' : '';\r\n\r\n\t\t\tconst end = game.end(user, cmd);\r\n\t\t\tif (end) {\r\n\t\t\t\tthis.privateModAction(`The game of blackjack was ${force}ended by ${user.name}.`);\r\n\t\t\t\tthis.modlog(`BLACKJACK END`);\r\n\t\t\t}\r\n\t\t},\r\n\t\thit(target, room, user) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tconst game = this.requireGame(Blackjack);\r\n\t\t\tgame.hit(user);\r\n\t\t},\r\n\t\tstand(target, room, user) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tconst game = this.requireGame(Blackjack);\r\n\t\t\tgame.stand(user);\r\n\t\t},\r\n\t\tslide(target, room, user) { // undocumented (used in UI)\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tconst game = this.requireGame(Blackjack);\r\n\t\t\tgame.slide(user);\r\n\t\t},\r\n\t\tj: 'join',\r\n\t\tjoin(target, room, user) {\r\n\t\t\treturn this.parse('/joingame');\r\n\t\t},\r\n\t\tl: 'leave',\r\n\t\tleave(target, room, user) {\r\n\t\t\treturn this.parse('/leavegame');\r\n\t\t},\r\n\t\tunspectate: 'spectate',\r\n\t\tspectate(target, room, user, connection, cmd) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tconst game = this.requireGame(Blackjack);\r\n\t\t\tif (cmd === 'spectate') {\r\n\t\t\t\tgame.spectate(user);\r\n\t\t\t} else if (cmd === 'unspectate') {\r\n\t\t\t\tgame.unspectate(user);\r\n\t\t\t}\r\n\t\t},\r\n\t\tdisable(target, room, user) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tthis.checkCan('gamemanagement', null, room);\r\n\t\t\tif (room.settings.blackjackDisabled) {\r\n\t\t\t\treturn this.errorReply(\"Blackjack is already disabled in this room.\");\r\n\t\t\t}\r\n\t\t\troom.settings.blackjackDisabled = true;\r\n\t\t\troom.saveSettings();\r\n\t\t\tthis.sendReply(`Blackjack has been disabled for this room.`);\r\n\t\t},\r\n\t\tenable(target, room, user) {\r\n\t\t\troom = this.requireRoom();\r\n\t\t\tthis.checkCan('gamemanagement', null, room);\r\n\t\t\tif (!room.settings.blackjackDisabled) {\r\n\t\t\t\treturn this.errorReply(\"Blackjack is already enabled in this room.\");\r\n\t\t\t}\r\n\r\n\t\t\tdelete room.settings.blackjackDisabled;\r\n\t\t\troom.saveSettings();\r\n\t\t\tthis.sendReply(`Blackjack has been enabled for this room.`);\r\n\t\t},\r\n\t\t'': 'help',\r\n\t\thelp(target, room, user) {\r\n\t\t\treturn this.parse('/help blackjack');\r\n\t\t},\r\n\t},\r\n\tblackjackhelp: [\r\n\t\t\"/blackjack create - Creates a game of blackjack. Requires: % @ # &\",\r\n\t\t\"/blackjack create [autostart] - Automatically creates a game of blackjack in [autostart] minutes. Requires: % @ # &\",\r\n\t\t\"/blackjack start - Starts a game of blackjack. Requires: % @ # &\",\r\n\t\t\"/blackjack end - Ends a game of blackjack. Requires: % @ # &\",\r\n\t\t\"/blackjack join - Joins a game of blackjack.\",\r\n\t\t\"/blackjack leave - Leaves a game of blackjack.\",\r\n\t\t\"/blackjack spectate - Spectates a game of blackjack.\",\r\n\t\t\"/blackjack unspectate - Stops spectating a game of blackjack.\",\r\n\t\t\"/blackjack disable - Prevents games of blackjack from being made in the room. Requires: # &\",\r\n\t\t\"/blackjack enable - Allows games of blackjack to be made in the room. Requires: # &\",\r\n\t],\r\n};\r\nexport const roomSettings: Chat.SettingsHandler = room => ({\r\n\tlabel: \"Blackjack\",\r\n\tpermission: 'editroom',\r\n\toptions: [\r\n\t\t[`disabled`, room.settings.blackjackDisabled || 'blackjack disable'],\r\n\t\t[`enabled`, !room.settings.blackjackDisabled || 'blackjack enable'],\r\n\t],\r\n});\r\n"], "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,iBAAoB;AATpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBO,MAAM,kBAAkB,MAAM,SAA0B;AAAA,EAoC9D,YAAY,MAAY,MAAY,mBAAmB,GAAG;AACzD,UAAM,IAAI;AACV,SAAK,aAAa,KAAK,eAAe;AACtC,SAAK,OAAO;AAEZ,SAAK,qBAAqB;AAC1B,SAAK,mBAAmB;AAExB,SAAK,YAAY,KAAK;AACtB,SAAK,YAAY;AACjB,SAAK,eAAe;AAEpB,SAAK,YAAY;AACjB,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AACzB,SAAK,YAAY;AACjB,SAAK,aAAa;AAElB,SAAK,aAAa,uBAAO,OAAO,IAAI;AACpC,SAAK,SAAS,IAAI,gBAAgB;AAElC,SAAK,UAAU;AAAA,MACd,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,MACL,UAAK;AAAA,IACN;AACA,SAAK,OAAO,IAAI,cAAc,EAAE,QAAQ;AAExC,SAAK,SAAS,KAAK,KAAK;AACxB,SAAK,QAAQ,cAAc,KAAK;AAChC,SAAK,QAAQ;AAEb,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,iBAAiB;AAEtB,SAAK,SAAS;AACd,SAAK,iBAAiB;AACtB,SAAK,cAAc;AAEnB,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,YAAY;AAEjB,SAAK,SAAS,gBAAgB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,mBAAmB,GAAG;AAC9B,QAAI,mBAAmB,GAAG;AACzB,WAAK,YAAY,WAAW,MAAM,KAAK,MAAM,GAAG,mBAAmB,GAAK;AAAA,IACzE;AAEA,SAAK,WAAW;AAAA,EACjB;AAAA,EACA,WAAW,MAAY;AACtB,WAAO,IAAI,gBAAgB,MAAM,IAAI;AAAA,EACtC;AAAA,EACA,aAAa;AACZ,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,OAAO,KAAK,KAAK,WAAW;AAC5C,UAAM,aAAa,CAAC;AACpB,eAAW,UAAU;AAAS,iBAAW,KAAK,iBAAM,WAAW,KAAK,YAAY,MAAM,EAAE,IAAI,CAAC;AAC7F,SAAK,KAAK,KAAK,SAAS,oBAAoB,KAAK,iCAAiC,KAAK,mBAAmB,KAAK,8CAA8C,KAAK,gCAAgC,QAAQ,qBAAqB,CAAC,QAAQ,SAAS,WAAW,WAAW,KAAK,IAAI,SAAS;AACzR,SAAK,cAAc;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,MAAY;AACpB,QAAI,CAAC,KAAK;AAAO,aAAO,KAAK,aAAa,MAAM,iDAAiD;AACjG,QAAI,KAAK,UAAU;AAAW,aAAO,KAAK,aAAa,MAAM,gCAAgC;AAC7F,UAAM,SAAS,KAAK,UAAU,IAAI;AAClC,QAAI,CAAC,QAAQ;AACZ,WAAK,aAAa,MAAM,+BAA+B;AACvD,aAAO;AAAA,IACR;AAEA,SAAK,WAAW;AAEhB,QAAI,OAAO,KAAK,KAAK,WAAW,EAAE,WAAW,KAAK,WAAW;AAC5D,WAAK,MAAM;AAAA,IACZ;AACA,QAAI,KAAK,WAAW,KAAK,EAAE;AAAG,aAAO,KAAK,WAAW,KAAK,EAAE;AAC5D,WAAO;AAAA,EACR;AAAA,EACA,UAAU,MAAY;AACrB,QAAI,KAAK,UAAU;AAAW,aAAO,KAAK,aAAa,MAAM,qDAAqD;AAClH,QAAI,CAAC,KAAK,YAAY,KAAK,EAAE;AAAG,aAAO,KAAK,aAAa,MAAM,oCAAoC;AACnG,SAAK,aAAa,IAAI;AACtB,SAAK,WAAW;AAAA,EACjB;AAAA,EACA,SAAS,MAAY;AACpB,QAAI,KAAK,WAAW,KAAK,EAAE;AAAG,aAAO,KAAK,aAAa,MAAM,uCAAuC;AACpG,QAAI,KAAK,YAAY,KAAK,EAAE,GAAG;AAC9B,aAAO,KAAK,aAAa,MAAM,+DAA+D;AAAA,IAC/F;AACA,SAAK,WAAW,KAAK,EAAE,IAAI,KAAK;AAChC,SAAK,OAAO,KAAK,QAAQ,mCAAmC;AAAA,EAC7D;AAAA,EACA,WAAW,MAAY;AACtB,QAAI,CAAC,KAAK,WAAW,KAAK,EAAE;AAAG,aAAO,KAAK,aAAa,MAAM,2CAA2C;AACzG,WAAO,KAAK,WAAW,KAAK,EAAE;AAC9B,SAAK,OAAO,KAAK,QAAQ,yCAAyC;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,aAAa,MAAY,SAAiB;AACzC,SAAK,OAAO,KAAK,MAAM,iBAAM,wCAAwC,eAAe;AAAA,EACrF;AAAA,EACA,KAAK,SAAiB,QAAQ,OAAO;AACpC,UAAM,SAAS,KAAK;AACpB,SAAK,KAAK,KAAK,SAAS,oBAAoB,KAAK,iCAAiC,KAAK,mBAAoB,QAAQ,UAAU,KAAK,cAAc,eAAgB;AAChK,SAAK,eAAe;AACpB,SAAK,cAAc;AAAA,EACpB;AAAA,EACA,QAAQ,MAAc,QAAQ,OAAO,YAAqB,WAAW,OAAO,MAAM,OAAO;AACxF,UAAM,QAAS,OAAO,KAAK;AAC3B,QAAI,SAAS,KAAK;AAClB,QAAI;AAAU,eAAS;AACvB,QAAI;AAAO,WAAK,cAAc;AAC9B,UAAM,UAAU,SAAS,oBAAoB,KAAK,iCAAiC,KAAK;AACxF,SAAK,eAAe;AACpB,QAAI,KAAK;AACR,aAAO,6BAA6B,QAAQ,0BAA0B,KAAK,YAAY,qDAAqD,KAAK,oBAAoB;AACrK,WAAK,cAAc;AAAA,IACpB;AACA,eAAW,UAAU,OAAO,KAAK,KAAK,WAAW,GAAG;AACnD,UAAI,cAAc,KAAK,YAAY,MAAM,EAAE,SAAS,YAAY;AAC/D,aAAK,YAAY,MAAM,EAAE,WAAW,6BAA6B;AACjE,aAAK,YAAY,MAAM,EAAE,SAAS,GAAG,UAAU,MAAM,OAAO,KAAK,YAAY,MAAM,EAAE,eAAe;AAAA,MACrG,OAAO;AACN,aAAK,YAAY,MAAM,EAAE,WAAW;AACpC,aAAK,YAAY,MAAM,EAAE,SAAS,GAAG,UAAU,MAAM,OAAO,KAAK,YAAY,MAAM,EAAE,eAAe;AAAA,MACrG;AAAA,IACD;AACA,eAAW,eAAe,OAAO,KAAK,KAAK,UAAU,GAAG;AACvD,YAAM,YAAY,MAAM,IAAI,KAAK,WAAW,WAAW,CAAC;AACxD,UAAI;AAAW,kBAAU,OAAO,KAAK,QAAQ,GAAG,UAAU,KAAK,cAAc,YAAY;AAAA,IAC1F;AAAA,EACD;AAAA,EACA,QAAQ;AACP,UAAM,SAAS,KAAK,YAAY,KAAK,WAAW;AAChD,QAAI,CAAC;AAAQ,YAAM,IAAI,MAAM,4BAA4B;AACzD,WAAO,SAAS,+BAA+B,KAAK,aAAa;AAAA,EAClE;AAAA,EACA,iBAAiB;AAChB,QAAI,KAAK,SAAS;AACjB,mBAAa,KAAK,OAAO;AACzB,WAAK,UAAU;AAAA,IAChB;AACA,QAAI,KAAK,WAAW;AACnB,oBAAc,KAAK,SAAS;AAC5B,WAAK,YAAY;AAAA,IAClB;AACA,QAAI,KAAK,WAAW;AACnB,mBAAa,KAAK,SAAS;AAC3B,WAAK,YAAY;AAAA,IAClB;AAAA,EACD;AAAA,EACA,MAAM,MAAY;AACjB,SAAK,OAAO,KAAK,QAAQ,oBAAoB,KAAK,aAAa;AAC/D,SAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;AAAA,EAClC;AAAA,EACA,UAAU,MAAY;AACrB,UAAM,UAAU,oBAAoB,KAAK,iCAAiC,KAAK;AAC/E,QAAI,KAAK,UAAU,WAAW;AAC7B,WAAK,WAAW;AAAA,IACjB,WAAW,KAAK,UAAU,WAAW;AACpC,YAAM,SAAS,KAAK,YAAY,KAAK,EAAE;AACvC,YAAM,YAAY,KAAK,WAAW,KAAK,EAAE;AACzC,UAAI,UAAU,KAAK,OAAO,KAAK,KAAK,WAAW,GAAG;AACjD,eAAO,SAAS,GAAG,UAAU,OAAO,SAAS;AAC7C,eAAO,SAAS,OAAO,WAAW,QAAQ,iBAAiB,SAAS,CAAC;AACrE;AAAA,MACD,WAAW,QAAQ;AAClB,eAAO,SAAS,GAAG,UAAU,OAAO,SAAS;AAC7C;AAAA,MACD,WAAW,WAAW;AACrB,aAAK,OAAO,KAAK,QAAQ,GAAG,UAAU,KAAK,aAAa;AACxD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EACA,qBAAqB;AAAA,EAIrB;AAAA,EACA,YAAY,MAAY;AACvB,UAAM,SAAS,KAAK,YAAY,KAAK,EAAE;AACvC,SAAK,UAAU,WAAW,MAAM;AAC/B,UAAI,QAAQ;AACZ,iBAAW,QAAQ,OAAO;AAAO,iBAAS,IAAI;AAC9C,aAAO,SAAS;AAChB,WAAK;AAAA,QACJ,iBAAM,qBAAqB,OAAO,6BAA6B,UAC/D,KAAK,OAAO;AAAA,QACZ;AAAA,QACA,KAAK,YAAY,KAAK,WAAW,EAAE;AAAA,MACpC;AACA,WAAK,MAAM;AACX,WAAK,KAAK;AAAA,IACX,GAAG,KAAK,qBAAqB,KAAK,GAAI;AACtC,SAAK,YAAY,YAAY,MAAM;AAClC,YAAM,UAAU,OAAO,WAAW,QAAQ,WAAW,eAAe;AACpE,UAAI,YAAY,IAAI;AACnB,cAAM,WAAW,OAAO,iBAAiB;AACzC,cAAM,SAAU,OAAO,QAAQ,EAAE,WAAW,IAAI,MAAM;AACtD,cAAM,OAAQ,YAAc,KAAK,qBAAqB,KAAM;AAC5D,eAAO,SAAS,GAAG,kBAAkB,OAAO,2BAA2B,iCAAiC,OAAO,IAAI,gCAAgC,SAAS,kBAAkB;AAC9K,eAAO,kBAAkB,KAAK;AAAA,MAC/B;AAAA,IACD,GAAG,KAAK,mBAAmB,GAAI;AAAA,EAChC;AAAA,EACA,aAAa,MAAc;AAC1B,UAAM,QAAQ,KAAK,IAAI,EAAE,YAAY;AACrC,UAAM,aAAa,KAAK,QAAQ,KAAK,OAAO,EAAE,CAAY;AAC1D,UAAM,MAAM,CAAC,KAAK,GAAG,EAAE,SAAS,WAAW,OAAO,CAAC,CAAC;AACpD,QAAI,SAAS;AACb,QAAI,UAAU;AAAK,eAAS;AAC5B,QAAI,UAAU;AAAK,eAAS;AAC5B,QAAI,UAAU;AAAK,eAAS;AAC5B,QAAI,UAAU;AAAK,eAAS;AAC5B,WAAO,eAAe,aAAa,6BAA6B,MAAM,YAAY,gIAAgI,KAAK,wBAAwB,KAAK,+DAA+D,eAAe,KAAK,OAAO,EAAE,+GAA+G,cAAc,KAAK,OAAO,EAAE;AAAA,EAC5d;AAAA,EACA,WAAW,WAAW,OAAO;AAC5B,UAAM,UAAU,CAAC;AACjB,QAAI;AAAU,WAAK,SAAS,QAAQ;AACpC,QAAI,KAAK,OAAO,SAAS,IAAI;AAC5B,iBAAW,UAAU,OAAO,KAAK,KAAK,WAAW,GAAG;AACnD,YAAI,KAAK,YAAY,MAAM,EAAE,WAAW;AAAQ;AAChD,gBAAQ;AAAA,UACP,iBAAM,eAAe,KAAK,YAAY,MAAM,EAAE,mBAC9C,IAAI,KAAK,YAAY,MAAM,EAAE,MAAM,KAAK,IAAI;AAAA,QAC7C;AAAA,MACD;AAAA,IACD,WAAW,KAAK,OAAO,WAAW,IAAI;AACrC,iBAAW,UAAU,OAAO,KAAK,KAAK,WAAW,GAAG;AACnD,YAAI,KAAK,YAAY,MAAM,EAAE,WAAW,UAAU,KAAK,YAAY,MAAM,EAAE,UAAU,KAAK,OAAO;AAAQ;AACzG,gBAAQ;AAAA,UACP,iBAAM,eAAe,KAAK,YAAY,MAAM,EAAE,mBAC9C,IAAI,KAAK,YAAY,MAAM,EAAE,MAAM,KAAK,IAAI;AAAA,QAC7C;AAAA,MACD;AAAA,IACD,WAAW,KAAK,OAAO,WAAW,IAAI;AACrC,cAAQ,KAAK,WAAW,KAAK,OAAO,kBAAkB,KAAK,OAAO,MAAM,KAAK,IAAI,IAAI;AAAA,IACtF;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAa;AAClB,UAAM,kBAAkB,OAAO,KAAK,KAAK,WAAW,EAAE;AACtD,QAAI,kBAAkB,KAAK,gBAAgB;AAC1C,UAAI,KAAK,WAAW;AACnB,qBAAa,KAAK,SAAS;AAC3B,aAAK,YAAY;AAAA,MAClB;AACA,WAAK,KAAK,mDAAmD;AAC7D,WAAK,QAAQ;AACb;AAAA,IACD;AACA,QAAI;AAAM,WAAK,YAAY,iBAAM,WAAW,KAAK,IAAI;AACrD,SAAK,iBAAkB,mBAAmB,KAAK,oBAAoB,qBAAqB;AACxF,SAAK,KAAK,2BAA2B,KAAK,mBAAmB,IAAI;AAEjE,SAAK,cAAc,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;AAElD,UAAM,SAAS,oCAAqC,KAAK,cAAc,KAAK,gBAAgB,KAAK,eAAe,OAAQ,KAAK;AAC7H,SAAK,QAAQ;AAEb,SAAK,SAAS,QAAQ;AACtB,SAAK,SAAS,QAAQ;AACtB,SAAK,WAAW,WAAW,KAAK,OAAO,mBAAmB,KAAK,OAAO,MAAM,CAAC;AAE7E,eAAW,UAAU,OAAO,KAAK,KAAK,WAAW,GAAG;AACnD,WAAK,SAAS,KAAK,YAAY,MAAM,EAAE,KAAK,EAAE;AAC9C,WAAK,SAAS,KAAK,YAAY,MAAM,EAAE,KAAK,EAAE;AAC9C,WAAK,WAAW,iBAAM,qBAAqB,KAAK,YAAY,MAAM,EAAE,oBACnE,IAAI,KAAK,YAAY,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,YAAY,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,YAAY,MAAM,EAAE;AAAA,IAC7G;AAEA,SAAK,QAAQ,GAAG,SAAS,KAAK,WAAW,MAAM,EAAE;AACjD,SAAK,KAAK;AAAA,EACX;AAAA,EACA,IAAI,MAAmB,KAAc;AACpC,UAAM,QAAS,OAAO,KAAK,GAAG,MAAM;AACpC,QAAI,SAAS,MAAM;AAClB,WAAK,QAAQ;AACb,WAAK,QAAQ;AACb,aAAO;AAAA,IACR;AACA,QAAI,KAAK,UAAU,aAAa,OAAO,CAAC,OAAO;AAC9C,aAAO,KAAK;AAAA,QACX;AAAA,QACA;AAAA,MACD;AAAA,IACD;AACA,QAAI,UAAU,KAAK,WAAW;AAC9B,QAAI,OAAO;AACV,gBAAU,KAAK,WAAW,IAAI;AAC9B,WAAK,UAAU,iBAAM,WAAW,KAAK,IAAI;AACzC,UAAI,KAAK,aAAa;AACrB,aAAK,YAAY,KAAK,WAAW,EAAE,KAAK,+BAA+B,KAAK,aAAa;AAAA,MAC1F;AACA,UAAI,QAAQ,SAAS,GAAG;AACvB,aAAK,QAAQ,mCAAmC,OAAO,QAAW,OAAO,IAAI;AAAA,MAC9E,OAAO;AACN,aAAK,QAAQ,iBAAiB,KAAK,OAAO,QAAQ,MAAM,eAAe,QAAQ,KAAK,IAAI,KAAK,OAAO,QAAW,OAAO,IAAI;AAAA,MAC3H;AAAA,IACD;AAEA,QAAI,CAAC,SAAS,KAAK,UAAU,WAAW;AACvC,UAAI,QAAQ,SAAS,GAAG;AACvB,aAAK,QAAQ,mCAAmC,OAAO,QAAW,OAAO,IAAI;AAAA,MAC9E,OAAO;AACN,aAAK,QAAQ,iBAAiB,KAAK,OAAO,QAAQ,MAAM,eAAe,QAAQ,KAAK,IAAI,KAAK,OAAO,QAAW,OAAO,IAAI;AAAA,MAC3H;AAAA,IACD,WAAW,KAAK,UAAU,WAAW;AACpC,WAAK;AAAA,QACJ,iBAAM,+CAA+C,KAAK,WAC1D;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAEA,SAAK,QAAQ;AAEb,SAAK,QAAQ;AACb,WAAO;AAAA,EACR;AAAA,EACA,UAAU;AACT,QAAI,OAAO,KAAK,KAAK,WAAW,EAAE,QAAQ;AACzC,iBAAW,UAAU,OAAO,KAAK,KAAK,WAAW,GAAG;AACnD,aAAK,YAAY,MAAM,EAAE,QAAQ;AAAA,MAClC;AAAA,IACD;AACA,SAAK,eAAe;AACpB,SAAK,KAAK,OAAO;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,MAAY;AACf,QAAI,KAAK,UAAU;AAAW,aAAO,KAAK,aAAa,MAAM,+BAA+B;AAC5F,QAAI,CAAC,KAAK,YAAY,KAAK,EAAE;AAAG,aAAO,KAAK,aAAa,MAAM,mCAAmC;AAClG,QAAI,KAAK,gBAAgB,KAAK;AAAI,aAAO,KAAK,aAAa,MAAM,qBAAqB;AACtF,SAAK,YAAY,KAAK,EAAE,EAAE,YAAY;AACtC,SAAK,YAAY,KAAK,EAAE,EAAE,gBAAgB;AAE1C,SAAK,SAAS,KAAK,EAAE;AAAA,EACtB;AAAA,EACA,MAAM,MAAY;AACjB,UAAM,SAAS,KAAK,YAAY,KAAK,EAAE;AACvC,QAAI,KAAK,UAAU;AAAW,aAAO,KAAK,aAAa,MAAM,+BAA+B;AAC5F,QAAI,CAAC;AAAQ,aAAO,KAAK,aAAa,MAAM,mCAAmC;AAC/E,QAAI,KAAK,gBAAgB,KAAK;AAAI,aAAO,KAAK,aAAa,MAAM,qBAAqB;AACtF,WAAO,SAAS;AAChB,QAAI,QAAQ;AACZ,eAAW,QAAQ,OAAO;AAAO,eAAS,IAAI;AAC9C,UAAM,WAAW,iBAAM,qBAAqB,OAAO,6BAA6B,WAC/E,IAAI,OAAO,SAAS,OAAO,WAAW,KAAK,kBAAkB;AAE9D,SAAK,WAAW;AAChB,SAAK,QAAQ,UAAU,OAAO,OAAO,IAAI;AACzC,SAAK,MAAM;AAEX,SAAK,KAAK;AAAA,EACX;AAAA,EACA,SAAS,QAAgB;AACxB,QAAI,KAAK,KAAK,SAAS;AAAG,WAAK,OAAO,IAAI,cAAc,EAAE,QAAQ;AAClE,UAAM,SAAU,WAAW,WAAW,KAAK,SAAS,KAAK,YAAY,MAAM;AAC3E,QAAI,CAAC;AAAQ;AACb,WAAO,MAAM,KAAK,KAAK,KAAK,CAAC,CAAC;AAE9B,SAAK,KAAK,MAAM;AAEhB,QAAI,KAAK,KAAK,WAAW,GAAG;AAC3B,WAAK,QAAQ,SAAS,KAAK,OAAO,gEAAgE;AAClG,WAAK,OAAO,IAAI,cAAc,EAAE,QAAQ;AAAA,IACzC;AAEA,WAAO,SAAS,KAAK,cAAc,MAAM;AAEzC,QAAI,OAAO,MAAM,SAAS;AAAG;AAE7B,QAAI,WAAW,iBAAM,qBAAqB,OAAO,oCAChD,IAAI,OAAO,MAAM,OAAO,MAAM,SAAS,CAAC,OAAO,OAAO;AACvD,SAAK,WAAW;AAChB,QAAI,OAAO,MAAM,SAAS;AAAG,WAAK,QAAQ,UAAU,OAAO,OAAO,IAAI;AAEtE,QAAI,kBAAkB,iBAAiB;AACtC,UAAI,OAAO,SAAS,IAAI;AACvB,YAAI,QAAQ;AACZ,mBAAW,QAAQ,OAAO,OAAO;AAChC,mBAAS,IAAI;AAAA,QACd;AACA,mBAAW,iBAAM,qBAAqB,KAAK,OAAO,iCAAiC,UAAU,OAAO;AACpG,aAAK,WAAW;AAChB,aAAK,QAAQ,QAAQ;AACrB,aAAK,IAAI,IAAI;AACb;AAAA,MACD,WAAW,OAAO,WAAW,IAAI;AAChC,mBAAW,iBAAM,qBAAqB,KAAK,OAAO;AAClD,aAAK,WAAW;AAChB,aAAK,QAAQ,QAAQ;AACrB,aAAK,IAAI,IAAI;AACb;AAAA,MACD;AAAA,IACD,WAAW,OAAO,SAAS,IAAI;AAC9B,aAAO,SAAS;AAChB,UAAI,QAAQ;AACZ,iBAAW,QAAQ,OAAO,OAAO;AAChC,iBAAS,IAAI;AAAA,MACd;AACA,iBAAW,iBAAM,qBAAqB,OAAO,iCAAiC,UAAU,OAAO;AAC/F,WAAK,WAAW;AAChB,WAAK,QAAQ,UAAU,OAAO,OAAO,IAAI;AACzC,WAAK,MAAM;AAAA,IACZ,WAAW,OAAO,WAAW,IAAI;AAChC,aAAO,SAAS;AAChB,iBAAW,iBAAM,qBAAqB,OAAO;AAC7C,WAAK,WAAW;AAChB,WAAK,QAAQ,UAAU,OAAO,OAAO,IAAI;AACzC,WAAK,MAAM;AAAA,IACZ;AACA,QAAI,WAAW,KAAK;AAAQ,WAAK,YAAY,MAAM,EAAE,QAAQ,OAAO;AACpE,SAAK,KAAK;AAAA,EACX;AAAA,EACA,cAAc,UAAkB;AAC/B,UAAM,SAAU,aAAa,WAAW,KAAK,SAAS,KAAK,YAAY,QAAQ;AAC/E,QAAI,SAAS;AACb,QAAI,WAAW;AACf,eAAW,QAAQ,OAAO,MAAM,IAAI,OAAK,KAAK,CAAC,EAAE,YAAY,CAAC,GAAG;AAChE,UAAI,CAAC,MAAM,OAAO,IAAI,CAAC,GAAG;AACzB,kBAAU,OAAO,IAAI;AAAA,MACtB,WAAW,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AAC1C,kBAAU;AAAA,MACX,WAAW,SAAS,KAAK;AACxB,kBAAU;AACV;AAAA,MACD;AAAA,IACD;AAKA,WAAO,SAAS,MAAM,WAAW,GAAG;AACnC,gBAAU;AACV;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EACA,OAAO;AACN,SAAK,eAAe;AACpB,QACC,OAAO,KAAK,KAAK,WAAW,EAAE,OAAO,KAAK,KAAK,WAAW,EAAE,SAAS,CAAC,MAAM,KAAK,eACjF,KAAK,YAAY,KAAK,WAAW,EAAE,WAAW,WAC7C;AACD,UAAI,KAAK,OAAO,SAAS,IAAI;AAC5B,aAAK,SAAS,QAAQ;AAAA,MACvB,WAAW,KAAK,OAAO,UAAU,IAAI;AACpC,YAAI,QAAQ;AACZ,mBAAW,QAAQ,KAAK,OAAO,OAAO;AACrC,mBAAS,IAAI;AAAA,QACd;AACA,cAAM,WAAW,iBAAiB,KAAK,OAAO,6BAA6B,UAAU,KAAK,OAAO;AACjG,aAAK,WAAW;AAChB,aAAK,QAAQ,QAAQ;AACrB,aAAK,IAAI,IAAI;AAAA,MACd;AACA;AAAA,IACD;AACA,QAAI,KAAK,YAAY,KAAK,WAAW,EAAE,WAAW,WAAW;AAC5D,UAAI,MAAM;AACV,aAAO,KAAK,YAAY,OAAO,KAAK,KAAK,WAAW,EAAE,GAAG,CAAC,EAAE,WAAW,WAAW;AACjF;AAAA,MACD;AACA,WAAK,cAAc,OAAO,KAAK,KAAK,WAAW,EAAE,GAAG;AAAA,IACrD;AACA,QAAI,SAAS,SAAS,KAAK,YAAY,KAAK,WAAW,EAAE,4BAA4B,KAAK;AAC1F,cAAU,2BAA2B,KAAK,YAAY,KAAK,WAAW,EAAE;AACxE,eAAW,QAAQ,KAAK,YAAY,KAAK,WAAW,EAAE,OAAO;AAC5D,gBAAU,KAAK,aAAa,IAAI;AAAA,IACjC;AACA,cAAU,gBAAgB,KAAK,YAAY,KAAK,WAAW,EAAE,SAAU,KAAK,YAAY,KAAK,WAAW,EAAE,WAAW,KAAK,2BAA2B;AACrJ,cAAU;AAEV,SAAK,YAAY,KAAK,WAAW,EAAE,SAAS,sBAAsB,KAAK,KAAK,gCAAgC;AAC5G,SAAK,YAAY,KAAK,WAAW,EAAE,SAAS,MAAM;AAClD,SAAK,YAAY,KAAK,WAAW,EAAE,aAAa;AAEhD,SAAK,YAAY,KAAK,YAAY,KAAK,WAAW,EAAE,IAAI;AAAA,EACzD;AACD;AAEA,MAAM,wBAAwB,MAAM,eAA0B;AAAA,EAc7D,YAAY,MAAY,MAAiB;AACxC,UAAM,MAAM,IAAI;AAChB,SAAK,OAAO;AAEZ,SAAK,QAAQ,CAAC;AACd,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,SAAS;AAEd,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,aAAa;AAClB,SAAK,iBAAiB,KAAK,KAAK,qBAAqB;AAAA,EACtD;AAAA,EACA,kBAAkB;AACjB,SAAK,iBAAiB,KAAK,KAAK,qBAAqB;AAAA,EACtD;AACD;AAEA,MAAM,gBAAgB;AAAA,EAKrB,cAAc;AACb,SAAK,QAAQ,CAAC;AACd,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACb;AACD;AAEA,MAAM,cAAc;AAAA,EAEnB,cAAc;AACb,SAAK,OAAO;AAAA,MACX;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC5D;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACxE;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACxE;AAAA,MAAO;AAAA,MAAO;AAAA,MAAO;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAC3E;AAAA,MAAM;AAAA,IACP;AAAA,EACD;AAAA,EACA,UAAU;AACT,WAAO,iBAAM,QAAQ,KAAK,IAAI;AAAA,EAC/B;AACD;AAEO,MAAM,WAA8B;AAAA,EAC1C,KAAK;AAAA,EACL,WAAW;AAAA,IACV,KAAK;AAAA,IACL,OAAO,QAAQ,MAAM,MAAM;AAC1B,aAAO,KAAK,YAAY;AACxB,WAAK,SAAS,YAAY,MAAM,IAAI;AACpC,UAAI,KAAK;AAAM,eAAO,KAAK,WAAW,+CAA+C;AACrF,UAAI,KAAK,SAAS;AAAmB,eAAO,KAAK,WAAW,+CAA+C;AAC3G,YAAM,mBAAmB,SAAS,WAAW,MAAM,IAAI;AACvD,UAAI,MAAM,gBAAgB,KAAK,oBAAoB,KAAM,mBAAmB,KAAK,MAAQ,KAAK,sBAAsB;AACnH,eAAO,KAAK,WAAW,sEAAsE;AAAA,MAC9F;AAEA,WAAK,iBAAiB,sCAAsC,KAAK,OAAO;AACxE,WAAK,OAAO,kBAAkB;AAC9B,WAAK,OAAO,IAAI,UAAU,MAAM,MAAM,gBAAgB;AAAA,IACvD;AAAA,IACA,MAAM,QAAQ,MAAM,MAAM;AACzB,aAAO,KAAK,YAAY;AACxB,WAAK,SAAS,YAAY,MAAM,IAAI;AACpC,YAAM,OAAO,KAAK,YAAY,SAAS;AACvC,UAAI,KAAK,UAAU;AAAW,eAAO,KAAK,WAAW,6CAA6C;AAElG,WAAK,iBAAiB,wCAAwC,KAAK,OAAO;AAC1E,WAAK,OAAO,iBAAiB;AAC7B,WAAK,MAAM,IAAI;AAAA,IAChB;AAAA,IACA,UAAU;AAAA,IACV,IAAI,QAAQ,MAAM,MAAM,YAAY,KAAK;AACxC,aAAO,KAAK,YAAY;AACxB,WAAK,SAAS,YAAY,MAAM,IAAI;AACpC,YAAM,OAAO,KAAK,YAAY,SAAS;AACvC,YAAM,QAAQ,QAAQ,aAAa,cAAc;AAEjD,YAAM,MAAM,KAAK,IAAI,MAAM,GAAG;AAC9B,UAAI,KAAK;AACR,aAAK,iBAAiB,6BAA6B,iBAAiB,KAAK,OAAO;AAChF,aAAK,OAAO,eAAe;AAAA,MAC5B;AAAA,IACD;AAAA,IACA,IAAI,QAAQ,MAAM,MAAM;AACvB,aAAO,KAAK,YAAY;AACxB,YAAM,OAAO,KAAK,YAAY,SAAS;AACvC,WAAK,IAAI,IAAI;AAAA,IACd;AAAA,IACA,MAAM,QAAQ,MAAM,MAAM;AACzB,aAAO,KAAK,YAAY;AACxB,YAAM,OAAO,KAAK,YAAY,SAAS;AACvC,WAAK,MAAM,IAAI;AAAA,IAChB;AAAA,IACA,MAAM,QAAQ,MAAM,MAAM;AACzB,aAAO,KAAK,YAAY;AACxB,YAAM,OAAO,KAAK,YAAY,SAAS;AACvC,WAAK,MAAM,IAAI;AAAA,IAChB;AAAA,IACA,GAAG;AAAA,IACH,KAAK,QAAQ,MAAM,MAAM;AACxB,aAAO,KAAK,MAAM,WAAW;AAAA,IAC9B;AAAA,IACA,GAAG;AAAA,IACH,MAAM,QAAQ,MAAM,MAAM;AACzB,aAAO,KAAK,MAAM,YAAY;AAAA,IAC/B;AAAA,IACA,YAAY;AAAA,IACZ,SAAS,QAAQ,MAAM,MAAM,YAAY,KAAK;AAC7C,aAAO,KAAK,YAAY;AACxB,YAAM,OAAO,KAAK,YAAY,SAAS;AACvC,UAAI,QAAQ,YAAY;AACvB,aAAK,SAAS,IAAI;AAAA,MACnB,WAAW,QAAQ,cAAc;AAChC,aAAK,WAAW,IAAI;AAAA,MACrB;AAAA,IACD;AAAA,IACA,QAAQ,QAAQ,MAAM,MAAM;AAC3B,aAAO,KAAK,YAAY;AACxB,WAAK,SAAS,kBAAkB,MAAM,IAAI;AAC1C,UAAI,KAAK,SAAS,mBAAmB;AACpC,eAAO,KAAK,WAAW,6CAA6C;AAAA,MACrE;AACA,WAAK,SAAS,oBAAoB;AAClC,WAAK,aAAa;AAClB,WAAK,UAAU,4CAA4C;AAAA,IAC5D;AAAA,IACA,OAAO,QAAQ,MAAM,MAAM;AAC1B,aAAO,KAAK,YAAY;AACxB,WAAK,SAAS,kBAAkB,MAAM,IAAI;AAC1C,UAAI,CAAC,KAAK,SAAS,mBAAmB;AACrC,eAAO,KAAK,WAAW,4CAA4C;AAAA,MACpE;AAEA,aAAO,KAAK,SAAS;AACrB,WAAK,aAAa;AAClB,WAAK,UAAU,2CAA2C;AAAA,IAC3D;AAAA,IACA,IAAI;AAAA,IACJ,KAAK,QAAQ,MAAM,MAAM;AACxB,aAAO,KAAK,MAAM,iBAAiB;AAAA,IACpC;AAAA,EACD;AAAA,EACA,eAAe;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AACO,MAAM,eAAqC,WAAS;AAAA,EAC1D,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,SAAS;AAAA,IACR,CAAC,YAAY,KAAK,SAAS,qBAAqB,mBAAmB;AAAA,IACnE,CAAC,WAAW,CAAC,KAAK,SAAS,qBAAqB,kBAAkB;AAAA,EACnE;AACD;", "names": [] }