From 9aa032d76c434e44cd28b637835d529e8a46f771 Mon Sep 17 00:00:00 2001 From: okxlin Date: Fri, 13 Mar 2026 19:53:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0zeroclaw=E5=88=B0?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/zeroclaw/0.1.7/.env.sample | 8 ++ apps/zeroclaw/0.1.7/data.yml | 123 ++++++++++++++++++++++ apps/zeroclaw/0.1.7/docker-compose.yml | 35 ++++++ apps/zeroclaw/0.1.7/scripts/uninstall.sh | 3 + apps/zeroclaw/README.md | 27 +++++ apps/zeroclaw/data.yml | 31 ++++++ apps/zeroclaw/latest/.env.sample | 8 ++ apps/zeroclaw/latest/data.yml | 123 ++++++++++++++++++++++ apps/zeroclaw/latest/docker-compose.yml | 35 ++++++ apps/zeroclaw/latest/scripts/uninstall.sh | 3 + apps/zeroclaw/logo.png | Bin 0 -> 9947 bytes 11 files changed, 396 insertions(+) create mode 100644 apps/zeroclaw/0.1.7/.env.sample create mode 100644 apps/zeroclaw/0.1.7/data.yml create mode 100644 apps/zeroclaw/0.1.7/docker-compose.yml create mode 100644 apps/zeroclaw/0.1.7/scripts/uninstall.sh create mode 100644 apps/zeroclaw/README.md create mode 100644 apps/zeroclaw/data.yml create mode 100644 apps/zeroclaw/latest/.env.sample create mode 100644 apps/zeroclaw/latest/data.yml create mode 100644 apps/zeroclaw/latest/docker-compose.yml create mode 100644 apps/zeroclaw/latest/scripts/uninstall.sh create mode 100644 apps/zeroclaw/logo.png diff --git a/apps/zeroclaw/0.1.7/.env.sample b/apps/zeroclaw/0.1.7/.env.sample new file mode 100644 index 000000000..5919b1b4c --- /dev/null +++ b/apps/zeroclaw/0.1.7/.env.sample @@ -0,0 +1,8 @@ +API_KEY="" +CONTAINER_NAME="zeroclaw" +PANEL_APP_PORT_HTTP=42617 +PROVIDER="" +TZ="Asia/Shanghai" +ZEROCLAW_ALLOW_PUBLIC_BIND="true" +ZEROCLAW_GATEWAY_PORT=42617 +ZEROCLAW_MODEL="" diff --git a/apps/zeroclaw/0.1.7/data.yml b/apps/zeroclaw/0.1.7/data.yml new file mode 100644 index 000000000..62a6b51c8 --- /dev/null +++ b/apps/zeroclaw/0.1.7/data.yml @@ -0,0 +1,123 @@ +additionalProperties: + formFields: + - default: 42617 + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + label: + en: Port + zh: 端口 + zh-hant: 埠 + ja: ポート + ko: 포트 + ru: Порт + ms: Port + pt-br: Porta + required: true + rule: paramPort + type: number + - default: 42617 + envKey: ZEROCLAW_GATEWAY_PORT + labelEn: Gateway Port (container) + labelZh: 网关端口(容器内) + label: + en: Gateway Port (container) + zh: 网关端口(容器内) + zh-Hant: 網關連接埠(容器內) + ja: ゲートウェイポート(コンテナ内) + ko: 게이트웨이 포트(컨테이너) + ru: Порт шлюза (контейнер) + ms: Port gerbang (kontena) + pt-br: Porta do gateway (contêiner) + required: true + rule: paramPort + type: number + - default: "true" + envKey: ZEROCLAW_ALLOW_PUBLIC_BIND + labelEn: Allow public bind (Docker) + labelZh: 允许容器内公网绑定(Docker) + label: + en: Allow public bind (Docker) + zh: 允许容器内公网绑定(Docker) + zh-Hant: 允許容器內公網綁定(Docker) + ja: コンテナ内のパブリックバインドを許可(Docker) + ko: 컨테이너 내 공용 바인드 허용(Docker) + ru: Разрешить публичную привязку в контейнере (Docker) + ms: Benarkan ikatan awam dalam kontena (Docker) + pt-br: Permitir bind público no contêiner (Docker) + required: true + type: select + values: + - label: "true" + value: "true" + - default: Asia/Shanghai + envKey: TZ + labelEn: Timezone + labelZh: 时区 + label: + en: Timezone + zh: 时区 + zh-Hant: 時區 + ja: タイムゾーン + ko: 시간대 + ru: Часовой пояс + ms: Zon waktu + pt-br: Fuso horário + required: true + type: text + - default: "" + envKey: API_KEY + labelEn: LLM provider API key + labelZh: 模型服务商 API Key + label: + en: LLM provider API key + zh: 模型服务商 API Key + zh-Hant: 模型服務商 API Key + ja: LLM プロバイダーの API キー + ko: LLM 제공자 API 키 + ru: API-ключ провайдера LLM + ms: Kunci API penyedia LLM + pt-br: Chave de API do provedor de LLM + required: false + type: password + - default: "" + envKey: PROVIDER + labelEn: Provider + labelZh: 服务商 + label: + en: Provider + zh: 服务商 + zh-Hant: 服務商 + ja: プロバイダ + ko: 제공자 + ru: Провайдер + ms: Pembekal + pt-br: Provedor + required: false + type: select + values: + - label: "" + value: "" + - label: OpenRouter + value: openrouter + - label: OpenAI + value: openai + - label: Anthropic + value: anthropic + - label: Ollama + value: ollama + - default: "" + envKey: ZEROCLAW_MODEL + labelEn: Model (optional) + labelZh: 模型(可选) + label: + en: Model (optional) + zh: 模型(可选) + zh-Hant: 模型(可選) + ja: モデル(任意) + ko: 모델(선택) + ru: Модель (необязательно) + ms: Model (pilihan) + pt-br: Modelo (opcional) + required: false + type: text diff --git a/apps/zeroclaw/0.1.7/docker-compose.yml b/apps/zeroclaw/0.1.7/docker-compose.yml new file mode 100644 index 000000000..50f2d31a0 --- /dev/null +++ b/apps/zeroclaw/0.1.7/docker-compose.yml @@ -0,0 +1,35 @@ +services: + zeroclaw: + image: "ghcr.io/zeroclaw-labs/zeroclaw:v0.1.7" + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + ports: + - "${PANEL_APP_PORT_HTTP}:${ZEROCLAW_GATEWAY_PORT}" + environment: + - TZ=${TZ} + - API_KEY=${API_KEY:-} + - PROVIDER=${PROVIDER} + - ZEROCLAW_MODEL=${ZEROCLAW_MODEL} + - ZEROCLAW_ALLOW_PUBLIC_BIND=${ZEROCLAW_ALLOW_PUBLIC_BIND} + - ZEROCLAW_GATEWAY_PORT=${ZEROCLAW_GATEWAY_PORT} + volumes: + - "zeroclaw-data:/zeroclaw-data" + healthcheck: + test: ["CMD", "zeroclaw", "status"] + interval: 10s + timeout: 10s + retries: 3 + start_period: 10s + restart: unless-stopped + networks: + - 1panel-network + +networks: + 1panel-network: + external: true + name: 1panel-network + +volumes: + zeroclaw-data: + name: zeroclaw-data diff --git a/apps/zeroclaw/0.1.7/scripts/uninstall.sh b/apps/zeroclaw/0.1.7/scripts/uninstall.sh new file mode 100644 index 000000000..891c61f0d --- /dev/null +++ b/apps/zeroclaw/0.1.7/scripts/uninstall.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker-compose down --volumes diff --git a/apps/zeroclaw/README.md b/apps/zeroclaw/README.md new file mode 100644 index 000000000..11c195aba --- /dev/null +++ b/apps/zeroclaw/README.md @@ -0,0 +1,27 @@ +## 项目简介 + +ZeroClaw 是一个高性能、低资源占用、可组合的自主智能体运行时。ZeroClaw 是面向智能代理工作流的**运行时操作系统** — 它抽象了模型、工具、记忆和执行层,使代理可以一次构建、随处运行。 + +- Rust 原生实现,单二进制部署,跨 ARM / x86 / RISC-V。 +- Trait 驱动架构,`Provider` / `Channel` / `Tool` / `Memory` 可替换。 +- 安全默认值优先:配对鉴权、显式 allowlist、沙箱与作用域约束。 + +## 安装后如何访问 + +安装完成后访问: + +- `http://<服务器IP>:` + +**访问码通过容器日志获取** + +## 数据存储(named volume) + +本应用主数据存放在 Docker **named volume**:`zeroclaw-data`(容器内挂载到 `/zeroclaw-data`)。 + +- 卸载脚本会执行 `docker-compose down --volumes`,将同时删除该数据卷;如需保留数据,请先备份或避免删除 volume。 + +## 配置说明(简要) + +- `API_KEY`:LLM 提供方 API Key +- `PROVIDER`:LLM 提供方 +- `ZEROCLAW_MODEL`:可选模型覆盖 diff --git a/apps/zeroclaw/data.yml b/apps/zeroclaw/data.yml new file mode 100644 index 000000000..5a6f48fa2 --- /dev/null +++ b/apps/zeroclaw/data.yml @@ -0,0 +1,31 @@ +name: ZeroClaw +tags: + - AI +title: 一个高性能、低资源占用、可组合的自主智能体运行时 +description: 一个高性能、低资源占用、可组合的自主智能体运行时 +additionalProperties: + key: zeroclaw + name: ZeroClaw + tags: + - AI + shortDescZh: 一个高性能、低资源占用、可组合的自主智能体运行时 + shortDescEn: A high-performance, low-resource, composable autonomous agent runtime. + description: + en: A high-performance, low-resource, composable autonomous agent runtime. + zh: 一个高性能、低资源占用、可组合的自主智能体运行时 + zh-hant: 一個高效能、低資源佔用、可組合的自主智能體運行時 + ja: 高性能・低リソースで、構成可能な自律エージェント実行基盤。 + ko: 고성능, 저자원, 조합 가능한 자율 에이전트 런타임. + ru: Высокопроизводительный, малоресурсный и модульный рантайм для автономных агентов. + ms: Runtime ejen autonomi berprestasi tinggi, penggunaan sumber rendah dan boleh digabungkan. + pt-br: Runtime de agentes autônomos de alto desempenho, baixo consumo de recursos e composável. + type: website + crossVersionUpdate: true + limit: 1 + recommend: 0 + website: https://zeroclawlabs.ai + github: https://github.com/zeroclaw-labs/zeroclaw + document: https://www.zeroclawlabs.ai/docs + architectures: + - amd64 + - arm64 diff --git a/apps/zeroclaw/latest/.env.sample b/apps/zeroclaw/latest/.env.sample new file mode 100644 index 000000000..5919b1b4c --- /dev/null +++ b/apps/zeroclaw/latest/.env.sample @@ -0,0 +1,8 @@ +API_KEY="" +CONTAINER_NAME="zeroclaw" +PANEL_APP_PORT_HTTP=42617 +PROVIDER="" +TZ="Asia/Shanghai" +ZEROCLAW_ALLOW_PUBLIC_BIND="true" +ZEROCLAW_GATEWAY_PORT=42617 +ZEROCLAW_MODEL="" diff --git a/apps/zeroclaw/latest/data.yml b/apps/zeroclaw/latest/data.yml new file mode 100644 index 000000000..62a6b51c8 --- /dev/null +++ b/apps/zeroclaw/latest/data.yml @@ -0,0 +1,123 @@ +additionalProperties: + formFields: + - default: 42617 + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + label: + en: Port + zh: 端口 + zh-hant: 埠 + ja: ポート + ko: 포트 + ru: Порт + ms: Port + pt-br: Porta + required: true + rule: paramPort + type: number + - default: 42617 + envKey: ZEROCLAW_GATEWAY_PORT + labelEn: Gateway Port (container) + labelZh: 网关端口(容器内) + label: + en: Gateway Port (container) + zh: 网关端口(容器内) + zh-Hant: 網關連接埠(容器內) + ja: ゲートウェイポート(コンテナ内) + ko: 게이트웨이 포트(컨테이너) + ru: Порт шлюза (контейнер) + ms: Port gerbang (kontena) + pt-br: Porta do gateway (contêiner) + required: true + rule: paramPort + type: number + - default: "true" + envKey: ZEROCLAW_ALLOW_PUBLIC_BIND + labelEn: Allow public bind (Docker) + labelZh: 允许容器内公网绑定(Docker) + label: + en: Allow public bind (Docker) + zh: 允许容器内公网绑定(Docker) + zh-Hant: 允許容器內公網綁定(Docker) + ja: コンテナ内のパブリックバインドを許可(Docker) + ko: 컨테이너 내 공용 바인드 허용(Docker) + ru: Разрешить публичную привязку в контейнере (Docker) + ms: Benarkan ikatan awam dalam kontena (Docker) + pt-br: Permitir bind público no contêiner (Docker) + required: true + type: select + values: + - label: "true" + value: "true" + - default: Asia/Shanghai + envKey: TZ + labelEn: Timezone + labelZh: 时区 + label: + en: Timezone + zh: 时区 + zh-Hant: 時區 + ja: タイムゾーン + ko: 시간대 + ru: Часовой пояс + ms: Zon waktu + pt-br: Fuso horário + required: true + type: text + - default: "" + envKey: API_KEY + labelEn: LLM provider API key + labelZh: 模型服务商 API Key + label: + en: LLM provider API key + zh: 模型服务商 API Key + zh-Hant: 模型服務商 API Key + ja: LLM プロバイダーの API キー + ko: LLM 제공자 API 키 + ru: API-ключ провайдера LLM + ms: Kunci API penyedia LLM + pt-br: Chave de API do provedor de LLM + required: false + type: password + - default: "" + envKey: PROVIDER + labelEn: Provider + labelZh: 服务商 + label: + en: Provider + zh: 服务商 + zh-Hant: 服務商 + ja: プロバイダ + ko: 제공자 + ru: Провайдер + ms: Pembekal + pt-br: Provedor + required: false + type: select + values: + - label: "" + value: "" + - label: OpenRouter + value: openrouter + - label: OpenAI + value: openai + - label: Anthropic + value: anthropic + - label: Ollama + value: ollama + - default: "" + envKey: ZEROCLAW_MODEL + labelEn: Model (optional) + labelZh: 模型(可选) + label: + en: Model (optional) + zh: 模型(可选) + zh-Hant: 模型(可選) + ja: モデル(任意) + ko: 모델(선택) + ru: Модель (необязательно) + ms: Model (pilihan) + pt-br: Modelo (opcional) + required: false + type: text diff --git a/apps/zeroclaw/latest/docker-compose.yml b/apps/zeroclaw/latest/docker-compose.yml new file mode 100644 index 000000000..2d712f207 --- /dev/null +++ b/apps/zeroclaw/latest/docker-compose.yml @@ -0,0 +1,35 @@ +services: + zeroclaw: + image: "ghcr.io/zeroclaw-labs/zeroclaw:latest" + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + ports: + - "${PANEL_APP_PORT_HTTP}:${ZEROCLAW_GATEWAY_PORT}" + environment: + - TZ=${TZ} + - API_KEY=${API_KEY:-} + - PROVIDER=${PROVIDER} + - ZEROCLAW_MODEL=${ZEROCLAW_MODEL} + - ZEROCLAW_ALLOW_PUBLIC_BIND=${ZEROCLAW_ALLOW_PUBLIC_BIND} + - ZEROCLAW_GATEWAY_PORT=${ZEROCLAW_GATEWAY_PORT} + volumes: + - "zeroclaw-data:/zeroclaw-data" + healthcheck: + test: ["CMD", "zeroclaw", "status"] + interval: 10s + timeout: 10s + retries: 3 + start_period: 10s + restart: unless-stopped + networks: + - 1panel-network + +networks: + 1panel-network: + external: true + name: 1panel-network + +volumes: + zeroclaw-data: + name: zeroclaw-data diff --git a/apps/zeroclaw/latest/scripts/uninstall.sh b/apps/zeroclaw/latest/scripts/uninstall.sh new file mode 100644 index 000000000..891c61f0d --- /dev/null +++ b/apps/zeroclaw/latest/scripts/uninstall.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker-compose down --volumes diff --git a/apps/zeroclaw/logo.png b/apps/zeroclaw/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..52904e3c0dd1b74c34b9afea34065352177159e1 GIT binary patch literal 9947 zcmV<1CM4O3P)u|2 z@PB+?yURcQ?EQx?oqEW8uiCu5Z?W0BAArx_{wL$=#%{O8!liM$`qRgq@?41rP`_&a z;a$t-Y3u$5`p5o1hI%UyBo@oflK#J4(%9^FzZmM-e2UtA`319!d5g_*yV%-6*M(8` zyZ=kKxlekr%lG@evs?Av%5heX{Rd-5x4hruZ&5Ey!x#2)Ar@!5+hc@aed6BNlI&-LUEUeJe#O+AgOBa9UG|3}KebA>aJ;5yVUZ+JYK$V@ z8GSna9!lZWe=_y6d<%DPW0{{6ub741Ca?u;U|ey z3ARxAv|TKBPWto((0+?}zu%PD&M6$N@qxK%5{o$|%$dl`oc+GL7hKD~n)+F(!Tdgv zT~>OBi>Y`V#pEIhSvwUvO{65$`36+MNz=!-r#Rn$|IxT;9gdf4!eB6dxdjEDBuccSWsyfC|M5qy#uql1qN=f9L99bR7{ZY^e zVvDo~=+Zm2?Wp{LFgGoQ4%rcAUImBTD=QsPTy*zO%XbE%&F@=rF^$t3>-e#J+ASzv zOF8D{so)iPNTdcEKzyK{bSmNHxIU74pKdLn&&Faypke1eL5@i@;<~Q*Sind_tc{pgZ<*f6wfkCi zm)8$+1L~V#JRe`~n439_ptq}4>6Jxmn&#a5zE7B& zcGQfqjMs4_%9CHkRm1h&o9}7=xjF~pc~6#oc_!+&c<~WyW?OBV`|bCFH=M)Eat~I{ zjxnpn*izK<{ap7$agoR|dD*Y9RQ~26&RwK{hG%Rczw{=CTNAB$`eh$H_w`^3|IOD%R&){J${PeqPxSo4^%;YOge z@Aq1_V}lfN>d99>2kmYe)PatlCwa;n|D5Y-LW=d9bksE*_UF{8UY&US9cgH5~a1^qF^tPM{SNDvL9o9y0809%VI5jo9HgjlPz7m-+^T zy(j^Cn?7Labn7nm2k=CxQh65P1lIs&A;&t)*b$%y!H#g0ruzum-MEY3#YJH*O{IP+ zjoXiM{Mm73w$E8WZ}mT<6snqi4P?a>RfXPews_6qicFn~T!&|qYK|BP(C+(A`1`T-cdomma2JRnt3n@1ia?t& zL%@SsxQXJ7u|UY0<-eBvsBUFF_=-((fT6S=BpcHy9(DCg@Luc$t0&*s4KidFcFhdO zdis9Y=i!-OuvL@f0MJk3)9ixss&Rkpz~=aXt5*F9bRA`iY7EhYII00XW|1=5)I8t+ zA|$+YT{CvrMN&;^(x#IdP3i|+bT?*td+*jM88gkO5JC|>*lcU5$*Z-VPTrY!0?er> z_Q)Bl&+GDy1OM2AE%Kp3!Y+Gc7XfmBy%)^`$m2@}Aazylw~HGb`tn?XsTh@}ToC9& zYm=q}7X#1c+U91MrE{uT-T7Rwc=kB_d*psI3RFdtpP#uAQ`Q#k2JY&7T9&)Z2L7>0 z5;1myXH^c+zPhMX@hrMupNULdcy^Ya1KRyz**nuUBG82xtfhq#t*C^Sb@t&73j#gz zn(GU1tjpQKYtd+M2CaL5<~n5Qp~{6Y2nK^@ z+4Txiv%fE%`|P@=f^$f)A4vsvs)qu>z8R$XiJ*7aGd3vT^GnBS(M(gQ;E;E#9Ehq%d9Ap9!hK_;0< z(&aAoAE;gyPJ&viNMwZt$_$qk>U#u(@mO2u;7GqH5*e$n!@&dU&1}Kv0Y7FPoH|j1 zXfDLQC-@2+WHK3_xSXk;yV!vBmIqWo2#1#ex8T+s8CPo3!!V#S;9206MkM*Z$%{uc zn+<5FmnUlMHR_5i>#DA+hDn-RXo9M2JlUZAHK1g7e-5F`U9&`zU+IzUl1AN-uI*=c{R&mi+ z=Q!e~swz2jC_@qIvMiInW?js99~6g`t;(!oy9heQGzh0Il2Ie#wuMN2t=dKpqaGsD z5ojt`cT`}sh4kt;?zk3X%@MF!RZksZ?kXM~tD(%fXjh10>jyw@w>wNPKQwXPpMfJg z8e=BIb!;j`<_>nlOyVpIRqI*tbPm;v$(V?0MAT(MQ5`HGI7mnW8h=wqK{bFI6GgBx z=^?pXVTCS=15K+4pJ3C`XxUZAtgenAAlQg`(mLTI;ux0ilq9D%7JYccuH(n!&~Yxw zRe0BN%8D%O98;85_ubu;E?rd-5~b8oF_aJF4G1z41hRxNaa`#EvcO`2eQ1^9QyX|S zqu3vt4wtRtpfkLiDtL5VWnQV{_K>u_vwxt231R@3LuMFd?;Q;T=uTqy@h*cqQ}%*u z9IKUSPLQj6XB7soudlnkC@?Lm)RhLE*N~w=!c_`2iZ(5RgkR|0PQ3Me^(t7%T_^*uYQ#NDeNoE2_D&Ngx&?86jcf{qzSH#rd_z)+rAv z%1nrBW5U@H)`>IZfXXYm!aiBu)9oXJ_TuVPq_IR15wni=5~l=qhMgl^en7j(>$9qZ z(3cb_*A-`q!ebOoLLqAdKb#X;gO6&0EM*unB9o+56>TDB(7De1zCmqgXl8`dKO+u?bmE1#&R8ol8TiwNMosF)RGu zC{43KmZADusLs$;Xpr91fhGAqG7#y1@5^cWP@4nWSTWtE? zYZJpN>_KjW#vG(UY^Dt98cG>588CL0f_9CNT(OK&rRCd!AYl$F&uD2y0Edl%nRF`f z18%2w!5biTb6aj zc3wPkq-3$1HNp*c+Cd;3(Y5aUA0!W(+h=JZsL|7P1`&gg=pCubz6-2SSyrDZZEXD2 zyfQSKPC`}?oI+=2I_o;c#ZVoJ-Ey-DBb6eqOp5Rl&h%jOm|wdatKAZ_L4{Eb?-ddG z2xKM!p}p|2(nN-!4jChTH4NH%57-ra;=P`Ppl)Au2-13jL{`Tc(kapHrWlkz#Tm8@ zd#gTK6&j5|9$M~*uK$Da!(GzKppru(~QFgSJJO~0*paUvigpb+=EEGAWLfzg7ieQ%!t8f`;1~T=BNeA+# zBq11~;zWIqKL=+a4$cE($te^Irc0{eJ_hJFefW>_*xZG_?FYrr#t=_HUP9vn(Wpa+ z3wR6zO=>_n2jjWP@{CJD5Eg+y~)h6gad$X1osGpB#KG}^*unN-r^m+d^B`* zR7OlthbsI9^P61qM`zgHn+reYa6WUwE!Cl`YY^RJu`C!UFGvW{*lI8pG=R*CTa>CP z<)}g-ox_cYUxTBa|U6gU7~yqM*KM>KRpe>yaMoS-V@OdtgWRal`aaL0^C-i#HxgC0$6Z6fEi>JTq-7ed=zVXMyXXMu_ z)VQ%FzN8`$T@R2AV=C@yOLih+C}@14g=ZNCJe!U4(U40zLLP=GYf2wfX(HXgzdBm1 zjGPWr2Akw&>LFNdf4TSV>n{Dfyy!k9b1eVW<)KwTeOsYE4V@5mIVWmEe*C7g+l3FI zU10ym#NIo!P!k8$b;9tBVJY_UIOj17y`tg{F_EhoHFYy>mlxX>j4Q_a-(+3O6C$V=IU|MYoH^t~*3<}kM{+AB0k@(;VM0l<+U=Ly-wo|jpo6mbPp4Iu z1%%2!{(ecQ9eXH^bc-Ik#lfGDmSLz>cBY^QyTfjf^w1~*Tx)0OG#p&;+@WBz{h+IN zMMfD1Y(vkxB3fUsxRyu9YtB&EYmz`=m6zCPQI-Y9kg*u-z!1E2(i6yjys|xF9$dciW7)%WNIZj z#C7P>)d;3yB}I4=%Z7}@aS1fdm`>x_V~Kr9XRV-fFMct!yS1P^x*pu)P>^uYdpf5Rg@*$jFSK^ct1|*|h46KRSta@srUMZ|=fod?`N%j)nb}d~ z_S_&@8uAe&Cw=wo5m5Bn_qS8;Z^t$lHrxWU^Vw0it>gGfN}98~e@DF~iPkStdxKTa zP)&oQ6{kFhnaOB5dMK1=;uy*w9M*?tXPNQ^_z5T?v`OS?E>1MasZcee`!t%M?q|^l zH$~G4-f*WF)B%R!(nPP5h)^t|)5LRp8LervubLq((%%0Z|Q-94Rl< zcDF}4PqyquLl?ZMv*+#9B_+%i@^(~H*f9RV4!Bhzki|)=oa*yAwDKCb>eF%o>&)g} zhM2(;tw9Z%`r|Xu?piz0vi&{wokr_;Yq#LeKP4yP1x`iu22CU#pxprJO%8E99nfX0 z2{qzaH^O_V`3NlusuRQ!TYV7)P=~{X&U;SifK0Sq6{HgA9^j%-tc!!N2b^7U#nlG6 z0p?#h`hkP8?sna;9Rv{p$zE(Wo8^AzLs2SxyNnQHLtQ~QI35jT_E
IO3yTQHGO zM6tR;5v!-Jrfi*oltfmV45UPGhC-PQ0sIKphr!V}0cXR z(HXt2GnCDU#72&eu+OM_57<1KwF?vlgvZE9Riqig#`V1?J9Qwo=xU+7@j(LUGBrP+ zyYNU=c)0HAq-={j=GgU!=;R#x$K<^2lS8QSH{OXl2<0J3Jb*saGQunnoMNJA%pcA| zNceY!sYp<$8FfeL8toZ6150$Zw#1J3705J2Y;?3HC8%g1!iOvhQHeVtOpO-R{Ty{! zVsXp0e(=2dV&ku|8NEKW2g(yznl|BjZ933i5S&|^Vwlc|A<&aM(yy&_HrHJewnh^< zqs$GVcxHAKTTo9y&t(~T2|S8)CHxKVsxTwuK#llKK2oAhkUDE`z5e9j_j}%6?0Rwr zbU+WMlZO_QmF^wqNKCS(GKFBX2@G{&)>@2eY^z_)U0wP$Ddq6}S!>1XKv$N40H{He zv(t2<1~2GvB9T2<1reYulDs^X5Rg~o=HBK#!Ts4S-iqL5NG`lWy9m8Gpgs|ET%E(L zJK813raz(s1%hX8{Sx%PxFn6~rpZ-?AO}{Nifq9RDhq*kUJGQ@;XGyW(UuaBl8@&s ztk4}m`#C|fqD_RjOP0Gq`amjvM=fqg;7D7t{gn1Vi1P%F;;pJP$Y)KWeb%8BgFT6~ zO@^l0qk?xMZL9lH1?0ub_QR~@6=Wm{sTxgu`!m#B=dOcD5Ahq?L|u1vSb5k+c|y3+ z^zK>+M2f5c?_07qMvZ41Xfpx_KEv=XV#s^QqU4?KD9@x!PU zs7QK=GdaHLt8d3opzoj^L+$d8-+xF4A3Jg?bS?;V#k=zr_e)OXjozVzdy`LE8FITz z|4BMsB5~SBDne(TX$kU~ClvPla1B~qQ(Z@!v8MJd>A;=U?|4TIE(&9Jhlnjc>kODy zG(uHE`7#UKq$CVACQb&=z-ZA|KCaFsf-{9@&&%oVYXp>VxmfPf%8m2w{Ayd_ia>R>q&|v(5Yoc zB8{Q4wnorEd48LU~MR}SXG~*neFe=Hl;&%Naz*v4=E-{Mzkb4qvkadVtDM%=N=@FYJ=Oz zeQ_NSy%4M&|8w@S-Ggq2I$vo0ozLW(TnI2{ zOQYothWX`Ist*~;P|PBBklK2M!ks?b_>BZXBOdeX+qjlT`Fk;9p#Gf~$%iagb90)Q^ zg1WGDA~$`LY2HRVkHY@0u^?eh8H}hJ*qbrzKa~5)C>Npu3U#mJ*{t{opLUnl)CiP$ zqHww9?f!_gLIw3W&g=Kf4CwXEiLDotXJpnnFz)ZTyZQaq{jX^9Actz6t$@d03No{e zA&)(ugOq8FO{YE}9-HKs(Xisaw3m^Q)y5IakiCKWWRO5?*9Tn!Mf(I!s0b>8yp7Wr zOytrQo<;oNagUFvPjso@K+8CN`(DM(huPp>wEonv7YcuO5w_dkG#94GcWkFR4&I%o zvM5z-Z;>K+iy1t_B=Q;a<4xNiv>6HX0TAt#-iKh>J7_xZ_db~X@Zy*Gh?-W1M^+LR zAFdV9WDz(EYmK|bWlJYu2=)F8ts>OmuNHI*KG#BzvoV9fraZPcvg@l1^JzV?5vi9M zso8G|yU5WEG`&jg#u(=_0R$SpL2ovUt{KF1>KHSNqLlM$m)1V1}#q z5=YA1oKacZMt5`AK~_&`+b4I>3VYC4&@`U_iO0T0%zsPC{X#~cT|&hd>%=vIZjX`m zL>`YtPOQ|~Y~3$_rY<@_do9(UH}-?A-L@*eS?V^Cu_a#yc(T5QqkwC)poKMV9Q){y zvWo?6d5M}`f&5vpie_8SUN*&bYYoqe(^q|C9u%!lspSurMbPt91$EnCxt4;8O#<>} z^?)ATjL1pIoHx*THO}YD<|(V0NXdE91hma={(+`J(WdOaF~y-@Kaq<1HPlc))=nYG z$k~9!9MjXGXsEw6()H~~>jP(i5( ze=B2p)>Frt)W|l#M9{5)EfDbf<<~z31)#kGWd+v+ou|-AQ)*^KibMrF@KO}>6WR2y zj2e7PMSw(U3DCD!wvB`zyLAYz()1ESlOefjmr#vzhA z2UH@upykRMk{RdLJg}TBP+ILYx5SJDor%Zvf>b++ZvYy?Bu!HWfIZ?p&5f$kAI;;0 z;M|-}hXHds(1TnG(@n99E`^uw{sriD*;dnuTr6UK2|-uRs)kR9K*en5{(zsWLFM=Y z&&C%59ntG468Is_bIS88AL)0uQme`R6Tltt$A=&S$;kcSfR)ToN&@83Q%yCJor4UVfu z8L*$u;L-);nTo6+trPaE^;bWEVj0@XuxJ4FLgKx?mDv(6@_WfW;)M@f8byv|HGq-b zC$xaPYeYY!r}^otw!a%lo~mm6x}4(qQa+1(YA2w^@S%4MKwgsX$IYR1zUbAEYZ5B2 zQWQ{%FpE3RiC%y~22x$Q@@CM=&MM2j_i>HOkFVJLJ94w(db0spKj#+v3ExUoSw19B zuOan>L%sOo3Ad#KH7xhQz;I0zYd+XaHV#)E3B0nO+W-VyTRaHUWPWskN)H?ELNlsLXV_%FT9db**gnF?{QDm+Wq~d_8<6J3WJ3Lob z&TTXrI>V1j0$rE-I&o&^BOpOQ9nB~UqIXB1JuFHf}B0rU9*|~ zQxh37HPrxf88E+tvH6rV%1b)_7Ed&3Mr( z;=-_WbP)FT0V1oip0L(A>^cNg)mg!bSq*Yd_-~@eU&dUskeCGJfM!C$M-Eqk1`ah8 zaq(!HZ{(E}HBSTYnnXPMxdMw_(txgb1!!n_#|w3kj_DKHjNOW;h{f@n{1yE@;6Kg) zU*<{-1Z$Y6!I+ub-SR9lLYz?ZHHmmkQ+Ic*SZ}tQyonID=Fez>fFh=VWW2fJy90fz z^xnQicZ1)oe*5mG-Q2#3-{)wL+!FoD#yYl7)dDmK%!!}+{XW#`L#P)!LC@|1Ovj z;X_p=AfjoA?p0RL0!e){D+G7M5UBmyKIV`3PaoGqAA*y6*djds)!QiqQLCdwaJhfv z&V!qANwFyUE8v*R3E>X0iS+CKrUw^ug{`4?L1?E_REQ6}nq8(olPY>V+tRT(^;VCy z9r4v1I?L-|*vETNJOVk)%KmFrzz&Qjihf~+au}igEnOC!vXyyYRVit zo>gbk7NPJd$>{(#8gXrF4=$AUM1U1ydY{x>kDi$$dq!vDqz5`v zKD~XU*J48thoxe_S^VYm4!4^fd}X3qVj@$2#n2_^& zLr1gvRoE0ha>BX0_T9Oe(3L32ix5edw}*ok8_^d2{?AAK>D2Vn8XR0N(&fX9$p!0V z#Km_1{0sp?|I^98KiapX)9u?m_GtlcNW(nWsfNHP;7UtM6Pr1nE}h)}N6tB0gic1W ztbF+M#g^q&m)_~2v`5f2$rtNO`h^R>Oho4N3 zoBF9Nze2y=?egvUdzX$8K{BCMRRW~|+ZB^vyg!@&m5&s4m%#m?sc+AW{JXK;AU;5z zvIjQMGO_1-{{6>&Vj+M0FO0>44#YupZBo*g7j~up_0`-T?!PzS*X{$9zQ_0Y9^d18e2?$(J-)~H_#WTmdwh@Y@jbrB_xK*)