Compare commits

...

1 Commits

Author SHA1 Message Date
Peter Bakkum
3a67f45701 new spinner animation 2025-06-07 21:44:29 -07:00
3 changed files with 134 additions and 50 deletions

View File

@@ -1,4 +1,5 @@
import { log } from "../../utils/logger/log.js";
import { useSpinner } from "../../utils/terminal-chat-utils.js";
import { Box, Text, useInput, useStdin } from "ink";
import React, { useState } from "react";
import { useInterval } from "use-interval";
@@ -75,34 +76,7 @@ export default function TerminalChatInputThinking({
{ isActive: active },
);
// Custom ball animation including the elapsed seconds
const ballFrames = [
"( ● )",
"( ● )",
"( ● )",
"( ● )",
"( ●)",
"( ● )",
"( ● )",
"( ● )",
"( ● )",
"(● )",
];
const [frame, setFrame] = useState(0);
useInterval(() => {
setFrame((idx) => (idx + 1) % ballFrames.length);
}, 80);
// Preserve the spinner (ball) animation while keeping the elapsed seconds
// text static. We achieve this by rendering the bouncing ball inside the
// parentheses and appending the seconds counter *after* the spinner rather
// than injecting it directly next to the ball (which caused the counter to
// move horizontally together with the ball).
const frameTemplate = ballFrames[frame] ?? ballFrames[0];
const frameWithSeconds = `${frameTemplate} ${thinkingSeconds}s`;
const frameWithSeconds = useSpinner(thinkingSeconds);
return (
<Box flexDirection="column" gap={1}>

View File

@@ -21,6 +21,7 @@ import {
loadCommandHistory,
addToHistory,
} from "../../utils/storage/command-history.js";
import { useSpinner } from "../../utils/terminal-chat-utils.js";
import { clearTerminal, onExit } from "../../utils/terminal.js";
import { Box, Text, useApp, useInput, useStdin } from "ink";
import { fileURLToPath } from "node:url";
@@ -896,28 +897,7 @@ function TerminalChatInputThinking({
setDots((prev) => (prev.length < 3 ? prev + "." : ""));
}, 500);
// Spinner frames with embedded seconds
const ballFrames = [
"( ● )",
"( ● )",
"( ● )",
"( ● )",
"( ●)",
"( ● )",
"( ● )",
"( ● )",
"( ● )",
"(● )",
];
const [frame, setFrame] = useState(0);
useInterval(() => {
setFrame((idx) => (idx + 1) % ballFrames.length);
}, 80);
// Keep the elapsedseconds text fixed while the ball animation moves.
const frameTemplate = ballFrames[frame] ?? ballFrames[0];
const frameWithSeconds = `${frameTemplate} ${thinkingSeconds}s`;
const frameWithSeconds = useSpinner(thinkingSeconds);
// ---------------------------------------------------------------------
// Raw stdin listener to catch the case where the terminal delivers two

View File

@@ -0,0 +1,130 @@
import { useState } from "react";
import { useInterval } from "use-interval";
const frames = [
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;87m░\x1b[0m",
"\x1b[38;5;177m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;117m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;177m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;153m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;177m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;87m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;87m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;147m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;87m▒\x1b[0m\x1b[38;5;177m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;87m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;87m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;87m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;147m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
"\x1b[38;5;87m░\x1b[0m\x1b[38;5;177m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
"\x1b[38;5;117m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
"\x1b[38;5;147m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;147m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
"\x1b[38;5;177m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;117m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;177m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;225m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;147m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;219m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;177m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;225m▒\x1b[0m\x1b[38;5;213m░\x1b[0m",
"\x1b[38;5;147m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;219m▒\x1b[0m\x1b[38;5;183m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;87m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;225m▓\x1b[0m\x1b[38;5;213m▒\x1b[0m\x1b[38;5;189m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;189m▒\x1b[0m\x1b[38;5;213m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;87m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;225m█\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;189m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;189m▓\x1b[0m\x1b[38;5;213m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;87m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;219m█\x1b[0m\x1b[38;5;219m█\x1b[0m\x1b[38;5;183m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;189m█\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;201m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;201m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;219m█\x1b[0m\x1b[38;5;219m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;231m░\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;189m█\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;201m▒\x1b[0m\x1b[38;5;189m░\x1b[0m",
"\x1b[38;5;231m░\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;225m▓\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;189m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;201m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;231m░\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;219m▓\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;177m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;231m░\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;189m█\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;201m▓\x1b[0m\x1b[38;5;189m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;231m░\x1b[0m\x1b[38;5;225m▒\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;189m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;231m░\x1b[0m\x1b[38;5;219m▒\x1b[0m\x1b[38;5;183m▓\x1b[0m\x1b[38;5;219m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;201m█\x1b[0m\x1b[38;5;177m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;231m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;201m█\x1b[0m\x1b[38;5;189m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;225m░\x1b[0m\x1b[38;5;213m▒\x1b[0m\x1b[38;5;189m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;219m░\x1b[0m\x1b[38;5;183m▒\x1b[0m\x1b[38;5;219m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;201m█\x1b[0m\x1b[38;5;177m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;201m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;213m░\x1b[0m\x1b[38;5;189m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;189m░\x1b[0m\x1b[38;5;213m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;201m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;201m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;189m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;153m░\x1b[0m",
"\x1b[38;5;213m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;201m▓\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;177m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;201m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;147m▒\x1b[0m\x1b[38;5;147m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;201m▒\x1b[0m\x1b[38;5;183m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;177m▒\x1b[0m\x1b[38;5;117m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;201m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;87m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;147m▓\x1b[0m\x1b[38;5;147m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;201m░\x1b[0m\x1b[38;5;189m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;177m▓\x1b[0m\x1b[38;5;117m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;201m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;117m█\x1b[0m\x1b[38;5;177m▓\x1b[0m\x1b[38;5;87m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;177m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;147m█\x1b[0m\x1b[38;5;147m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;189m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;117m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;177m█\x1b[0m\x1b[38;5;87m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;147m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;177m█\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;147m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;153m▓\x1b[0m\x1b[38;5;177m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;177m▓\x1b[0m\x1b[38;5;117m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;231m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;153m▒\x1b[0m\x1b[38;5;177m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;189m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;177m▒\x1b[0m\x1b[38;5;117m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;177m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;87m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;147m░\x1b[0m\x1b[38;5;147m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;183m▒\x1b[0m\x1b[38;5;219m░\x1b[0m",
"\x1b[38;5;177m░\x1b[0m\x1b[38;5;117m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;177m▒\x1b[0m\x1b[38;5;189m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;87m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;147m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;183m▓\x1b[0m\x1b[38;5;219m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;117m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;189m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
"\x1b[38;5;87m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;183m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;189m▓\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;153m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;171m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;201m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;147m▒\x1b[0m\x1b[38;5;171m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;171m▒\x1b[0m\x1b[38;5;141m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;201m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;189m▓\x1b[0m\x1b[38;5;213m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;147m▓\x1b[0m\x1b[38;5;171m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;177m▓\x1b[0m\x1b[38;5;189m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;171m▓\x1b[0m\x1b[38;5;147m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;201m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;189m▒\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;147m█\x1b[0m\x1b[38;5;171m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;177m▒\x1b[0m\x1b[38;5;189m▓\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;171m█\x1b[0m\x1b[38;5;147m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;231m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;201m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;87m░\x1b[0m",
"\x1b[38;5;183m░\x1b[0m\x1b[38;5;219m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;141m█\x1b[0m\x1b[38;5;171m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;177m░\x1b[0m\x1b[38;5;189m▒\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;171m█\x1b[0m\x1b[38;5;147m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;207m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;231m▓\x1b[0m\x1b[38;5;117m█\x1b[0m\x1b[38;5;201m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;87m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;219m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;141m█\x1b[0m\x1b[38;5;171m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;189m░\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;171m█\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;231m▒\x1b[0m\x1b[38;5;117m▓\x1b[0m\x1b[38;5;201m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;87m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;141m▓\x1b[0m\x1b[38;5;141m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;231m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;201m▓\x1b[0m\x1b[38;5;117m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;153m▒\x1b[0m\x1b[38;5;171m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;171m▒\x1b[0m\x1b[38;5;141m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;201m▒\x1b[0m\x1b[38;5;117m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;147m░\x1b[0m\x1b[38;5;171m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;171m░\x1b[0m\x1b[38;5;141m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;201m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;87m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;171m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;147m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;87m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;87m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;123m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;147m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;177m░\x1b[0m",
"\x1b[38;5;87m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;147m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;177m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;117m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;123m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;147m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;201m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;213m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;201m░\x1b[0m",
"\x1b[38;5;195m░\x1b[0m\x1b[38;5;123m▒\x1b[0m\x1b[38;5;159m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;207m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;201m▒\x1b[0m\x1b[38;5;177m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;195m█\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;201m▒\x1b[0m\x1b[38;5;189m░\x1b[0m",
"\x1b[38;5;123m░\x1b[0m\x1b[38;5;159m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;153m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m▓\x1b[0m\x1b[38;5;207m▒\x1b[0m\x1b[38;5;195m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;159m█\x1b[0m\x1b[38;5;183m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;201m▓\x1b[0m\x1b[38;5;177m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
"\x1b[38;5;159m░\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;195m▓\x1b[0m\x1b[38;5;123m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;207m█\x1b[0m\x1b[38;5;201m▓\x1b[0m\x1b[38;5;195m▒\x1b[0m\x1b[38;5;231m░\x1b[0m",
];
export function useSpinner(thinkingSeconds: number, intervalMs = 40): string {
const [frame, setFrame] = useState(0);
useInterval(() => setFrame((idx) => (idx + 1) % frames.length), intervalMs);
const frameTemplate = frames[frame] ?? frames[0];
return `${frameTemplate} ${thinkingSeconds}s`;
}