SLOPSHOPPER

usage-band-mod

A one-line band above the prompt with model, cost and bars for context, the 5-hour session, the week and per-model limits, plus a native settings window on…

bandcommandtoastprocessnetworktimer
★ 5v0.4.4MITupdated 2026-10-23jonathanlocks/usage-band-mod
A shopper browsing a rack in a slop shop
Preview · a replayed session in a sandbox
claude · ~/work/app · usage-band-mod
› fix the failing auth test and add an audit log call ⏺ Read(src/auth.ts) ⎿ Read 6 lines ⏺ Update(src/auth.ts) ⎿ Added 2 lines, removed 1 line ⏺ Bash(bun test) ⎿ 3 pass, 1 fail ● Done. refresh now rejects expired claims and logs an audit event. ✻ Worked for 42s · done 4:20 PM › /usage-band ⎿ usage-band-mod: Usage band hidden. ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › ? for shortcuts
README

<img src="arte/mascote-animado.svg" width="108" height="63" alt="Animated pixel crab mascot">

Usage Band

A Claude Code mod that keeps your limits in sight: context window, 5-hour session, week and per-model usage, in one line above the prompt.

GitHub stars License: MIT Claude Code mod Settings window: macOS 26 · Windows (preview)-black) CI

Install · What it shows · Meet the mascot · What leaves your machine · Settings window

<img src="docs/band-terminal.svg" width="100%" alt="Claude Code in a terminal. Above the prompt box, one line reads: a small orange crab face, Opus 5.5, $34.63, Context 56%, 5h 25%, 7d 4%, Fable 2%, each with a solid bar">

<sub>In the terminal: the band line is the mod's real output at 110 columns with sample numbers, drawn cell by cell in Claude Code's dark theme colors; the window around it is an illustration.</sub>

<img src="docs/band-desktop.png" width="100%" alt="The band in the Claude desktop app: pixel crab mascot, Opus 5.5, cost R$ 372,71, and bars for Contexto 32%, 5h 36%, 7d 48% and Fable 13%, then the settings gear and the close mark">

<sub>In the Claude desktop app.</sub>


Status: early release (0.4.4), maintained by one person. In daily use on macOS 26.6, in the terminal and in the desktop app. On 2026-10-22, a clean install from GitHub loaded on Claude Code 2.1.295 (which some desktop apps still bundle), 2.1.299, 2.1.304 and 2.1.306, and CI checks the oldest and the newest on every push. On Windows, the first user (Windows 11, x64) ran it in the desktop app and in the claude CLI: the band showed up, and the settings window opened, but behind the Claude window; 0.4.2 fixes that. The fix and the window were checked on Windows Server 2022 and 2025 and Windows 11 ARM runners, not yet on that PC. The settings window needs macOS 26 or Windows 10/11 with .NET Framework 4.8.

What it shows

  • Model and session cost. The cost is what the session would cost at API prices. On a Pro or Max subscription it is an equivalent, not a charge. Show it in US dollars, Brazilian reais or euros. Converted values use market rates, not what your card charges.
  • Context window used by the current session.
  • 5-hour session and weekly limits of your subscription. These two bars only appear in subscription sessions; with an API key, Bedrock or Vertex they stay hidden instead of sitting empty.
  • Per-model weekly limit, such as Fable, when your account has one.
  • Colors follow the level: green below 60%, yellow from 60%, red from 85%.
  • Narrow terminals keep the line on one row. Space runs out in this order: the reset times and the context tokens, then the bars (each segment shrinks to a short label and its percentage), then the cost, the mascot and the model, and only then the last segments.
  • Reset times next to the 5-hour, weekly and per-model bars (↻ 2h 10m), and the tokens used next to the context bar (112k/200k), when the line has room.

Meet the mascot

A pixel crab sits at the start of the band and runs through 13 gestures in a 56-second loop. Pick animated, still or hidden; it stays still when your system asks for reduced motion. In the terminal, which has no pictures, it is a one-line face: arms, an orange body and two black eyes.

| | | | | | |:-:|:-:|:-:|:-:|:-:| | <img src="docs/gestures/laptop.svg" width="96" alt="Typing on a laptop"><br><sub>Laptop</sub> | <img src="docs/gestures/cafe.svg" width="96" alt="Sipping coffee"><br><sub>Coffee</sub> | <img src="docs/gestures/danca.svg" width="96" alt="Dancing with music notes"><br><sub>Dance</sub> | <img src="docs/gestures/oculos.svg" width="96" alt="Sunglasses drop down and shine"><br><sub>Shades</sub> | <img src="docs/gestures/festa.svg" width="96" alt="Party hat and confetti"><br><sub>Party</sub> | | <img src="docs/gestures/dormir.svg" width="96" alt="Napping with Zzz, then waking up"><br><sub>Nap</sub> | <img src="docs/gestures/caranguejo.svg" width="96" alt="Walking sideways"><br><sub>Crab walk</sub> | <img src="docs/gestures/coracao.svg" width="96" alt="A heart floats up"><br><sub>Heart</sub> | <img src="docs/gestures/ideia.svg" width="96" alt="A star blinks: an idea"><br><sub>Idea</sub> | <img src="docs/gestures/esconde.svg" width="96" alt="Hides below the edge, peeks and jumps back"><br><sub>Peekaboo</sub> | | <img src="docs/gestures/acenar.svg" width="96" alt="Waving"><br><sub>Wave</sub> | <img src="docs/gestures/pulinho.svg" width="96" alt="Two little hops"><br><sub>Hop</sub> | <img src="docs/gestures/olhar.svg" width="96" alt="Looking around"><br><sub>Look around</sub> | | |

Install

In Claude Code, in a terminal:

/plugin install usage-band-mod --marketplace jonathanlocks/usage-band-mod

In the Claude desktop app, where /plugin is not available: click + next to the prompt box, then Plugins, Add marketplace with jonathanlocks/usage-band-mod, then Add plugin.

From a shell:

claude plugin install usage-band-mod --marketplace jonathanlocks/usage-band-mod

The install screen asks for the options below. Change them later in /config, under usage-band-mod, or in the settings window on macOS and Windows.

Step-by-step guides, written so an agent can follow them: INSTALL-MACOS.md · INSTALL-WINDOWS.md.

Commands

CommandWhat it does
/usage-bandShows or hides the band. The × on the band hides it too.
/usage-settingsOpens the settings window (macOS 26; Windows 10/11 as a preview, see Status). In the desktop app, the ⚙ on the band does the same.

With the language set to Portuguese, the commands are /uso-barra and /uso-ajustes.

Options

OptionValuesDefault
Languageen, pten
CurrencyUSD, BRL, EURUSD
Mascotanimado (animated), parado (still), oculto (hidden)animado
Per-model weekly limiton, offon

What leaves your machine

WhereWhenWhat
api.anthropic.com/api/oauth/usageAt most every 10 minutes, only with the per-model limit onA GET with your subscription login. Claude Code attaches the token; the mod never sees it.
api.coinbase.com/v2/exchange-ratesAt most every 6 hours, only when the currency is not USDA GET with no login. After a failure it waits 5 minutes, then 30 minutes, then 2 hours. A rate older than 3 days is not used.

Nothing about your conversations, projects or files is sent. With CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC set, the mod makes no requests at all.

[!NOTE] The per-model limit reads an internal Anthropic endpoint with no public documentation. It can change or stop working without notice; if it does, that bar disappears. Turn the option off if you would rather not use it.

When to use something else

  • For a one-off look at your limits, Claude Code's own /usage is enough.
  • For reports across past sessions and days, use a log analyzer such as ccusage. This mod only shows the current session and your live limits; it keeps no history.

Settings window (macOS and Windows)

| | | |:-:|:-:| | <img src="docs/ajustes-en.png" width="100%" alt="Settings window on macOS 26: a preview of the band, then language, cost currency, mascot style and the per-model weekly limit switch, on Liquid Glass"> | <img src="docs/ajustes-windows-en.png" width="100%" alt="Settings window on Windows in the dark theme, rendered by the app: the same preview of the band and the same four settings"> | | <sub>macOS 26, Liquid Glass</sub> | <sub>Windows, dark theme: the window's content rendered at 2× by the app's --print on a CI runner (Windows Server 2025). The title bar strip is drawn by the app; the real one belongs to Windows.</sub> |

macOS

macos/PainelDeUso.app is a small SwiftUI app built from macos/Sources/PainelDeUso.swift. It does not use the network. It talks to the mod only through standard output, one JSON line per change, and changes apply to the band right away. Its only file output is a PNG, and only when you run it by hand with the developer flag --print.

The repository ships the app already built (universal, ad-hoc signed), so you do not need Xcode. To check that the shipped app matches this source, build it yourself. The script builds in a temporary folder, compares the result with the published SHA-256 in macos/PainelDeUso.sha256 and prints OK or FAILED; the shipped app is left as it is:

./macos/build.sh

The published hash comes from Swift 6.4 (Xcode command line tools with the macOS 26 SDK). Another Swift version can produce a different binary, and then the check fails even though the source is the same.

Windows

windows/PainelDeUso.exe is a small WPF app built from windows/Sources on .NET Framework 4.8, which Windows 10 (1903 and later) and Windows 11 already include; nothing to install. It follows the system theme, high contrast and reduced motion, works with the keyboard, and gives every control a name for screen readers such as Narrator; all of that was checked on CI runners, not on a person's PC. On Windows 11 it asks the system for the Mica background: the runners accepted the request but drew a solid color, so Mica has not been seen on screen yet. Windows 10 gets a solid background (rendered sample). It does not use the network and talks to the mod only through standard output, the same JSON lines as on the Mac. Its only file output is a PNG with the developer flag --print.

Not code-signed. The executable has no digital signature and has not been tested against SmartScreen, Smart App Control or antivirus software. On Windows 11 with Smart App Control on, Windows may refuse to run it, and Smart App Control has no per-app exception. If the window does not open, /usage-settings says so and points to /config, which has the same options; INSTALL-WINDOWS.md shows how to tell whether Smart App Control is the cause.

To check the shipped executable against the source, install the .NET SDK pinned in windows/global.json and run one of these, in PowerShell 7 or in the Windows PowerShell 5.1 that comes with Windows:

pwsh windows/build.ps1
powershell -ExecutionPolicy Bypass -File windows\build.ps1

The build is deterministic: CI compiles it on two Windows images and compares both with windows/PainelDeUso.sha256.

On Linux, in WSL, or on macOS before 26, use /config. The options are the same.

Development

claude plugin validate .
claude plugin test .
claude --plugin-dir .
pwsh windows/build.ps1   # on Windows, with the .NET SDK from windows/global.json (or powershell -File, see above)

The mascot is drawn frame by frame in arte/gerar_mascote.py:

python3 arte/gerar_mascote.py            # writes hooks/mascote.ts and arte/mascote-animado.svg
python3 arte/gerar_mascote.py --docs     # also writes docs/gestures/<gesture>.svg for this README
python3 arte/gerar_mascote.py --previa   # also writes arte/previa.html with every gesture
python3 arte/gerar_mascote.py --check    # fails if any of those files is out of date

tsconfig.json extends .claude-plugin/types/tsconfig.json, which Claude Code writes when it loads the mod from a watched plugin folder. On a fresh clone, write the types once and then run tsc (the first command may answer Not logged in; the types are written anyway):

CLAUDE_CODE_PLUGIN_DIR_WATCH=1 claude --plugin-dir . -p ok
npx -y -p typescript@5.9.3 tsc -p .

GitHub Actions runs ci.yml on every push: validate, test and type-check on Linux, macOS and Windows, and again on engine 2.1.295 (the one some desktop apps bundle); check both published hashes, the mascot files and that no file has CRLF line endings; rebuild PainelDeUso.exe on two Windows images and compare it with the published hash; on the exe just built, talk to it the way the mod does, check that it opens in front of the window that asked for it, and scan its accessibility tree; and install the mod from PowerShell. capturas.yml runs by hand and produces PNGs of the Windows window in light and dark, English and Portuguese, with the Windows 11 and the Windows 10 path, real screenshots (light, dark, high contrast, keyboard focus), a glyph check of the band's characters in the legacy console and in Windows Terminal (a script prints them; it is not a Claude Code session), and an accessibility scan. The scripts in windows/ci/ that change system settings refuse to run outside GitHub Actions. In a fork: gh workflow run capturas.yml, then download the artifacts with gh run download.

Changes are listed in CHANGELOG.md.

Star history

<a href="https://star-history.com/#jonathanlocks/usage-band-mod&Date"> <img alt="Star history chart for jonathanlocks/usage-band-mod" src="https://api.star-history.com/svg?repos=jonathanlocks/usage-band-mod&type=Date"> </a>

License

The code is MIT. The mascot drawings are fan art of Clawd, the Claude Code mascot, and are not covered by the MIT License.

This is an independent project, not made, endorsed or supported by Anthropic. Claude, Claude Code and Clawd are trademarks of Anthropic.

