From 40f535c5355b13059e8a76ca02c5b8b5f5958b28 Mon Sep 17 00:00:00 2001
From: Phelipe Lorran <112786693+httpsphl@users.noreply.github.com>
Date: Tue, 29 Sep 2026 23:41:18 -0300
Subject: [PATCH] docs(readme): a README that shows Botloft, with its mascot
and screenshots
The README said little and showed nothing. Now it opens with the animated
mascot (an SVG built from the app's own art and idle frames, still under
reduced motion), badges and a download link, then a hero screenshot that
follows the reader's light or dark theme.
It covers what Botloft does today (the crew Chief, chat with requests,
work handed between bots, the live browser, screens, routines, running in
the background, choices per bot) with four captioned screenshots; getting
started; how it works, with a diagram; privacy and security; a FAQ that
also says Botloft is independent from Anthropic; and a current status in
place of the milestone table. Development moves into a folded section.
The screenshots come from the dev preview's sample crews, not real data.
---
README.md | 244 +++++++++++++++++++++++++----------
docs/assets/chat-browser.png | Bin 0 -> 303169 bytes
docs/assets/chief.png | Bin 0 -> 246007 bytes
docs/assets/hero-dark.png | Bin 0 -> 270016 bytes
docs/assets/hero-light.png | Bin 0 -> 275455 bytes
docs/assets/mascot.svg | 82 ++++++++++++
docs/assets/routines.png | Bin 0 -> 249695 bytes
docs/assets/screens.png | Bin 0 -> 324867 bytes
8 files changed, 260 insertions(+), 66 deletions(-)
create mode 100644 docs/assets/chat-browser.png
create mode 100644 docs/assets/chief.png
create mode 100644 docs/assets/hero-dark.png
create mode 100644 docs/assets/hero-light.png
create mode 100644 docs/assets/mascot.svg
create mode 100644 docs/assets/routines.png
create mode 100644 docs/assets/screens.png
diff --git a/README.md b/README.md
index 2b7d997d..7d1c8a96 100644
--- a/README.md
+++ b/README.md
@@ -1,57 +1,180 @@
-# Botloft
+
+
+
+
+
Botloft
+
+
+ A crew of Claude Code bots that stays on and works together on your Windows PC.
+
+
+
+
+
+
+
+Botloft keeps a crew of [Claude Code](https://code.claude.com) bots running on your computer. Each bot has
+its own folder, memory and conversation. They pass work to each other, keep going after you close the
+window and pick up where they left off after a restart. You talk to each one like in a chat app, and
+you decide what they may do.
+
+## What you can do
+
+- **Start a crew from a goal.** Say what the crew is for. Its Chief plans the work and suggests the
+ bots it needs; you create each one with a click, or say why not.
+- **Chat with every bot.** Replies stream in as they are written. Send images and files. When a bot
+ wants to run a command, edit a file or open a website, a card asks you first, unless you told that
+ bot it may.
+- **Let them hand work to each other.** Bots send messages and tasks to each other. Every message is
+ saved before it is sent and retried until it arrives.
+- **Watch them work.** See every page a bot opens in its browser, live, and take control to sign in
+ for it. Watch the screens it designs take shape while it writes them. Open the files it made.
+- **Schedule routines.** Weekday mornings, every two hours or any cron schedule, with missed runs
+ and overlaps handled.
+- **Leave them running.** Bots keep working after you close Botloft. They start with Windows, come
+ back within a minute if something crashes and keep the PC awake while they work. Botloft waits
+ near the clock and tells you when a bot needs you.
+- **Choose per bot.** How much it asks before acting, and which Claude model it uses. See how much
+ of your plan's usage is left.
+
+
+
+
Chat and live browser. Scout asks before using a new site, and you watch it browse.
+
Screens. Designer's pages take shape while it writes them.
+
+
+
A Chief for each crew. It suggests the bots the work needs.
+
Routines. Work that runs on a schedule, with the last result at a glance.
+
+
+
+Botloft speaks English, Portuguese (Brazil) and Spanish, follows your light or dark theme and updates
+itself.
+
+## Get started
+
+You need Windows 10 or 11 (64-bit) and [Claude Code](https://code.claude.com/docs/en/setup),
+installed and signed in once with your Claude account. Bots run on your own Claude plan.
+
+1. Download `Botloft__x64-setup.exe` from the
+ [latest release](https://github.com/httpsphl/botloft/releases/latest) and run it. It installs for
+ your Windows user only, with no administrator prompt. The installer is not code-signed yet, so
+ Windows SmartScreen may ask you to confirm ("More info", then "Run anyway").
+2. Open Botloft. It sets itself up; there is nothing to configure.
+3. Create your first crew and tell it what it is for.
+
+When a new version is out, an **Update available** button shows in the title bar. Uninstalling
+(Settings > Apps) removes the app and stops Botloft from running in the background. Your bots and
+their files stay in `%LOCALAPPDATA%\Botloft` and `%USERPROFILE%\Botloft`.
-Always-on Claude Code crews for Windows.
+## How it works
-Botloft keeps groups of persistent Claude Code bots ("crews") running on your machine and lets
-them hand work to each other. A Rust daemon, `botloftd`, runs each bot as headless Claude Code,
-stores everything in SQLite and delivers messages between bots durably. A Tauri + React desktop
-app shows each bot as a chat: you talk to it, send it images and files, and approve what it asks
-to do.
+```mermaid
+flowchart LR
+ app["Botloft app Tauri + React"] -- "JSON-RPC over WebSocket 127.0.0.1 only" --> daemon["botloftd Rust daemon"]
+ daemon --> db[("SQLite")]
+ daemon -- "stdin and stdout stream-json" --> bots["One claude -p per bot"]
+ bots -- "Botloft's MCP tools messages, tasks, requests" --> daemon
+```
-> **Status: pre-alpha.** Milestones M0 to M4.1 are done: the daemon, the chat, messages and
-> tasks between bots. M5 (distribution) is in progress. The design lives in
-> [`docs/spec.md`](docs/spec.md).
+- **The daemon is the source of truth.** Closing the app never stops a bot. `botloftd` runs as a
+ scheduled task of your Windows user: it starts when you sign in and comes back within a minute if
+ it dies.
+- **Claude Code is the runtime.** Each bot is a real `claude -p` session with its own workspace,
+ memory (`CLAUDE.md`) and conversation. There is no custom agent SDK and no API key to manage.
+- **One conversation per bot.** Your messages, messages from other bots and notices from the daemon
+ reach the bot in order. What it does comes back as a chat: replies, tool use and requests you
+ allow or deny.
+- **Durable before delivered.** Every message is written to SQLite before it is sent and retried
+ until it is delivered or marked as failed, which you can retry.
+
+The full design, from the protocol to the states of a bot, lives in [`docs/spec.md`](docs/spec.md)
+(in Portuguese).
+
+## Privacy and security
+
+- **Local only.** The daemon listens on `127.0.0.1`. No cloud service of our own, no telemetry, no
+ accounts. What bots send to Claude goes through Claude Code, as when you use it yourself.
+- **You decide what bots may do.** Per bot: ask before anything, accept edits, plan only, or decide on
+ its own what needs your OK. Unless it decides on its own, a bot also asks before its first visit
+ to each website.
+- **Tokens stay safe.** The app authenticates with an owner token readable only by your Windows user.
+ Each bot gets its own token per start, and the daemon keeps only its SHA-256 hash.
+- **Botloft is not a sandbox.** Every bot runs as your Windows user, so isolation between bots is
+ cooperative: a bot can read other bots' folders if it decides to. Give bots only the permissions
+ you would give Claude Code directly.
-## Install
+## FAQ
-1. Install [Claude Code](https://code.claude.com/docs/en/setup) and sign in once.
-2. Download `Botloft__x64-setup.exe` from
- [Releases](https://github.com/httpsphl/botloft/releases) and run it. It installs for your
- Windows user only, with no administrator prompt. The installer is not code-signed yet, so
- Windows SmartScreen may ask you to confirm.
-3. Open Botloft. It sets itself up; there is nothing to configure.
+
+Does Botloft cost anything?
-Botloft updates itself: when a new version is out, an "Update available" button shows in the
-title bar. Uninstalling (Settings > Apps) removes the app and stops Botloft from running in the
-background; your bots and their files stay in `%LOCALAPPDATA%\Botloft` and
-`%USERPROFILE%\Botloft`.
+No. Botloft is free and open source under the Apache 2.0 license. The bots run on Claude Code with
+your own Claude account, so they use your plan's limits; Botloft shows how much is left.
+
-## How it works
+
+Do I need to keep the window open?
-- **The daemon is the source of truth.** Closing the app never stops a bot. The daemon runs as a
- scheduled task of your Windows user: it starts when you sign in and comes back within a minute
- if it dies.
-- **Claude Code is the runtime.** Each bot is a real `claude -p` session with its own workspace,
- memory (`CLAUDE.md`) and conversation, talking `stream-json` over stdin and stdout. There is no
- custom agent SDK.
-- **One conversation per bot.** Your messages, messages from other bots and notices from the
- daemon all reach the bot in order. What it does comes back as a chat: replies, tool use and
- permission requests you allow or deny.
-- **Durable before delivered.** Every message is written to SQLite before it is sent and is
- retried until it is delivered or marked dead.
-- **Local only.** The daemon listens on `127.0.0.1`. No cloud services, no telemetry.
+No. The bots run in the background, even after you close Botloft, and start with Windows if you want.
+Settings has a switch to stop them when you close the app instead.
+
-## Layout
+
+Where are my bots and their files?
-```
-crates/botloft-core domain types, IDs, message envelope, protocol types
-crates/botloft-store SQLite storage and migrations
-crates/botloftd the daemon
-app/ Tauri v2 + React desktop app
-docs/ specification and ADRs
-```
+Each bot has a folder under `%USERPROFILE%\Botloft\\`, and each crew a shared work folder
+that you can point at a project of yours. Botloft's own data (SQLite, logs, secrets) is in
+`%LOCALAPPDATA%\Botloft`.
+
+
+
+Why does Windows warn me when I install it?
+
+The installer is not code-signed yet, so SmartScreen does not know its publisher. Each release is
+built by GitHub Actions from this repository, and updates are signed and checked by the app before
+they install.
+
+
+
+Does it run on macOS or Linux?
-## Development
+Not yet. Botloft is Windows-first: it uses scheduled tasks, Job Objects and Windows notifications.
+
+
+
+Is Botloft made by Anthropic?
+
+No. Botloft is an independent open-source project. It uses Claude Code as installed on your computer
+and is not affiliated with or endorsed by Anthropic.
+
+
+## Status
+
+Botloft is young (version 0.x) and moves fast. The daemon, the chat, crews with a Chief, messages
+and tasks between bots, routines, the live browser, screens, the installer and updates are in place.
+Planned next: a question box where bots ask you things, "always allow" for requests, search, and a
+code-signed installer. `main` can be ahead of the latest release.
+
+
+Development
Requirements: Windows 10 or 11, Rust stable (MSVC toolchain), Node.js 24 and pnpm. Running real
bots also needs Claude Code (the native `claude.exe`) installed and signed in.
@@ -67,6 +190,7 @@ cargo fmt --all --check
cd app
pnpm install
pnpm tauri dev
+pnpm dev # the UI alone in a browser, with a fake daemon and sample crews
pnpm check # typecheck + Biome + Vitest
pnpm bundle # NSIS installer with the daemon inside
```
@@ -86,29 +210,17 @@ botloftd service uninstall # stop it and remove the task; bots and data stay
Each data folder gets its own task, so a dev daemon installed with `BOTLOFT_HOME` (or `--home`)
never replaces the real one.
-## Security model
-
-- The daemon binds to `127.0.0.1` only. The app authenticates with an owner token stored under
- `%LOCALAPPDATA%\Botloft\secrets`, readable only by your Windows user.
-- Each bot gets its own token per process start; the daemon keeps only its SHA-256 hash.
-- Bots ask in their chat before they run commands or edit files, and wait for you to allow or
- deny each request.
-- **Botloft is not a sandbox.** Every bot runs as your Windows user, so isolation between bots is
- cooperative: a bot can read other bots' workspaces if it decides to. Give bots only the
- permissions you would give Claude Code directly.
-
-## Roadmap
-
-| Milestone | Scope |
-|---|---|
-| M0 | Workspace, empty app, CI |
-| M1 | Daemon base: config, storage, RPC, crews and bots |
-| M2 | Runtime: supervisor, restarts with backoff, Job Objects |
-| M3 | Messaging: durable delivery, bot tools, tasks between bots |
-| M4 | Desktop app: onboarding, crews, bots, timeline |
-| M4.1 | Headless bots with a chat, approvals, attachments |
-| M5 | Distribution: start with Windows, keep awake, installer, updater |
+```
+crates/botloft-core domain types, IDs, message envelope, protocol types
+crates/botloft-store SQLite storage and migrations
+crates/botloftd the daemon
+app/ Tauri v2 + React desktop app
+docs/ specification and ADRs
+```
+
## License
-Botloft is licensed under the [Apache License 2.0](LICENSE). See [NOTICE](NOTICE) for the copyright notice that goes with redistributions.
+Botloft is licensed under the [Apache License 2.0](LICENSE). See [NOTICE](NOTICE) for the copyright
+notice that goes with redistributions. The screenshots show sample crews from the app's preview, not
+real data.
diff --git a/docs/assets/chat-browser.png b/docs/assets/chat-browser.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1e29b04b4c730a915a19f2ddc5da36813a6cfa4
GIT binary patch
literal 303169
zcmcG$byU=A7dA{umm(!8DU#BSgd!~>Al)F{9Rm*Cp>&9(v~)^?NQ+3v(A_aG#Cvm|
z^_+8__n&Wlf4sBSC~MaI>b`ee*WTBju-D46c-W7yk&uw^oL7E=kD_G^yc<(ePG9qza>E)Pmkrx+k0#eRo^~rGCbd^(LW8p
z*5-67l_=LQpD1r}|Hev!mWT7^vhXGIFgDD-oE`kvazwz*`jYx5z}iT6b%ji_iKkL*l6+i
z;=}m(I4kSZr+%d+C0D|Pn2LC4C^+c&lpCqMmT&Y7Nw4O1uiBU2S!B49?6;ijkLtam4um&dlNOFKGp0*9n;
zZCUwY+qgawh5vi$D`M8^O8PggtgIsODEP?~k~s28N(LURg;?Hy9Foo}(9ApBxIYhkX^tY0BM
zKK@;;4LPtTZ1flZ-XcMVBCKmaiM+f#Q*(1;EsgCI9t&ammyyZU4lpSq2R5tD_QT~~
znuLsu>o>=1gHe3ee_pGqW;?w8_ela#IT>)#P=5dZ9h;G%L`z5}XwnlIMlTz!+XT)s
zhNSzPOGxOVcPK-IMo&Xyt;C>p{#i4FVric-Rlj*s#BD__aU2~7jzClhp_{gcXP9of~@m84x`
zHC|L$_=AO=UH$a)zYoL2@FUK)oq3nI%D~J_0Uo}TlwJEI+)_&e0WM`SYbOvC6jVh0
z@ZT#g6#9^aVIKl!=_)J1RMlxBJaN*+381N|1vnt%*+hj>N~r-rdHtQR`nCxW?-4|D<gW~6x>lWxQu9%y?@uuTv%#Pp#e1R8sjja6R#Vg3@Skm1iB$t@d-puR_&W8#KN)j&
z0^oZ)rG{LDn1(a_B06Rp#}`NrO>_0S9J@mIFQlJ6d*;!i4;~lEz#XrGGQoN+?UM4J
zhmMohP**1gk6c(-I8^rI#}AEK+vRh_xkpOo!ag%0=1$!1WNlRM^5{HK-0qQAOKyHX
zzwZ0?T)ga4bxZPZ`QN&a~%q1WTXC`xC)(xH%Cd+mov
zDs1da(finwDGgYzUkqeY-{|QL9&x|VG(8-{OqiLOPS1G1?9>3B9#fO-Ux9-1r>?gb
zROG?D-ndX4EMtlMrrj!^SmRk~MR-Q(>uNUZ7!9%TADP57G_rDXEQopt_rBfPFGxU4
zCOJt#UYa0_gOZWI^+Xz*1LNYUmt%wO$D|~+w{LT)82@&RN(!&@J-K2H_Nf%NBcN4zcY`N`>LOG!jdOdb*43PTaasEt
z(v%fT&>`F=Urqk_?!u6)Rr^loP-oo>lf9&l$wdcyFJ{}@g1__LPPN0RfH?;Q9lj+y>0Jg(o&*CCjWt+1V;
z^w03}9Zb!ubX;b_pY(T-6>Ta>ZoP_sK6CPfnmRc^@BYfCi|$#ja>D{@>j{(&1&`Hr
zoehe*j5Jhn`3dFq>yUEe*>eO;)%6hd%2o#75#vXi;qG*e%jT~X4n2I-No%9gJeBXm
zp?{PX);P7h14(cCZkb58$Goz3&rg9rI}JSZJ>T*R8EJ-sOyd$(t@WCCD^;}hSJzkk
zCA79sq)6IK8PX&R43E0Wm0XXI=s13RbmPLJqA!h&UZm6wL^;&WK{)8=w9KPbr^h)C
zRINT25_{eoJb$)d6aLro;-K%c#9KTz^EBb`Jy2S1rz%@Z@0y9um&aQY0>J>8Q>EP!uj#i_KaJg>D^4q^1
z-7Ut5Oym>Z_%~a`=ggOT0T|RMi+fG>1=1mBJFf)cbM6v5W7r*HB!qjf-nn~jd#vfs
zlK6|@tF)IP_Yx?p6Mk8g@E!AT^L&<-8LPDLyHM;XxwY7ZgEN}EbI|pc`qn?lbq<{f
z;jndqSdjemXjN!&9uvXAz-GMa%z4o2b=xy{EWiQrL?&h!ah`nTtL^L%6bJ$)h@HW`
zQ;Q+%i6YJJyeFaPGw8kdUZw}##|g$tv^{v+Pm7vktNX`J^nh=|Su#nmt@jd3#i^S-
z!*by}4}F8=nqK6qfqYK|DvZB1qk+&{0-
zSZx)F2HxVtv+tncFmr#zJPQr3)yL>1uqc>>+3rNDHJTD3zZMReD8Hsj@WW#_fM4I%
zd%|D!w46Mc!2cdFF|lJIl52*2$U&9#&tqNnJ%(kG<9AS}Ll0u)CB5@y-t1Iu&afoj
zq*0+<_~~LXF}#a4guTUZG;)$_lCjBBs*@oY<5%BXP1?_!3WcS=Ik&ZO4|Xfem@7BG
zKekZPx`%XgdBU#C&lOT1I{hLqi0$e|Yme-h2?v?uuZX8+@7G2-q}v$Fqt%YsRe?n>
zcrs0`FLaw|;ubh-Q{LyO9SVYHlcE_4Mr##P&UU5nDXOhw`o;0F9`jmS
z0&n={w(Iq$Os{S~^Z7_fYx@T@bbVKx9CSBY_SESM>r^e1L)II|
zqH{fscbk)lDYQg4*{QwGWW(JY(?)$cmoxj(N4{z8hPPv5Cn~PxVdxuLT@yFN-k$e;
zt=2llGGQ`vp3@S0PmRYaA)e6Mf<&m)+B)0Lh&mlhqIrJxhX>I~>fw^si`KT&`6g$lpgns2E5{$KYz93X9ew}
zbTXVyv~XXt`-a+vUTnCA&(k}b^f~p*-3!(pvz?3weh&?2Zekpv#T;1e4x!HO6T+eK
zi!F{Be#|&Dw#c(G{mlMPS~*vQnq6yJvFvYa18udR;p8-2dq=X#Z|x(Jz6)o}Tz0kp
zBzO;5n$xkzgpk-?ZB-r_uu{aC1Ti(kwNa(imAbQHa=S$rT7;16XT>Uvd2`v-+BGM?6)?KR#c6T~vBtx6%{d@mt<
zdnk{<-M*e}F~?yKEwcfl*s_&{9C^L9kUnLec9!YL;zI36y6>{rRnxg|=dk2wVQO$g
zx7_=i0KPRC1V7Mmk(Y>x$dnMA$92s%j35~di;0;NAP_F$v-EE@Bv$Lh$szZd$kCl(
z4G8CRhMOBBi$CbwbY{4IxgdF5EnB~~DO7Xb8sg2dC*`vFG~cf_nNBpaD>(VD;(k_U+&KN5m~?&EVsT}qp7V07?4gtk3MJl!9<>ISp2gUKLM
z<2?0wEm^29Jl%omzfAA}d2Wdkq;0e}YFc%6y`5W@2^z0Gj7eC^lp`-~xW&vBErx~@
zQclJ!U{+GKUk_SN#*?IssGmp0JQ9`p?H3%W5@XmE#Q80gjl=g8+Oz$lD~@OJLFUcV
zXls?(n&H$fY#P2#gsKzy^*ypmgjQB3(%SzG^QN-tZqqC$yEEQNdx-0E2`;0Kx<@h(
zA8=?@MrMk6Uwwtq?sWPeRJ9L=u?l=cPMTU%O-yLW$Gy&r83_d~_i3mi%B8rUyC5Z727+ms8WOg70{fL_XY}@5kZw9=
zrKc&&>=$a1)9?OMR#&&&5Bu`eO||@#C4H;gx1w#3tT~x2bxp@%K4@R`tL*(ecjvWZ
z&1WUob2_ZSsgq|zVte07X=r-;mj!SAAv!!{u->qxafkInCbh$KYQCxG7GH`6}d5?Q&LU
z)uxv`>AOn9@*TwSutWq2d#c)-H$T_2Al;eR7%lpoDs?yyD7Y%{xabuJ7;u<}K1|CS
zN_f)AJ
zP)VK>`nzjrINc;Hle-Q%Hv3uO7x2YQH6a^qy7W-FvT#<`+*?eExlQ}lSrxkNB2FOI
z6zZqB>U48oD?5#K{itV(;7A;a#^H9#cH`T@1L3C6&ilpwP3|{Bvs|%5s@a?qD$Qxz
znWbWfw>x;EqrTiRR9Pr2b3$gk&9~D5-Us#+_}?$qyuD$n4>p8-$n@&8w7)rGWwml8
z-VV+-+H{Rlh2{HytrB$+`=S6nEnw$dTuGdA5ytl*4=-Z%mvIVqdwki@n3zGV=({_P
zem;|8+wq{Mb+%sD-p%O#Na{&+TP-rIhY_z+^7F+g)vM0oEBoybX!fpz>uQSVIJ}pT
zB8ksuw%eYK7UID_$P-DTSyC+;sSF!KowOagahSAMtiGOr=-6efkemcOni6xx`g3lE-MfBH%Ly*
zjBAeDvWE#SodCEXvHM(cIf!bFuv`fly9X9(Feu!?#pfjyFTYBSA7Gkzt^wKD3
zsSD-fJTTU+j&`dm>S$Fsrrv9Q(F_@L;h>;S-R8{eM7rcos&7`!6O-uMfqy1s-h(r9CTmhU)1|u
zD$G8+&O11t^5uZ_G?lGBSX8Mo-a79Ys*t?r=|QU0T@IZeTvxAZYf+YxxI~CK
zcFC~NaR+KQU`O%sv5|UM(KOM@QO4>o`jjQss8zk`^aYVR+I!3;t{Ee|Gh}-MlAbNq
zAjk|35dlkXr5FCsl7Whhe3OcUm_$p=NwKN}=5H*93nxO=5hmHP(H1oP$?
zU%2Q)maR$bi&~7@%tSq;&LqF>pSuZeI5pI>iXc7Xh)ku8#=sRAc&9oPXb>UDZ%dTr
zmnExoWnQ+Mh0heZMXn;himvgp%W2B!>*TmUO{Hjd1fFi$9O9KOxHr4+`9!ilJn1%X
ze(d2zPOSU?T>!zv#^|(tu{|sYw+IUK<~6Efvu@gb5mwoT)*B!*)?L{7z*4_5p1)`9
zHKLU^awD-LsMnOIM4j?22G(2jgNp0$?v@9HwUL;bC#o7fbR??U8i7P>%2{JZn_c{aKphScz0%CUVFEDYpAxW9Y8ZQuq+x{q84
zx_~XqG3qD-^=Q}imz*%W>e5r6;~_}HeyvXZ+LvQ8p{>>dj-aj_<&~X`d2>?by?NXs
z(t{zTn4`VGdjq$5X9f+B0{x|*OCxCBd-YU4RESqe92w`@f|%JC7|5wjxS`0pB*9pM
zgtpSDGsc@S60wN>w-3JPE@G>*(8LjUQdz7VTnX(8K4pBABOJPmV?6O4Yi^IKbd9o2
zV%{s^Td#nlnj4%bFm?LpP>^ShflSw^d)hdLzB6hL{_XPV`-6t+-4J^;4A~O4zav10
zB*2ejTD-{
zP!n^Ig;35jxgLL-pJ4F&;G3IInk&Y)kYsc$eO`KPftjxpb#^}=U^|Rij+o(P(NNX9
z>>M|rF5%(PIMZk~xrt>#ZpQVoFgo}3iEP@i9#|Pg-a{r!CmKFpuU@+`Npl=*!+m-B
z3K>F(V)z^FnUy~hA?DIs>53jB-x{jRlB4}s&nY@3#1R5H(K|yaD#~ja80Dshwrvv^
za8}Q)`GD-<*fzSgW^(PD%iN%kD5j@tf1aUs=xq56Mu@s~egdncLhjAbd^4qsz5S=j
z*8^Vl#2en3?ke--p8jpW4(#kpM7VXi{(DcfI{fks)|yoZJCQuMA?d%P$bBOSHpY~S
zloYAAAT6&F(M&A`n}NL7?)98Y-Ojoo!`pWvab^
z2LE-Jp7-L{Uf1hKBh|Pma_uKn53M}`YJm#Q_$Trb8
z-AMMLAb7~V+l}D?!O$Oaqd8acK?PN%qcIi8l8q%X&B0JLQN6`;4D{O?jD2xo=IX0{
zSz?lBq-EQDks${A54`+xM{8sWQkgHc1Yo@f+mjOr-}VnJ24_}CC3wcn
z+GM|jgV0a7$fqt{ULs6^M+Z!H}wQ|E(v+&(VV3_h2x$ZP9=XiCv(xv(@x^**x?RneY&kG2Sn2><5(C_&s7&uw0%%h_Dd@M^Jh%gyi
z{<7}uzTs(q?nvMWd)o1xo}9RBvUo8K<95izfXzt36yp+)rl*hj+DkWcUP+i$CdHr0ro}l;>
zwDAc*>}1Ug^Mjc3RCXH^(9lK~^Lixi9;Ma9KfXec5l
z@NEf-&I*``hvN}8wt_FH2f&}`31ytq2*w!Isg$|L=;}8gJlLaYeNycwW4ob=Aa{ZR
z_9)&w|H{tKlAASrt5g%z7eLu;Hw;h0I@w7;Q}l$K)v8#F{)_1ElB-Ba%Qrib;j8r%oPdcP!-m+0EWZnNe5mZ|1d#<{!4Q0rJimMxZK~?s2@%Co_p7}ts>+6_79s3qU
z6O2~r?Snmqm+M0r8K8xj$e}k~cx0~$+Mi4+)$S@szXq)TuwH*XH=8@hfB5!ZN>g5b
zpKV&coQzE1yenM@7ijLhe2Ff$qqb`9@k{|yB~e+2aMDoxkf4=1wgoY_REZmGkOqog_-bc);&Vcw$DyOMFzy0nC!
zL2vJ(>@A0uIT!7GzID1}d{eFH$Yj2_SDN-FyE=MW5iA1*x;l=Y#&7%P-|e&z+==<=
zgEJ{9HxobUASm6Ng63w?-&VYQpH|iNe}rW0rcz>}J;eW~mw}0mIaT#I+cFgmC1B3V
zV9Tv3Eq&&-jNl3@*74C%M;5`%&BE`?-)X)7>iVJG3-r!3(|VWq0yHCTO)zG{8g)59
zvx*CMm*qa}{Dah)VRz*}&wO_Y6UoQ^wljj!W2OfdWWgx^)6cw*f8ZZ$TZH;Q%}LV*
zwKvRvZz}lX!@uz5U5b!I{@1dCi+%S0*Bye0@cQ|`T5jO@C$#^xB<_xXNchhpfWyH}
z{?GNnGyePP|6iB?zYkxDT?9=rBnBp?CBf*Ie+Q_$KUQc>$k37W%Skm|UHL$(?jbR;
z(M;`2Ss598ERLjzA3t8nD=6@h{e5+(5gw%kP;oCRDsr$C1joN#b!+-sR`%!l-%E@c
zBJ~`T5Eq>f^8fW3|3BHHD;BVl6>JKqf3rm=OeafBuo3uF
zfGTx$cN?WLMK8a8_wJRFQWW~%dxfTcXCRmu27<}y>52$6&UJHH(9e;yvU&;*d-PAM
z^e;og#L!e2U0E>=&aEeNPmaJpM2GCZ9~ELjDW51tesE`RcP~lym%zx*8Yd^ofOdk9
z5b<1Bmom}J(N`xzV~{O1Ps@Yd!>xf}rk3yd-`ijK0ob)^dE;s#h3CcUdRTPyAHxd!
z>4<3MXYW%?VKU^oFDc%>75Ruk`Sj^i-hUtGupegMd&rEJYwbpY
z*I!|BTz`-i*VVNj>=d#dAaqjnk5cqHa?Mw_ZQ-*$Sk-khrF_f2*23Is*v%i4FuUpz
ze6lU$=7W~laN2Ntbn_ETt>KMIx{
z_8{uyrbTM^?;NbU0-pnA3A)OEod;~l9`R^MR)?!*rc`-i4UE>`5~gG$S$;q1c;a!2
z$i)u(7qyvZ@ObCV8d>bu8sCIDPd^xvycgP^5PWqIGj;>OKt)GsM?^90Y10b&GsVqUS!+=VXXo?6*
zKH;otFfPjSOhdJqs=U|h$m{>Ft#TNS*c+T;uA!es+ridQOleyQN_*Tugc?k(q|DZJ
zE*LR3A<-v`lQu827c+b;*D~`!IIC;wn&;bqq8H7~hm@@Hxgn^%;ji28pT7>G*Rp79
zHQLcL*I1$-4*uZJ{_Lim4`2K0v0a)pUdhMy?uFi}k%rSo@dwxbM|NDEw4GMPWKaso
z>h^wqRsO>V+|i#W9A)E)C~|#{N#2Uk)6q52Gcw+b>Fr#=cXsUDK?*kFt#A4A<-@r^
zx1*$)f65Dd9)ZiLO0$R}fxlzn>*w_o)uOc`mQ2rCju(6~IsZ(|zvhLWYuK&)wpK1M
zYgZZ2ZMe2YE0SknnZESx``9%}44BkkhlyriWdH+J5o`L;1*=24M;Q^14N`zqX8
zrG{?1$Cfjq
zpa4JmXLFv=&f=twet%(0G}wI4r`0blZCBmrD66-9-kWnQfo#Hqy0hqwd{LcNVpG7C
zq5D!PW-4C{^i$q*S#49KhZRTLu3gpklG;|*!m`R(gVK}DTJLAtQJkFXru1F$B-`ks
zYxQ(^T*sb1-OBf>6sR!$h7al?Ms@4Xytq)wQa1Baf_u<>OMXl&UvV0sFlp8ydJ)F?
z%F=QZnF`3Lem#tTqCG_Zd9s|m
zo-inKHhxuiTcpfm<&K7Tl`eSmMCaP>y0IQjTq_3|GNG0?rw7civ8NpK-)2-8rR7Cv
zrMW+#s(j2?dhdYMw2pQLg}>Cqvs*Y`o|aua<>XJB)Q`TxUCu^7y=DIVh@@{JS~(Iz+NV#$D=RAxgh9a7(&}qWeMH%7`PRsTmR#%-
z#jg1f9Xvk8ZP}tzTzq`T0gRdF{Rpl2