From e04d9a9dab3db969cc8ef33dc70d1d2c7ccaefae Mon Sep 17 00:00:00 2001 From: Arnaud Robin Date: Mon, 3 Mar 2025 23:09:01 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D(doc)=20update=20README=20to=20enga?= =?UTF-8?q?ge=20users?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revamp README to be more engaging and informative. Goal: Foster a true open-source spirit by making it easier for contributors to engage, interact, and contribute. Heavily inspired by PostHog's excellent README. --- README.md | 228 +++++++++++++++--------------------- docs/assets/visio-logo.png | Bin 0 -> 28126 bytes docs/developping_locally.md | 145 +++++++++++++++++++++++ 3 files changed, 237 insertions(+), 136 deletions(-) create mode 100644 docs/assets/visio-logo.png create mode 100644 docs/developping_locally.md diff --git a/README.md b/README.md index 0326eeb0..3c9c4af0 100644 --- a/README.md +++ b/README.md @@ -1,157 +1,113 @@ -# Meet - -Meet is a simple video and phone conferencing tool, powered by [LiveKit](https://livekit.io/). - -Meet is built on top of [Django Rest -Framework](https://www.django-rest-framework.org/) and [Vite.js](https://vitejs.dev/). - -## Getting started - -### Prerequisite - -#### Docker - -Make sure you have a recent version of Docker and [Docker -Compose](https://docs.docker.com/compose/install) installed on your laptop: - -```bash -$ docker -v - Docker version 20.10.2, build 2291f61 - -$ docker compose -v - docker compose version 1.27.4, build 40524192 -``` - -> ⚠️ You may need to run the following commands with `sudo` but this can be -> avoided by assigning your user to the `docker` group. - -#### LiveKit CLI - -Install LiveKit CLI, which provides utilities for interacting with the LiveKit ecosystem (including the server, egress, and more), please follow the instructions available in the [official repository](https://github.com/livekit/livekit-cli). - -### Project bootstrap - -The easiest way to start working on the project is to use GNU Make: - -```bash -$ make bootstrap FLUSH_ARGS='--no-input' -``` - -Then you can access to the project in development mode by going to http://localhost:3000. -You will be prompted to log in, the default credentials are: -```bash -username: meet -password: meet -``` ---- - -This command builds the `app` container, installs dependencies, performs -database migrations and compile translations. It's a good idea to use this -command each time you are pulling code from the project repository to avoid -dependency-related or migration-related issues. - -Your Docker services should now be up and running 🎉 - -[FIXME] Explain how to run the frontend project. - -### Configure LiveKit CLI - -For the optimal DX, create a default project named `meet` to use with `livekit-cli` commands: -```bash -$ livekit-cli project add -URL: http://localhost:7880 -API Key: devkey -API Secret: secret -Give it a name for later reference: meet -? Make this project default?? [y/N] y -``` - -Thus, you won't need to pass the project API Key and API Secret for each command. +

+ posthoglogo +

-### Adding content +

+ + + + PRs Welcome + GitHub commit activity + GitHub closed issues + + GitHub closed issues + +

-You can create a basic demo site by running: +

+ LiveKit - Chat with us - Roadmap - Changelog - Bug reports +

-```bash -$ make demo -``` +

+ + Visio Demonstration + +

