From 54a086afc45a3c9ed9b2f0ff13cee08335cfbefe Mon Sep 17 00:00:00 2001 From: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> Date: Fri, 7 Jul 2023 15:04:35 +0100 Subject: [PATCH] fixup! Update README --- README.md | 110 +++++++++++++++++------------------------ docs/images/collab.gif | Bin 0 -> 2492109 bytes 2 files changed, 46 insertions(+), 64 deletions(-) create mode 100644 docs/images/collab.gif diff --git a/README.md b/README.md index 469339c8..85e6abcc 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,56 @@ -# Ably +# Ably Collaborative Spaces SDK -_[Ably](https://ably.com/) is the platform that powers realtime experiences at scale, including live chat, data broadcast, notifications, audience engagement and collaboration._ +
-## Collaborative Spaces SDK +The [Ably](https://ably.com) Collaborative Spaces SDK enables you to implement realtime collaborative features in your applications. -![CI](https://github.com/ably-labs/spaces/actions/workflows/dev-ci.yml/badge.svg?branch=main) +![Example collaboration GIF](/docs/images/collab.gif) -The Collaborative Spaces SDK enables you to implement realtime collaborative features in your applications. +> The Collaborative Spaces SDK is currently under development. If you are interested in being an early adopter and providing feedback then you can [sign up](https://go.ably.com/spaces-early-access) for early access and are welcome to [provide us any feedback](https://go.ably.com/spaces-feedback). -Go to ["Why do I need realtime collaboration?"](#why-do-I-need-realtime-collaboration) to read why we think you should add realtime collaboration to your application. +Rather than having to coordinate resources on calls, or send documents and spreadsheets back and forth using a combination of tools, having in-app realtime collaboration features has proven to boost productivity in remote workplaces. Try out a [live demo](https://space.ably.dev) of a slideshow application for an example of realtime collaboration in action. -### Development status +Realtime collaboration enables users to have contextual awareness of other users within an application. This means knowing: + +### Who is in the application? -![development-status](https://badgen.net/badge/development-status/alpha/yellow?icon=github) +One of the most important aspects of collaboration is knowing who else you're working with. The most common way to display this is using an "Avatar Stack" to show who else is currently online, and those that have recently gone offline. -The Collaborative Spaces SDK is currently under development. +### Where is each user within the application? -If you are interested in being an early adopter and providing feedback then you can [sign up](https://go.ably.com/spaces-early-access) for early access and are welcome to [provide us any feedback](https://go.ably.com/spaces-feedback). +Knowing where each user is within an application helps you understand their intentions without having to explicitly ask them. For example, seeing that a colleague is currently viewing slide 2 of a slideshow means that you can carry out your own edits to slide 3 without interfering with their work. Displaying the locations of your users can be achieved by highlighting the UI element they have selected, displaying a miniature avatar stack on the slide they are viewing, or showing the live location of their cursors. -## Getting started +### What is everyone doing in the application? -Use the following snippets to quickly get up and running. +Seeing where users are within an application aids in understanding what they may be working on. It's possible to go one step further though and see what changes they're making to an application. For example, you can display a typing indicator when a colleague is editing a cell in a spreadsheet, or even update the contents of the cell as they type it. -See the [docs](/docs) directory for: +## Quickstart -- more detailed [usage instructions](/docs/usage.md) -- [class definitions](/docs/class-definitions.md) -- details on how Spaces uses [Ably internally](/docs/channel-behaviors.md) +Get started quickly using this section, or take a look at: -You can also view a [live demo](https://space.ably.dev) which uses an example slideshow app to demonstrate updating an avatar stack, displaying user locations and live cursors. +* more detailed [usage instructions](/docs/usage.md) +* [class definitions](/docs/class-definitions.md) +* how the Spaces SDK uses [Ably internally](/docs/channel-behaviors.md) ### Prerequisites To begin, you will need the following: -- An Ably account. You can [sign up](https://ably.com/signup) for free. -- An Ably API key. You can create API keys in an app within your [Ably account](https://ably.com/dashboard). - - The API key needs the following [capabilities](https://ably.com/docs/realtime/authentication#capabilities-explained): `publish`, `subscribe`, `presence` and `history`. +* An Ably account. You can [sign up](https://ably.com/signup) for free. +* An Ably API key. You can create API keys in an app within your [Ably account](https://ably.com/dashboard). + * The API key needs the following [capabilities](https://ably.com/docs/auth/capabilities): `publish`, `subscribe`, `presence` and `history`. -You can use [basic authentication](https://ably.com/docs/realtime/authentication#basic-authentication) for testing purposes, however it is strongly recommended that you use [token authentication](https://ably.com/docs/realtime/authentication#token-authentication) in any production environments. +You can use [basic authentication](https://ably.com/docs/auth/basic) for testing purposes, however it is strongly recommended that you use [token authentication](https://ably.com/docs/auth/token) in production environments. ### Authenticate and instantiate @@ -48,17 +60,7 @@ Install the Collaborative Spaces SDK: npm install ably @ably-labs/spaces ``` -Instantiate Spaces with your Ably API key and a [clientId](https://ably.com/docs/realtime/authentication?lang=javascript#identified-clients) (if prototyping, you can use a package like [nanoid](https://www.npmjs.com/package/nanoid) to generate an id): - -```ts -import Spaces from '@ably-labs/spaces'; - -const spaces = new Spaces({ key: ABLY_API_KEY, clientId: 'id' }); -``` - -Spaces will create an Ably realtime client for you. This client will be accessible on the instance via `spaces.ably`. See the [Ably docs](https://ably.com/docs) for details. - -Alternatively, if you already have an Ably realtime client, you can instantiate by passing it to the `Spaces` constructor: +To instantiate the Spaces SDK, create an [Ably client](https://ably.com/docs/getting-started/setup) and pass it into the Spaces constructor: ```ts import Spaces from '@ably-labs/spaces'; @@ -68,22 +70,22 @@ const client = new Realtime.Promise(options); const spaces = new Spaces(client); ``` +You can create an Ably client with just an API key, however to use Spaces you must also set a [`clientId`](https://ably.com/docs/auth/identified-clients) so that clients are identifiable. If you are prototyping, you can use a package like [nanoid](https://www.npmjs.com/package/nanoid) to generate an ID. + ### CDN -You can also use Spaces with a CDN like [unpkg](https://www.unpkg.com/): +You can also use Spaces with a CDN, such as [unpkg](https://www.unpkg.com/): ```html ``` -Note that when you use a CDN, you need to include the Ably SDK as well. - -## API +**Note**: when you use a CDN, you need to include the Ably SDK as well. ### Space membership -A space is the virtual, collaborative area of an application you want to monitor. A space can be anything from a web page, a sheet within a spreadsheet, an individual slide in a slideshow, or the slideshow itself. Create a space and listen to events for when clients enter and leave it. +A space is the virtual, collaborative area of an application you want to monitor. A space can be anything from a web page, a sheet within a spreadsheet, an individual slide in a slideshow, or the slideshow itself. Create a space and listen for events to see when clients enter and leave. Space membership is used to build avatar stacks and find out which members are online within a space. @@ -194,19 +196,19 @@ The following is an example `locationUpdate` event received by subscribers when ### Cursors -Use the Cursors API to track client pointer events (like a `mousemove`) across an application: +Use the Cursors API to track client pointer events across an application: ```ts // Register a cursor instance -const mouseMove = space.cursors.get('mousemove'); +const demoCursors = space.cursors.get('demoSlideshow-cursors'); // Publish a CursorUpdate with the location of a mouse, including optional data for the current member -window.addEventListner('mousemove', ({ clientX, clientY }) => { - mouseMove.set({ position: { x: clientX, y: clientY }, data: { color: 'red' } }); +window.addEventListener('mousemove', ({ clientX, clientY }) => { + demoCursors.set({ position: { x: clientX, y: clientY }, data: { color: 'red' } }); }); -// Listen to events published on "pointer" by all members -mouseMove.on('cursorUpdate', (cursorUpdate) => { +// Listen to events published on "mousemove" by all members +demoCursors.on('cursorUpdate', (cursorUpdate) => { console.log(cursorUpdate); }); ``` @@ -215,30 +217,10 @@ The above listener will receive a `CursorUpdate` event: ```js { - "name": "pointer", + "name": "demoSlideshow-cursors", "connectionId": "hd9743gjDc", "clientId": "clemons#142", "position": { "x": 864, "y": 32 }, "data": { "color": "red" } } ``` - -## Why do I need realtime collaboration? - -Rather than having to coordinate resources on calls, or send documents and spreadsheets back and forth using a combination of tools, having in-app realtime collaboration features has proven to boost productivity in remote workplaces. - -![ably-multiplayer-collaboration-solutions](https://github.com/ably-labs/spaces/assets/5900152/533d23cb-d943-4230-8d86-1981ccc31a8a) - -Realtime collaboration enables users to have contextual awareness of other users within an application. This means knowing: - -### Who is in the application? - -One of the most important aspects of collaboration is knowing who else you're working with. The most common way to display this is using an "Avatar Stack" to show who else is currently online, and those that have recently gone offline. - -### Where is each user within the application? - -Knowing where each user is within an application helps you understand their attentions without always needing to explicitly ask them. For example, seeing that a colleague is currently viewing slide 2 of a slideshow means that you can carry out your own edits to slide 3 without interfering with their work. Displaying the locations of your users can be achieved by highlighting the UI element they have selected, displaying a miniature avatar stack on the slide they are viewing, or showing the live location of their cursors. - -### What is everyone doing in the application? - -Seeing where users are within an application aids in understanding what they may be working on. It's possible to go one step further though and see what changes they're making to an application. For example, you can display a typing indicator when a colleague is editing a cell in a spreadsheet, or even update the contents of the cell as they type it. diff --git a/docs/images/collab.gif b/docs/images/collab.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e1f368e5b436e7220385ebe47f9758758770292 GIT binary patch literal 2492109 zcmW(+XE@x=*ZyI#O4uMuB(hjt5WPlc)o3evh!SOW(WBQ8HhM`ybW7CLdyNo@Agtbd zuOT+}ecu0kI@eq?bIyk|XXd`I`>1QENlMv-kxGL8JOch3FaUr901^OD0Du7iECAsC zHw%LSa2SAu0Vo)NfdN<;fcxK47#x7Z0VEti!2t{$z`_CC|MtU>02~P*kpKz_V2}V7 z3E=*BC=3O_Q2-JJpilq?1z=GC?th+O7yym|kQe}k0WcT5duFnnq=q*fbQmu5`MB?i2AqqxG$c zmqIFa7>Q4&Etq!Z4aIM+OYwh?Otx5#aDqqEU)*jcms@=P6 zB4FglXAD{S@&NvtG(U`h#(z1C?0%Vb_#L)pXcU$3Resc61OJsMCbKe|=!Y+xS>sr| zu0F@HrueVM@#K`fjDK9v%$6uncU6%1WZb_nQ~_i?WGtsP!2aBV;ChHvMb|ztSxs$V z2qL}Olxe1~BvqXDM#GdN-SlMuhlTyVU#?YT-{=QC zcb!VjgL$3H3UgYc>5C#-oy*F-c6rh0;XvLp1EJF8H!ZuZeAOL)|MJ!JkjwDb4%`po zultsyu19nICJKTX)fmyoOzPh3H~fC-^0;X(u;Ov^%-cEF=JlkTgO-f~7lF3D)(V04 zo#8pR_VXV%haDHIE`nV*e=7tbDx$*a#>BM2H3%{-` YdJtgmG2OzBkiAtW~4DC{uai!+9B )XiXMZG`86L) zm_*7n%zX08Snr5VXvuUijfHC$sd^0@IJ_= anDXsV 3Nz}UG(E_1;f|0cak{Q*G8TNCg! zXQ!~M^Y20ZBa)x8H(Zp(nX@nCZ}ETj^5jL{f>(=hDGIzM#b`<5#B>7l;%<;IB%DeX z3SzkGCU9dVYeqAZh?Mo*@v4br!9l^w+)9AxNW{W;yq*C(EvHP6gWF<-!jh4W@rPcF za;*)8t%35xMO3Vm9qXMSu*w6Hlh`NcHg{9u{TyuX DSwzdP*g{Y|(G+D<8v%vYD1r)H>2UAHP0HFz2j+fK&(^d}XyqxeLF_oz^BtX%LX` zvw>8D9YpI*%~+jMbACDwqT=n=+4Q}IV?21JGK_w3h{S)>vASc qzkAuDi8pOc$*B3jA>fidV!m6K*^VoI9ND5}^EV~y$$grX2%jQ* zFOKZzo(@L&E#KK#oyZ6s!9QvA2#-8zgBSNV(>0d~1th@)&~DnB@tw}sXxcYUaDq@8 zNR)=juHH=>7ydY)3o6M?UPJg>p2r^@*6D0qd%sMPEO5-=iFyb`i9>~*_gB0DrhvYq ztWNW)I@lBQ;_qKab&1_ysQ;XE-s92K$}vc(J1^pW nE{r<1nP1&q~6OY{p~(@9(l#rrq^WD9L|Rpo6cdAxky-ccoYQ6TV0QlSso{ z_HW-wL&jwy-(d< {st%>-sJv5CqG0|nb z6q9Y!1k`>>uKadPd^1?pjJni?1$zdU|LDMs`kVuPM|r;4CHoA_Coxw?eVN($^o)j& ze0sR3ZV-%BFz|W#<8v>*js;HYCVkH+c0wN%015+nfVL!36XqGxK7*)L6~MFKe(Y#I zZ#7fs_IM2gt7pfw{r%46-=)Q^%1r>sQc(JGVY|Uq&m;B`g278c-7v}Xn#&Hskh6-V zf2Yr%-oLkcH;;Q6p!JU>688uvNL(i7Ywl6AJC1x<+0V@>*-QWFIGkg@pWHU9k2yw2 zC1M%;YJ2i6-h5q?q1JJ=LROi;X3`uo)LScY8U4=LXYJjuxV8IzwU24Sepp*=er2U? z8FD6cQ3d`J 2Tr8|;X$Z++^+gI8M2vr|>#jT2(3 zl~ wZ3ZNj&k=WA&X4W)bE_gsiV> +AHMZL&^fD?^D~? zubeXWd2`LCt8lenUSB(zcA8~1S!{?jwK#hVcz>M0Z3=$9{t>z8{fX$!wvwRq3NA`V zi xUq z0OI>b6LP;ZhZFbi8;xC_%5@(83tA#$3@^@YKaP=?U8Q}7#Rrb`(fwD7#Bl!KUS0LR zZ^EtPpS-xHQhs{&p|pKXBJ}#F%hU4`^%{V_=fJ(9`NBZzB)@z-ij_Nw&Z&j*oib^w>Q@1^hPq~`_@sLg+Z`v5pZx6LjSR`m zz9st;7bS8Yec8Vg|0zuCL*3BpXL)PYujGHexIM0xzdfoB{d=@@i^F%}2Mi$K9+W7p zh@9bPj(lOVZ|tH hK)VLLx+QSAUf42p&GS=k|RjM+V&8R@b7>g91@66pl z%>564GfJlE;1Vx6KA6p{^en9O?%4EY{}$$s5Jo1@?cW=`S1@>Yl{F_%>ln%|Ucmm8 z4fbh1l$-w7zYiRPAAZ@hja$AP^(^>lv&tD!z-3&(o$-<@XO-(y0dGmcaU6B1-30K| zGUdwHUG?GP#g}fZ@qEM20Pb#a9jFjnCK)VjN|h881|VMN3mY?#LltmY{{gjpvJ5Di zECSm6@(ESJ5;4oND|_(Fu;S!%SQ5KbMxj*3gSGdcq?1@=0 JaZ8&S63Y$5|@~2QCYvsmV=plzZsKHQ2>;+3_ZY`$j|LF`Az9 z_bH}wD(`WYVm0r)Eqo@xX)9i0n>1EqIz}t-nbw$-&S2ACx5UAW)4_Ms!2!?tDulBU z7S2wo-E6wzB>X*&4BQ6lW;9JqeDj$x=5uR{0uz$pMAbq|MUlLS01<%b5>sP#NY5$i zNxmK_dy;MbWd8EYZ!--|(||!C{%|(_RTb?Ip3s+;?;pAQd}xv7^p7d^PvV*@GvMpY z*ygr828IGI?E^cx0tZWjhF=9uaRn`I1#XrWu55+umIhvOh255h^=<{zm%aJR70%)q z#>pK@#r;N{JCbcXQnM^vX*)__J6hT?+Mq1L*)dj)JEr7;I88YFF<6W#UexsA@81RI zbV{ti_F{jTAc?I|M%V+( Xf!mC-ZtyMPM39jaf+}K)J`*c zpIe-4j9w2S;kCB-n66SK+%knL)3-b`q`bPwR-O=+T~#Q%TbRANCSSsn(`lRgX(y}B z=|k(zhu)nWbiV>W0ed3jy-m7(G1`0WcDk!7%18wsY&286rK)aG!H+D{=5QuGMP({R z676&p8JC7Z45J-^@13l4o%h`h>*t?ikV9&}B+1iS7_%%XX!LY4Y;<&}V#!RovZl~q z7I~`zzut&(7$_B2U-H&GwXZov*U V&Zg%Zf49{SJ7AYuvGT^wRRNXcNDLDCA{A!UFoRH-)~UaZ@gbmOhBtgm{;PE z_f+|wP{h~h$#xC`QoTgxNmT~l&y0f(gUyP?OeXCxMUtWwk5=u@2Fm}wJ@hr4m~dWK zAsz2sn{whW4q@-VJ7|S)ld^eb+YM9ns(qQ%J$T7U9~W2_?dBL4;uvG~W!m>K*7@<2 zm*bSz7i`GEOw5;=D%Y9D$1|M=Q?0J^y$9GIUlyhwFBTlc?sAKp%^r(ZAkdD#RUalZ zMzDevQ}drMogNUMyd%_8X#BK6k)}WjnO?m=B$DxQQ}|(2B7V AJ{px%|$x8#g~f&zUUP =#OD+e(1rTQd92psD{MOa+R$yY~JK~^e6UhP3ve@xaSL`hMs z4-SJs6j? 2`Pl?QUjc zm-+Q=yK3)XO5oq)3JCbWhMh>i=xH`k1l0f0!TlX&g!((UB8?*f0oi1lo1z;moUJnj zyj9C` ;4UgN1|O zJtW#aB*-2Ru8Jn?8|yO)LZ~80MUkY;i@wMUG?qyyv#+zRP6G<3fhj%aQe;Ebz2?m3 z`sbyw5&H!m_HgU|8rggG(^_Fc5s|aZfMM4~^kdPz15quJ1%op&^RtDQXW}m2qNR@| z>s`fTy~R?`Bon+Pa=oPs&q9T(!plx*$z1|GgyI#c~v38|d1IR_}#Yk=+=MC7L9k zArS@{b(yx8YdHeRG?n)wsbq-2+gI^P+UNVmK1<}f%CYK+Q`R#)oA>$R)FtZS$)Xwz z^ru$tA04XCt1y~PqL-aMntkVI!=jo$eYBS_I$P)HI#KeEd6&1M&(_Wft093`db;C! z8e9zqf( SBmC4}@|9;+2^3PdKgmiIMjSj4+47-II(+(Zuk-noDXV zEN0%+U>=0(&8V|@acaTkWyx1(IniLXCH7)X?9<;1O9^v++sy^2h I~|rJgrByuypWsy=fF@_l71?wH*8AKPY^cNrymLd)#4^whHx zeYw#q5=U~bDk7>fy{tBJ8SQqyx!FjYkR;FU6DK`HcXv*q>2hQ9?XhO8f<&XYyo3+! zh{nYEC1HaW#p~Ck4Z5%XymoJTZTQE}*3Tcmc6;c4_hAFAlUDR+39X7h4QYP}N!P24 zV+9$sh}9)RwwgkY$jL%4jBg~uUc3%-xd_8Ig*}oCA9;jimNenIO7L%}&KUFB)AT-S zihdy(L!I#G&ui-=G3y}zSZ~R= w# z{C@yxK$gFjZ#kEb&`EPQcx!h}k2#o&x0si?cc1xqllhvXIh(6FoOkz|%Q+0qcbDHe zp65B-IJJW_xStm|pd zXF8`-`lfq&O|dwnk2 gb&&w8sfd96D+tkZg~-#V4^ z`m5Xet_OS861T#dy0ITSvX94fn>n4gxwFT4m^VALGkdgGJGEbXnoGO3TYI*1JDHj_ z$|bwFk2|@uv3?{vx+A)}A3D1$db+p&`@6gQy30Gf`v;?!JHF>TvTr!3_dBNh`=|fA zzz00Rcly8^e8F3$o$EWpH+-W%Gp+->#78{E_qwoG{I6rYto!=LU%bUn{Ksp&u7iBW zhrG#`d^`&TmODJlxBQ)d`Ll03w$Hh@ySdHBe9hzh%-{U9cl*xkyw3;y^)9^27roKv zH=oaYyf3}dH+{W7J-tUg(?k8#OFe_!`_X5;);G4KBfQrG{MR2m*pI!~mwm#Ueb@)Q zsBb;nxBXJ1I>(Q^$j3e1dpyc_Jjvtz+}pk0pM2lnz1;hK-~)c$=Y47yyW1ze;w$sA z3q8-vyyF8s&HsGQPk!WA{^RHWJmyP&=2O0$gZqRpzUYts)b_X4Q@zulzUo&!>!*I} zqdx4f{!?N->DRvP7c9S{J=vc<@29=*@BZ)WzVP=x@OKo^-#+puKbOKi;q(3A|2_0S zzw{UW-Wxvk3;y*tzx6wR_D6sBPygO7$jU1}`Io `LQfe9{V6o_%7MgSZ? zdIULAWXX;vL!u<9(qu}PD_^#RIa6j$mN#SKq^Z+pPM 7I%g$YU_if$3c?0(yocM6#y^#w~UVQm+<00%FGFhdD9q_9H^F$_^d5jiB$LlZ$9QN $+;P!L49Moth0eL?*j?A%blZjZU3KNHm)?8h#dqF(`Q6uF zd;10WUwsAtE|}nhDKnMag&A(x;fEoPSmKG%G8HBid&HQ>jX%uzMUQC&`9_g* 8GKN zTI#8(t{N~XD;-r-O-a@I)2%uET5PY$<{Ip*%^o}LvcqN@?Y7sB8}7N^u6t9vyOta8 zv+wRZZ@T^F`|rKg2AoQTtxjC=#Tjqh@yEBN$RcSew|3ggE2ma-%q`EH^UXaEz4OsQ zC;ju&MK4`-)PKSj^4DRHUG~{&uYIm_5gs_;+zsB{cin;SJ$T-U|6Tawiyz+j #@(?Y4m=++54Tp?;iZ|#V;Re^3ONlXrYU4|LFC@PhWoc(WhU1 z_t}3R|M=~n-+hvPL=o)`kbng=-~kb69;~@7aD^ir0|(bY2nvpZ4wRtYE@-$4PSAo8 z^xy_D_`wc>P=g~hAqP uwlDDNd1!ReYVf1lYXjF^`MS)8ZGqxJ5695sYIrqZrXx z#x# x=CGNQCR`iPGJ?BgE&7)U@4vLkvd RFglTqk<};xgO=*q?YZ+u=2~&v8 z7H0FB-L&R6MaWHXu5g?u+~zs8nNDwp6P@cMCp* Kj?=W~J@J`OeX2!rPD~;b z0s2pYE^(m#B Xev1Eviuek4n^K zF4d?^MXFPk+El4Nb*fRN>Q$|p)tqiMs9NnRSBDDLq;3^=F*WO1(VAArEwD~&a%)@R z`c}EdHEnaXD_!rJSG?|3uYKj~U;P?bzz$Zhg(d7^4VzfRE>^LPW$a@e8(GLsR }4&R*?Ov#vz_(qXTz1lhK}~3rDdpT9eP^Trk1s&U9D?di(1&~B%+|T?QL yb#8K@3$V@Vmb%ro?scn!N2rQ*yFMX^6r`|) z@QNiQ7@>)Iy&6_t8aD~#)uSHK3tyK=puI0F?|qflUiVg&yB~R>Vcz@yRROD4llnz3 zR&N?n1P^$u4DK$08w}wGN0`DBwlIGkjA3Oq6T2Pu@P|PxmukY(ootel1W3_}cC>=U zD{coF4)fM|zLPRrXz_3nyM-0EVheZOgo;}sg%WEG$SaPqIpay<#7F_ik{I%tQf%bC z&KSv0PBM+FEYEgo`N~;VvXZA8Vlj`I%w_K9Y>fqk6t`l{ttbVH;VcE1NI?lwATOGC z@?#d?`72Cj@g~sA5*xF43#j!ooVgI&)%lqeg~kxFQf!M-2>Dvz6*8U`ooP&OTDF~5 zU2V%8YEh4xx)_bFaHK?r7Q>kwMQ-wAcHD~R;)V<^mH@k?;NmU+9Jw<;Ua^on>T5W+ z ElGbD984e#`p>o6$f4hi zUjR5e&>F7rD)qeVj>PxAn@qr=w{YN3Vq^ g!Q2}}>vzRT_n~}YyB#=Va zYjQCu9P6f*1EJO`#&KbDt>RtNRoK9Gxm| pWSq= zJALb2=la*Z9(J&gy|7_U`PtE)_8N-T(^a`QyG4=&7Q2G~6zyg+n_ruic=LHGezpam zgEHtwn|AMTKX0!9UXsLnj>&ZY_vIo@3QAw3&5Cb3r}Lh9O<$h#ngg}kK_7b2Uyrxd zK8=orUYbpiVepXI!s=r^ir0^!F+aa|zu8O%O-P~kkqPf6#t>tLlY;nw2aS2nMTT;) znG14O^Nw#loTLw3^*}cIM;g5e-UA>BxNr2Oahx2vulU)LuzvW#)cq)v0oVyxz2vck z04cej^=!8D;j+JdDUg92tY<$*IAgfnkLJig` |dFU1<|$bdi!R`1RKjIT1pA_z8c%^FP-jEgL+tp-g` z+HjECHpA>juLphb2Ng%VK5ht+N@ YK~;>`@NQ0`K!&@>_m>aP`SA=b3-C6M6mgscn=&m|y( z6!vi7h_4Xg3=&g964$H}hm8;giQWe8($ $}sBmtC7*;Wkpe9mjQWcp07PK3?L=C8%X z3&>W@)?} g=H+*(?G}Mc0Il9_#K(5I_>?(Z$&B z)v9FXTJ0p+j1+>v#GuR}Kho9m@l5WJBO~%k5&$Jb@*E*jC+%@1brS1-&dQLI%aZcT zym8Bz(#!aU2e)x5sj@0#<;*(ID1hMZ_6#Qk!VSag2-!@$#Ou3KY!5eK*T8GwS|JPp zKnjsiykPL*GJ+y+@%Om$?)Xk9;BfK(LShT{kQKC`yd3fF_D~DJOV!|xDJa4f-V6!> zU=y}5$Yvtm9#Jm;tQP+4B(|~-gABaLZ3_dfFr%!|wm=g?F~#JpAm;M>`mGj-j|3mj z_0F;uB*D(4!2F(YHiII?9CPx>vdzL07Kdx@2yNH;tqMi+BDRte*NpwVk1f9s2CHzB zoK5n0&k)HEmN0MgG_O0slXO1MD#^1v&9g~NEeClc0HBWihR(k{!^K$PPI?l^lF%{6 zuOsKLJz-2Uz|lSxg9ANs+!As?En`anQZ|ZCGwRbIujD`X@ix|RDC@HwaPBb !BSkmV zzR>W`;L!=UPauBM=zsvlMieq2v_ETa?`}{Bq0|P|v)ZujJgxLfv2<42D=3 (G{sBn&adT!Q#mZ1T{H^{P zOb(TslOVKr5 z)wMd XYC-2O9H}Hlw@ -Xwl}_q#vP{-7`tE81u|!9?1Px=( zO4jkxUZ`W?L}BM|$y71xAfsQ05;EGuUCAzJfp%zxwrGj=U$Jmqm3C>F)-KrYJBtMc z+0qQ-&{6LW3fFX7an)6M%uz*^5LF@-FXGTvb0yl0&rpyQHbHIKc5N^5+*qs@0FNeY z3^oUIX$%u4ND)Z?pJLofVGAD*BSf_==S}WP!7*oo$ oJK2TyP7auZ~AFIgh;Ca+m(aozwxPfJ1HHX M!;rQXu5BG_dIR6cZz<_3lWPGO8Cb zQuHV>qvw1zGIWz8+05z))-nusBT$kw5}?Jvwl=EnN3^8Y!W3ndbbTiSLLqTxRZQ|; z?|-%L{RpjT8uUW5WI+YO{35h7pzit#A_*km_ZYRv474*o_CmIj{H&xwTOlny7=Uq4 zLkn{0He+M|c``paK`}@{75CB3e$Kd_R7#^XhH1EWq|$hCIERZ@2&Yk8Te036HptFY z47-pNvK9cm)-u^_GB*>63o*)gb0E&LE!#sfQ%rO(WbfXi@s82iCU0*$m?YW_FsHE4 z6cx_q)*#yV33DkwB`*nZ6OKtiS;P1uaQ96O!gaqA05tO)Su8NIu7d|c?)nfV1VZp& zF@(){AiTB|HDcUSu^p827uOVZku}chQsO9XB%1T?9@EXPHcas@B#iRDA~Ox`^f9Lu zBak!|om295wTGWETxWS)eVANv`IdG08g;mreYtqM5h{flQ`S+|&ZNZ*7$*_ZCV8|< z8kkD|=2699I4IlUD77~t@e_nUI4w=^eBWvywWLCs?r?T&oIB%6=vR`()YaaMG9Z)- z3`KtrwkSoCLQxV+a4dbHjv&8epU*^ryU-$2)PCpcW3Ntw6Q&(?l7+{ae=XFlPL>5D zRschig-6*bo3hKOY@;!Hm^+%I 3o?&9!T z(3o-27&I+S3*dM-@2qk?0+Htsr(=TA0yn1961-k0PKm-dC+#JAb&sxgriW7srohtw z-m}@96X0g|laO>&LkR^H6VA4 iEk9hTAD=Rj5H*`ATJxBU6LO0m_ )@-%_>VmnL)c3BSZtKVwV?SS;LkO9ri) zTh@&y(&`E^MFlx|EqlFXxV={@s3$wV #Hk%+OIRQ1dj y%<^&?o7ryR9V(UdL?l`w&f6|kC(op_H=c~2!gkkrf|A95`Jf |XZS?Q8+O){}YS*|8k zRIZx&&smlr2GwFE1E8PPnj=^OkYL8|nL!gHeKT0a-u%Qy7BMFMnpKRT;mXfPU1y!y zJ_(%x>C5&ET^$utG4eCfOXaK2Bql5OXxUuYiGA3Oz1ZyvveSIonf=56o|duAi)-O; z4J|WUmfDFqg2n4JBNPs)&u}2LAQXF?k=Lvim=gvawsk#u+qpst()3k5qW< xi2s8)4V)$FYWRQ@fOC%IxzXP+F# )Qgsz}bMYenT8{#o5KR|PQ9@K57Ns2<+G&2Vl|p!%J?C}a zx{#N>PoqMYP6-6C`^41TBo^yxy)jU)d=cZeEj WUcz!)yI?4Ks>4dySRN!u}Bd15mkNXb;J6VYL$h z3w`O>ULPx1G%gr2N&zJynC(|>>;V8tSBxAyorFOnyr1{r7ufX_pI=X1z1`dMYuM*) zIB9pj^i5y4co Orb$TOw@oJ~= z0n<>d^k^>4aQR0WtI@IvZ?TCj*O8pQo!79FW=`UG6MUsp@?@Pg|CsodEv|FCi9tgC z$Xdb&*E3~P-0k=rM kh3pcLZxpeE=y^A-m-o1SL`uz(yu;9Uj3mZO+II-fzj2j=WC>96+$&wLLp4{?s zWz3f?bI$zPbLY>SH6xU=Ftx(fskfM>Oh)y>%Ti*qUQJ3uYuc*|mY&R-bb?K!WUo%L zCACG Vd1NKd%lz;zH`9H7CfpaAWD@xD{sCt#C_Z&bFm9 zlwdwJndifgJD-f&ZK+9tUMrGtmVhJzb{Akf_>l(xAu0ZuM@lKGkrIGr?Ab?9XV)o2 z#&1AusDNqOjrZA!3#PYRXb^q} ~kzjywL?Bab2m3FMGQf_G$$ zJ`%}fk~J2Iq;M5EMrD;&UWsLvT5ic@mtKAeW|(4*NoJW^CIA*tC#`uCn>D$qW}9+4 zb>2s<*dn1on|KB1782$uflo=~nP)3fpxFv5t!$x^p8{ zB!NVhl2TAc3_*JT5CQ-oFsz~y9x4T%oq~FjgszlwD^UGS z%BH9S*&>j$DqZ9eNp4z85t|a^x!;;exT?`ahkgoY!U!*ntHKR4j4s3uNBnTb6kj}X z#u9IAvBn*9EGU}ynn`lWCZCLQ$||qSa?38i40FtJK?a& e^aTaBaIT8kVu5Opho=H8AQ9%K?ycwIH* zY3ptI O??Y7?zGn!)IdQ|UF zWrY-1L9s+UM?D?o6-(V3kC3+~dFwnx(6 o(?~}HME =FbLop)C+dJQMNG=yqgHXjXHa%Os~b%Zbi&sxzGIG-o^0`ObB^ zbDrq5qcHD@&wT20pZx6S9qm|?0XDFH0<@n&3yRR72-J8ebk{)@dXxKgFQEh--a}3J z6A}gw0OMO|MKOxO-l=H+B;3){$d+fZg{qW+4o&DuR!Y$VR&=H^E#ONZ`cV(I6rwJz z=|FwTP@uw;r$nXcPmdZ@qz=`nNp0# qM!>ptuxb74T?vcW z!X|dHift@oAM02#+Ow>bt*m7)i`mQu6HN-3r7dGwOVEDSv!Z>Ne5m%2(2}-&ej){N z2(((&%67D~Ep2RRi(A{)_O`msEpLCj+fw3Ev&1c~agU4K o~_e-m#B+4CEgRImkpF zvXP67 ?B_lMdeDC^w4e }W%K+S0BzwXbb$IXe2- z-0rrwzy03HuKCR4PBWRyjqY=+o80R*H@n~M?s%sg-t(4s$e0Z7eCvDP{0=K~5xr Ge6;tub7#QnZ^!1Mj@gb#e-2XFYq13d0_Z@l9l4|%g#`ld1G`O0&S z`JHF} y(|q)+SAFMCe_~-re)hDlz1)*c^{MMV_q^Y| z?|TpY-wQwZ%x1jpkB|K1e_PycZ~oey-}dKAKl;>vJM^tTee75N`lM~M^1l!M@JIUJ zf-nE!&98X$BYyqrZ~yt xgm?27e@TdhOXz+| z*n~_-e^Ka!QV4}ph+ZmKgjuMCTL?pwCp|X-KwmgNU`U2zXof%$hA4%GWw?fC7(i_Z zhi@o{Vi<>XIEQL@hvrj X2#AA-h-@f`idcw==!T8Rh=&-7 zhDeEyxQCTEiI%vCk0^ 4!4iI512nMjJGXo{B@ik*mxrFdzw$Azy5i?JC0JGh5} zwP=F3Xp6asi@T_cy_kE(CyT)-jKfGK%-4g*xPv~ZjL7(d&A5!o$c)eEjM3;OK}d|( zh>h8JCFDniPw0)^2#!`*h2!{*;#iL47>-qFf7-~7?dXnz!GEW?iK{4&qDYVTIFI>g zkNT*J{P>CZxQ_wZj{^CR{+NmdNstGrkgRBs44IG)Igk;FkP^9&^+=HrIguGzkpOv- z7O96UW@qmxk|Rlyb-ls*ZRxn+$uiIhp%jz@ToO_`2PX^u}Rl~GBR=vb9dX_e parV`Z%o-FQL;q|x}bPP zM2FR&3JReUS~$3Ao3%Nc7pkEd`h*XPp?+o^SZJUlN}}ENn_f{qC|W=%N{1@iKrE_; zE^0h5s)sUaqb-V~F`A<_x}!8&KHb@z*9oN2S)JTjq(hpWL8_fdYNSGXq)$4A@$->D z#iUh=k@7>BC90)cN@ WDyEBNbY;3jl*y%Q%BD@$b*SW@fCwjp$e(rk zpLQCj0eYu Wck1DAgYM~AX1Q`+l zL69M&v8j|gXu4Ubp(?8CC0{SPqNi%AsXC*mx~i&rKMe%`tF2lZ7cBqrCd7uG*u(TCBt>tj3zG$m*-g+N{hvtg;%c&nm6QTCK}^t<*ZL(Yme9 z%B|Mgt DGRYOl#vp0#*1`-)5by02sk zuxKi<0ZXu)5d?y;2+NSL39AT#5CnnHsROG+YI?5~Yq9-AWq*n -wWmDwZ0{r+S*FD7&&L>oGx~1k1n(!@vy7zzmA82so>*!o#u+26rNQu|X@e_k^Gh z%Ak#Uv`YdRO~bDd;IB#Gv`6E#e&eX%l(cJ8wO5<}wMNUe5?Y~^fj3 B&c{>%l?E0?SI=QGzxx6~M zr|Y`y8n3aNy00s)wJWc-E4!1o{!7D-P=cA8hnEEMoMEv66 E5Qxy zvK4%T2&=pq%)H3E3^uE #5IFAQF;rKma&Hti+Yd#F1)EL7)gV8@L@DxKjMLRm``H z0Jy?1xS85kP7E}aqrziM#<5eXzdO9Rd#sW(uWj5B2%N37ni1mi5p)bGKEX)=oW^LZ zyV#qoiLwzLQN6@#J{eIGtxL#$9K34W$BFF7jJ(Kv9Ld-F$datcmkg{>tihYS!5O>= z!jQAj`%st+$%>4nAz8+$tjaEvuffOvwA!XLZp0oYVjI4}Q9#_jQ?wAatYfphzQ3Hy zCYY%SE5#igzwk@Ndz-LS+_&`muo26WC%nqjOwDJaG!txrS)|9c3dgwOhzfGZFToIj zY!IAukUdMMbSMzhVq1J-$ckja*xa)7EYCh+uAGd|oy@$;K(mXGvx~5^^gI-TTFnJ* z&{k5kh^x?bTeS$Brj!9VG&~s*Exw1VR|4@f3epN!1H?9y07!5i+9b%OQPD}D1;Mfz zN-{MxEHv}s(O82V3T!ps;=);j83hbBS92bN#2h<49!>Kgo*_A#Ks5 (19)3@R&&zMaq_}tZW>*BAmII3&+-L z$fK(*yP_zWR41i!E?prJ!ICVK1gwUP0He}PE;=HA@)452Cpx?l#={V{pgp7D*|2KJ zAF(RSkpvQ9+SqbHmYXN^!VsWq+LkgU+Oojj;ws$oEfRtp1F;`nG20~3+$LeUn_w;^ z(JqHg$)#M$*^SuR?cLoC-rOzTX^g@8oX_Xo$)T*N+3UuWyvJA?7K1I{^Sv10`+=_< zM-{C`zHB16e9I1U8RB98Dvq)c^D!dR^d|(f%SIF+;-TP^bQ#D2H)Oy~4N(~ZV&Kxm z)Bl}CIwS$3U>l@x+}1JS#K8^<(czRq;1sUlH%#CR;VMLf9uOiC ySvMU~8#17*=2h$OzVhf#=DdUp4j`A#We#Zu( z2?9|I-hmOy?J)TwE1Ekf!~(joT@qdKDntztgJKKC;@k|eJ(qM765{3wFcBe=+S|er z+7jsD;pn?E>F`Yd&lKG1@w^j3P{rs?>*l?@3cIuaGl|bA5HyYItGzl4uIw`|(QjiQAI(vI(jt~y;8(*Q9!>9{QRA6G5;1%tTJY7{k~Ju< z>{zo2LA=CZEb)_SUICB<#LNtJ?ZI_@#T}2=e9O!otOWOKw@nDD!H)7Nj}~V<-i_?t ziVfzoYPpupyPz$G)`Hxip4kp{8WJKsxV^5D{yx4s$I&Y(#KPv9J`-}T&3oPo9HHFz zp}CJztn1AG+N6;45aH|#46BtQ$Y#S3(Q_IC!K1E1&N`3U#`EuGq4S+I9sy-j+x^~i z@ABbI_wHTyEsytmkKH*61W8cqfp6 6XD+O;c!DA)ASk)??VCd8nIDV$x&CJk?!J7?W%(6 ?Y02el5n9EfeZmG+{kew!&a@Na7>USWI>bzlW1I+ zq$0sqwMZo)iBX|P02o{0WQee10+k;*CKO0CAuEELG@3lwYST!D3=#aKD%2{^s#veG z eU%!C?4;EaQa9=?} zIOe6wnC@N3aRcyNxw7MB%$YTB=G@uyXV9TVk0xE(^l8+oRj+2<+VyMLv1QMuUEB6; z+_`n{=H1)(Z{Wdk0|8LEBk_&Il^+MNJb82I&z(b`z8pFA=-96-m$K42^#sZhC=cKN ze0=kg5~^dDo*hU;r&~73-x8&~^j7U8Jl~X`AS*KZYeyp>$Y_U*?KaA9BJGZoqMcR} zEbzeO$OvhmkRa5M6s44l2tlA)p^2&R3>-s3_Yi<^q=kTxK*N(@gpibyHhL*TfeaM! zy!Rk{?xK+HgU%=ALXtu};s$~cM;s;E?xiJL(S*GQ+e7h6=GN2FJu1JmGD|ME#PUlr zt2EQgGrLq%Ofbhxlg%>Glyl86>vVI@>Vi;&nPvE5q|d$p<&&>L10}T2WeP2Hk!1pa z^G!S3lr&B{fhdV3;WE{9Q%*be^ixnn6?IfnOEvXWR8v)z(@Qy;EULvwiWOG>sbsB{ zRsa}-Ro7W%<+UWJY_-+WVWR?~yIXw~R#%&TRW<>nEK8ujgrqo du_Jcb~`oWzLUGbx$CC;ZoB73LgVuC#v8r=jQ!3VKEaF2 zPrc?AoDQP_l`{}Q?F8B)?*}8)?n4jlVFd^t|90p>$O~*`3!DBXZ$ K zpg8Z*^5+ G=d z&7RR^v`4i2?Gs&wkzp9^TYB`Vue;T^+jswc_~Vy +pz2eOn}X0%u4;x<`VvgCr6TSEP0v z2|Y>5Pv0yQy67y3kjH|MgdVpXQrwV0&3O?SyaPCb4Cpznum$P>>7E4G@;sZUMLQy} z5hR2MC;=K$D 0Qg6E&4JG{H?l8+33GNgNt{T?gGo>>3~||_k##D!%=L^ilD8!1 zIL#?ebV4$n C*-m`QbCdxH0`?65CB8!i)KCLm)G`tf1nT&1 zQu<_QJx6(|>*!IU6QyWHEqYOmW>llFVb|7_X0(s?%%eWr7zhn$uVYC|q$z6_R$%p! zAufbkPyr)`B4jS7FeWb!nTpD6Vy_BLr6RW2#D031N`}$uLadOLfn*YakA<{WMzR$` zf;BCHXflKlEQttjsIZdcNTnef*h;c>A&D)-fwt0#D?g$W+L2XZXHBX}rFvJSfi$lx zP1;_$*4L2+wrhXYt6%{;SiBmxu!!~9Uc~s=F$!Z5Ra4s4?CRIVGS;q_0^3GC`&rP2 zR <8t@)I2iC<(bQ=@uptw>$qNWJBPD zQY tSVy#qC&?#rUpjk3V6|8Q8S7(h0Qb+;T zpGe|{BheMO{zui90zd-&xzKNE1q7m8h+tXe3AJp|*_ QQ)#^qUaL$ZKv=)0T4Nc^69QJE`fJ5_m|a=O*b& zgPN74PIaX|Eo$mSKnfZ=kClK0&Mft W_P>Y{cd>2d$g?z zv|{ 5SkUUU |3bcH42FDzpzOj6h(v?;s^a0&dC% Sx;o^DlNUA|w^I@Z13b+CV3>|rPS z*x{SKLj8$R1zr32#$9!@m)%m9IeOjges{d*UGJ>X-=5d}cQkLTwe6}*$EZH|)*=wj zXHH`j8~^72Jzny7p?p^!PsPbw9?)^QeB?L3c))`m@}d8H=}CWjHfFvt3)xGe>Kt>! z(0pjH>L2YT&a$0X*5|tC`K^LkG1E+D@53j4@r{3c(n8vy4ZSDx|Jd|&@vXJdFMJZH zkI3dPU;EjAbw0OGDerSX{NqReH~B+te(^hB{oh}I`q}?}_s1Xo^KXA3oxL4BDeBt- zE$BhPBcTH`usO*UB+(9qk{tt-n*&_Hxf2rPdq4<`Kna{c3R4$*OF5JCxbPr6juAYK z=|B)9mfXw0lH0wN+c*tWxe`Rd6-=6(V?hkOKoyKZ7@R>HBtaTHxf_&09NfVg?7@t? zxTRSFmn#g(syQKCxFEE-B+QzXKmrPkLMfa=Dy+h?K`pL}J1vyEE$l)r{6a4bLogge zF)TweJVWQ %#ZqiVRAj|h)I3>SJ+1(Prtu5dgDgC2L>FW^bx{KUQiMqe#zR~LW84d3JjP=5 zFJ(-|ML@=4Y{qDO#$wzHV`Ro*G{$Va#zR~JN8GbY3`cPsM{+d2N2?M0qqg!}M^&@7 zc4S9ogU9 eDNd5DZ{Tl|g8>o;>yN?`6Kru;=6eyG&D8AsuTPjDGj7gcC z$qA!3ztce= *tTuZiWOSjCZq%%XgL_@lqOS`N~ zyu3@j%uBx9OZd{0i9|cMGau^VpCAwf$pW|V2~5TG9>(OJ0As_&jLgTBOvjAO>`^;m zaLKpqOwasG(0rf16Es* &!%$0tU z$iKkKz7Pi4 =~r*$CkaP3yc)?95J0Q9k*rKktOU zdZa(_Y&G%!?9TB#PxDOA@?6jFRL}NgPxORO_l(c?Y)^x%8g5%j^O?getQ(9Jgh3c6 zaSKUt>qu|ozmGIf1x-)}MNkLr6G6xh?VL~wtxyZ)C<}~AAB0K{<;kfmN)7|jryS7_ zMM|kW(G4Y06cy1D)le2)Q4>wksr1kz3nTJ*nj@S&h6@Db6pR~XP9SwoA%(0y`Nj)9 zQY1}MCCv;h^vk|{QYVd4D4kL%tx_tzQY(E!M1jL)ATaHyL&52 1dLsziN{;4)*~a}98ydTQs#6$*psXzsLnbKRZ$()Nj%5SVn~5R)q|u*e^k}` zTu4?;)mUBCgmhI{t<_n5Ra@QFT)ov+?NwgIRbl;AVI2?a37>=Y0v|W z)&+IY1ASI%omOduRz88lVW5(RAyse %lo1{^yJXdo~S9D!hb!}I6eOGslS9qOQ zd97D^y;pn9SA5-9eeG9%J=gK5N{|$UJgYsfWVlDoRE5>lg&opG2!cWzSBafiiWR!J z#8Qm4QjN`6j@?*~?O2fgSbhRi>Cr L}lEj_}tyrA@ z%~_pQv~t}|G}_ZfWz $C~&DyBd zTCCk#ukBi}y;`v)TC#20vZdOwHCwes+q1RWw&mKiW!tq)+MeRG-n%#+b-jjVSiap` zvXm^G*jd3HT*Cb$lLaP26FX)y1V%Vtri3g !TeyAO z0Y>1kRbT=>U;|Fz2VUR^ZeR$OTMI7W3wGcPu3!xAU=8+Q4*p;f4q+0O;0> 4m+B0$>`hVH?gAQ#B{g-C@xE++f|@9_Ha64&5R4VZ{aFA{OE!CgLSF z;>- iBy zo@HJ+Zr(YrV>-TLJI-S~-eW!PV?O@l<7FBb7Rw*S#X*MQ!a&P6USvl9Ze-NB*z=9# z^qpi$u4GESWJ{K0AvjL<&7O&LLu%jzZs3H*3?EJiWo~HGHBDW U@l={E@lQk<_SjT6E@~#ZsuiH=3i#!XLjajhUQ?l zW@5(XPQ W@sjM=mc|=`z@4-#MVJ^hkwZEcJL>E z0-tio=zp*WYB*zw{K(mLy&GKyB|ztY;1jk>V~a) r!p?=rr4Wk!cgm)I_?r|EW25ESXxk3(7cNS-6fSRdZ*kuR=gtBR`{%YLy zUQ8bAOeSlyE^D+tYqe&rSng!S9EM3?>5Mi9%UnZJfNFbyNcpW_EyW&jzK4;<; 5;}BYA6MahH7` m}H4 zN^rd;poYKZhM1<^J`o1#&TtK1Qk*7g4=?Hu4{;D5aS< UX~Ddw2&y z=?i5r2XX%B UCaVF-+mz6V#}@or#*s)lEnqlEqDhDosAMc8mCkMaqH z cm*vI`NhyDHNVn506K%_`Y|Jig zO270 0u}zxHbnePjg1;^KwYtc`tKnu!XtSYuLqBM!9y1uXsxAa1_t@6xVo;-*}Jj zc#!{ik)M?n@7t$tX=*TsbS?$)=?40C2TC}3@fm48|A9T<<_4Aq?nF6uU{B Lb2v@rq^<(Z+fVIda3_9j8ufdc58nc^M7D&PRR3%&geAf_pI!b zMc@KX$dCCxbg)O1R> JO$7W@ zM|Dsib;S?-#XtPUPkhFYe8-o3$e(=6N7^1dD57WBMPO-WF!Fb{^Ll6MMPPHQ9u#WW zagfe;kfsJokgT?U2TmZ2W{2u-=+SR}a_a1R-tT>)qwaOT?%+>%bPsoRKmOt`_vAl! z;Ya@FU;g1Ye(hLqfP#0}g>RNtc1Ea%basbn|0soww(m7>b3R$$Tli~tD2HyC1~XrK zMrr$d;06NilXoEVdyw^vCIwc8X=q&pfDi^?Ai;tL4 |W vqw- zd;g}Tt>*5ZyK;Nqaay*F?!SM`m<{S?*BvKClN2pdwD%viWy6-W`**KXTt#;Ob(_Sk zFlD)MPn%9X_$BMsu3y8BEqgZY+O}`w|IV#@H}BpdWhMatL^$!`#)~6At~@#O<<6T! zcb)*q^y<{FThIP{d-U$yzk3f4e!Ted b+ZV81XA+OFQ6INN@3g( zh~P3y-1Cb+5H4a)VfRe(;W8=;W+Q<)7Rcj=g7_AskV6t#q>)D=nWU0SGTG#kG3hkW zObFa0B>+^;WF?jaO s6jmNv~ it zJ1<={(oHM w~HxSclJms_6sGD-x( zujikG9=hnGlU};%r&|OiS*vT6#F{lxM^o(8$qsu=ZL*%bS-Wp#Deu2e3cT>T6F b^2xIfL=wX&zOK5&YRmQ_ifLBLw+ap}m|Ep%_K!W ihHGzyJROFn|IaU_*c-w*K(vJr%Q#a1daen<>YE4ZIix5oo~# zUND0g++YGawn6ns|L}t%)F25*Xu=Yr@PsO~kB$n|LIgq2g~JGuxV%RoySxK_YoVb% z^fru1$cTRbcn2laR}BHp?;h1s5hLQJBFeb~hj(is6 5kilD%l{zQ|o2~JXy1HF(1er-gg3^&u}OTtjl{c0%)YDi)e-doEeB*6*1uw@yEnFJ?dNDW0$ViDyiM=7ZBm`V8ZTgxEk z-%jJqz^uhG|Lmf~Bpx@t`z<2~@Dd|A%W2MYqBEW9Y|?Q2wY99lvuZ8N7z3{(90=mm zI3ax4J59C)QnaESj0`A2CBd8|4AeOx>{>jp<~6JVECB)y&etHCvztAXYf>0!J6ItF zj5f5N1(Sk6kAu*5R4}6 uPH`Gjn%;D$2|J*1 z{!_WNr6os5U25g5g)APaO{qtnD&}s4Ii${wsaK_H=8y`cEUq)GVjU}4%WBrMIz)BL zGhUi_GCQ2S)poKYBvv-cidFzLuXx3)1b70_Ju+{tNC5&Pr9eC~kYWtF0|F@kDw97g z4@(;*|3#rDD%hOl5wMpHEN3_C+0KGCE5G_CX=_>9)0#H5-&BMm(CXUP!Zx QZRj@kq24hUH*pGnm)oMu()oCCEu7aNFi=p%pKM z?sdD%-S2ugyzU7=5E5iX9|;J(W^18(=hmb1!k4}AeXo4$Tc7|5MhW_(Er0v#-~R$Q zz^) r$0#mL8YYQr*Kah5V0oEZaIlR-8xDG#hlAtRZ{2u|{j z|CRh<5q}s60T4v=wujm)t2WD6o}M<_5(NE`X`BKcGnvb5<}(M_Upfscn|Uf634D~e z`h4J=@A<%q-N&~kldeGn2BoG+KoVQ 9v^xNGY z_qOo^03|@?GEdzqySvI&t-8D2@SgX(>wPw45vXBk-Z#Jd?eBksF(y9_ZSfWi{}y56 z7%SPO>`)rZiYkplj~kw>Eg0DjQpA-ec?4)9O-vBHK61kdB}HFhH-=VJe6OXpNreY` z*G=>_##17!M-ggqTR0LZ8*L;bsof=)?^UzZSvW^YfrO%re4x+8Ngh$&aiC}d=%k=F zhj*@Yh)I}B0*yk2Q(o9uBJ{32kF%8k5L}KEbPJf3I9yx73XIE~;Gdnl-0M#FtOP<4 zTh=n)_wIMobeS2#7=#($1@OZoKJkiQ{Jem}YVhU<367QzZ|9?D=tOw9!f7dtfq;OG z3Um{Q4Jh0n2+)g*UZAbmg6Z{`90^RcIAjp0BlCFI a>5pp8@*z=7W4WdEEZ#p--Ig<8}0o zEGcyZ>RU&iUb)BtJ;)mieB>m7<5NffCW 7-I!}-pQ z)kGd`0hIs%iRD~P
pEXv|Rv{OuQTe*>&wgnA6 zd0w4m+CKSW0%#1l0m0>kOh7f8AFiHpNZ0i(8%%+ov9(_R4aZ*vO>)81# +)?W1KG4e8m86l|BxoRk(A2kgn8(aav)0l>6fNfIz2|0!IbE{Yp2dL&1NTS#VG zM}p)?isUWo;@Fgp4y~Jc#oJ5Lo4nZ@OwOcMVPJZ#8|Td8PV!_=`sCuNmEEz9!O2xl zq~PozTvseyQ7Ga-SfhgB91yM;DO{YHq)EvMVh*ASBVpx4#t{_CpIhw->@?C(P~Tid zVow0n$^ifwyd9MJ#Lf*?8cK;DexXjZ+)cDx3bsNm;8 TqcYMjIoR$2<>-A!g?Qs!kYg##slFa+KydS)u7VwY*tm;GdEn&xSu=4{#40qV!( z%}3?A$K`DYG8)J1bzTDG)fOZ{qB-0BNyl+mBXPwZ|8;=gLN*6gwt^%)-ghLIK@nGV z4Tn4?n{ZI2iV;L}nT#z8+xUgYQxeDhA !7UmPugbcdX|BG>nuqh g0e zXeRdQk?|>r3MwW7Y9h6uD3%G9j238qW}`AHGYEnZm{A}WgqU&YrDAHPYHGZw*+~*3 zO12u=rDHGJSp$tKY`#Ylo{V_bX7PO^`Uw;}Sl4d7CwByAaWrG1EvCf<)EI1Ja0wLc zMP$!lBdeidJItz>1}i}=t4qm*0Lr7!1mRu@)R+cTclcl{XaYV7YqK(I%*CI#1}p0& zK-7_fvoRw (!_p+g#$?38 $R%!ZHEMuVe-jibm z4L>d>WzAVLPEB$t*POX6H9Amr+RQ#O-1*tAt`%FY1#8UI;{
yT$V@5Acgr3aQr*Vt{I#TlL{wu+jWEu1Fr}}a(3+yi!tS(=PLK#OA zBtm_`n^kEJ4Bd@0- R0#Si+H+%Cpb8JxVZB&pf?HFZGAf^6B z#bg=n9I2nrIiY63;TF2x9Zo9`g0PyloFmQAUbO;Nx}6g0AaXud61*JC^ J qQPhXbvkmBN4aZ#rh;F2a6gY!}|byM@?YHsg* zxTbqp?t0*>>M?65&+&1fpZzVLv&CPyCgbLLYZVTs>!x4)IVV{YRQ# JFc-(61b!$M`=d@a!m*zG7Ib4aU>q+f1Vy7|!g!LbeUnu`! zN5!A-)^WQ^SX6iKXM1*Na~F9fz`{aC`l9awzK|6isA}JrRXsDlDS{FR0!TUaZR2)s zf1rm#@uBv1|0w>pD3 C& zci6GC66T*jYh+JQ_lqH^-1clh|L7yK+(Dm;gNZj>Qn-W%_l1X;g=e^lPPm3wIEQ2S zha0zu1NVlHxQEA>*d#$92*FTy<`o-tFp(mQYjNSJAtdQ`j_df2`&Xxm_IkjXu^Ka@ zJN=KwAcbAFV*1`GmF?vbl9rVY%)h^l&U5|rQ5>xfL2gH$_l%#n8_CsEpSVw&ta z8zs@G|E5{nK$v-`YG Qfs|2)I8Az=Q@Y0Tc&2Omru$dO`ZPJKGgZ71P?P$n7uZpZ 0tOu5q$qu~mxuoa%uIqZQ=lXQ;I c6)so?6-6KxQlzabGxa98qYk`b`%%1yZgJt zds)dZh?{tclX!;@#nEQP)!uuEd$<($dkIJQQviI7{ky4vBEaK&3j+L-c?FST*pp4T z|D3GO6W9B~+xx+vIK2ma$7_7XbNt6+{K)%z$eaAek2t(sW}*{BD;nNG1Y#hH8KuU1 z&D;FV%ZnKIGBEGFDocRIc D> z1)T7`oA`ag&3fSL{oo6J;S>Jh8-C(DFyX7RE#Cd(Lw@Ar3sjrCcVq|DUcPo!QEar+?M6KhSvp`+q k 166Q;p9FrtS z0sv=DojZB<^!XELP@zMK7BzYlX;P(2nKpI$6lzqdQ>j+9dKGI{ty{Tv_4*ZTSg~Wt zZmn4p2!OO})wX5()@@w4bLG~hd)IDWynFTb<@?ufV8DX~7bbkzaAL%Z{}nf8{Md11 z$de^krhM6QX3U#4cjmm;roghJNtZT#8g**bt68^p{Tg;`*|TY*wkbg(0*AU2@>b}( zAaH}i1ri5f9QkhLy_f%P9{l<6=*6cWub!NFcIVombC>R&I{2L7$6FWu-TX}TF=P71 zDIWWF`Q7KEr+?pme)9PD>rc=BKmXzba6kdCI}knu>+6rf02?e2B_wRpt+om+yb!|- zHQbQH4n6!3#1KVHDy_5P!U--EPpnHtwpwiK#k69~DMc1-tP#f*b9C`W9ew0+M;Lnq z@<$ 5qPEX!0A z%`Mvm^UX2iT=Pse?W_~eH1l-RE(G2Rt;!Jv9hA^Q4LuamL=|0>Q4T{}4^s9bomA3F zDZSLvOflV5(@r`4)YDKw9aYp)Ngc? 7D8|pByd~<6Fk@3 zaMdmML3YJOmt1(wP1oIZYUO)eSblT}Wc<&{_V{}a%SWuBSlnr*%r=V)!Z z$<&@t^%>}&g$|nNp^YvY>7$iSn(3uC>Nw}9rJkDVs;$1d)|gw~+GVc2?i%c`#SWY7 zvCS?U?ZcqOn(emTejDz%HNGvkdhO=-ZiE|VxL=3+<~wh{0|y-M!u9@p;l%e=9Pz~+ zZyfT$8JGNV$|E-%K!VPqQ0~q>{~YwtMaQs2oAf-L&pqM16ZO?qmy`9>TZjF1I%l_C z_S{{+ea_xv-(7dwdH-Gb;Bf~Y`Qnp5Uis#kf8O`nqaVIWApCS|?a{U0p8M{-|Gue5 zn;ze3^35+F{qxmNpZ)dSZy$b=l868a@a?}J|NQlT|J&BH{ZAW!{}W&U2{=Fl77&34 z+*S7W*FXn85P}h$6}Jv&ISXQra23Sh hdIgQ TbEo8biK)96=CbDk5O=|oij z?%2*czSEuYgy%fvS )vtkV zCSV6EShw&Mv4lOWVp+;qmpZnug_Z1L4cpktKK8ParR-!a%UR5NR }W+>+Ru{q zw5APhYFWEl*CsZzum!DbQTtlR(pI&&ZLMx?8{6Cd*0;f(EpUe`+}iRMxs0tUUYXlm z=YsE=K$WggsXJZkRu{Y1)vg%J`CRXQ7rdck=TylXRr8h?z2{Z$JeM0@_r4dtHT!3F z>APL~))&9`)o*^mnbG+E7r+75R;q4g+}slPxN~9SGuPPQ&^TDBeo3x@cZ=WyQ@FRq z)o_9_JmC#r_`? ~#4VQbi)S2T8sFH)IZkYQ1>9pF z|5#NwrLF{$AcZ0y*~m#o@{)}#fr#;Uzfp$rl%-r{Dqn=CK-Th>xqPSy$1w>+e(;zf zOlBezdA(^)@0!)zW;QR2$6c25oaqdkt@2dKC;>u}A4Xr}SQ*e)4)mY}?M46A8PSPW zbXoM8ViN0^ur`T6#1!1w1xHrQj{Yn&FU?F(cUHEa-t?nG4Qf-58pkTGv8q!|YFCdK z)|!?zj9CroSkwB|vtD(saeeDu`#R2x7WS}-EtTl%^vD=_GD4P}?3XP2I7!fg6r!*Y zXcOexQqY2gtep@ke0wF={~n0AJ2GuTpS#fLR(HA|GCwjF8{YAjH&ed+#!T~7FiUi@ zuB4!eEl9yJT9Cx0^@0Fx1Dr1=8dd@%v28a${LK)T_&b9=Z;M|%-p9sik=0{lN%2Ms z|K37+d{gr8gq(>c56_;#U6F4Cydx?n`FDWuZ}R+^-RstQ&UtR#Lt`B1K_51OdHrh> zXS&mtRyu m z!pMHwf+nht1PO3G_fbc9UcNp1mrLPKMV`GRGA$R|3*6j)^0({TQe-JOed5`V`1ZBm zwZNMm{Ncyze0N%8a+^f)> ndx|BmgL5DJ~p?w(KzFR%*#E(-7N3Y$<1lMkjS5Ddf6sthljI8NCh2HQOD z{6gaQwt&)#jQ%QbASSQbL@oe m6y5;?`)#LyBiv8GV(h*S^z4nyBI!{GkS2XPNB*3Yt5@Y0I#>Yl0Lh7T{a z?Udp|Lf}FO-C_%daIrXT_9P_#NU{644;X(@7*Xc?Fwq!~k(9`go6Jxq((l>+Edl`X z@qA<22+<%SVDh4k^UQ