Source 9 files
hooks/register.tsx 447 lines
1// usage-band-mod: banda de uma linha acima do prompt com modelo, custo e barras de contexto,
2// sessão de 5 horas, semana e limite por modelo; no Mac e no Windows, uma janela de ajustes.
3// Tudo o que chama $ mora neste arquivo: motores mais antigos do Claude Code (o 2.1.295 que vem no
4// app desktop) recusam o módulo inteiro quando $ é passado a uma função importada de outro arquivo.
5// ./fontes, ./janela e ./prefs trazem só a parte pura; os desenhos vêm de ./ui.
6import { atom, read, update } from 'claude-code'
7import type { EngineInterface, Register } from 'claude-code'
8
9import type { Cambio, Leitura, LeituraModelos, Moeda, Preferencias } from '../types'
10import {
11  CAMBIO_URL,
12  CHAVE_CAMBIO,
13  CHAVE_MODELOS,
14  INTERVALO_MODELOS,
15  TRAVA,
16  USO_URL,
17  VALIDADE_CAMBIO,
18  cambioValido,
19  lerCambio,
20  lerModelos,
21  modelosValidos,
22  montarLeitura,
23  proximaTentativa,
24  silencio,
25} from './fontes'
26import type { Uso } from './fontes'
27import { CAMPOS, CHAVE_AJUSTE, PRAZO_PRONTO, amostra, caminhoDoApp, lerLinha, pendenteValido, situacao, temDotNet48 } from './janela'
28import type { Abertura, Pendente, Plataforma } from './janela'
29import { deOpcoes, iguais } from './prefs'
30import { textos } from './textos'
31import { banda } from './ui'
32import type { Contexto } from './ui'
33
34const leitura = atom({ plugin: 'usage-band-mod', key: 'leitura' } as const, null)
35const modelos = atom({ plugin: 'usage-band-mod', key: 'modelos' } as const, null)
36const cambio = atom({ plugin: 'usage-band-mod', key: 'cambio' } as const, null)
37const ajuste = atom({ plugin: 'usage-band-mod', key: 'ajuste' } as const, null)
38const oculta = atom({ plugin: 'usage-band-mod', key: 'oculta' } as const, false)
39const relogio = atom({ plugin: 'usage-band-mod', key: 'relogio' } as const, 0)
40const sistema = atom({ plugin: 'usage-band-mod', key: 'sistema' } as const, null)
41const CHAVE_OCULTA = 'oculta'
42
43async function silencioDeRede($: EngineInterface): Promise<boolean> {
44  return silencio(await $.env.get('CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC'))
45}
46
47// ---------- uso da sessão ----------
48
49// Grava só quando algo mudou: cada gravação redesenha a banda.
50async function guardarLeitura($: EngineInterface, nova: Leitura): Promise<void> {
51  const atual = await read($, leitura)
52  if (atual !== null && JSON.stringify(atual) === JSON.stringify(nova)) return
53  await update($, leitura, () => nova)
54}
55
56async function medir($: EngineInterface, uso?: Uso): Promise<void> {
57  try {
58    const u = uso ?? (await $.session.usage())
59    const nova = montarLeitura(u, await $.session.model())
60    await guardarLeitura($, nova)
61  } catch {
62    // Sem leitura agora; mantém a última.
63  }
64}
65
66// ---------- limite por modelo ----------
67
68async function buscarModelos($: EngineInterface, agora: number): Promise<LeituraModelos> {
69  const falha = (estado: LeituraModelos['estado'], detalhe: string): LeituraModelos => ({ em: agora, lidoEm: null, estado, detalhe, limites: [] })
70  try {
71    const cred = await $.session.authorize()
72    if (cred === null || cred.kind !== 'bearer') return falha('sem-credencial', '')
73    const r = await $.http.fetch(USO_URL, { auth: cred.handle, headers: { 'anthropic-beta': 'oauth-2025-04-20' } })
74    if (!r.ok) return falha('recusado', String(r.status))
75    return { em: agora, lidoEm: agora, estado: 'ok', detalhe: '', limites: lerModelos(r.text) }
76  } catch (erro) {
77    return falha('erro', erro instanceof Error ? erro.message.slice(0, 120) : '')
78  }
79}
80
81let buscandoDesde = 0
82
83// No máximo uma leitura por INTERVALO_MODELOS, contando todas as sessões abertas (a leitura fica no $.store).
84async function medirModelos($: EngineInterface): Promise<void> {
85  const agora = await $.clock.now()
86  if (agora - buscandoDesde < TRAVA) return
87  buscandoDesde = agora
88  try {
89    const recente = (m: LeituraModelos | null): boolean => m !== null && agora - m.em < INTERVALO_MODELOS
90    const naMemoria = await read($, modelos)
91    if (recente(naMemoria) && naMemoria?.estado === 'ok') return
92    // Depois de uma falha desta sessão, o store ainda pode trazer a leitura que outra sessão acabou de fazer.
93    const guardada = modelosValidos(await $.store.get(CHAVE_MODELOS))
94    if (guardada !== null && recente(guardada)) {
95      if (JSON.stringify(guardada) !== JSON.stringify(naMemoria)) await update($, modelos, () => guardada)
96      return
97    }
98    // A falha recente desta sessão segura a próxima tentativa, mesmo sem nada no store.
99    if (recente(naMemoria)) return
100    if (await silencioDeRede($)) return
101    const nova = await buscarModelos($, agora)
102    // Uma falha guarda o motivo, mas não apaga os últimos números lidos.
103    const final = nova.estado === 'ok' || guardada === null ? nova : { ...nova, lidoEm: guardada.lidoEm, limites: guardada.limites }
104    await $.store.set(CHAVE_MODELOS, final)
105    await update($, modelos, () => final)
106  } catch {
107    // Sem leitura agora; mantém a última.
108  } finally {
109    buscandoDesde = 0
110  }
111}
112
113// ---------- câmbio ----------
114
115let cotandoDesde = 0
116
117async function medirCambio($: EngineInterface, moeda: Moeda): Promise<void> {
118  if (moeda === 'USD') return
119  const agora = await $.clock.now()
120  if (agora - cotandoDesde < TRAVA) return
121  cotandoDesde = agora
122  try {
123    const naMemoria = await read($, cambio)
124    if (naMemoria !== null && agora < proximaTentativa(naMemoria)) return
125    const guardado = cambioValido(await $.store.get(CHAVE_CAMBIO))
126    if (guardado !== null && agora < proximaTentativa(guardado)) {
127      await update($, cambio, () => guardado)
128      return
129    }
130    if (await silencioDeRede($)) return
131    let taxas: Partial<Record<Moeda, number>> = {}
132    try {
133      const r = await $.http.fetch(CAMBIO_URL)
134      taxas = r.ok ? lerCambio(r.text) : {}
135    } catch {
136      taxas = {}
137    }
138    const deuCerto = Object.keys(taxas).length > 0
139    // A falha também é gravada, com a hora da tentativa: é ela que segura a próxima.
140    const final: Cambio = deuCerto
141      ? { em: agora, lidoEm: agora, falhas: 0, taxas }
142      : { em: agora, lidoEm: guardado?.lidoEm ?? null, falhas: (guardado?.falhas ?? 0) + 1, taxas: guardado?.taxas ?? {} }
143    await $.store.set(CHAVE_CAMBIO, final)
144    await update($, cambio, () => final)
145  } catch {
146    // Sem câmbio agora; mantém o último.
147  } finally {
148    cotandoDesde = 0
149  }
150}
151
152// ---------- preferências e janela de ajustes ----------
153
154// Preferências em vigor: o ajuste da janela, se houver, senão o userConfig.
155async function emVigor($: EngineInterface, opcoes: Preferencias): Promise<Preferencias> {
156  return (await read($, ajuste)) ?? opcoes
157}
158
159async function aplicar($: EngineInterface, p: Pendente, opcoes: Preferencias): Promise<void> {
160  for (const campo of CAMPOS) {
161    if (p.prefs[campo] === opcoes[campo]) continue
162    let recusado = false
163    try {
164      const r = await $.config.set({ key: `usage-band-mod.${campo}`, value: p.prefs[campo] })
165      recusado = r.deny !== undefined
166    } catch {
167      recusado = true
168    }
169    if (recusado) {
170      await $.store.set(CHAVE_AJUSTE, { ...p, recusado: true })
171      return
172    }
173  }
174  // Chegou aqui sem recarga: tudo gravado. O pedido fica marcado para a próxima carga só limpar.
175  await $.store.set(CHAVE_AJUSTE, { ...p, aplicado: true })
176}
177
178// Ao carregar: conclui, retoma ou descarta o pedido guardado.
179async function conciliar($: EngineInterface, opcoes: Preferencias): Promise<void> {
180  const p = pendenteValido(await $.store.get(CHAVE_AJUSTE))
181  if (p === null) {
182    const atual = await read($, ajuste)
183    if (atual !== null && iguais(atual, opcoes)) await update($, ajuste, () => null)
184    return
185  }
186  const s = situacao(p, opcoes)
187  if (s !== 'continuar') {
188    await $.store.delete(CHAVE_AJUSTE)
189    await update($, ajuste, () => null)
190    return
191  }
192  await update($, ajuste, () => p.prefs)
193  if (!p.recusado) await aplicar($, p, opcoes)
194}
195
196async function gravar($: EngineInterface, prefs: Preferencias, opcoes: Preferencias): Promise<void> {
197  if (iguais(prefs, opcoes)) {
198    // Voltou tudo ao que o /config já tem (por exemplo, desfez uma mudança recusada): nada pendente.
199    await $.store.delete(CHAVE_AJUSTE)
200    await update($, ajuste, () => null)
201    return
202  }
203  const p: Pendente = { prefs, base: opcoes, recusado: false, aplicado: false }
204  await $.store.set(CHAVE_AJUSTE, p)
205  await aplicar($, p, opcoes)
206}
207
208// A janela precisa do macOS 26, ou do Windows com .NET Framework 4.8. Descoberto uma vez por sessão e
209// guardado no átomo `sistema`: a banda o lê, e o ⚙ aparece assim que a resposta chega. A API não diz
210// o sistema; a variável OS é fixa no Windows.
211type Sistema = { plataforma: Plataforma; disponivel: boolean }
212
213async function sistemaDaJanela($: EngineInterface): Promise<Sistema> {
214  const salvo = await read($, sistema)
215  if (salvo !== null) return salvo
216  let s: Sistema = { plataforma: 'macos', disponivel: false }
217  try {
218    if ((await $.env.get('OS')) === 'Windows_NT') {
219      s = { plataforma: 'windows', disponivel: false }
220      const r = await $.process.run(
221        ['reg.exe', 'query', 'HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full', '/v', 'Release'],
222        { timeoutMs: 5_000 },
223      )
224      s.disponivel = r.exitCode === 0 && temDotNet48(r.stdout)
225    } else {
226      const r = await $.process.run(['/usr/bin/sw_vers', '-productVersion'], { timeoutMs: 5_000 })
227      s.disponivel = r.exitCode === 0 && Number(r.stdout.trim().split('.')[0]) >= 26
228    }
229  } catch {
230    // Sem resposta do sistema: a janela não é oferecida.
231  }
232  await update($, sistema, () => s)
233  return s
234}
235
236// No início da sessão, sem segurá-la: descobre a janela em segundo plano.
237async function descobrirJanela($: EngineInterface): Promise<void> {
238  try {
239    await sistemaDaJanela($)
240  } catch {
241    // A sessão acabou (ou o mod recarregou) antes da resposta: não há banda para redesenhar.
242  }
243}
244
245let aberta = false
246
247// Abre a janela e fica escutando até o app sair. Só diz "aberta" depois do {"pronto":true} do app.
248async function abrirJanela($: EngineInterface, opcoes: Preferencias): Promise<{ resultado: Abertura; detalhe: string }> {
249  if (aberta) return { resultado: 'ja-aberta', detalhe: '' }
250  // A trava liga antes de qualquer espera: um clique duplo no ⚙ não abre duas janelas.
251  aberta = true
252  try {
253    return await abrir($, opcoes)
254  } catch (erro) {
255    aberta = false
256    return { resultado: 'falhou', detalhe: erro instanceof Error ? erro.message.slice(0, 120) : '' }
257  }
258}
259
260async function abrir($: EngineInterface, opcoes: Preferencias): Promise<{ resultado: Abertura; detalhe: string }> {
261  const s = await sistemaDaJanela($)
262  if (!s.disponivel) {
263    aberta = false
264    return { resultado: 'falhou', detalhe: '' }
265  }
266  const prefs = await emVigor($, opcoes)
267  const estado = { prefs, amostra: amostra(await read($, leitura), await read($, modelos), await read($, cambio)) }
268  const argv = [caminhoDoApp($.plugin.root, s.plataforma), '--estado', JSON.stringify(estado)]
269  const iterador = $.process.spawn({ argv })
270
271  let resto = ''
272  let erros = ''
273  let ultima: Preferencias = prefs
274  // Depois de desistir de um app que não respondeu, nada do que ele mandar vale mais.
275  let desistiu = false
276  // Trata um pedaço da saída; devolve true quando chega o "pronto".
277  const tratar = async (pedaco: { stream: string; text: string }): Promise<boolean> => {
278    if (desistiu) return false
279    if (pedaco.stream !== 'stdout') {
280      erros = (erros + pedaco.text).slice(-200)
281      return false
282    }
283    resto += pedaco.text
284    const linhas = resto.split('\n')
285    resto = linhas.pop() ?? ''
286    let pronto = false
287    for (const linha of linhas) {
288      const lida = lerLinha(linha, ultima)
289      if (lida.pronto === true) pronto = true
290      if (lida.prefs !== undefined) {
291        ultima = lida.prefs
292        await update($, ajuste, () => lida.prefs ?? null)
293      }
294    }
295    return pronto
296  }
297
298  const esperarPronto = async (): Promise<'pronto' | string> => {
299    for (;;) {
300      const r = await iterador.next()
301      if (r.done === true) return (erros.trim().split('\n').pop() ?? '') || 'o app fechou antes de abrir a janela'
302      if (await tratar(r.value)) return 'pronto'
303    }
304  }
305  let resposta: string
306  try {
307    resposta = await Promise.race([esperarPronto(), $.clock.sleep(PRAZO_PRONTO).then(() => 'o app não respondeu')])
308  } catch (erro) {
309    resposta = erro instanceof Error ? erro.message.slice(0, 120) : ''
310  }
311  if (resposta !== 'pronto') {
312    desistiu = true
313    // Encerrar o laço encerra o app, se ele ainda estiver de pé. Sem esperar: ele pode estar travado.
314    void iterador.return({ code: null, signal: null })
315    aberta = false
316    return { resultado: 'falhou', detalhe: resposta }
317  }
318
319  void (async () => {
320    try {
321      for (let r = await iterador.next(); r.done !== true; r = await iterador.next()) await tratar(r.value)
322    } catch {
323      // O app caiu: o que ele já mandou continua valendo.
324    } finally {
325      aberta = false
326      try {
327        await gravar($, ultima, opcoes)
328      } catch {
329        // Não deu para gravar agora: o ajuste da janela continua valendo nesta sessão.
330      }
331    }
332  })()
333  return { resultado: 'aberta', detalhe: '' }
334}
335
336// ---------- banda e comandos ----------
337
338async function contexto($: EngineInterface, opcoes: Preferencias): Promise<Contexto | null> {
339  const l = await read($, leitura)
340  if (l === null) return null
341  const prefs = await emVigor($, opcoes)
342  const c = await read($, cambio)
343  const agora = await $.clock.now()
344  const recente = c !== null && c.lidoEm !== null && agora - c.lidoEm < VALIDADE_CAMBIO
345  const taxa = prefs.moeda === 'USD' || !recente ? null : (c.taxas[prefs.moeda] ?? null)
346  return { l, prefs, modelos: await read($, modelos), taxa, agora }
347}
348
349async function buscar($: EngineInterface, opcoes: Preferencias): Promise<void> {
350  const prefs = await emVigor($, opcoes)
351  if (prefs.limitePorModelo) void medirModelos($)
352  void medirCambio($, prefs.moeda)
353}
354
355async function ocultar($: EngineInterface, valor: boolean): Promise<void> {
356  await update($, oculta, () => valor)
357  await $.store.set(CHAVE_OCULTA, valor)
358}
359
360// O que dizer quando a janela não abriu. No Windows, um app que não sobe costuma ser o exe barrado
361// (sem assinatura digital): a mensagem diz isso e aponta o /config.
362async function falha($: EngineInterface, opcoes: Preferencias, detalhe: string): Promise<string> {
363  const t = textos((await emVigor($, opcoes)).idioma)
364  if (detalhe === '') return t.janelaIndisponivel
365  return (await sistemaDaJanela($)).plataforma === 'windows' ? t.janelaBloqueada(detalhe) : t.janelaFalhou(detalhe)
366}
367
368async function ajustes($: EngineInterface, opcoes: Preferencias): Promise<{ text: string }> {
369  const r = await abrirJanela($, opcoes)
370  if (r.resultado === 'falhou') return { text: await falha($, opcoes, r.detalhe) }
371  return { text: textos((await emVigor($, opcoes)).idioma).janelaAberta }
372}
373
374// O ⚙ da banda não tem onde responder como um comando: se a janela não abrir, o motivo vai num aviso.
375async function ajustesPeloBotao($: EngineInterface, opcoes: Preferencias): Promise<void> {
376  const r = await abrirJanela($, opcoes)
377  if (r.resultado === 'falhou') $.ui.toast(await falha($, opcoes, r.detalhe), { timeoutMs: 12_000 })
378}
379
380async function alternarBanda($: EngineInterface, opcoes: Preferencias): Promise<{ text: string }> {
381  const t = textos((await emVigor($, opcoes)).idioma)
382  const escondida = !(await read($, oculta))
383  await ocultar($, escondida)
384  return { text: escondida ? t.bandaOculta : t.bandaVisivel }
385}
386
387async function iniciar($: EngineInterface, opcoes: Preferencias): Promise<void> {
388  await conciliar($, opcoes)
389  const prefs = await emVigor($, opcoes)
390  const t = textos(prefs.idioma)
391  // Nomes escritos por extenso: o validador reconhece assim que cada comando é deste mod.
392  if (prefs.idioma === 'pt') {
393    await $.command.register({ name: 'uso-barra', description: t.cmdBanda })
394    await $.command.register({ name: 'uso-ajustes', description: t.cmdAjustes })
395  } else {
396    await $.command.register({ name: 'usage-band', description: t.cmdBanda })
397    await $.command.register({ name: 'usage-settings', description: t.cmdAjustes })
398  }
399  if ((await $.store.get(CHAVE_OCULTA)) === true) await update($, oculta, () => true)
400  await medir($)
401  await buscar($, opcoes)
402  void descobrirJanela($)
403}
404
405// A cada minuto: os relógios de "reinicia em" andam, e as fontes conferem se já é hora de ler.
406async function aCadaMinuto($: EngineInterface, opcoes: Preferencias): Promise<void> {
407  await update($, relogio, n => (n ?? 0) + 1)
408  await medir($)
409  await buscar($, opcoes)
410}
411
412export const register: Register = (on, options) => {
413  const opcoes = deOpcoes(options)
414
415  on('session.start', async ($, e, next) => {
416    const ran = await next(e)
417    await iniciar($, opcoes)
418    $.clock.every(60_000, () => aCadaMinuto($, opcoes))
419    return ran
420  })
421
422  // O evento já traz os números: nada de pedir de novo.
423  on('session.measure', async ($, e, next) => {
424    const ran = await next(e)
425    await medir($, e)
426    return ran
427  })
428
429  on('command.run', { command: 'uso-barra' }, async $ => alternarBanda($, opcoes))
430  on('command.run', { command: 'usage-band' }, async $ => alternarBanda($, opcoes))
431  on('command.run', { command: 'uso-ajustes' }, async $ => ajustes($, opcoes))
432  on('command.run', { command: 'usage-settings' }, async $ => ajustes($, opcoes))
433
434  on('ui.render', { component: 'AbovePrompt' }, async ($, e, next) => {
435    const c = await contexto($, opcoes)
436    if (e.props.hasSurvey || c === null || (await read($, oculta))) return next(e)
437    await read($, relogio)
438    const s = await read($, sistema)
439    const ui = $.ui.resolve(e)
440    const outros = await next(e)
441    return banda(ui, e.surface, e.props.bodyColumns, c, {
442      ocultar: () => ocultar($, true),
443      ajustes: e.surface === 'desktop' && s?.disponivel === true ? () => ajustesPeloBotao($, opcoes) : undefined,
444    }, outros)
445  })
446}
447
hooks/fontes.ts 119 lines
1// De onde vêm os números.
2// - Uso da sessão: $.session.usage() e o evento session.measure (os mesmos da status line, grátis).
3// - Limite semanal por modelo (ex.: Fable): endpoint interno da Anthropic, sem documentação pública.
4//   Só é lido com a opção ligada; o host anexa o login e o mod nunca vê o token.
5// - Câmbio: taxas públicas da Coinbase a partir do dólar, só quando a moeda não é USD.
6// Nenhuma consulta sai com CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC ligada.
7// Aqui só a parte pura (endereços, prazos e leitura dos corpos); o que chama $ fica em ./register:
8// motores mais antigos do Claude Code (o 2.1.295 do app desktop) não aceitam $ passado entre arquivos.
9import type { SessionUsage } from 'claude-code'
10
11import type { Cambio, Leitura, LeituraModelos, LimiteModelo, Moeda } from '../types'
12import { nomeBonito } from './formato'
13
14export const USO_URL = 'https://api.anthropic.com/api/oauth/usage'
15export const CAMBIO_URL = 'https://api.coinbase.com/v2/exchange-rates?currency=USD'
16export const CHAVE_MODELOS = 'modelos'
17export const CHAVE_CAMBIO = 'cambio'
18export const INTERVALO_MODELOS = 600_000
19export const VALIDADE_MODELOS = 3_600_000
20export const INTERVALO_CAMBIO = 21_600_000
21// Uma cotação mais velha que isso não é usada: o custo volta a aparecer em dólar.
22export const VALIDADE_CAMBIO = 259_200_000
23// Espera depois de falhas seguidas: 5 min, 30 min, 2 h e daí em diante.
24export const ESPERAS = [300_000, 1_800_000, 7_200_000]
25// Uma consulta presa há mais que isso não segura a próxima.
26export const TRAVA = 60_000
27
28const objeto = (v: unknown): Record<string, unknown> | null =>
29  typeof v === 'object' && v !== null ? (v as Record<string, unknown>) : null
30
31// Valor de CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: ligada, nenhuma consulta sai.
32export function silencio(v: string | undefined): boolean {
33  return v !== undefined && v !== '' && v !== '0' && v.toLowerCase() !== 'false'
34}
35
36// ---------- uso da sessão ----------
37
38export type Uso = Pick<SessionUsage, 'context' | 'rateLimits' | 'cost'>
39
40export function montarLeitura(uso: Uso, modelo: string): Leitura {
41  return {
42    modelo: nomeBonito(modelo),
43    pct: uso.context.percent ?? null,
44    tokens: uso.context.tokens ?? null,
45    janela: uso.context.window,
46    usd: uso.cost?.usd ?? null,
47    limites: uso.rateLimits.map(r => ({ tipo: r.kind, pct: r.percentUsed ?? null, reinicia: r.resetsAt ?? null })),
48  }
49}
50
51// ---------- limite por modelo ----------
52
53// Linhas `weekly_scoped` com modelo, do corpo do endpoint. Lança se o corpo não é JSON.
54export function lerModelos(texto: string): LimiteModelo[] {
55  const linhas = objeto(JSON.parse(texto))?.limits
56  if (!Array.isArray(linhas)) return []
57  const saida: LimiteModelo[] = []
58  for (const bruta of linhas) {
59    const linha = objeto(bruta)
60    const nome = objeto(objeto(linha?.scope)?.model)?.display_name
61    if (linha === null || linha.kind !== 'weekly_scoped' || typeof nome !== 'string') continue
62    const r = linha.resets_at
63    saida.push({
64      modelo: nome,
65      pct: typeof linha.percent === 'number' ? linha.percent : null,
66      reinicia: typeof r === 'number' ? new Date(r * 1000).toISOString() : typeof r === 'string' ? r : null,
67    })
68  }
69  return saida
70}
71
72export function modelosValidos(v: unknown): LeituraModelos | null {
73  const o = objeto(v)
74  if (o === null || typeof o.em !== 'number' || typeof o.estado !== 'string' || typeof o.detalhe !== 'string' || !Array.isArray(o.limites)) return null
75  if (!['ok', 'sem-credencial', 'recusado', 'erro'].includes(o.estado)) return null
76  const limites: LimiteModelo[] = []
77  for (const l of o.limites) {
78    const x = objeto(l)
79    if (x === null || typeof x.modelo !== 'string') continue
80    limites.push({ modelo: x.modelo, pct: typeof x.pct === 'number' ? x.pct : null, reinicia: typeof x.reinicia === 'string' ? x.reinicia : null })
81  }
82  return { em: o.em, lidoEm: typeof o.lidoEm === 'number' ? o.lidoEm : null, estado: o.estado as LeituraModelos['estado'], detalhe: o.detalhe, limites }
83}
84
85// ---------- câmbio ----------
86
87const MOEDAS_CAMBIO: readonly Moeda[] = ['BRL', 'EUR']
88
89// Taxas a partir do dólar no corpo da Coinbase ({ data: { rates: { BRL: "5.41", ... } } }).
90// Lança se o corpo não é JSON; objeto vazio se não acha nenhuma.
91export function lerCambio(texto: string): Partial<Record<Moeda, number>> {
92  const taxas = objeto(objeto(objeto(JSON.parse(texto))?.data)?.rates)
93  const saida: Partial<Record<Moeda, number>> = {}
94  if (taxas === null) return saida
95  for (const m of MOEDAS_CAMBIO) {
96    const v = Number(taxas[m])
97    if (Number.isFinite(v) && v > 0) saida[m] = v
98  }
99  return saida
100}
101
102export function cambioValido(v: unknown): Cambio | null {
103  const o = objeto(v)
104  if (o === null || typeof o.em !== 'number' || typeof o.falhas !== 'number') return null
105  const taxas: Partial<Record<Moeda, number>> = {}
106  const t = objeto(o.taxas)
107  for (const m of MOEDAS_CAMBIO) {
108    const x = t?.[m]
109    if (typeof x === 'number' && x > 0) taxas[m] = x
110  }
111  return { em: o.em, lidoEm: typeof o.lidoEm === 'number' ? o.lidoEm : null, falhas: Math.max(0, Math.floor(o.falhas)), taxas }
112}
113
114// Quando pode tentar de novo: 6 h depois de um sucesso; depois de falhas, a espera cresce.
115export function proximaTentativa(c: Cambio): number {
116  if (c.falhas === 0) return c.em + INTERVALO_CAMBIO
117  return c.em + (ESPERAS[Math.min(c.falhas, ESPERAS.length) - 1] ?? INTERVALO_CAMBIO)
118}
119
hooks/janela.ts 88 lines
1// Janela de ajustes: no Mac um app SwiftUI (macos/), no Windows um app WPF (windows/), que o mod
2// abre e escuta. Os dois falam o mesmo protocolo.
3// Conversa por linhas JSON: o app escreve {"pronto": true} ao aparecer, {"prefs": {...}} a cada
4// mudança e {"fim": true} ao fechar (o mod se guia pelo fim do processo, não por essa linha). As
5// mudanças valem na hora (átomo `ajuste`); quando o app sai, vão para o userConfig por $.config.set, para que o menu /config e as próximas sessões vejam o mesmo.
6// Aqui só a parte pura; abrir, escutar e gravar ficam em ./register, porque motores mais antigos do
7// Claude Code (o 2.1.295 do app desktop) não aceitam $ passado entre arquivos.
8import type { Cambio, Leitura, LeituraModelos, Preferencias } from '../types'
9import { iguais, preferencias } from './prefs'
10
11export const CHAVE_AJUSTE = 'ajuste'
12export const CAMPOS = ['idioma', 'moeda', 'mascote', 'limitePorModelo'] as const
13
14// Onde a janela mora em cada sistema.
15export type Plataforma = 'macos' | 'windows'
16
17// No Windows a raiz pode vir com `\` ou `/`: o caminho do exe usa o mesmo separador que ela.
18export function caminhoDoApp(raiz: string, p: Plataforma = 'macos'): string {
19  const pasta = raiz.replace(/[\\/]\.claude-plugin[\\/]?$/, '').replace(/[\\/]$/, '')
20  if (p === 'windows') {
21    const sep = pasta.includes('\\') ? '\\' : '/'
22    return [pasta, 'windows', 'PainelDeUso.exe'].join(sep)
23  }
24  return `${pasta}/macos/PainelDeUso.app/Contents/MacOS/PainelDeUso`
25}
26
27// Saída de `reg.exe query ...\NDP\v4\Full /v Release`: tem .NET Framework 4.8 (528040) ou mais novo?
28export function temDotNet48(saidaDoReg: string): boolean {
29  const m = /\bRelease\s+REG_DWORD\s+0x([0-9a-f]+)/i.exec(saidaDoReg)
30  return m !== null && parseInt(m[1] ?? '', 16) >= 528040
31}
32
33// Uma linha do app: só aceita preferências válidas; o resto é ignorado.
34export function lerLinha(linha: string, base: Preferencias): { prefs?: Preferencias; pronto?: true } {
35  try {
36    // trim: no Windows a linha pode chegar com um \r sobrando.
37    const o = JSON.parse(linha.trim()) as Record<string, unknown>
38    if (o.pronto === true) return { pronto: true }
39    if (typeof o.prefs === 'object' && o.prefs !== null) return { prefs: preferencias(o.prefs, base) }
40  } catch {
41    // Linha que não é JSON (log do app): ignora.
42  }
43  return {}
44}
45
46// Gravação no userConfig. Cada $.config.set pode recarregar o mod no meio do caminho, então o
47// pedido inteiro fica antes no $.store ({ prefs, base }) e cada carga aplica o que falta.
48// `aplicado`: tudo já foi gravado sem recarga; daí em diante, uma mudança no /config vence.
49export type Pendente = { prefs: Preferencias; base: Preferencias; recusado: boolean; aplicado: boolean }
50
51export function pendenteValido(v: unknown): Pendente | null {
52  if (typeof v !== 'object' || v === null) return null
53  const g = v as { prefs?: unknown; base?: unknown; recusado?: unknown; aplicado?: unknown }
54  if (typeof g.prefs !== 'object' || typeof g.base !== 'object') return null
55  return { prefs: preferencias(g.prefs), base: preferencias(g.base), recusado: g.recusado === true, aplicado: g.aplicado === true }
56}
57
58// O que fazer com um pedido pendente diante do userConfig atual:
59// - 'pronto': tudo já está gravado;
60// - 'descartar': alguém mexeu no /config por fora, e o menu vence;
61// - 'continuar': ainda há campos a gravar (ou o /config recusou, e o ajuste fica valendo).
62export function situacao(p: Pendente, opcoes: Preferencias): 'pronto' | 'descartar' | 'continuar' {
63  if (iguais(p.prefs, opcoes)) return 'pronto'
64  for (const campo of CAMPOS) {
65    if (opcoes[campo] !== p.base[campo] && opcoes[campo] !== p.prefs[campo]) return 'descartar'
66  }
67  // Já gravado e o /config voltou um campo ao valor antigo: foi a pessoa, e o menu vence.
68  return p.aplicado ? 'descartar' : 'continuar'
69}
70
71// Quanto esperar o app dizer {"pronto":true} antes de desistir.
72export const PRAZO_PRONTO = 15_000
73
74export type Abertura = 'aberta' | 'ja-aberta' | 'falhou'
75
76// O que a janela mostra na prévia: os números da sessão, ou exemplos enquanto não há leitura.
77export function amostra(l: Leitura | null, m: LeituraModelos | null, c: Cambio | null) {
78  return {
79    modelo: l?.modelo ?? 'Opus 5.5',
80    usd: l?.usd ?? 3.26,
81    contexto: l?.pct ?? 24,
82    cincoHoras: l?.limites.find(x => x.tipo === 'five_hour')?.pct ?? 5,
83    semana: l?.limites.find(x => x.tipo === 'seven_day')?.pct ?? 1,
84    porModelo: (m?.limites ?? []).map(x => ({ modelo: x.modelo, pct: x.pct ?? 0 })),
85    taxas: c?.taxas ?? {},
86  }
87}
88
hooks/prefs.ts 32 lines
1// Preferências do mod. A fonte é o `userConfig` do plugin.json (o menu de configurações do
2// Claude Code e a tela de instalação). A janela de ajustes (Mac e Windows) grava por cima, ao vivo,
3// e no fim passa tudo para o `userConfig` por `$.config.set`.
4import type { PluginOptions } from 'claude-code'
5
6import type { Idioma, Mascote, Moeda, Preferencias } from '../types'
7
8const IDIOMAS: readonly Idioma[] = ['en', 'pt']
9const MOEDAS: readonly Moeda[] = ['USD', 'BRL', 'EUR']
10const MASCOTES: readonly Mascote[] = ['animado', 'parado', 'oculto']
11
12export const PADRAO: Preferencias = { idioma: 'en', moeda: 'USD', mascote: 'animado', limitePorModelo: true }
13
14const entre = <T extends string>(lista: readonly T[], v: unknown, padrao: T): T =>
15  typeof v === 'string' && (lista as readonly string[]).includes(v) ? (v as T) : padrao
16
17// Lê qualquer objeto (options do engine, $.store, linha da janela) e devolve preferências válidas.
18export function preferencias(v: unknown, base: Preferencias = PADRAO): Preferencias {
19  const o = typeof v === 'object' && v !== null ? (v as Record<string, unknown>) : {}
20  return {
21    idioma: entre(IDIOMAS, o.idioma, base.idioma),
22    moeda: entre(MOEDAS, o.moeda, base.moeda),
23    mascote: entre(MASCOTES, o.mascote, base.mascote),
24    limitePorModelo: typeof o.limitePorModelo === 'boolean' ? o.limitePorModelo : base.limitePorModelo,
25  }
26}
27
28export const deOpcoes = (options: PluginOptions | undefined): Preferencias => preferencias(options ?? {})
29
30export const iguais = (a: Preferencias, b: Preferencias): boolean =>
31  a.idioma === b.idioma && a.moeda === b.moeda && a.mascote === b.mascote && a.limitePorModelo === b.limitePorModelo
32
hooks/textos.ts 35 lines
1// Todos os textos que o mod mostra, em inglês e português.
2import type { Idioma } from '../types'
3
4const EN = {
5  contexto: 'Context',
6  bandaOculta: 'Usage band hidden.',
7  bandaVisivel: 'Usage band visible.',
8  janelaAberta: 'Settings window open.',
9  janelaIndisponivel: 'The settings window needs macOS 26 or Windows 10/11 (1903 or later, with .NET Framework 4.8). Use /config instead: the options are under usage-band-mod.',
10  janelaFalhou: (d: string) => `Could not open the settings window (${d}). Use /config instead.`,
11  // No Windows o exe não tem assinatura digital: o Smart App Control ou um antivírus podem barrá-lo.
12  janelaBloqueada: (d: string) =>
13    `Could not open the settings window (${d}). On Windows, Smart App Control or an antivirus may have blocked PainelDeUso.exe, which is not code-signed. Use /config instead: the options are under usage-band-mod.`,
14  cmdBanda: 'Shows or hides the usage band above the prompt',
15  cmdAjustes: 'Opens the settings window (macOS, Windows)',
16  alt: 'Pixel crab mascot',
17}
18
19const PT: typeof EN = {
20  contexto: 'Contexto',
21  bandaOculta: 'Barra de uso escondida.',
22  bandaVisivel: 'Barra de uso visível.',
23  janelaAberta: 'Janela de ajustes aberta.',
24  janelaIndisponivel: 'A janela de ajustes precisa do macOS 26 ou do Windows 10/11 (1903 ou mais novo, com .NET Framework 4.8). Use o /config: as opções estão em usage-band-mod.',
25  janelaFalhou: (d: string) => `Não deu para abrir a janela de ajustes (${d}). Use o /config.`,
26  janelaBloqueada: (d: string) =>
27    `Não deu para abrir a janela de ajustes (${d}). No Windows, o Controle Inteligente de Aplicativos ou um antivírus pode ter bloqueado o PainelDeUso.exe, que não tem assinatura digital. Use o /config: as opções estão em usage-band-mod.`,
28  cmdBanda: 'Mostra ou esconde a barra de uso acima do prompt',
29  cmdAjustes: 'Abre a janela de ajustes (macOS, Windows)',
30  alt: 'Mascote caranguejo em pixel',
31}
32
33type Textos = typeof EN
34export const textos = (idioma: Idioma): Textos => (idioma === 'pt' ? PT : EN)
35
hooks/ui.tsx 190 lines
1// O desenho da banda de uma linha acima do prompt, no terminal e no app desktop.
2import type { EngineInterface, RenderElement } from 'claude-code'
3
4import type { Leitura, LeituraModelos, Limite, Preferencias } from '../types'
5import { PCT_COLUNAS, SEP_BARRAS, SEP_COMPACTO, barra, corDe, curto, dinheiro, encaixe, faltam, pctTexto } from './formato'
6import type { Trecho } from './formato'
7import { MASCOTE_ALTURA, MASCOTE_ANIMADO, MASCOTE_LARGURA, MASCOTE_PARADO } from './mascote'
8import { textos } from './textos'
9import { VALIDADE_MODELOS } from './fontes'
10
11// Trilho das barras no desktop: cinza translúcido, escuro no tema escuro e claro no claro,
12// para o preenchimento verde se destacar (o tom "subtle" ficava quase do brilho do verde).
13const TRILHO = '#80808059'
14const OLHO = '#000000'
15
16// No terminal, o Clawd numa linha: braço, corpo laranja com dois olhos pretos e altos, braço.
17// O corpo é fundo pintado (sem as emendas que o Terminal.app deixa entre blocos vizinhos) e os
18// olhos são pretos nos dois temas, como no Clawd do próprio Claude Code. Os braços são traços na
19// meia altura (╺ ╸), para fora do corpo; nos quadrantes de baixo (▗ ▖) o conjunto lia como focinho.
20// A primeira linha do logo dele (▐▛███▜▌), que a banda usava antes, lia como um bloco cortado.
21const MASCOTE_PARTES = [
22  { t: '╺', cor: 'claude' },
23  { t: '▮', cor: OLHO, fundo: 'claude' },
24  { t: ' ', fundo: 'claude' },
25  { t: '▮', cor: OLHO, fundo: 'claude' },
26  { t: '╸', cor: 'claude' },
27] as const
28
29// Sem leitura, no lugar da barra vai uma linha pontilhada apagada: "sem dado" não pode parecer
30// "0% usado" (um trilho cinza cheio). O · existe em toda fonte, inclusive no console antigo do Windows.
31const SEM_LEITURA = '·'
32export const MASCOTE_TEXTO = MASCOTE_PARTES.map(p => p.t).join('')
33
34const limite = (l: Limite[], tipo: string): Limite | null => l.find(x => x.tipo === tipo) ?? null
35
36export type Contexto = {
37  l: Leitura
38  prefs: Preferencias
39  modelos: LeituraModelos | null
40  taxa: number | null
41  agora: number
42}
43
44// "↻ 2h 10m": o ↻ diz "reinicia em" e só aparece num reinício (o contexto mostra tokens, sem ele).
45const reinicio = (iso: string | null, agora: number): string => {
46  const f = faltam(iso, agora)
47  return f === '' ? '' : `↻ ${f}`
48}
49
50// Os trechos da banda. 5h e 7d só entram quando a sessão tem esses limites (assinatura).
51function trechosDaBanda(c: Contexto): Trecho[] {
52  const t = textos(c.prefs.idioma)
53  const cinco = limite(c.l.limites, 'five_hour')
54  const sete = limite(c.l.limites, 'seven_day')
55  const m = c.modelos
56  const porModelo = c.prefs.limitePorModelo && m !== null && m.lidoEm !== null && c.agora - m.lidoEm < VALIDADE_MODELOS ? m.limites : []
57  return [
58    { rotulo: t.contexto, pct: c.l.pct, extra: c.l.tokens === null ? '' : `${curto(c.l.tokens)}/${curto(c.l.janela)}` },
59    ...(cinco === null ? [] : [{ rotulo: '5h', pct: cinco.pct, extra: reinicio(cinco.reinicia, c.agora) }]),
60    ...(sete === null ? [] : [{ rotulo: '7d', pct: sete.pct, extra: reinicio(sete.reinicia, c.agora) }]),
61    ...porModelo.map(x => ({ rotulo: x.modelo, pct: x.pct, extra: reinicio(x.reinicia, c.agora) })),
62  ]
63}
64
65const custoCurto = (c: Contexto): string =>
66  c.l.usd === null ? '' : ` · ${dinheiro(c.l.usd, c.prefs.moeda, c.taxa, c.prefs.idioma)}`
67
68type Ui = ReturnType<EngineInterface['ui']['resolve']>
69
70function mascoteTexto(ui: Ui): RenderElement {
71  const { Text } = ui
72  return (
73    <Text>
74      {MASCOTE_PARTES.map(p => (
75        <Text color={'cor' in p ? p.cor : undefined} backgroundColor={'fundo' in p ? p.fundo : undefined}>{p.t}</Text>
76      ))}
77      {' '}
78    </Text>
79  )
80}
81
82function mascoteGrafico(ui: Ui, prefs: Preferencias): RenderElement | null {
83  if (prefs.mascote === 'oculto' || !('Svg' in ui)) return null
84  const { Box } = ui
85  const Svg = ui.Svg
86  return (
87    <Box key="mascote" marginRight={1}>
88      <Svg
89        source={prefs.mascote === 'animado' ? MASCOTE_ANIMADO : MASCOTE_PARADO}
90        alt={textos(prefs.idioma).alt}
91        width={MASCOTE_LARGURA}
92        height={MASCOTE_ALTURA}
93        isInteractive={prefs.mascote === 'animado'}
94      />
95    </Box>
96  )
97}
98
99type Acoes = { ocultar: () => unknown; ajustes?: () => unknown }
100
101export function banda(ui: Ui, superficie: string, colunas: number, c: Contexto, acoes: Acoes, outros: RenderElement): RenderElement {
102  const { Box, Text, Button } = ui
103  const trechos = trechosDaBanda(c)
104  const custo = custoCurto(c)
105  const comMascote = c.prefs.mascote !== 'oculto'
106  const { w, resto, comExtra, cabeca, mostrar } = encaixe(colunas, { glifo: comMascote ? MASCOTE_TEXTO.length + 1 : 0, modelo: c.l.modelo.length, custo: custo.length }, trechos)
107  const comModelo = cabeca !== 'nada'
108  const comGlifo = cabeca === 'toda' || cabeca === 'sem-custo'
109  const comCusto = cabeca === 'toda'
110
111  // Fora do terminal a fonte é proporcional: contar caracteres não fecha a largura.
112  // Ali cada barra é um bloco flexível, e as barras dividem por igual o que sobra da linha.
113  // O trilho não tem conteúdo (senão barras com e sem preenchimento saem de larguras diferentes)
114  // e o preenchimento é uma fração exata dele. Meia linha de altura acompanha a altura das letras.
115  if (superficie !== 'terminal') {
116    const medidor = (x: Trecho) => {
117      const p = x.pct === null ? 0 : Math.round(Math.max(0, Math.min(100, x.pct)))
118      return (
119        <Box key={x.rotulo} flexDirection="row" flexGrow={1} alignItems="center" columnGap={1}>
120          <Text dimColor>{x.rotulo}</Text>
121          <Box flexDirection="row" flexGrow={1} height={0.5} backgroundColor={TRILHO} overflow="hidden">
122            {p > 0 && <Box key="cheio" width={`${p}%`} backgroundColor={corDe(x.pct)} />}
123          </Box>
124          <Text color={corDe(x.pct)}>{pctTexto(x.pct)}</Text>
125          {comExtra && x.extra !== '' && <Text dimColor>{x.extra}</Text>}
126        </Box>
127      )
128    }
129    const grafico = mascoteGrafico(ui, c.prefs)
130    return (
131      <Box flexDirection="column">
132        <Box flexDirection="row" alignItems="center" width={colunas} columnGap={2} paddingLeft={1}>
133          <Box flexDirection="row" alignItems="center">
134            {grafico ?? (comMascote && mascoteTexto(ui))}
135            <Text bold>{c.l.modelo}</Text>
136            {custo !== '' && <Text dimColor>{custo}</Text>}
137          </Box>
138          {trechos.map(medidor)}
139          {acoes.ajustes !== undefined && <Button key="ajustes" label="⚙" plain onPress={acoes.ajustes} />}
140          <Button key="ocultar" label="×" plain role="dismiss" onPress={acoes.ocultar} />
141        </Box>
142        {outros}
143      </Box>
144    )
145  }
146
147  const trecho = (x: Trecho, i: number) => {
148    // Sem barras, o trecho fica compacto: rótulo, um espaço e o percentual.
149    if (w === 0) {
150      return (
151        <Box key={x.rotulo} flexDirection="row">
152          <Text dimColor>{`${' '.repeat(SEP_COMPACTO)}${x.rotulo} `}</Text>
153          <Text color={x.pct === null ? undefined : corDe(x.pct)} dimColor={x.pct === null}>{pctTexto(x.pct)}</Text>
154        </Box>
155      )
156    }
157    const largura = w + (i < resto ? 1 : 0)
158    const b = barra(x.pct, largura)
159    const pct = pctTexto(x.pct)
160    // O número encosta na barra dele; o que falta das 4 colunas do percentual vai para o fim do trecho,
161    // depois do detalhe, junto do espaço que separa do próximo rótulo.
162    return (
163      <Box key={x.rotulo} flexDirection="row">
164        <Text dimColor>{`${' '.repeat(SEP_BARRAS)}${x.rotulo} `}</Text>
165        {x.pct === null && <Text dimColor>{SEM_LEITURA.repeat(largura)}</Text>}
166        {b.cheio !== '' && <Text backgroundColor={corDe(x.pct)}>{b.cheio}</Text>}
167        {b.vazio !== '' && <Text backgroundColor="subtle">{b.vazio}</Text>}
168        <Text color={x.pct === null ? undefined : corDe(x.pct)} dimColor={x.pct === null}>{` ${pct}`}</Text>
169        {comExtra && x.extra !== '' && <Text dimColor>{` ${x.extra}`}</Text>}
170        {pct.length < PCT_COLUNAS && <Text>{' '.repeat(PCT_COLUNAS - pct.length)}</Text>}
171      </Box>
172    )
173  }
174  // Alinhada à esquerda com uma coluna de margem, como o resto do Claude Code. O × fica discreto:
175  // cheio só sob o ponteiro ou o foco, ao lado do [-] que o Claude Code desenha.
176  return (
177    <Box flexDirection="column">
178      <Box flexDirection="row" width={colunas} paddingLeft={1}>
179        {comGlifo && comMascote && mascoteTexto(ui)}
180        {comModelo && <Text bold>{c.l.modelo}</Text>}
181        {comCusto && custo !== '' && <Text dimColor>{custo}</Text>}
182        {trechos.slice(0, mostrar).map(trecho)}
183        <Text> </Text>
184        <Button key="ocultar" label="×" plain dimColor role="dismiss" onPress={acoes.ocultar} />
185      </Box>
186      {outros}
187    </Box>
188  )
189}
190
hooks/formato.ts 127 lines
1// Funções puras: nomes de modelo, números, dinheiro, tempo, cores, barras e o encaixe da banda.
2import type { Idioma, Moeda } from '../types'
3
4// "claude-opus-5-5" → "Opus 5.5". Aceita os formatos do Bedrock (us.anthropic.claude-…-v1:0),
5// do Vertex (claude-…@20250805) e sufixos como [1m].
6export function nomeBonito(id: string): string {
7  let s = id.trim().toLowerCase()
8  const i = s.lastIndexOf('claude-')
9  if (i >= 0) s = s.slice(i + 'claude-'.length)
10  s = s.replace(/\[[^\]]*\]$/, '').replace(/@.*$/, '').replace(/-v\d+(:\d+)?$/, '')
11  const partes = s.split('-').filter(p => p !== '' && !/^\d{8}$/.test(p))
12  const nome = partes.find(p => !/^\d+$/.test(p))
13  if (nome === undefined) return id
14  const versao = partes.filter(p => /^\d+$/.test(p)).slice(0, 2).join('.')
15  const titulo = nome.charAt(0).toUpperCase() + nome.slice(1)
16  return versao === '' ? titulo : `${titulo} ${versao}`
17}
18
19export function curto(n: number): string {
20  if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`
21  if (n >= 1_000) return `${Math.round(n / 1_000)}k`
22  return String(n)
23}
24
25// Número com casas e separadores do idioma: 1.234,56 em português, 1,234.56 em inglês.
26export function numero(n: number, casas: number, idioma: Idioma): string {
27  const [inteiro = '0', fracao = ''] = Math.abs(n).toFixed(casas).split('.')
28  const mil = idioma === 'pt' ? '.' : ','
29  const dec = idioma === 'pt' ? ',' : '.'
30  const corpo = inteiro.replace(/\B(?=(\d{3})+$)/g, mil) + (casas > 0 ? dec + fracao : '')
31  return n < 0 ? `-${corpo}` : corpo
32}
33
34const SIMBOLO: Record<Moeda, Record<Idioma, string>> = {
35  USD: { en: '$', pt: 'US$ ' },
36  BRL: { en: 'R$', pt: 'R$ ' },
37  EUR: { en: '€', pt: '€ ' },
38}
39
40// Custo em dólar mostrado na moeda escolhida. Sem taxa para ela, fica em dólar em vez de inventar.
41export function dinheiro(usd: number, moeda: Moeda, taxa: number | null, idioma: Idioma): string {
42  if (moeda === 'USD' || taxa === null) return SIMBOLO.USD[idioma] + numero(usd, 2, idioma)
43  return SIMBOLO[moeda][idioma] + numero(usd * taxa, 2, idioma)
44}
45
46export function faltam(iso: string | null, agora: number): string {
47  if (iso === null) return ''
48  const ms = Date.parse(iso) - agora
49  if (!Number.isFinite(ms) || ms <= 0) return ''
50  const min = Math.round(ms / 60_000)
51  if (min >= 1_440) return `${Math.floor(min / 1_440)}d ${Math.floor((min % 1_440) / 60)}h`
52  if (min >= 60) return `${Math.floor(min / 60)}h ${String(min % 60).padStart(2, '0')}m`
53  return `${min}m`
54}
55
56export function corDe(pct: number | null): 'success' | 'warning' | 'error' | 'subtle' {
57  if (pct === null) return 'subtle'
58  if (pct >= 85) return 'error'
59  if (pct >= 60) return 'warning'
60  return 'success'
61}
62
63// Preenchimento e trilho em células inteiras, desenhados como fundo pintado (a banda pinta o fundo
64// de espaços): sem emendas entre células, sem depender de glifo da fonte, da mesma altura do mascote.
65// Célula inteira: no Terminal.app o glifo de bloco é mais baixo que a célula, e um oitavo (▍) deixaria
66// um buraco ou um degrau antes do trilho.
67// Nos extremos a célula inteira mentiria: uso acima de 0 mostra ao menos uma célula cheia, e uso
68// abaixo de 100 deixa ao menos uma vazia. Sem leitura não há barra (quem desenha põe outra coisa).
69export function barra(pct: number | null, largura: number): { cheio: string; vazio: string } {
70  if (pct === null) return { cheio: '', vazio: '' }
71  const p = Math.max(0, Math.min(100, pct))
72  let n = Math.round((p / 100) * largura)
73  if (p > 0 && n === 0) n = Math.min(1, largura)
74  if (p < 100 && n === largura && largura > 1) n = largura - 1
75  return { cheio: ' '.repeat(n), vazio: ' '.repeat(Math.max(0, largura - n)) }
76}
77
78// `extra` é o detalhe já escrito: "↻ 2h 10m" para um reinício, "112k/200k" para o contexto.
79export type Trecho = { rotulo: string; pct: number | null; extra: string }
80
81// A linha começa depois de um recuo de uma coluna (paddingLeft do Box, como o resto do Claude Code)
82// e, com barras, para uma coluna antes da borda. Toda conta de largura soma o recuo.
83export const RECUO = 1
84const MARGEM_DIREITA = 1
85// Espaço antes de cada trecho: três com barras (a barra já separa, mas o detalhe dim encostava
86// no rótulo seguinte), dois no modo compacto, onde o trecho é só "Rótulo 56%".
87export const SEP_BARRAS = 3
88export const SEP_COMPACTO = 2
89
90// Partes do cabeçalho, em colunas: o glifo do mascote (com o espaço), o modelo e o custo.
91export type Cabeca = { glifo: number; modelo: number; custo: number }
92export type NivelCabeca = 'toda' | 'sem-custo' | 'so-modelo' | 'nada'
93
94export type Encaixe = { w: number; resto: number; comExtra: boolean; cabeca: NivelCabeca; mostrar: number }
95
96// O percentual como a banda escreve: "56%", ou "—" sem leitura.
97export const pctTexto = (pct: number | null): string => (pct === null ? '—' : `${Math.round(pct)}%`)
98// O percentual ocupa sempre 4 colunas (o que falta vira espaço no fim do trecho): o número encosta
99// na barra dele e a barra não anda quando o número ganha um dígito.
100export const PCT_COLUNAS = 4
101
102const largCabeca = (c: Cabeca, nivel: NivelCabeca): number =>
103  nivel === 'toda' ? c.glifo + c.modelo + c.custo : nivel === 'sem-custo' ? c.glifo + c.modelo : nivel === 'so-modelo' ? c.modelo : 0
104
105// Banda de uma linha só no terminal. Com barras, cada trecho é "   Rótulo ███░░ 56% ↻ 2h 10m" e as
106// barras dividem por igual o espaço que sobra (`resto` barras, as primeiras, levam uma coluna a mais).
107// Sem barras, o trecho fica compacto: "  Rótulo 56%".
108// O que sai quando aperta, nesta ordem: o detalhe, as barras, o custo, o mascote, o modelo e,
109// por fim, os últimos trechos (`mostrar` diz quantos ficam).
110export function encaixe(colunas: number, cabeca: Cabeca, trechos: Trecho[]): Encaixe {
111  const comBarra = (t: Trecho, comExtra: boolean) => SEP_BARRAS + t.rotulo.length + 1 + 1 + PCT_COLUNAS + (comExtra && t.extra !== '' ? 1 + t.extra.length : 0)
112  const compacto = (t: Trecho) => SEP_COMPACTO + t.rotulo.length + 1 + pctTexto(t.pct).length
113  const n = trechos.length
114  const fixoBarras = (comExtra: boolean) => largCabeca(cabeca, 'toda') + 2 + trechos.reduce((s, t) => s + comBarra(t, comExtra), 0)
115  const livre = (comExtra: boolean) => colunas - RECUO - MARGEM_DIREITA - fixoBarras(comExtra)
116  const dividir = (comExtra: boolean): Encaixe => ({ w: Math.floor(livre(comExtra) / n), resto: livre(comExtra) % n, comExtra, cabeca: 'toda', mostrar: n })
117  if (n > 0 && livre(true) >= 5 * n) return dividir(true)
118  if (n > 0 && livre(false) >= 3 * n) return dividir(false)
119  const soma = (k: number) => trechos.slice(0, k).reduce((s, t) => s + compacto(t), 0)
120  for (const nivel of ['toda', 'sem-custo', 'so-modelo'] as const) {
121    if (RECUO + largCabeca(cabeca, nivel) + 2 + soma(n) <= colunas) return { w: 0, resto: 0, comExtra: false, cabeca: nivel, mostrar: n }
122  }
123  let k = n
124  while (k > 0 && RECUO + 2 + soma(k) > colunas) k--
125  return { w: 0, resto: 0, comExtra: false, cabeca: 'nada', mostrar: k }
126}
127
hooks/mascote.ts 7 lines
1// Gerado por arte/gerar_mascote.py; não edite à mão.
2// Fan art do Clawd: 13 gestos em SMIL, ciclo de 55.7 s, palco de 24x14 pixels de arte.
3export const MASCOTE_ANIMADO = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"36\" height=\"21\" viewBox=\"0 0 24 14\" shape-rendering=\"crispEdges\"><style>.e{display:none}@media (prefers-reduced-motion:reduce){.a{display:none}.e{display:inline}}</style><g class=\"e\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/></g><g class=\"a\"><g opacity=\"1\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.01257;0.01527;0.02784;0.04041;0.044;0.05657;0.06017;0.06915;0.07094;0.07094;0.08351;0.08621;0.09878;0.12213;0.1347;0.13739;0.14996;0.20833;0.22091;0.2236;0.23617;0.2606;0.27317;0.27586;0.28843;0.3398;0.34249;0.34249;0.35506;0.35776;0.37033;0.4102;0.42277;0.42547;0.43804;0.48258;0.49515;0.49784;0.51042;0.56717;0.57974;0.58244;0.59501;0.64889;0.66146;0.66415;0.67672;0.73384;0.74641;0.7491;0.76167;0.81501;0.82759;0.83028;0.84285;0.92134;0.93391;0.9366;0.94917\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.01257;0.01527;0.08351;0.08621;0.1347;0.13739;0.22091;0.2236;0.27317;0.27586;0.35506;0.35776;0.42277;0.42547;0.49515;0.49784;0.57974;0.58244;0.66146;0.66415;0.74641;0.7491;0.82759;0.83028;0.84285;0.84824;0.91146;0.91595;0.93391;0.9366\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM8 4h6v1h-6zM15 4h3v1h-3zM6 5h1v1h-1zM8 5h6v1h-6zM15 5h3v1h-3zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.02784;0.04041\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h3v1h-3zM10 4h6v1h-6zM17 4h1v1h-1zM6 5h3v1h-3zM10 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.044;0.05657\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.06017;0.06915;0.43804;0.44343\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.09878;0.10004;0.10632;0.10758;0.10758;0.11045;0.11045;0.11171;0.118;0.11925;0.11925;0.12213;0.257;0.2606;0.37033;0.37482;0.40481;0.4102;0.56358;0.56717;0.80244;0.80388;0.80819;0.80963;0.80963;0.81501\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 3h1v1h-1zM15 3h1v1h-1zM7 4h1v1h-1zM9 4h1v1h-1zM14 4h1v1h-1zM16 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 1h12v1h-12zM6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h1v1h-1zM8 4h1v1h-1zM10 4h4v1h-4zM15 4h1v1h-1zM17 4h1v1h-1zM4 5h16v1h-16zM4 6h16v1h-16zM6 7h12v1h-12zM6 8h12v1h-12zM7 9h1v1h-1zM9 9h1v1h-1zM14 9h1v1h-1zM16 9h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.10004;0.10129;0.10506;0.10632;0.11171;0.11297;0.11674;0.118\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 2h1v1h-1zM15 2h1v1h-1zM7 3h1v1h-1zM9 3h1v1h-1zM14 3h1v1h-1zM16 3h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 0h12v1h-12zM6 1h12v1h-12zM4 2h4v1h-4zM9 2h6v1h-6zM16 2h4v1h-4zM4 3h3v1h-3zM8 3h1v1h-1zM10 3h4v1h-4zM15 3h1v1h-1zM17 3h3v1h-3zM6 4h12v1h-12zM6 5h12v1h-12zM6 6h12v1h-12zM6 7h12v1h-12zM7 8h1v1h-1zM9 8h1v1h-1zM14 8h1v1h-1zM16 8h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.10129;0.10255;0.10255;0.10381;0.10381;0.10506;0.11297;0.11422;0.11422;0.11548;0.11548;0.11674;0.80388;0.80532;0.80675;0.80819\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1zM8 6h1v1h-1zM15 6h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h4v1h-4zM9 6h6v1h-6zM16 6h4v1h-4zM4 7h3v1h-3zM17 7h3v1h-3zM6 8h1v1h-1zM17 8h1v1h-1zM6 9h1v1h-1zM17 9h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.14996;0.15535\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1zM8 6h1v1h-1zM15 6h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h4v1h-4zM9 6h6v1h-6zM16 6h2v1h-2zM4 7h3v1h-3zM17 7h1v1h-1zM6 8h1v1h-1zM17 8h3v1h-3zM6 9h1v1h-1zM17 9h3v1h-3z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.15535;0.15733;0.1593;0.16128;0.16325;0.16523;0.16721;0.16918;0.17116;0.17313;0.17511;0.17708;0.18175;0.18373;0.1857;0.18768;0.18966;0.19163;0.19361;0.19558\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1zM8 6h1v1h-1zM15 6h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM6 6h2v1h-2zM9 6h6v1h-6zM16 6h4v1h-4zM6 7h1v1h-1zM17 7h3v1h-3zM4 8h3v1h-3zM17 8h1v1h-1zM4 9h3v1h-3zM17 9h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.15733;0.1593;0.16128;0.16325;0.16523;0.16721;0.16918;0.17116;0.17313;0.17511;0.17708;0.17906;0.18373;0.1857;0.18768;0.18966;0.19163;0.19361;0.19558;0.19756\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h3v1h-3zM17 7h3v1h-3zM6 8h1v1h-1zM17 8h1v1h-1zM6 9h1v1h-1zM17 9h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.17906;0.18175\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h3v1h-3zM17 7h3v1h-3zM6 8h1v1h-1zM17 8h1v1h-1zM6 9h1v1h-1zM17 9h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.19756;0.20833\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h4v1h-4zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.23617;0.23976;0.24264;0.24551;0.24838;0.25126;0.25413;0.257;0.4754;0.48258\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM19 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM19 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.23976;0.24264;0.24551;0.24838;0.25126;0.25413\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h3v1h-3zM10 4h6v1h-6zM17 4h1v1h-1zM6 5h3v1h-3zM10 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM13 11h1v1h-1zM15 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.28843;0.29041\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M10 4h1v1h-1zM17 4h1v1h-1zM10 5h1v1h-1zM17 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h3v1h-3zM11 4h6v1h-6zM18 4h1v1h-1zM7 5h3v1h-3zM11 5h6v1h-6zM18 5h1v1h-1zM5 6h16v1h-16zM5 7h16v1h-16zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM16 11h1v1h-1zM18 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29041;0.29239\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M10 4h1v1h-1zM17 4h1v1h-1zM10 5h1v1h-1zM17 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h3v1h-3zM11 4h6v1h-6zM18 4h1v1h-1zM7 5h3v1h-3zM11 5h6v1h-6zM18 5h1v1h-1zM5 6h16v1h-16zM5 7h16v1h-16zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29239;0.29436\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M11 4h1v1h-1zM18 4h1v1h-1zM11 5h1v1h-1zM18 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M8 2h12v1h-12zM8 3h12v1h-12zM8 4h3v1h-3zM12 4h6v1h-6zM19 4h1v1h-1zM8 5h3v1h-3zM12 5h6v1h-6zM19 5h1v1h-1zM6 6h16v1h-16zM6 7h16v1h-16zM8 8h12v1h-12zM8 9h12v1h-12zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1zM17 11h1v1h-1zM19 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29436;0.29634\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M11 4h1v1h-1zM18 4h1v1h-1zM11 5h1v1h-1zM18 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M8 2h12v1h-12zM8 3h12v1h-12zM8 4h3v1h-3zM12 4h6v1h-6zM19 4h1v1h-1zM8 5h3v1h-3zM12 5h6v1h-6zM19 5h1v1h-1zM6 6h16v1h-16zM6 7h16v1h-16zM8 8h12v1h-12zM8 9h12v1h-12zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM15 11h1v1h-1zM17 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29634;0.29831\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M12 4h1v1h-1zM19 4h1v1h-1zM12 5h1v1h-1zM19 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M9 2h12v1h-12zM9 3h12v1h-12zM9 4h3v1h-3zM13 4h6v1h-6zM20 4h1v1h-1zM9 5h3v1h-3zM13 5h6v1h-6zM20 5h1v1h-1zM7 6h16v1h-16zM7 7h16v1h-16zM9 8h12v1h-12zM9 9h12v1h-12zM10 10h1v1h-1zM12 10h1v1h-1zM17 10h1v1h-1zM19 10h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1zM18 11h1v1h-1zM20 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29831;0.30029\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M12 4h1v1h-1zM19 4h1v1h-1zM12 5h1v1h-1zM19 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M9 2h12v1h-12zM9 3h12v1h-12zM9 4h3v1h-3zM13 4h6v1h-6zM20 4h1v1h-1zM9 5h3v1h-3zM13 5h6v1h-6zM20 5h1v1h-1zM7 6h16v1h-16zM7 7h16v1h-16zM9 8h12v1h-12zM9 9h12v1h-12zM10 10h1v1h-1zM12 10h1v1h-1zM17 10h1v1h-1zM19 10h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM16 11h1v1h-1zM18 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30029;0.30226\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M10 4h1v1h-1zM17 4h1v1h-1zM10 5h1v1h-1zM17 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M9 2h12v1h-12zM9 3h12v1h-12zM9 4h1v1h-1zM11 4h6v1h-6zM18 4h3v1h-3zM9 5h1v1h-1zM11 5h6v1h-6zM18 5h3v1h-3zM7 6h16v1h-16zM7 7h16v1h-16zM9 8h12v1h-12zM9 9h12v1h-12zM10 10h1v1h-1zM12 10h1v1h-1zM17 10h1v1h-1zM19 10h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1zM18 11h1v1h-1zM20 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30226;0.30424\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M8 2h12v1h-12zM8 3h12v1h-12zM8 4h1v1h-1zM10 4h6v1h-6zM17 4h3v1h-3zM8 5h1v1h-1zM10 5h6v1h-6zM17 5h3v1h-3zM6 6h16v1h-16zM6 7h16v1h-16zM8 8h12v1h-12zM8 9h12v1h-12zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM15 11h1v1h-1zM17 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30424;0.30621\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M8 2h12v1h-12zM8 3h12v1h-12zM8 4h1v1h-1zM10 4h6v1h-6zM17 4h3v1h-3zM8 5h1v1h-1zM10 5h6v1h-6zM17 5h3v1h-3zM6 6h16v1h-16zM6 7h16v1h-16zM8 8h12v1h-12zM8 9h12v1h-12zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1zM17 11h1v1h-1zM19 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30621;0.30819\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h1v1h-1zM9 4h6v1h-6zM16 4h3v1h-3zM7 5h1v1h-1zM9 5h6v1h-6zM16 5h3v1h-3zM5 6h16v1h-16zM5 7h16v1h-16zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30819;0.31017\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h1v1h-1zM9 4h6v1h-6zM16 4h3v1h-3zM7 5h1v1h-1zM9 5h6v1h-6zM16 5h3v1h-3zM5 6h16v1h-16zM5 7h16v1h-16zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM16 11h1v1h-1zM18 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31017;0.31214\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM8 4h6v1h-6zM15 4h3v1h-3zM6 5h1v1h-1zM8 5h6v1h-6zM15 5h3v1h-3zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM13 11h1v1h-1zM15 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31214;0.31412\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM8 4h6v1h-6zM15 4h3v1h-3zM6 5h1v1h-1zM8 5h6v1h-6zM15 5h3v1h-3zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM15 11h1v1h-1zM17 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31412;0.31609\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M6 4h1v1h-1zM13 4h1v1h-1zM6 5h1v1h-1zM13 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM5 4h1v1h-1zM7 4h6v1h-6zM14 4h3v1h-3zM5 5h1v1h-1zM7 5h6v1h-6zM14 5h3v1h-3zM3 6h16v1h-16zM3 7h16v1h-16zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31609;0.31807\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M6 4h1v1h-1zM13 4h1v1h-1zM6 5h1v1h-1zM13 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM5 4h1v1h-1zM7 4h6v1h-6zM14 4h3v1h-3zM5 5h1v1h-1zM7 5h6v1h-6zM14 5h3v1h-3zM3 6h16v1h-16zM3 7h16v1h-16zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31807;0.32004\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M5 4h1v1h-1zM12 4h1v1h-1zM5 5h1v1h-1zM12 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M4 2h12v1h-12zM4 3h12v1h-12zM4 4h1v1h-1zM6 4h6v1h-6zM13 4h3v1h-3zM4 5h1v1h-1zM6 5h6v1h-6zM13 5h3v1h-3zM2 6h16v1h-16zM2 7h16v1h-16zM4 8h12v1h-12zM4 9h12v1h-12zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1zM4 11h1v1h-1zM6 11h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32004;0.32202\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M5 4h1v1h-1zM12 4h1v1h-1zM5 5h1v1h-1zM12 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M4 2h12v1h-12zM4 3h12v1h-12zM4 4h1v1h-1zM6 4h6v1h-6zM13 4h3v1h-3zM4 5h1v1h-1zM6 5h6v1h-6zM13 5h3v1h-3zM2 6h16v1h-16zM2 7h16v1h-16zM4 8h12v1h-12zM4 9h12v1h-12zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM13 11h1v1h-1zM15 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32202;0.32399\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M3 2h12v1h-12zM3 3h12v1h-12zM3 4h1v1h-1zM5 4h6v1h-6zM12 4h3v1h-3zM3 5h1v1h-1zM5 5h6v1h-6zM12 5h3v1h-3zM1 6h16v1h-16zM1 7h16v1h-16zM3 8h12v1h-12zM3 9h12v1h-12zM4 10h1v1h-1zM6 10h1v1h-1zM11 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM5 11h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32399;0.32597\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M3 2h12v1h-12zM3 3h12v1h-12zM3 4h1v1h-1zM5 4h6v1h-6zM12 4h3v1h-3zM3 5h1v1h-1zM5 5h6v1h-6zM12 5h3v1h-3zM1 6h16v1h-16zM1 7h16v1h-16zM3 8h12v1h-12zM3 9h12v1h-12zM4 10h1v1h-1zM6 10h1v1h-1zM11 10h1v1h-1zM13 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32597;0.32795\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M6 4h1v1h-1zM13 4h1v1h-1zM6 5h1v1h-1zM13 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M3 2h12v1h-12zM3 3h12v1h-12zM3 4h3v1h-3zM7 4h6v1h-6zM14 4h1v1h-1zM3 5h3v1h-3zM7 5h6v1h-6zM14 5h1v1h-1zM1 6h16v1h-16zM1 7h16v1h-16zM3 8h12v1h-12zM3 9h12v1h-12zM4 10h1v1h-1zM6 10h1v1h-1zM11 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM5 11h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32795;0.32992\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M4 2h12v1h-12zM4 3h12v1h-12zM4 4h3v1h-3zM8 4h6v1h-6zM15 4h1v1h-1zM4 5h3v1h-3zM8 5h6v1h-6zM15 5h1v1h-1zM2 6h16v1h-16zM2 7h16v1h-16zM4 8h12v1h-12zM4 9h12v1h-12zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM13 11h1v1h-1zM15 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32992;0.3319\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M4 2h12v1h-12zM4 3h12v1h-12zM4 4h3v1h-3zM8 4h6v1h-6zM15 4h1v1h-1zM4 5h3v1h-3zM8 5h6v1h-6zM15 5h1v1h-1zM2 6h16v1h-16zM2 7h16v1h-16zM4 8h12v1h-12zM4 9h12v1h-12zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1zM4 11h1v1h-1zM6 11h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.3319;0.33387\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM5 4h3v1h-3zM9 4h6v1h-6zM16 4h1v1h-1zM5 5h3v1h-3zM9 5h6v1h-6zM16 5h1v1h-1zM3 6h16v1h-16zM3 7h16v1h-16zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.33387;0.33585\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM5 4h3v1h-3zM9 4h6v1h-6zM16 4h1v1h-1zM5 5h3v1h-3zM9 5h6v1h-6zM16 5h1v1h-1zM3 6h16v1h-16zM3 7h16v1h-16zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.33585;0.33782\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h3v1h-3zM10 4h6v1h-6zM17 4h1v1h-1zM6 5h3v1h-3zM10 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM15 11h1v1h-1zM17 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.33782;0.3398\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 4h1v1h-1zM22 4h1v1h-1zM20 5h3v1h-3zM21 6h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.37482;0.37751\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 3h1v1h-1zM22 3h1v1h-1zM20 4h3v1h-3zM21 5h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.37751;0.38021\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 2h1v1h-1zM22 2h1v1h-1zM20 3h3v1h-3zM21 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.38021;0.3829\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 1h1v1h-1zM22 1h1v1h-1zM20 2h3v1h-3zM21 3h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.3829;0.3856\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 0h1v1h-1zM22 0h1v1h-1zM20 1h3v1h-3zM21 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.3856;0.38829;0.39296;0.39655;0.40122;0.40481\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 0h1v1h-1zM22 0h1v1h-1zM19 1h5v1h-5zM20 2h3v1h-3zM21 3h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.38829;0.39296;0.39655;0.40122\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M21 0h1v1h-1zM20 1h3v1h-3zM21 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.44343;0.4463;0.44917;0.45205;0.45492;0.45779;0.46067;0.46354\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M20 0h1v1h-1zM22 0h1v1h-1zM21 1h1v1h-1zM20 2h1v1h-1zM22 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.4463;0.44917;0.45205;0.45492;0.45779;0.46067;0.46354;0.46642\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h2v1h-2zM15 4h2v1h-2zM7 5h2v1h-2zM15 5h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM9 4h6v1h-6zM17 4h3v1h-3zM6 5h1v1h-1zM9 5h6v1h-6zM17 5h3v1h-3zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M21 0h1v1h-1zM20 1h3v1h-3zM21 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.46642;0.4754\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 0h10v1h-10zM7 1h4v1h-4zM13 1h4v1h-4zM8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.51042;0.51293\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 1h10v1h-10zM7 2h4v1h-4zM13 2h4v1h-4zM8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h1v1h-1zM11 2h2v1h-2zM17 2h1v1h-1zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.51293;0.51545\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 2h10v1h-10zM7 3h4v1h-4zM13 3h4v1h-4zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h1v1h-1zM17 2h1v1h-1zM6 3h1v1h-1zM11 3h2v1h-2zM17 3h1v1h-1zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.51545;0.51796\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 3h10v1h-10zM7 4h4v1h-4zM13 4h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h1v1h-1zM17 3h1v1h-1zM6 4h1v1h-1zM11 4h2v1h-2zM17 4h1v1h-1zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.51796;0.52047\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h10v1h-10zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.52047;0.52586;0.54849;0.55568\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h9v1h-9zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M7 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.52586;0.52748\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h2v1h-2zM10 4h7v1h-7zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M9 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.52748;0.52909\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h6v1h-6zM14 4h3v1h-3zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M13 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.52909;0.53071\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h8v1h-8zM16 4h1v1h-1zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M15 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.53071;0.53233\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h10v1h-10zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h3v1h-3zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h3v1h-3zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.53233;0.54849\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 3h10v1h-10zM7 4h4v1h-4zM13 4h4v1h-4zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h1v1h-1zM17 3h1v1h-1zM6 4h1v1h-1zM11 4h2v1h-2zM17 4h1v1h-1zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.55568;0.55765\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 2h10v1h-10zM7 3h4v1h-4zM13 3h4v1h-4zM8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h1v1h-1zM17 2h1v1h-1zM6 3h1v1h-1zM11 3h2v1h-2zM17 3h1v1h-1zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.55765;0.55963\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 1h10v1h-10zM7 2h4v1h-4zM13 2h4v1h-4zM8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h1v1h-1zM11 2h2v1h-2zM17 2h1v1h-1zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.55963;0.5616\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 0h10v1h-10zM7 1h4v1h-4zM13 1h4v1h-4zM8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.5616;0.56358\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M21 0h1v1h-1zM21 2h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h4v1h-4zM4 6h16v1h-16zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 4h3v1h-3zM20 5h4v1h-4zM20 6h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.59501;0.59896;0.60291;0.60686;0.61081;0.61476\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M22 1h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h4v1h-4zM4 6h16v1h-16zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 4h3v1h-3zM20 5h4v1h-4zM20 6h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.59896;0.60291;0.60686;0.61081;0.61476;0.61871\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h14v1h-14zM6 4h14v1h-14zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 2h3v1h-3zM20 3h4v1h-4zM20 4h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.61871;0.63308\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M21 0h1v1h-1zM21 2h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM4 6h16v1h-16zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 4h3v1h-3zM20 5h4v1h-4zM20 6h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.63308;0.63703;0.64098;0.64494\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M22 1h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM4 6h16v1h-16zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 4h3v1h-3zM20 5h4v1h-4zM20 6h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.63703;0.64098;0.64494;0.64889\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM6 5h1v1h-1zM8 5h1v1h-1zM13 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M2 0h1v1h-1zM2 1h1v1h-1zM1 2h2v1h-2z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM3 4h4v1h-4zM8 4h6v1h-6zM15 4h2v1h-2zM3 5h3v1h-3zM7 5h1v1h-1zM9 5h4v1h-4zM14 5h1v1h-1zM16 5h1v1h-1zM5 6h14v1h-14zM5 7h14v1h-14zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.67672;0.67996;0.68966;0.69289;0.70259;0.70582;0.71552;0.71875\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM8 5h1v1h-1zM10 5h1v1h-1zM15 5h1v1h-1zM17 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M2 0h1v1h-1zM2 1h1v1h-1zM1 2h2v1h-2z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h2v1h-2zM10 4h6v1h-6zM17 4h4v1h-4zM7 5h1v1h-1zM9 5h1v1h-1zM11 5h4v1h-4zM16 5h1v1h-1zM18 5h3v1h-3zM5 6h14v1h-14zM5 7h14v1h-14zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM16 11h1v1h-1zM18 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.67996;0.68319;0.69289;0.69612;0.70582;0.70905;0.71875;0.72198\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 3h1v1h-1zM14 3h1v1h-1zM6 4h1v1h-1zM8 4h1v1h-1zM13 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M22 1h1v1h-1zM22 2h1v1h-1zM21 3h2v1h-2z\"/><path fill=\"#D87656\" d=\"M5 1h12v1h-12zM5 2h12v1h-12zM3 3h4v1h-4zM8 3h6v1h-6zM15 3h2v1h-2zM3 4h3v1h-3zM7 4h1v1h-1zM9 4h4v1h-4zM14 4h1v1h-1zM16 4h1v1h-1zM5 5h14v1h-14zM5 6h14v1h-14zM5 7h12v1h-12zM5 8h12v1h-12zM6 9h1v1h-1zM8 9h1v1h-1zM13 9h1v1h-1zM15 9h1v1h-1zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.68319;0.68642;0.69612;0.69935;0.70905;0.71228;0.72198;0.72522\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 3h1v1h-1zM16 3h1v1h-1zM8 4h1v1h-1zM10 4h1v1h-1zM15 4h1v1h-1zM17 4h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M22 1h1v1h-1zM22 2h1v1h-1zM21 3h2v1h-2z\"/><path fill=\"#D87656\" d=\"M7 1h12v1h-12zM7 2h12v1h-12zM7 3h2v1h-2zM10 3h6v1h-6zM17 3h4v1h-4zM7 4h1v1h-1zM9 4h1v1h-1zM11 4h4v1h-4zM16 4h1v1h-1zM18 4h3v1h-3zM5 5h14v1h-14zM5 6h14v1h-14zM7 7h12v1h-12zM7 8h12v1h-12zM8 9h1v1h-1zM10 9h1v1h-1zM15 9h1v1h-1zM17 9h1v1h-1zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.68642;0.68966;0.69935;0.70259;0.71228;0.71552;0.72522;0.72845\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.72845;0.73384\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h2v1h-2zM15 5h2v1h-2zM7 6h2v1h-2zM15 6h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM9 5h6v1h-6zM17 5h1v1h-1zM6 6h1v1h-1zM9 6h6v1h-6zM17 6h1v1h-1zM4 7h16v1h-16zM4 8h16v1h-16zM6 9h12v1h-12zM6 10h12v1h-12zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1zM7 12h1v1h-1zM9 12h1v1h-1zM14 12h1v1h-1zM16 12h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76167;0.76329\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 6h2v1h-2zM15 6h2v1h-2zM7 7h2v1h-2zM15 7h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 4h12v1h-12zM6 5h12v1h-12zM6 6h1v1h-1zM9 6h6v1h-6zM17 6h1v1h-1zM6 7h1v1h-1zM9 7h6v1h-6zM17 7h1v1h-1zM4 8h16v1h-16zM4 9h16v1h-16zM6 10h12v1h-12zM6 11h12v1h-12zM7 12h1v1h-1zM9 12h1v1h-1zM14 12h1v1h-1zM16 12h1v1h-1zM7 13h1v1h-1zM9 13h1v1h-1zM14 13h1v1h-1zM16 13h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76329;0.76491\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 7h2v1h-2zM15 7h2v1h-2zM7 8h2v1h-2zM15 8h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 5h12v1h-12zM6 6h12v1h-12zM6 7h1v1h-1zM9 7h6v1h-6zM17 7h1v1h-1zM6 8h1v1h-1zM9 8h6v1h-6zM17 8h1v1h-1zM4 9h16v1h-16zM4 10h16v1h-16zM6 11h12v1h-12zM6 12h12v1h-12zM7 13h1v1h-1zM9 13h1v1h-1zM14 13h1v1h-1zM16 13h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76491;0.76652\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 8h2v1h-2zM15 8h2v1h-2zM7 9h2v1h-2zM15 9h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 6h12v1h-12zM6 7h12v1h-12zM6 8h1v1h-1zM9 8h6v1h-6zM17 8h1v1h-1zM6 9h1v1h-1zM9 9h6v1h-6zM17 9h1v1h-1zM4 10h16v1h-16zM4 11h16v1h-16zM6 12h12v1h-12zM6 13h12v1h-12z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76652;0.76814\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 9h2v1h-2zM15 9h2v1h-2zM7 10h2v1h-2zM15 10h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 7h12v1h-12zM6 8h12v1h-12zM6 9h1v1h-1zM9 9h6v1h-6zM17 9h1v1h-1zM6 10h1v1h-1zM9 10h6v1h-6zM17 10h1v1h-1zM4 11h16v1h-16zM4 12h16v1h-16zM6 13h12v1h-12z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76814;0.76976\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 10h2v1h-2zM15 10h2v1h-2zM7 11h2v1h-2zM15 11h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h1v1h-1zM9 10h6v1h-6zM17 10h1v1h-1zM6 11h1v1h-1zM9 11h6v1h-6zM17 11h1v1h-1zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76976;0.77137\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 10h1v1h-1zM14 10h1v1h-1zM7 11h1v1h-1zM14 11h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h1v1h-1zM8 10h6v1h-6zM15 10h3v1h-3zM6 11h1v1h-1zM8 11h6v1h-6zM15 11h3v1h-3zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.77137;0.78215\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 10h1v1h-1zM16 10h1v1h-1zM9 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h3v1h-3zM10 10h6v1h-6zM17 10h1v1h-1zM6 11h3v1h-3zM10 11h6v1h-6zM17 11h1v1h-1zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.78215;0.79292\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 11h1v1h-1zM15 11h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h12v1h-12zM6 11h2v1h-2zM9 11h6v1h-6zM16 11h2v1h-2zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.79292;0.79562\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 10h1v1h-1zM15 10h1v1h-1zM8 11h1v1h-1zM15 11h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h2v1h-2zM9 10h6v1h-6zM16 10h2v1h-2zM6 11h2v1h-2zM9 11h6v1h-6zM16 11h2v1h-2zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.79562;0.80101\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 7h1v1h-1zM15 7h1v1h-1zM7 8h1v1h-1zM9 8h1v1h-1zM14 8h1v1h-1zM16 8h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 5h12v1h-12zM6 6h12v1h-12zM6 7h2v1h-2zM9 7h6v1h-6zM16 7h2v1h-2zM6 8h1v1h-1zM8 8h1v1h-1zM10 8h4v1h-4zM15 8h1v1h-1zM17 8h1v1h-1zM4 9h16v1h-16zM4 10h16v1h-16zM6 11h12v1h-12zM6 12h12v1h-12zM7 13h1v1h-1zM9 13h1v1h-1zM14 13h1v1h-1zM16 13h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.80101;0.80244\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 1h1v1h-1zM15 1h1v1h-1zM7 2h1v1h-1zM9 2h1v1h-1zM14 2h1v1h-1zM16 2h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 0h12v1h-12zM4 1h4v1h-4zM9 1h6v1h-6zM16 1h4v1h-4zM4 2h3v1h-3zM8 2h1v1h-1zM10 2h4v1h-4zM15 2h1v1h-1zM17 2h3v1h-3zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h12v1h-12zM6 6h12v1h-12zM7 7h1v1h-1zM9 7h1v1h-1zM14 7h1v1h-1zM16 7h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.80532;0.80675\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.84824;0.85542\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#8B8B8B\" d=\"M19 3h2v1h-2zM19 4h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.85542;0.86009;0.8741;0.87877;0.89278;0.89745\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#8B8B8B\" d=\"M20 2h2v1h-2zM20 3h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.86009;0.86476;0.87877;0.88344;0.89745;0.90212\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#8B8B8B\" d=\"M20 1h3v1h-3zM21 2h1v1h-1zM19 3h4v1h-4zM19 4h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.86476;0.86943;0.88344;0.88811;0.90212;0.90679\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#8B8B8B\" d=\"M21 0h3v1h-3zM22 1h1v1h-1zM21 2h3v1h-3zM19 3h2v1h-2zM19 4h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.86943;0.8741;0.88811;0.89278;0.90679;0.91146\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h2v1h-2zM15 4h2v1h-2zM7 5h2v1h-2zM15 5h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM9 4h6v1h-6zM17 4h1v1h-1zM6 5h1v1h-1zM9 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.91595;0.92134\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h2v1h-2zM15 4h2v1h-2zM7 5h2v1h-2zM15 5h2v1h-2z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM9 4h6v1h-6zM17 4h1v1h-1zM6 5h1v1h-1zM9 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.94917;0.95366\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.95366;0.956;0.95833;0.96067\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1\" keyTimes=\"0;0.956;0.95833;0.96067;0.963;0.99102\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M1 0h1v1h-1zM11 0h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.963;0.96534\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M1 0h1v1h-1zM10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 1h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.96534;0.96767\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 1h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.96767;0.97001\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M9 0h2v1h-2zM12 0h2v1h-2zM1 2h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 3h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97001;0.97234\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 3h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97234;0.97468\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 5h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97468;0.97701\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M3 0h1v1h-1zM11 0h1v1h-1zM1 6h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97701;0.97935\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 6h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM3 1h1v1h-1zM1 7h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97935;0.98168\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 7h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M7 0h1v1h-1zM11 0h1v1h-1zM17 0h1v1h-1zM3 2h1v1h-1zM1 8h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.98168;0.98402\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 8h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M6 0h1v1h-1zM20 0h1v1h-1zM9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM18 0h1v1h-1zM7 1h1v1h-1zM17 1h1v1h-1zM3 3h1v1h-1zM1 9h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.98402;0.98635\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 9h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M6 1h1v1h-1zM9 1h6v1h-6zM20 1h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM18 1h1v1h-1zM3 4h1v1h-1zM1 10h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.98635;0.98869\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 10h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6zM20 2h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM18 2h1v1h-1zM3 5h1v1h-1zM1 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.98869;0.99102\"/></g></g></svg>"
4export const MASCOTE_PARADO = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"36\" height=\"21\" viewBox=\"0 0 24 14\" shape-rendering=\"crispEdges\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/></svg>"
5export const MASCOTE_LARGURA = 36
6export const MASCOTE_ALTURA = 21
7
types/index.d.ts 49 lines
1export type Idioma = 'en' | 'pt'
2export type Moeda = 'USD' | 'BRL' | 'EUR'
3export type Mascote = 'animado' | 'parado' | 'oculto'
4
5export type Preferencias = { idioma: Idioma; moeda: Moeda; mascote: Mascote; limitePorModelo: boolean }
6
7export type Limite = { tipo: string; pct: number | null; reinicia: string | null }
8
9// O que a banda desenha. Sem carimbo de hora: só muda quando um número muda, para não redesenhar à toa.
10export type Leitura = {
11  modelo: string
12  pct: number | null
13  tokens: number | null
14  janela: number
15  usd: number | null
16  limites: Limite[]
17}
18
19export type LimiteModelo = { modelo: string; pct: number | null; reinicia: string | null }
20
21// Limite semanal por modelo (ex.: Fable). `em` é a última tentativa; `lidoEm`, a última que deu certo.
22export type LeituraModelos = {
23  em: number
24  lidoEm: number | null
25  estado: 'ok' | 'sem-credencial' | 'recusado' | 'erro'
26  detalhe: string
27  limites: LimiteModelo[]
28}
29
30// Câmbio a partir do dólar. `em` é a última tentativa; `lidoEm`, a última que deu certo;
31// `falhas` conta as tentativas seguidas que falharam (a espera cresce com elas).
32export type Cambio = { em: number; lidoEm: number | null; falhas: number; taxas: Partial<Record<Moeda, number>> }
33
34declare module 'claude-code' {
35  interface PluginState {
36    'usage-band-mod': {
37      leitura: Leitura | null
38      oculta: boolean
39      modelos: LeituraModelos | null
40      cambio: Cambio | null
41      // Preferências que a janela de ajustes mudou e ainda não foram gravadas no userConfig.
42      ajuste: Preferencias | null
43      relogio: number
44      // Onde roda e se a janela de ajustes existe nele: descoberto uma vez por sessão; o ⚙ só aparece com ela.
45      sistema: { plataforma: 'macos' | 'windows'; disponivel: boolean } | null
46    }
47  }
48}
49