-Finally, you can check all available Make rules using: +## Visio: Simple Video Conferencing -```bash -$ make help -``` - -### Django admin - -You can access the Django admin site at -[http://localhost:8071/admin](http://localhost:8071/admin). - -You first need to create a superuser account: - -```bash -$ make superuser -``` - -### Run application on local Kubernetes - -The application is deployed across staging, preprod, and production environments using Kubernetes (K8s). -Reproducing environment conditions locally is crucial for developing new features or debugging issues. - -This is facilitated by [Tilt](https://tilt.dev/) ("Kubernetes for Prod, Tilt for Dev"). Tilt enables smart rebuilds and live updates for services running locally in Kubernetes. We defined our services in a Tiltfile located at `bin/Tiltfile`. +Powered by [LiveKit](https://livekit.io/), Visio offers Zoom-level performance with high-quality video and audio. No installation required—simply join calls directly from your browser. Check out LiveKit's impressive optimizations in their [blog post](https://blog.livekit.io/livekit-one-dot-zero/). +### Features +- Optimized for stability in large meetings (+100 p.) +- Support for multiple screen sharing streams +- Non-persistent, secure chat +- End-to-end encryption (coming soon) +- Meeting recording (coming soon) +- Meeting transcription (currently in beta) +- Telephony integration (in development) +- Secure participation with robust authentication and access control +- LiveKit Advances features including : + - speaker detection + - simulcast + - end-to-end optimizations + - selective subscription + - SVC codecs (VP9, AV1) -#### Getting Started +Visio is fully self-hostable and released under the MIT License, ensuring complete control and flexibility. It's free to [get started](https://visio.numerique.gouv.fr/) or [request a demo](mailto:visio@numerique.gouv.fr). -Make sure you have installed: -- kubectl -- helm -- helmfile -- tilt +We’re continuously adding new features to enhance your experience, with the latest updates coming soon! -To build and start the Kubernetes cluster using Kind: -```shell -$ make build-k8s-cluster -``` -Once the Kubernetes cluster is ready, start the application stack locally: -```shell -$ make start-tilt -or -$ make start-tilt-keycloak # start stack without Pro Connect, use keycloak -``` -These commands set up and run your application environment using Tilt for local Kubernetes development. +## Table of Contents -You can monitor Tilt's at `http://localhost:10350/`. After Tilt actions finish, you can access the app at `https://meet.127.0.0.1.nip.io/`. +- [Get started for free](#get-started-for-free) +- [Docs](#docs) +- [Contributing](#contributing) +- [Philosophy](#philosophy) +- [Open-source](#open-source) -#### Debugging frontend -Tilt deploys the `meet-dev` for the frontend by default, to benefit from Vite.js hot reloading while developing. -To troubleshoot production issues, please modify the Tiltfile, switch frontend's target to `frontend-production`: +## Get started for free -```yaml -... +### Visio Cloud (Recommended) +Sign up for Visio Cloud, designed for European public servants. Hosted on SecNumCloud-compliant providers and accessible via government SSO, [ProConnect](https://www.proconnect.gouv.fr/). Start for free. Reach out if your entity isn't connected yet to our sso. -docker_build( - 'localhost:5001/meet-frontend:latest', - context='..', - dockerfile='../src/frontend/Dockerfile', - only=['./src/frontend', './docker', './.dockerignore'], - target='frontend-production', # Update this line when needed - live_update=[ - sync('../src/frontend', '/home/frontend'), - ] -) -... -``` +### Open-source deploy (Advanced) + +Deploy Visio on your own infrastructure using [our self-hosting guide](https://github.com/suitenumerique/meet/blob/main/docs/installation.md). Our open-source deployment is optimized for Kubernetes, and we're working on supporting additional deployment options. Keycloak integration and any SSO are supported. We offer customer support for open-source setups—just reach out for assistance. + +## Docs + +We're currently working on both technical and user documentation for Visio. In the meantime, many of the essential aspects are already well covered by the [LiveKit documentation](https://docs.livekit.io/home/) and their [self-hosting guide](https://docs.livekit.io/home/self-hosting/deployment/). Stay tuned for more updates! ## Contributing -This project is intended to be community-driven, so please, do not hesitate to -get in touch if you have any question related to our implementation or design -decisions. +We <3 contributions big and small: -## License +- Vote on features or get early access to beta functionality in our [roadmap](https://github.com/orgs/suitenumerique/projects/3/views/2) +- Open a PR (see our instructions on [developing Visio locally](https://github.com/suitenumerique/meet/blob/main/docs/developping_locally.md)) +- Submit a [feature request](https://github.com/suitenumerique/meet/issues/new?assignees=&labels=enhancement&template=Feature_request.md) or [bug report](https://github.com/suitenumerique/meet/issues/new?assignees=&labels=bug&template=Bug_report.md) -This work is released under the MIT License (see [LICENSE](./LICENSE)). + +## Philosophy + +We’re relentlessly focused on building the best open-source video conferencing product—Visio. Growth comes from creating something people truly need, not just from chasing metrics. + +Our users come first. We’re committed to making Visio as accessible and easy to use as proprietary solutions, ensuring it meets the highest standards. + +Most of the heavy engineering is handled by the incredible LiveKit team, allowing us to focus on delivering a top-tier product. We follow extreme programming practices, favoring pair programming and quick, iterative releases. Challenge our tech and architecture—simplicity is always our top priority. + + +## Open-source + +Gov 🇫🇷 supports open source! This project is available under [MIT license](https://github.com/suitenumerique/meet/blob/0cc2a7b7b4f4821e2c4d9d790efa739622bb6601/LICENSE). + +All features we develop will always remain free, and we are committed to contributing back to the LiveKit community whenever feasible. +To learn more, don't hesitate to [reach out](mailto:visio@numerique.gouv.fr). + +### Help us! + +Come help us make Visio even better. We're growing fast and [would love some help](mailto:visio@numerique.gouv.fr). + + +## Contributors 🧞 + + + + + +## Credits + +We're using the awesome [LiveKit](https://livekit.io/) implementation. We're also thankful to the teams behind [Django Rest Framework](https://www.django-rest-framework.org/), [Vite.js](https://vite.dev/), and [React Aria](https://github.com/adobe/react-spectrum) — Thanks for your amazing work! diff --git a/docs/assets/visio-logo.png b/docs/assets/visio-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf47a5ff33ca76e109b535964e53ebd0164d488 GIT binary patch literal 28126 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 |-4LC_K7>d#_daVP=j& zw1&PG&Af+$qQATA(pSxbH*Pv3t*vZ_<2uZ0K3bC&>|O;q)gScgj&rru&i#zW-U3!( z$n1LaCoczw;^HFZ@|Xs3*H7QdD=rB>F53O|40Mx|ZLxN=d1VF>=4evEx-0>hDp;p@ z6+&*-JDJh%tMAm2SSMkcl%T2ZKYmI~FGF|_$sURPECKM%YbD3wUh6gik2{y%>VWWb zTL}1-e42bUq(ygB?EKJww5k`j+<3_#-Kmr~ zY(~cvM;UbT;<6PgXucx17q}gTKFwF9Pw$uCd4Ksd1!jFbHCdW$ve+sp5qzu6qR9O7 z<|r*$7SLMnTBj}S9EF^`*y3nv_K|CchRXgTVQx!x(Ku%J^>Nwr%{5|f8=2Ex2b1%| z=(yFaYDOWK58ql_Kk4Kv(A=8>Ffk2aVvSMR_pOcx(}(K|%tUTm$kkDr&dOR^v;)Se zhk!sDC`Tif%Z7wbK}bvI;y7=&+^fjZasL;R>u&AJVGFj|YhlP&p`oE?fYLk5LcBQb z88(MJNpXbte?m-_+Nno&TH6DrbeqWx8L?>WPZRXm?%t z^r%ht#FIy-3PL!KnNmQ-h#e|90n5`4$^&T-N@ndh+#sjz9eIbfIaX5sIPf(agz9gm zqgDn0FAYH~WWRghwT9p}rX?d2FtzIx`zFonXX#kcTG47a{#0dfy!TZ`%95@;>F8=) z_|$jJlWksBL}VuQwYF4l&cb}P;M{K&B}V*4DtL1EUY9!{Hv46X=*reo2G_Iw_DxT# zbgzEFRVZ#Er)Apl9)$W*L*@2lLq*GT;kzH-GCHX@C=rUaZnvlDmODGTHnU7i2edUQXbtPgqrOrP}XVffK5dXV; z5!}g_Vm9`@Ru77A0|g#e2U&+p;W_BrC#@2Rpuw?<4Lvp|EB-un=JEHOCGjH#iI6M% zz=nf%KH0T$Q|$HgwXN=4C1Lfjg_#uvlU|o8Ck}nwy$^i9Y)B zPv79|`Y)lF@o8S0J5I1oZ?Ww>hSq-9OLH^CT(yGS%_Z)Bo0VY8i)-6?uK=sbw_c1^ znBNBW1zq-EehCilB_Ml)a1W0j9G1ZOTHSb7^_8ad~~H2g!JR zF445seu&NVjSe1K>|;`*i$jME`FxsLImC8;-#bO_^MuT4ac)~1AD9E`Q=@07PCJJMlJ)n_sr1F3)sA=;i8om_@ZLk zzTakZY^DS}E_Gd!SU!EeI+c@V6Zx*i>k-(x8miC}N24})`weOlBl(9!0B0U70JU(i z=ey5V>Jj)qNDD z-x~YjdC3yf798%1IiulQsDE(2nk?Ksf7{qL9Mmp+Tl=Nq${x3*Z#p_4j6^y%i4#&a z`Z^FR%Ve&BEMThcumeQAg9pV8nxY2kfqMkkPc}?q{g1GM0qk+Q}$+7uX@8w1D zrSG7%e$-8LOubCS?}Hx2EywryB8BiBc@NC#B>B^dmgzIcb+T3B+^u1-qf`KkTAt#x zTvNrD5}=D_(PC51mfNBXC60HrpE#1`3z`10P%)JXinW@v^77BCe|*LeF=nJ$wVivs zQ7%<<#sTTGPv*)Z(P7*=(zw2My*W2IJYTDq!ve!@hs>BWcF4%9=o~{H_4gUW~1risFH6r z(_d#!xa(E##_*LmCXxswSeS$I>fz7XBE}d!bgI76x}Rp(5l4-uv{q~t}v(1 zIrRh`oE^vx7tg-o1u@Jz#^W*Ks~6>{PDx72pmY!3k#nEDUey)5XagS=$Odxinw`9WFcAY)_W zuB-FQmAo8v9Ob9O5Tcf<*7LLln)eF z91FPJp@PSdR&(=5rqDNOE&L9v`W?_pI{8d#pQ%Vqlv2IA7!}6w0@>HEe`Glw$)d|%LyS$K#yE!%I31qz^7cD2`_c1IXOp` zPINhcZHb&LwiPH>?;1%-gg&X|@ z4y8C{LAE8C9XQ``pdYJoY%v*@vXT_VqUNw3SJ8b(5xiJ)p( zVAOXa>3VNmKxKWe0M{{DIF+jWp6~cG&qx1V)!U|5=Z8IdVQzcZyQZ)@&hqKFrclyp}_D6sp~x2|Ks`-5TsI76!fWUI;R zrkCuuY<=@V)vb%k>yMkIy}g*g;&o-yJ4VwM>PI4T%S{g)<@)i^DD{M6d&A|MFP+Kr*F zA5(9y_aq~86L2Bt9Q^UlE|IIKU;!_(BTP?~QG%d5j=4*SXyLZ*K$4=seZJ-(q{5v2 z$Q$wHfeOH>#`qJS`=j|M<(hzV^^2~0*=0?JGd;73Q86)NhB9=zel>wqeXQ#E{%yf( z?v&9RK0)Zuo6SA$l;UI5K^CUP3j{OSSx*N&Kz8GB0efz>1#7IZdTUYP((T5EgfN9q z_1MPB#)ZV#LUvfj3OZJKI6b*+JHpsWr(dmUP6i;{pc&ido0Of-u&a1oY!q&2iNAi( zgDot;G?u@zZCPhWhlfQ{LjiVUju3Qb;i=uaQTFi2E&xzn54-T}SGqwX*PtzRd0K_t z{6@sc>iCY${STKX4x7PHGl#9d=x!swzQqI!3m!wO zl#5G*c}Iipt6S&8;|)j9&Aw~kLLJDAq+lVOq&8D@`)jq=fRokebNM7r#=ORLCDnZO z(AaeGmLoQFqrdSnKVT)0zdsN7LvMT_Nb;<@)R#AWSMl#2NWPYKoDEQR+J8&0oYT)b zQFQZ7qqA7Azz>>cve0a#p4_DYTkQuc6nQYOImut>&b{)(XDrXK>4CbAr1@_9qie(t zF;&XEXghuaLu=ldzLYLCe4M?NRP@5Q)38$f(5rlmWQBlvlch+9PBXuN(R$89o%YS- zGj99-9TLxV>qr1K!>Fz*W;U$x2$=Z_`@`loA3lzbD*oI}Am@EN-sje4c74%i+!--7 zT&zbpV$Deo$2Aaq>;24c1?J62A6 zLaf-r4I)^ib?a4MQ@F1QJM|%6V)~w-O28d)l6^Lo@Ulp)X6>8+ZRR{X+cZ}#6_N5-MlRa)kO(F*0MR1##`9I5 zX?t~>%~PA!&-h{1U{L3KSh-OLuj?;g+m+TY94&G{^nuy+_PQ#dCz&}{1DwhmO`9Qc zz5MVH#?|WNnV#Xd(#M^gdmE-2T~i~~PhW+e~?cRFhvkU;lt(@XE3&z>8P5N^r9jzbn!?gB><( zy)UJ2E+#OuiAQvvKu-11T{rVCvbW~6o5+0&=M0?>7O6Hv)=b8#91OcOn7$Q~T@LiwE~wLmrZl@T<$exf!-r@@%wHRDCA>l;bsy8!XD_ z*W2n9hq^p55^&vzt20syni;pQUXH3})*Pp!?(0aZOMOBu$Sqb$R@N~k&s$F+H&Ew3VVe*KrTjabBM{a^!&(dVXh zyG3{&q@A0PX&?ri=j46crUUW}B7%Q=t3F{GP$HBlO=E;?DI^16-eyE61>Vh+*e@Z6p+>GD1sK z{7CD2e$1}0Vi2b#!!z+!#tL+zL~E$noX1iI3e9pHzYR0S*bt`#Pb&*+~j#RKR5_UTb=Pk8XUR z|6zOVZtphE5r3L8`w$H?zLQ~$rcuG5w!qWvkDiq{YtLRTvuWPEZTG(s#T~W zuE`Z3Ug#$MU&U_g-!A5Ww%qbWxcgs+ehp6LvD5O`IvR_AsBF*Tp@Rx$u$w5pNf&#m zAl!&%4Eiw%xfM+mzWtmdc9QGmhumhe(yfp4#CRK>;s(Q*oxOaNx88EO1-sgf!>pdc zvc-I)PHL@x1=D?s6MyP&B}rR=Dvs~u-uKBBkOVM|VQRrQ z2CABSJ8M{uR!J2ZO`UsA=hKdR5`&$D9w2Br)CJ>{+JDWlr1`ctUi6jk^jIidBV&%w z(6iC@_C}To9FK^i9({WW!K&smJ2x{xDswAXlqA<f#u%VsIFH|L zW2kx~myvtbC|M_hrCAIbP0!D#^hz~LUl8(F6*+FHca5qKI)w+H+{09np8zu}v}2UH zA2ip1w|!6+hMHSWDwd8eYc(CFyZ|+$$&`8*z80J0riN73VRE)#S>_G#u9AVd;K&nE zM1Vdnu0{!&okdFGcLEI3Mur!Hhlj@`d~^0$wU}h7!Nw)s}(Ia!OvS0wmkh-q}(>~wL$q6SV;3;^@#$PR$?WEQM2W14IEZHW5+y>{_eZ< zMe1Is``tW_?u`H%SisbavU_%C2^`}C?xMvO;?`>CE#yg3UvMIwN6!yBa5r_wtjnyR zsCQH>e;S~lWB98eQfs6nfr2S=-|Z^vHIiwqG+u|5FjsfCS11>J6x_riYooSDt2D-| zy_eLqv;sNlGxrIXuP%^UOYR|i*z)QxX9_SJKVyAJeG7LPDV|GFc56h|xZ~0^nqi}c zop>OP_osAOWX%CVo_Kd%IXVShx(LqO1R&Cs{;}A$PeYXx2e+r2z`&8MvTj&SvL&EM z@!g`lMzx;)gjq-9k-Wp5F=XjU051fKIGyeqn@>5`E$k$M;BHPK^F;{IBpiJFWqTPn z*!l%5C#FjR#Ih}&^DIMuR^TqnI$K{iU8M_J+!9eA*npZrR18RX*AL<)L`4y@)QdFD z0e%VO34mO8Bo^ZJ$|rWS;gz4hs#?{%AxnkUq{D6(uIDSr7IYs?)8|$GmN<)W26q3b zzuYkM&+a4X{wx+bQ6K+oADh)(P$IjK#7RRj36gTKBy|>6NcbV9?_pP|$*VG|SKnAC zNnxq4T@u7%;MG7)XO>V*LO`%P8CNM23&j2Av|pjT`|`!Xcz|rFK)igbqeHUmc;n0P zH{UhJ_VVdtaf-|Hwdql`F*T^(>Y44Fyc0^Kn zNBN_N%b2cWjz~c9aBz+k*~hI!N*p%c<8$ae@05_p6X{_T?2q=3{7DraEy;7$afOS2myaKt(`Z9G= z^Chbe8oSyz%^EJ;s0-jtoM+cQB!!Qrv%>sTOM7D@9~bDKwc&?odnkJ&rAzDQY#;~~ zs)q^PfXT+Qt-vNUdNQTm$L5bP^Hk{6=e%!iD%I>ijvPv`Ua&=gfrx*FCHIK3X31KH z2L9=~lD_{4Y_zuiKqBW%me+IqB;jSU$;R+f9Kt(NWZ`pT=9RgVc&_umm6+N?0KaqB zTO#DqJ42ir0dy2zIvULRtJHv)$L92 zs8%J4Uf9A3F}dfcw%6q}U$sI1fir1$E;=7ECMqj!ea_=k%WgX?km_+39!Qmx5k@ zQ}r2oK-Kxv&@=9((SKpVry-YB9~b*UqaYisGU-vY0dKT|fvLOO)JWfBtYp z!OWKURX+rug@n@kQb+bKMB4%H=wzEAQKZ7CSN&ONWPE##8MLNYcv)rcrM`Y~!+Rr@L2$`w-^;2SET1E{aY9Kg}P%MjdkGntG2Lm(O>)UvIPdsH2Zm^8YQAnSX zP{!)tmdC7*cG=BYoq(ur8vzpu@>*1<5_b?MM9|s_U$~1A7fpLW>rX#!NZ{b48@GpC zjuK|I$xRd~Eiv-Cje4vb)O^S-)P_Z<7VC~Wrtzxn1BkSdqXQJ*^jV{mk(1NQ#tHm7 zEwc5*>%5Eo6LMOp$cJx*U3y-stLwaVZd|J4X3?CT;|HpNii)jG%%{z5Lz21fF;tPC z|7lx%XK*?#e0;u9(5sd=#(31kw{ig--5;IU9$L*Ru3d4~K8&9dz_)Mz44B9_x9LR! zeNC1$&#E3rs-`C2!`*u3QJD$1>`ef4-vIgc#ymc#KP-RdV2R(|k?XyaPWA0pu!wqz zh%MAUV1v2Ia*QGW;|#L>9(aX@i|gv-`{lATK$ePh6yoKQ`xBE?fGpKvAGcnXI`feM z){Cj3?%0m8+BWppf#s$`e#mOk*h24f)OU~*^CbROD!%V`=W`Bj;N06FMub}Wh(0oJ zMa@sIC-PX;49Hm)Xk?5HoX$(IHpo03eR~rfCQTA&9Q{Pb%X3OSFL}+!t?IHQ_?+bx z3ykZf6%~EHUjW4dfJ>sD8ym8U_;$9VGqP{2wi=WAr>1j2dyHNufp4KuV1@Zep8fu> zwrv~CTVgUYCeT)Ucf_;G(YQuVjEN)lSAcv1`3woE8d8wSjzDuNXOx-FtzA~kN{@#BIX$X*m#71O2g z$E%$9-(f~v#Kri*Ib}r3OQUcMlC#;OS)vQqrjItmRn~-JCW7=F@0zhz8f6@LERR(x z-X|1ljmUP#ysQ%Q9de=%yzg(!5dg&?jr7d-c1}M^r^4~|27j< zo3|S6%hEz1r=IozdFqFNI&2vbMuqonK}N%nTSH#&o6V9{vy*tZ$~T&6tkXaq$b5q3 zRSJ@>bPz%Ki|LSsLx2$mV(HNuc$7}>CpfLn zduCq_;>EFgi&&o~A8p#mh8D;GmPWn)c+t`18X34 zR?T`=caB(vW3>I-t6L?;O6;c$$$IOFW)?l}dzD=`vEKKM7DYTz(6>5_((>aTX4dFY zRHKx+HN@(>iY?YVLp;|Z7uU`H7OJb0*h3pXMdqD)8m}7KPa)z)R`g~aP0EcQ=Z4O8nAN~ zgWXZ2Hin0?H(iunMsw3fFKe1qaj^wem1yO+4fC=5?@#dODc}k>a_30?MiBT1Oh6<< z+wdqC$G1?@1EM-!kiIpR%+%FI2+?J~5QCNtS@g_bW=ez_$`{-fT1{0XJ_E7~eBixZ z!!J0G*+3QqI@OHh*Oz<|W1coZkk;DZik#PexlEH6qEQ_=k^`_1LUw>^Y$)r0^h0!D z*gb3nHmNH*KFjO6D_dQ0t0*ZtIxQyR(bkbY?>ho+p-Zde3;Ul81kNc2yMxbOt@b(G z(mY+`ti7i^a0rb+>=l;9<@qP{O7Y7Vz<(4M`~sX#?N1KM)~%m85BvF(Q)cYErBRIb zAoDUQ@3be(o5X{$dW^!EBW2@zi@ZidD{aYHRkEpNzKgz-pFSBE_Xe26wq&@z>NM0Q z!hGZ;8I7v1mmlDAsV?bp4QGa8J!?Iy?IK*1l$!D>M2jOLPKV2Sn}P;50R}~?v=N+0 z67TMMoB37)vwZ; zi%rzhs!zA+;LUvS(x}R%XYQ;$#BMDmdMQRlLJ|Z^`j})h&a`+kjU6V21ugq_2*T5@ zwU-k(9@IJ5u@xp6$!5+gc;7XU#BGajaC10rH>P$e9*9*GWV7Z^u-d95Ijb{zCNEfN zE9dR+$mMylxIVELr&*S{KM!`q1Pb3cwJR<3r3g&u9r`#2+O*6B^;LCH$Q!g~>?B8k zG7$?=G+ba={<%J#c_No5JC>&7Zzz&S@VJ=&S~ED`nTHRJiM{F3QH}R%&16X2x35Em zYfg_fQGKoWW=gzZH`F|-hpCYSH#=h3qA?;Rw+;nb`r%P7oyR3&0>gSVHWsWXq{19!mPt3+k5~o z{f&o0yFzNXmr@^-w39`@fvsw4^As>}`IHiPFW)tz4i#vurEiYr?28i!J{G>-C>Q6n zo3R5gU2I`9<%c!@bKCzhKaNHpk*b3}nAC4^_(l!yYb9+3%U6}6xSTXni6(`d(((&y zOcaz{s20bFoUnSk^4=^7-;gn?Kd}Y%z6393Cu0SfZj86xdWRChBuE^3Jxkp{2h&D@ z7*Lh~tXW7^9`g0n69lN^N6TpIR+Su@{6EY}qiDg-85If38$tBGoHC7$3(-%z>P$H)<|-xzqD4 zOr&3(qfF13=M>xRfh8p-imipu){VSv)&c6BG5QPh>&+N$$`0dze6~Gy;}^bW6>&Os3mt)#SsN-nbih(Xwv&y)e#>Zk4Vzhv(pjuMF!+*=v6A< z2*Ko>x+DZ{ueOum7{QWNlM~-w5qG5BdPo&QytWJr;#3>+kjpBg6L}q^LkN%51yU2RE7uLOnn#YsaZ{WWp_L@{Y1C=B?6TE=7ZJM)!G1oKz7C3wf>@|HUbDv z3ST9CzCOKwM_3Ae2e~lYYCp3Ffvp?Ial%W<4j*_ynGI#qf2kXQRYXc66w{w4>nQ)F zniPuUzTCwSp}EGJYM6O?)7C0;#5HsPnO1Upw?V#I$JUcR0E4i+-yT!#n=&AMHybZo zBuP2bse_vQs)K+fDUS>&7d~s6JZobOLZ2L#PX_RWKzC5MU&y^WX-}3&DiVm6Qt0rf znDpcu-CV77mA2q6Z5GhAH~TYMlH zNKfp1uskDds%%vZj+C$BVzAsE3}8?<&+%aW;zmyJrKh~J+q`{GQ)roAwXVY$*1zlx zoUcN@kH|@M-QlX-zXVs&4uO5Io|X3Y>?5to)8$g4 z+3FM3#;^Vi^bvAvp0gm_sElvq%wH(L6V(Qg-7m1*D5np*VCR9FwN%#8?J{O_I2zUb zRuQh0)#0o$yRD+=#a{Lfi97RRHdhAMn>B9Pys7t~!zZ0p7GnYu;X(`-r>s|A?Ens{;dTQga8ZI?fj_@O z#OY)^t8^{3n(q7TaC*wHUYQ@tX&8`fGaLeqph0f0&6X03&>-^_nesx4dCG{;DRW&X zXtW*FWGQ&+`ucdJqupuRT5by@Nm^#=XT*ldes2^!0wx7Tgf*P19L~QG^wIl=zANQx ztu<8GVd*2E0-pAER3zqzaDmef=G?=d^Qh+20F``DyPI>P=%rvYYS}TKH3ALoyPVtR z*}yGH3Q6^a1+$Kl!3e+c2v?A&b!pp0*UJvN*V9$ZK}Fgnhg!&GOC1ng&kM)U3zFJ; zkMqq*llbJNqH46;Z%w&M2A_Qqx#>HLN)e!=i#1ET!5bsNw-i4QI!?nFOJ=yCFQ==% z@!~1J-y9V`=(7zg=G|UH$GLe8kvSq&-nYAU)7F8l62zeANzUydGDe8%5Co$m2M`UglXZOI94gXQ6X#-px z-EUM;4Ef0zZ$P#;<0<)4ji}Np6#?4h=ibIS;lTx!gO*XZ0L2)s05>9O34|y)5SU4a zKGDp>L4-Ow|N8c-#jrhO(U}py^RUryL+@KlAUQrF@)NHIuuG!c4(w3U&TNRghVFqQ z2I+-IU%-W<AwB|>3(S1Ed@3&!}Vx!WUyjhI(oH@&`f~DsH30B01V*KYMM=`r^-DpC7Z++rYG{6btiJ|RnK2D=*@k(4P6`(v@FT1E;IG!^Z2++f zjiQRe4lC9p7H+lZ6{*VKoF{((RJhLH$~$h3@VN^+gdX>^bHT49(R8fOH;&Ia9yIPZ!*}V`)Z@*Re7r~Mj9Gya6few>e}OAN@tY6| z@R>e)d#z2E9*;>QO_=w7bVW5D8C=SWZ^TKqD%00GvjM}h&f2-#W1jqc!sa7`VLajr zJ|3P~pTDgV&DPvwBhY<8(a&#t>Q=2HgBXg}neA)fhOrCKpR>+)TnbzrsSf?cU04Hx z!F-!1&JcH@egTJV$*OZDTN{XHyvt_ZQj`!Hx)(8fgj@%|>*3X;^ZdKg5AUvps3QYr zHeODezql-^H@W4UcbvLy6mqjZd>4Y(g|+g3+PTiKCX+R)f&~?1RY2)p6qO=|5|kPh z7gVZ96GM=qNGK|j&;pAng48uAN|jYZF9D7z_3aY%h2gfrr!Cr8-rLLG z?_(yX3{wGqXP)8NFADCTm8tQHwVtniQjh&@`~rTo0IrGC`cO{U=TE0)n~{VARK2G1 z-9-ti4oy|J7DiMFzD#Gq)mBI*Cac;q%FyTQA8@rW&30ho@3a&U8^$@d^I(KjLHC+| zA*OD$Co;mc&!uRuYYFPs!XLSP^cigbAQ|n#CxX2WAycXfaZH1jRj*|#YSdF z8io){j(ss3ikfnm0nT&JSbYYZk$~3ISwwrx`UpncbRk(UglaH<{*s)P`E4O?6UZ)q zC&4te<+fL>Gniex~}rV`n;550BkPf2u~!%Ufk&7u0j?NHJX#5El@B>EjAc1xgTL4IZFV%S z6cu)m%5b)unh`>%ewssJOH6M$={lPu3|byA$e+WzN^Hf$aB8^uGv=Gr?5>fqH??wp zQp>Y`wQd48fkm}XObDsT;o+)d9+^FLN~5DC$XSo^cQ0P(#qx8v_#Oy@+KH>$e54V1 z1|ZYrvH6jndoKcb#eBbGHtnQUVdUhEXBnG1^BGe*Lku74?{);IR&M*k-V);;j{&Mp zG#sk?fX?oUzri+xx0k-zyptVyFsU4mny9CDW}e}FhT0@KE)oHyP(>}y4fLY#AkVzV zq0N^21qKHCLkJ|MFY(MSii}IeQcj?-OF%)qsO4gqt6G~lX7SV3r2%GNpL%g)zC}Pj zLgxkd{%TXR>~rCG5rOC{^5v09iVn}hppMZ!(F>0qICR#Ujs4kHK1LZ=ju(= zp+nKhsYIS;2n6GGgMjNr_ko*<<%y1izeg9Aiml9v5g`qYQLmffs1be%ZBaf@(WH>2 zmC*Jk5bg%=-qR6R%5X;w&qMGwWD+ufFX}R@ZYNTf$w(57kavFWyWoXNp``Xrftk~jQk){gJSJEV3W@0Lm z%Cics(g$^h;aKrJKO$W5KCA#WzC$2O=k%yHU`o9~hc492mYR1jmz1Mu?a<;@RI=Sp zj&_qaH+E6tl+uBTTb>HBPhs2kb+@_VJjsJrC1mrCTtSF2k)}y?SvLX_qfXDMA6Wc` zj)+H(^;(NoLKj;uxM6Q1oz%wPw&|ehnKTk0(t{~o{=}tdOovH6QPTjuJ<(^fdY{JP zbZ)470C!iFLZh%4V0h9Oyr*xxgaCLJ2h=fr4Ts|gP6jgXo98_Lyevz;7OPL}Yx-@U znn(A-xRx=%mBBKIauskacRsAoHlki9{NAxo5qPUjzW`3Ys=3L`8&=KW38JwFOQ-Wn zzZE4I8^y1yViCN&)xMk$3)$IpDedi7KI#7W-z5g76PFD#Qe74)@W&t)-VqK((=FVz zZUK@J+jCJ4epy5Sv8Z*$t$xSvfl=;dfj}e5DzfQw=q@-5uap|<x-qc6FsP0VzoL)tS#G$)HuZ_3&1 zM!f0HX3ktav~y@E%icd*X}O5&;!sSA*Cam0s^H}y>R~21ilZ}J#FDVgbQPv1lv-lD z_?SjjH+a1p)w2&J(eFJ~ym6{7zI2gdGZJ4|=8aC{`dGd+3V*cWu-H{6m3LF*e!oRq zFN^mdC@9)5vCi!y@Isl2XDaSSYSV3@cTwsc;ckpF<=`;rS3{;P5z&!h5!(}{A_2(|ADBe>ZBwDcF$5~y?QXS$caY3h7jexE5acH*)opmNNShNfeUC?S3t^|EBt2d z&=XL6hm}x=#ta)-Z19f*ZNRN02ghy=*3&Jo@Ye6|J@o=OYxq7DJN|r(^5hFIGR>bp zR_eNs8rNDeltrEyjqS}MN8}|cyIQU{DRjxvyPsxbo;;@D8lRU8>}P(Yk~5#Kc8k6AZnqY^1LS)$JavK1<)vv2`X? z0|N~LWma3T!FM-eWa}ZE0U~POv4;YPxIF`eM*Z@Jh@-~*K)MmbDBdZF^#I9p$S+UC z_JK&ruM4OAoeM^G$GY~WUPIp!Z1P&iA|m~O9=hB?-pQg78lN{IO|wE%{fZ@UE6WQh zR=Fvs0y=Sft8s)B)M%Gv`D|Id1m#>;?w7*~S_}797GjrGI9r~h-rfD8L=ZAF$qZFO zwu2w+Wj@NuIiqJ?6#i9or2=L`nzVZ`n>!e=r`ECe1}W`qeOZpWcb3@z*F#n$0_CJ& zRXHhJzGkon?#H=yn@?5=K``W;r>c%x8J91S#1&kn{GAG2oUt!p-h`vcPGT4)3K?1K z7{#9HuR?1W1Sk^kA$xWr4{BLEySvMH(ndWn!;QA@iU_qD=@}fIQ*(`{0-)j2S>(e7 zy(P%o6=`t1J;IKAUF!TvEzfdovkU3J$d+MY8k_)yizqO}_P4s0oqSR@e>npVhd&9n z2NVK**`*Lpoog>dg${(%u$*|=8hNoWmR!3w_$n!1!u013;9^X30vxkh2c!wR=tkwSz$#M&%`0)d*@$VZxyDlFA6qCuB$tf66I3hLr>ZeqTyMKH zZ7HAxz0V5PHP2drBsWc7y+RUh~&CufB0_)q`AbTf#do$C;O+>Q%HUhW>P1 zEGo!0d_<&gW!VMa>vfmxe(c`5HuvYGFzhctUVrxLIQV(Y+A4a+)}LRVgSgF&AABnE zOS+j%x?AKI9=i@ig$XzzF}>At4r5CYDb-Fl4L_Xawo&cicV@@L0jr6!!5i5L=n%6h z1g9HJ6j(X(L_c8)Uus{=R}DqB%M|q7E-U&R*jVXOI_(rA{wup0{k>&J0O+&a@aR9R zx8vNlc)^;~UkRc48$oDerMAR$xymjQiSZ)URXlbuXSL*=nE2>CFo;FxNX%eLeA!~c zUoR>JG-%7<^lNqOIpz7yA!w^QjE|FU*%%scGgF7wHco^Um}Q3peWOh_kNR~C(>*4i3t@s&MKf`J*2!DpvDqi|otyZf__0MVrI?K-{xY~yz ze>TBY