From fc3c866f1ae1a639b6a7d99f033d86dd49d91880 Mon Sep 17 00:00:00 2001 From: Anton Franzluebbers Date: Sat, 26 Aug 2023 00:58:26 -0400 Subject: [PATCH] add more docs --- .../assets/screenshots/scoped_registry.png | Bin 0 -> 50374 bytes Documentation/docs/client/concepts/rooms.md | 0 .../client/concepts/synchronizing-objects.md | 0 Documentation/docs/client/index.md | 25 ++++++++ Documentation/docs/client/quick-start.md | 1 + Documentation/docs/client/samples.md | 11 ++++ Documentation/docs/client/vel-voice.md | 1 + Documentation/docs/index.md | 56 +++++++++++++++--- Documentation/docs/server/index.md | 17 ++++++ Documentation/docs/server/self-host.md | 53 +++++++++++++++++ Documentation/mkdocs.yml | 55 +++++++++++------ Documentation/requirements.txt | 3 +- 12 files changed, 193 insertions(+), 29 deletions(-) create mode 100644 Documentation/docs/assets/screenshots/scoped_registry.png create mode 100644 Documentation/docs/client/concepts/rooms.md create mode 100644 Documentation/docs/client/concepts/synchronizing-objects.md create mode 100644 Documentation/docs/client/index.md create mode 100644 Documentation/docs/client/quick-start.md create mode 100644 Documentation/docs/client/samples.md create mode 100644 Documentation/docs/client/vel-voice.md create mode 100644 Documentation/docs/server/index.md create mode 100644 Documentation/docs/server/self-host.md diff --git a/Documentation/docs/assets/screenshots/scoped_registry.png b/Documentation/docs/assets/screenshots/scoped_registry.png new file mode 100644 index 0000000000000000000000000000000000000000..a0cd3ff6ddde72e321c222788c4b239eb77aaf73 GIT binary patch literal 50374 zcmZ^~cR1DmA3sd?K1RqsW^(MkH_2{rWRu7~_TJ-gj7nBSgjA9dj=c_t%%X$H9!WMK z>wfusf7f;YuIs+;Ke}8_$9ufS^Z8h>BoiZDDsmQbJUl!qz1v!M@$jx$;o;$Tk`jYY zS}2{Wzz=-iySf^9mBVc7;1@z?bwhPLyy|p{GkYTNJDK-w3tv1u>h7z5_*k#hWiX!rnLAxH<4tW55&0aG>E!c z)Wz&Or0uDN9*e)OdaUhdDvsK!+^7`!cZ%~%O>_%1J~B8m7#TcL83}*vNgckeJooYa zy}JADZQ&7Q8l=!TNU=-K{J)Jsfo^i43P_f9z*N=vUH#I>WZ=IvkY9ENMBC#EBmN1V z?R3)=4Gh2P`evZze!f5x`E-)*>hEvjx!n4Eon@f6+Pn2{dS>^?hjZIwr*$Xy;&N5k z;r?aUx4CoWv%p!&cY^dj^H{K1=%}8f?$Pf`2aao#OZ>fIuFhrQv#K#N& zygRWn+`k1>KcbC}LoQ~j1|{fzg1^=(nhF^h;zMiQ08jMJ|0M)`cIP@Jfk0tc&ADpC z+3`;M<@w0PNc>W|s>)}#2@&b6f(e^YVJn}0zIWAgwZjS#$)-d~>0 z#hAE+2PGtC|f9@>&_d}@#Q-42nNw2K{&)ED6a14nA=()RDSP_3GH*!khayLaCS za36Fz!=?VzPkZVkMJ}9K_9ZOPuQjq4Z+)nsOQ7N8xY$jPjN5L%RFU%dAtn7bg+}#k z6vKFDzl%cj^U8BJ|8Z0Mla=g-%gg=3%Q)G&FiEBTK}p8OLYm04CC={ABF*k!U*8Bf zXggUTdae&qo`4}JD?20pDSI^Om_GXcfsp0nt(nG!YAgqZ>gAcQYtkTZ18e%5kaWc@ zwAkapoSnJLi;2~2Iv+uDXk0l}Ma$lozel#0|FX}AGW#$G*Bsr z{xujHdL`O+%xx8Ue)xdS(z^qnBu=>2tA1GZGK|$K=z%P$P=ntJcYQuNk@>gZyV>n$d{%y6 zwPki9DT{^Z3&ZyG;8k|&K})H!U52th85I0}*^OC{pzfj=g}XXQIN5M;$JEi+>akTz zX^IK4)CxEMG;LI_;Ka*#X4!fb1O71oJ6NYz2;6GHRQK*H`2W5?OW^h4V?DXyODQr- zuhu%lbo=nLuD}^YVp4Ou%D+A>Ivl6Km`cX9VOs614y(tbfq(Lj)tWCh>n3dUXXM;{ zv#kTF_vie^47(rad6PzQ+b|cQI0IhfZ=^QNrUk9EO~3fYZK9IDVs$9bnelZujjGaT&z}k{7ymZ+JB*Ze zwdi3mR#XX3np~GvB>E<;sAdAC-jHBkqJOeupgAvB$;HV?`&?e+AR^ zEI+%L1}(%h{fX@RJhB{+v9w#gulhb{?Nwm?2CmA!n=g%Bi1iu;;tt+i+v%2DwJ&Kk zEssu)kKmT-&mo0-$W_=rbBkIWz%9#rNJ_TRH6Re z!Q?O3pto>VzJ|5`?7rtJhX%MB<$ibh@>4#s(-KtBARA3d|4{Z}-?5ruM4 z#$drpao9D7m*?oJsd}nARC!ZzQ`0KIKSE65(~uxNk>)=V)6@tDfmeRdEo#rsYBwbt zeCJqd)K_t`lB(sb|~C z(xoRI$1q_RsS|Z|jHP5T7c0`30RIUoKpdCAl zhO0*va`Eba+hdYj-*9VG1?w=7q|G$&s92*jlR*$k15>3G(aLwnUx23#%dfGa&Nccl zG2Fy%jIE~*-rM5J3E}q2ds{`6Zwn(rf>tuk-KV|~j#b;jygPOm(pt8fHeehSHJi02 zXW(rvepWk9`E0eFdQPup7^^%He}wV9n%%?b?Y7h56dB61LYknVU-3B}cDV*m_w2{Z zO`i}f=k~U^KY`w2utM@^F}2d^;p3xQn4_KyYNjY1&&SGqyw!3v8~S)?j|*Xya&W*? zAe6A;&FWy^r4TnwBgEp_7&sR`0rP63x-Z7vL$Fp|P^zDkkVgYuFQ)j>;AK0@BRQ=C zZTx9)+E0va1N9>B5Q1VdgDEg{fW7M$eQ?HsW@r>gBIrRq|4s1u1G5*igE3shju*P3 zSs(3G^UTo1DUXCo#$zJjpkeM@B`_=YDfeSi6gk2KBLt0^KR=qInE-1u=;CCpTVJ&G zg?JQ|(BM5|s&rn<92BTB3$aLiEKW%C&4bRXqZj8AvySiK@>&dv(Od4P}NOM z0Scb=Wcblf;XXF|)oHndQB7eYqR#b_61!k7b7q`;%x`(w#3i0*ET{YdsMmfqKO9!L zNi6EaHGG`q5Y4lUVS)!L!O6fZbv-xcJ`#K!i^vrQ<$rJ14LuM zbnzaT_hPy6_lw^#h=n$uj<9bfdhg!((_q+Qo~K=#wXi$gY@k`{O_hu`hw-AX9%(UZ z{{3hv{MLLzckAC#O&TXk^d}1MG2xb?T=V7J} z{wsuX^&6u$F<12-Qk)~@QKRmeyZT>?)>?TMuTN_Ffs2IW#1rY3@<9&(14E6svNe=X zJ!bcP72xQr+t(2rcNt)BgotEtXakghuh9C;FpAoRH}P$4Ay0NOq}VL_0qTJ7Mf-Dr zV_wj;WCY3XrrpWwmOL~EU*~wQelt7?Qv70pJ+rbVjW8QhjEm~G$r6TY33e+c2R@)9 z6M<@dOjtY+C8x5G_WBjSd1D14CL3Y&uIcBUHe|f$gDR0pP=B8=>6{a~UkYW2hFZoL*jqzI% zXS=#Wl=`#6NnnKDMX}NjfLqc;9&5U~-XI*(2jc_Q1_SNkT?Vi}0-phXz?Omta z?S(8tD#DialtL9%G3Tm*TUMu*tW)l_Lw7IZuS)y?x*#cF^GAGXw#aGOV#Mi=rt%uN z3;n2m_05EU|ht3oyjO`rE?#E5LhSR9lZCTABb_*G;XM!zaKh zHT&UHTZn6g51Zepx;zUCmL?eoAnf}A%}N{ zhG;6urdcE(8+@dW<@ zr|a0yhl;)Ky?Nj~W++QV#VR9pL`1}<3R=W?{{M)`{;*=+4j$|Zt&vkO!bpWaetvGD zQU5bwx~iAOE$#|%RorHXDpBvf^%=C3yi8L2LjZ*0{%%fBcU)BYg`e$Waiaj0TsC}!8AYsIa81iif0}*QhRrIncl~h| z*h-sh~LQo~6TU4WKe;RO@tqrw~O~T?`f|Ps47Y869PN0mt~* zSs>|bbcOPULI6opqGx!cn=S)A1Tf`g&wITL{sn;DYjlWY*>GYGUM}O*ihrth7Ez)v z<GkE!#uDjA$fZW!bbd?{3L?UCK+Wy@-o4Y(OWZwXr!ELDmb$cm9 zoJRa`#&^VG3GxYbQyJ`!k3~x_xxPW}BTeFH*ADvy3MYfKC!TpoetI%ih6_>!Bx+?X z`exYScXPv(O;A}EPSy%V3y%QqHrMmsowobwd%OvWWaH5wQ=dn8km6|xxAS?bRZ?ga z%yq;&QDVOw%I|a#cvx%+$6cT3?dL`RJKE;__jl7RhLQGcv%zWP8a8aFlO!>kfFwcr zXlAT_pl;b_MFCs&=b0|Y4Pr`WyMbLxpHyrrtMgI%r4jYSQzsHCmPd=(YjLMhbMLsn zF2tZV5`U?=w;z0aUfPJW^ir;6>*Xaf-#e3|9!@`%RA~noeA25U;<#$z#%hFSi)5;! zQI|Yt$giTmp*znoy0k~0O*yRv%ApCJu_V*BDh$V|C-AP!k;JLNT*-U-S)HvT;hkQq zM?~#{NA2B*Jx(Lydp7e*7Ks~O;jlQ!cdD2VuSK+3VsIZVE#C~Gs5|GyRi!lGh%$p* zhs9+ugEXq=2N^?4@$wO8LB7*aF&D^_a(0_P4YMI1$mrvSLG7gj)aelw(z0(hbh~x@ zo0FaW8&eHYloe-SXB$JjKxJ0w(8#mT;0{Qb5+u6vL`#h-lR zoff64;@p__YWKj&rltBnp_Er;$rG-hTnyZ}08Or**bPv%fGsP6Uhw8nH+S2h1tNOA z>(;t)l+*M7=*MD7wUG!8N&xIqhnm4QGaRjHDRdN9^Oh%lvi9PhQFU*20)4c$o!kUD zLM@h6Q!@mR(;WD6ghrLO2dy1xuKTE6tuibcFkj1H6ZyqIQNdbU;F%SR}M(4nc#1T z&DqO)<=0s2Vxq7OUq@@GFtD}GYK$j0EaT6}NHwz^!l&)xpWCVa8E2~W+U*L~#Ye|G z3;cKR-Lf<_e;-Y-2hP~H)8gnHHt~dv!!E?(#y|tGzvL0K4c(MJ_qQtQ-Zb-I=?{pKT390-!I$j>?Pur8U_3z})(}k>aM5Vms)lBW2Ly zrPJ|GJf4pu8XVJ=aSmcfQ_h@u9I@JIp#+u9;P$xto^hbPw0_~_Tl+4JqfnY2h8ycRJ@D+I-46b}`CZE7#2A0ln+MV{~dG@{(#|3tFX zm~YO1t0^t_b|5UR&=IO;cM@gNc}R#ZoypX7XG&FI%$cNGtByhlP^1&_8VLu`JM?su z_iuMd>&1NEeyT}beTfiXl1R%HvyVx_sa~Fpth7rX(Hu#lGfAq*@lONsF}k`<98GZR znZ=+1;f5R}alN6J;rtsu^BL=O|G}w<)6Gqb1xJBb%`_rSzql3KfdJHUcIM6V@5KJA zVOPCXoFlF8k$2b}*ZeQO!6-gll6BI>X(JyKn(+eKt4lkrx7aS-#oW-mzno$GW1Gg( zqb~D2bvHEnR470Z459x$vCjAhF?OD9F^DJP=)4rTuubt5oNYwW$P!eus1fusNm4Q5 zSQ_rg!^zKtIAob@dp&nwclJGsUf|Ooq%tFF@WjVgc&7^rz-Y+S9P%CV3Z;`q;p1657Lh=stU9FsPBBT z8=AC~uFhch-L8ZCM(i*7E%ef#NW!Trjq6fipoelP_8j&_R8<)CwkLXl zxYlOgwZm}Dwi8K->rR#m_%k_YVM&Tx)ec?Fbxr^}!gO1Gxb=)K`qsDBar~l8%B&SQ zl5f8^KYY*OvFeFQ=BC|GG+@+2-=e1D(R?hIXmh8wtI>(Rxe6yu6VOR=>^$$PKVzf7 z&!Xl;26t2SwW^U^ON2|olKfb>h$&DIs;0mQBqGpW#{L-{R=dH*}K^+bP`CA(KIHM1`v?iRve2~ooQYBH+prMCqxQ2_(5kftaE;eb&Y`_+n=&m&`1@atJ%t+T(`~E zZ7;Tx5y#wXPI+f{D@kn@2?^<2tfzEX-`B9?dVZ*B<}rN8B)~C-2wp?zkw#)l zYzZ97p0~35cG4HpF=;o^sqk0nTZOEEzP*XEP@HAWrnQJoSA z@b32s@stn*(lM?C>){mhlwhW;WBXnv<_q91q{+{ZKXbeEjU@@c-W}kl3wkEd!#KJx zW?M}ZW<54}U)x>%L49|V)US9tOOvnugIeNge6};fTKPt7iV3IENzJ?7sXf)!Na8rM z*yc*MN-CUD!w;xYb-hA0&~OS-!pJpz?xCdur0$!dKqVF7gwOO59vNFUGaIB`a(F6C z$hSUB`6SKQckt(!iD&!1)kG)B>%0*klWKjciPj?&t$s&+ABkPSr?764lezpz8-na* zUSw>XeIY@ofxKJ#gUGy%i|zP1(;-2_ZCcVaC(KfGi>w1>^fXcnmJd&X2uaNz1Q1|M zW}2lFqQb0Rs?nHji?6kA_#k^y82v-?yO0_@kTa61$CVtIG{s7q>IJF|1+ zGjUcrRd}ykk6Ep5&q88O=%3hfH(*?V+u zjtWQOW5<(S*HEQj$CRI5rp&#%&rmJL2%h!LG7*#6n@6G&rh!E&Ty`FvRN5&_yJ{t# zw>1btcYByD2WhgzVeC?~q$DxB8J@koXo^+=PCcLXzRvU2Vq^gVEsXeJudY9F%HT%5 zr47@@(AmG!AY8nwpZz^Qouol+0jKqA^j)l@PSn#v5nIxNK-A; zmVUPTe!qA2M0Woj^c~!%f`74^89R1VhZ>>wbx4C~)NTigpvNZ@-g2t@;cw|{nNk*a z>a*H6s=L#MKA?@D#HjS#Sf%A4WhZ>(zP`JXG=RD%y&MvuLIpMo0d~99JYyne#vEym zvoD0VDTNbfeJtTicI(}P&mEul8I45M(WA`i;>1o@1D$VFYPJ|w#=d>lA-w5n3q%G% z#n$J?thjmo1Qpq+O}aZ65?DAL!7h~vcR6BfmOr!f~2)Dvmh z=^DQe{U!aI&ST~hKXJ%hD8hDm>oVLExM!=>d0iFcJ`)}i`$)>cf7PtX_KTT-a2qPCz7l^@kxXmNy{6ZH6oIfEy`q5(2gFS}6pJ|~@3JBc}$ zr`WZ#>I?g7s4T<0QTIpqcbh7I+5)Fp8Y`hn)>oA10CXyXC*v`Jc@5Bhi6B-)fr8IR zpWZpgm~y@NM%1x-&H8X%$M}M~Ei5CqMf;E^+aUl#bzsJ8O&E;1mErtBMdJ^U|RLvmN}+mvm0UWI>9D?|OG?Z%arZBr%N{5Uc)@ zG*X!8u6i)rqI@5Dsv;c|74HPkR&3=_%WJY0zQA;p%ztvt-4Xy#bA+zhoO}_;kg}fj zMX1wa)f>EM&f^pLo7Lu$2^e1MP9+`Ck`B%5rGQ3yy z8FHXjqJIYbrx!2p5J$aW`WN%NhCE zhl>>E(A1l9gFb=-{8z5;bx&h+>7u~x*&_2#Hdi9a=deH}PEMdExOzUmO+HiOG_V)uqU5Hy-Qs)F zl;=^OyV4U1R3Q(b$!bM}0pM>Bn7?tV)8o{H4@|hOo{2pG^UVsL6f6M0LvP5MZciTZ z)HdRzluw)QMDYJr#k7Bx0=eV*Lw||tE^?tbM&XA!a&NoTtrOB2hqIU4fz4+j2Nd86 zGr{Xjw_-L}DIQgXkIVV54!?5aR0KnuY^*M9^(a$d{}f0)k8xB9z|rnsUBE4Dge0;D zR3U0cGW1c8Ua~9rRaNXUv_E#4tSXW&8+RyqHi^Kp554SEpkNaDd}fJ;2h4>B3Nd{K zs#ZJ@#BN^s^z|O5Y~)WCG{j6^Ce1N@pldUd4>*K^imcYQ9#^?v$KSbL}(5oSr$cQ-!$ z_4i7MT4K;ZHW{T_plif|cjmh}FH;2Fo1~4S7e&l>^mAPHFxkeXt6of&QL)L5{=Ri( zCjBjb%K)K@rx0N=a}{rjHy9UzSfjrjd(i4Msx4jq{_rWm+$OkZtCU%*dw)cga~M2| z7%=Q>A@YFs6(orz`h(r6B#b4l09y z6PV@!HtuUcRg?Le7_{6X$B7vSnw8gpQI1$AhIMIwZKUDJuJqc;@()Bo?c<>unw#@h zXb!MGJeXxY^TSDdax>-Y-6|Vf0|J;w(qn%9iL)|l%epqYaGv))6@Oy>ipm7ssF_cN1 zn6zd2B21p?A$&NjqiKMI)Kkq0AwH$TEXNo}$q9o$1CBG}k2*K!;&eC0?N~Rg$}P=5 zxD{shxF_`+$^I0yDQ<_xk^eHtoIxqp2Te9!e{`vV*(D#MBc&$Zf)R@Obg>+gBCuqo z^%HM5C6kEBlK+;hdkg$quMA%)rErJSV^k|itcooMI@@AYI zce0$wmNZO-<6tvrhKZ4d#uF=?^i+KiQ3#BjHvUJqVh+h33wRJd9W9dvtEF22?Ar=_dHD%nuhHlm&(_sgAM$ghMu_^#74m*bvq? z$0zM;Ojav#xzOtWQ4Gj7Bg8iUe*fX2D>=>IwI2ky&+4(nQ_?F|-ooFW==`@~TC%xq z8_o`+KY1@|ATQcg4rWG4y<;SVs+A$ zALSliuV<`M#?y;b*DA69ssGSxJrh;MlSXceJp;L)H&(9^Gx?k&3~T4V-lS(8xhzjD z^2Gb@r8C6QEh1@Hho8-n?DpzXuPta$f3Q_bi+XgUj6P+g&Vd8lnMk{4JgVHDx)(wQ z{Y?>eu=YbA@h&3#^i0Al!ou;sJDB!}zQ;XyED(o#N@)qNU2XnKK@dvWJyO#otBKfF=5kw>}QS9r*rx7oV$a{Acf^ zA0%eZupy39pcov!dR}*B(28OT^xVmyS}RY1sR@d~O$oaH;T~Un3(DV}+Fa?rl4+A}y>m7%e3$ay&3{Ws^P_drIXvWR zpNpkyCB0C9N*)8P#x1u_P+24Ek1j_rChN_-Xl`}J)O$$}#j$^n-pv8ly_@t?#$wy{ z2s5L2AHMDcs#^D@7o0^iG>1R?#8mA%@M^7A?vx$U8iAfvE1`~N*ZU^tv)s4Ga7I8v z{n>{XSq|J~NlH$Y8Ht73S+Em5r8mm)llr*2m5X5_ME`}~o(U0sD!q+w=Q?YDy?FF< z^FmG_$V0@N+lGIy(0No@R>s;Bhfp@1Wa^BY5B^n@=>95ax&B7gb6U$x&+v=82S?xZ zMXB~zhid=%jAOdF6Ikig{Xs10;hTB$(J=3GmXCYbnmJ5 zH)H|3niTrQRgiI}%O3!{M3hKVAMr)HdWRe-bD%La2ckXhruo8&dsc=Zi5WWf50ln| zlb91IMs;Bj@3<=L3`nd{Z65z2-}iSn#jO}%2}3f|u&Y!UfBwxIKD{@bbMQidpVN&J zZF3pGJem$@Is}Nosn(8)UE#A8oHnlxw9Q0$-_!!)JS8d^^FQq9yOy!6>4z8@< zbZMg`8lw2Go0SLbEkoD5;D-pX=Dds0|bLXnAKqZzVbTDpsvf6Pd{CbAR z^g1q)jGjMkeeCVDpH<4+R{<|e->E4rNVI_T0nDj~#jS$&3ZGp|4fm$FzLj zzGken;!3*7SXn~!VRZhkpZ;~6sG3WUHycRJy|k!X465{lJWb!IQ4vth1ThY1+;J+{ zlK5F49Z(;6Nk5iM#uP?gOjUSZ2f~!OQ}~FK=oJh3V(RQB_R}?pGym7J!paWQ4PIV{TJQYS zas@+%&EjoZL*lc9Eg#N5migtRzxk~P#q_oeM#fiFF7&UL)vKfoyj?kI4Np*ihdTq` zSPP`*(dGFO4ajcRX1a5KCvkB5)cW_%kg!MJiq1m@V!A^a5EQ%n@_u}tXOrMn)bCyO zpb7HT!=l_A38&&*|MLk2-pbNPFD%gz zM&9>70k_Zui*nFG)9ZdmGN?kQpv!#AFrg+dADC(h_HA|+w3==5cgtIwF6le5Ph@|5 z%0EQZGoiX87qO6^1XoMlbPBl^Wnse9bgjwkSbtRRarGn zCTEdyv8&Sv{rl$zNW>~`Sm?hpxy5hSxTw@f{U>&D6FwqmRtdGWWq6F;?7NuS2Ij%7gl;-6i4OXmev$Mf#?0IRoA93DK>gc+?4*Q)BY=iKUUYJ$ODB@iU znEfpH3p&N~)1!vo@~1ncX{>zgQh0!X3*TVMI98r{J=G^w$dY|uKn`g625?#|k;pLQ z6woeGCfl%Ti+0FA&+|pmC(1cSi`H?}0}7-JFeP}Q_Xt!5FIq2kc%!m;7?&sSTSg|U z7RF^zzT2;)Mdl!3j?CNpLgu~(?8>?&#iJQtL#<$H$+VsfV&i!x>VdBuE8x}1d8l7;gtCx2~6$i3xq$H+n5oD<0uu9e2eoL2PYUI?*oF$xF9NvewX}dM3FQ|6_?c?{2D1p$gwLays^fY#pyTD(Trynu-CngPLTP!oh&y&^M|xDypQ>kT z!nur6-&01pgk2?2FL{^IntnA@6-H>*+Fj5ON-r$we&-K^I6{4Q$7KWzu-R~sN6G9d zv0u-V@px&-q(S=ZRScO33mMDJ89{OMV;3v$4X)y2joy`A(58M!%|s$A8-3SaZV=lO z!BCLymumUcq9HR}A{99!*>b1d=RS)`0uN<^%9frZh^g6Js2Dw2)4mSu@5CGHaaQpE zY1U2W!2L@4jjujmsgk&BHFFRB!&}I~Nj-<_7ruITINg$`)7G=ep+xWG&=tN3M>h4e z4O)FhMh;HzIYeRUv~7J!8+zg@lgv6P6Z7HgoGa&mn=Mp2Oj+NO3whXt%if{tB zTLt13_mosKqa8bAeqpDACzvx|jGxrL^<>_A>R4@w5T0KZ zW3Sy2F99O(-XN{}^24u%L{4hJwd+=*JZ3^RKK_k2eC7tDf_LKSUl-w8gu@dy1)A#| zO94^q^&zx$^nZij{Q#o?r||CfW`ps(C#gAYcIvZNvcyG(@H^Z{Rkt%KAcMG}$=NRg zX@^>q9`xGJ0-Y+KMM(eCJXddHHd=Lxzc{scL&dw0TOkKn{~M*aTLh+ssVDnu(>nlN zzVyG2{NP||upiF#1>K&Ts7R}yL4U~^YtrR|-H%7ni(@{A*++sPPS{Dc$=SJRiyQWUx;R1YQ9{J|zf8+Ac-p6s#9o34NNYVc;2!jk zsBI4sZ&IAPS*2zKsyC7lO#ajZ-?*?@3@p4e66ngCe#)LRXfeNEqg5ceUX}&n_eV4_Y~-*jrq7>fvA^o|i3+3u zsR3Hv6qt1G#}ps%s37xg3meCv_*aYC(NL!q;lF`G>l4)M+g>^%^O77ZtL{K2eTdW< zQ60P>n64{#IDXIL5>7C)$n~Ct#g*yi*-+_1+hVeif!NrGG&FY{c?=;ME7E@EL;nLQ zGLuTm+HvQL4^j&A<8Z>ZU8_oN!)N=7a6P8#{{6ekScTC0(}GO<-WQ>JzA-;*XBMiv(-$KUCfs z5=4db1km9V=}kn24d#=GSXPQ65LTM$(r+}$7a4Z3Bu0C=*TIf1DE)W1xj)cyqW|~q zdl<%lCuWr|1w|N0Y<)nh*HVtqg&c{yPl{P`pstB@0eCbi$4J`tvO1s|Hiq~x|EsDyy^=Lq=05F*rwD>>aOY{E^rz(5> z1e!p3gAQ2K2^B>o)7F1ld;dJI!Wfld-}|`3S$~3jZqI1`marZ zSJWzcolKf3|J)zp%UAdrLUi3K+sY@&Da_cs_br4CfuYShld6nftMa;2^R!tg0k&!o z`gh9NkTUtpJ?j{X>iDWM&th^O&^2!|F3V^snkamfDE`p9?`@ipD51)xq#Yz!uFsAM z;?O__zt}HYP8)HYVkY17ftIIEl;~wt0UgLvFw4*6OQOS+_zUVqhu)`O+bkPA7v^JW z>Q8ue;@z=Sxj2G5-6lTq8b8N3-mp>BapMyiZp#1GxogyiqB*@NN5}$3rSC5IWzX=6 zaK_z~`8?tR`SHr(o>XVN*!s6p)b;+-@XHu-M`A%hz;jkUsS zRa7FRE4Fzm#()q#IJ3*(@w}Ui`Pr&&eGk&74Yx_0q zfn|sDIgV*$hIuknpV}{)$ST1pgG8{Q=T@(@PICPA-Cowm(By_jfPfP#t(zZ)_qq4m zZm`l>f`NZeAf;o~(GF)2cHt0LUwGmwbd?(AS836r$tnlOUZk&5f#k&ZIB8L)GK?^| zUFDsN5ZXE3D>?&I7rkIZoeBriTscMAUE3vWdP7$`lIOQTy~nhSwCp~@*^)+|v8PIK zbSMNZ($7N-U%5i7V!?Zl=v~Lk3~S+^fto%U7U7cY>H7z1dKFV#BbLNmMqhgax)!HNqdcya zp0SCR{FoTZ07Z&U+Ox@t{+4s-xw0#$khOp`O@-BOFB<$uk}`_PD&1j#lrd(nKm_7< z)aEgZBn@|!3MkOm13|F97G|Ft0($IS-!C03+OY3{TX%y)WUNDjo3{#iM)wK^}S!k^Y^Fk}Gizr?Dl60Vpp4a7@C9Bqs3WlM7H73;E zWIgac#j0M=QmdZre8vf18%rYT7EW?{0*nj2p?;(KLx?}TF()Bs#sMV^gK&61ak$Z4 z+;f7k0r*z5;U$ndI4S(f?IuCWt~<-pGxy~^adyRkGi&Tqt9ki%$kx9<24L^eRq`Ut zGVYUfuM~gZx;m6~Zq9t1YAm-9Hx3U`(kiZhHqZ$4g#ddXBpRm*>#3|6x^IDVV|gqe zly+5uBfhn&Hckk|9Fm8BQVR=@6#XUgN{u;&N08wQ8dyun_yd{457 zo(BlO7ViKQ=N!2tUr%MwkNCUNR4*CCSW+0q(&q=GtH! zg>XQhcNZ0$Nd*B{!3H~M%~j%%2D%SF0>nhSg3JR> z_0Sa-_^Xc=%TgBG8`t|{t#{j4A!R(#>hb1}I(_i6K{()|rGnIC$;AijWgpMn7K$+V z7SP?_RVPEUZJLg}RlJQk!HK(f)ivlzKP+Ql+84r&uZ{0UF-OytjI^kAP`VmPL*uc;?R;`llKgEG;{rf@EQJ zc6TJ$5sX-U{L{Zr;EfzX^Z23F9al^Te?x8Q>fm2owoOQX+>O&!X0Bi${$@oO>T0tfj{!CMcu#RnvmoZ-(-ey{d4Zq`q~{N=37MMS=?SH-an z7D_-N_9=h-a%YLMJ!`~eubuR~Qk9V}hf=5?CDf3dQx9Gl%n=p-2e3qbuHe~qSl0>d zbYJyoZ4R|W!EpScyl2Rzk5`ZYbBKcDrk!#n&xq~d71cGf310D@v`?IpOghYcA!4Pd z(gzv1LTZ_BL+snbq7k8s|~DAKF!+vw6h|d^qX{- z5@&vGJAp;|+^cg(K>=&ZcBW}e*YM$*!ahDJ(AplIoUcB;lgRO-V!&(O%)e50TYZa0 zRdzlyLbVdwE0igz^=5R)@1)G@?YJ$hVa~fqlo9oxp-5O7YIeTGx3Mte zNN%mi2L!gets<3foXyUhp8fTEz2}_kxOf({70d+IAI=HqY5MleqPRpln~ylP=$W=?bJYOQnq@qe$X>a00KAfk@W# zoyAq1%3DYhnzWHbzm47J9r;7CdIWtG3B;liPvrzy1{MI3x3EyiB~$&y{KR- zp86gv$$*>`a~RSZoJswwL1MGl(y|T>1GO*Pc&&68l@@d-j!)3)TW6ia4HiWfAqORS z4i^5AHS7VfS9&T1s7jWmOQ76S5*xd0wL>8PI70{(&lO+G_f1P8$2^ZUF-Ydd+Tt#t zn%xF(dRwFMT7Chw@hTmbT9J5<>vg^X72&mcu-T=Gbj}1X$K?Be#zlCNl2sC|>F}%- zK|0Ql*Hka3RA4T=3!v1=(DocKs}Q2Ie<3z;5s5ZaR@4%dVBoPm($0?rKHiQ<9vl{@%ZOSmE9@)Kn`nA8N6j1L9$f~Kxi)xe~Y9*9=Gyy zM3Rb)XM_hE4*W_OLKJq2Y z7Vp+Cy&9~ogxI$6|Nda5oqn4zPH4bqyV^^wWi+qA(MO;22ruED{C*b(X z<0Yk9a3Ur0WN%lJfSK<&JR1IZOB%zpws6GKPO_Fk-QM14Mk-zKu1TYgLIm^WKgj7% zV8cJNGsC8YoVky_let>t8B3AQM9oPh<=rumpp%hJWc#V5ykE_ zl*MF8XH)Wr1llnmk$o((BWillG(f8#Z|?cJ)9{G4OMJ9yziyDpMIs`h_bC(1wk+)C z?p|4^W2mS0lGD&Wt)&hm2tCspn`9YWRbr>DIXTK)O?iz%J;7Te$ZlwV)0^t&?@Y|d zjfNK}i~1hWQT9CgNY|qd~|f@c~blQe*7n6E8!Mi8gPVUe0ms;QTHFf6MN+$mcGe7 z%X|!9np&h#tv@JH++wbe58B-n+i8(dR=M!?^^}6@JazCQR+a($O zsVfBibUHqdP!KRtBUoCjZX6dr8Fajn<@D-(7ZV$Ss6hiao^6fP>-Dxhp_tzMB`pJ} z=b6w`rdNeD1hzS_d*Amv-p7FybX*3My@tzaFkH%YU0JB(U{5oUq}yi)B=d}h=kBG_ykmAsKC zhPl%b&^Rnbe3pKic1j?`x2vm%R9?)flK5)Zbeirs^w|~$%jaxQx0IJRBh;l^^o2aj zZx5_5s$PMkAEWQf>y{xtqRVEO;FM?ZTNLdiTTa6?LIzDb%EYvt+v{d}B+ugNDBVaZ zZ$+H?dAIMnqrb<7=FGj^bhuHpPnMO-yowlkTl;9`ns~aEYNhItD}T!pg+^zj+lkG9qxcZX8+TtG>fsKgGmOhhCkTYr#Ip(qFD#RQL#^FB_fZ z(s^gFGb3pGU@yEQ7S1v@)scdB$tnILiV4x5`{vm{(GN)W@Y$(^;W{MuIlPhsGSC<9xzG4jC3G%U$iq^SmjeyY^OEOVme_6A7gR~VCvJI_ zPjMjZLoK)IX5P7{K2CH59`HA(y*mi52X_X~P5%8oK6RWq-$V*&T%i@F)vVYJ-y2+_ zqBZ{@;ShJ5<7L1(37l;_lMKsD$j-s;XEoBpVkXkAm%?&=jG&j|DvfymZ&IknqOrN0 z`@^?!%#qp8!f(I4U0rHR3n#8jn*UZnK-}`1PMQ1WDsLf0@CT@UiJ`m@vDj4+FwT~F zztO{jW&29_q;XxyZ9JZ#5PC16*kl>Ze(O^hE-d3qBd%b$^se3UAQ-aBJ|;Hal=Pk$ zuM8Y+w?MCT^{^!~P_*u}+O)-uC~+e~q>u^X?x zH$F_*eTW+qvwj0tgK%%lmKau+?>7Jbd5{=g^j#Yt%(GB5$?m%Q!^gSnX|xe=&Ig{)q`w=!+S_gMG@)e z+E@W-lcb~(fFe-g&8p^Mh-OH$ZZNqWA-Ss%0XLEiJ|i!_APh0dBNA!21=A)@Um(;f z*Uy#hKVCJZi{@DEZSXQo8h)3+&FQX`tumpWWH;X-5Z^gq|G9F|3x;N)Q+su#u$bBl z_Ft}%OSIwP+SPU$fAq}ZT!%rIf?B?YIc zvfw(8)*iR}%;1IUd`1JWpSnn5HtYfb; zZ(jL~A%VZ0`Wqvd^!_Qi49rw_>|Mv+ke7Y(fAchQ#sRhtg$52PB<@s^oW=i^5OkG3 zL(sc+FrDQ~NmLBwkd`M?xdi-gxP5`B*w{~~+Rr}&enRGgz36doDGvq~iQX%B`U`GPNx0g2ZQICu$TzjUMcN&4Dwtb>y4pW)=y05%@!fw=$30V@Vgv zoe)qVfVyM%sU&lmXrZk1(Iv%e;cl*81|Z+Kg?GlEz*6GFcjVvZ+V?ma&ntQdBN#rv zA)Tm?S2H|T!+H}H{qP}^dt7l+1->ZSOVzYmvXa&)`_P*#>r-P(=z?Mv(>sVMHM2m( z>N$zx9UEJ$hAubMn-g!|o*Y5Vwf|hLvOr_JF6q|qy-Urd6(z7sY&(Q|L2v&s7j<5{ zoy1zDb&r64nl5bFriV{Far+nYvu3#*@pF5w_M&d&^Ki(*zoBQ44M?&Wu4m77+N52om)%@l~+DX=t-y?pp)T&7igqF&eJRyjg{F^C>_TajdL zN-skHBi9c)|Ka|k-invKs;IH{7(GJ6ZBayD_zmqfpL-31+N@2>Lzi~(+KfK4KA%Lr z@8D5U|M2gjU2E}Pq)LKES`g+Y-OCVWmdR)e2K|u$ev&0wjc7q4YS*!7l|tPp?BGtAwt21cT2o=Dma zma_y7$MOj2O=2tq@x5Tk>4z!B6|Z1y&U_=^BdvN5KIZ0cw^msmo2*Rf5wNs37@1R< ziJzgKJ&j!5SzurMvC>E{hho(uqacW9TKw}dzWF|W(4Fr(AkDKHzt0=AkZSZ?5m9c!J`LS%N;j3b4uvoB?Z4f(Yd^BPwLTTZNyRMx zU1qxOo7M-91(T%D9P#E93%DF2nKyA%l6hs?F9PI)656#{9zF2OKfqub(a*p){DDM3 zsH-D)1w!3f5M;F=j`R>X!;g3|8*Y%I8`qG2p__yGWTp$TScfU}{6o5<(@Hhn37Bj3 zB_D87t>&hVNBT}`HA5qj4L?4HyJ>$myvJ=p=}^sD^sbs&JajUlP3mZ~W*}$z0OUeN zz7U&araa(>lY<<^la1Orqn#9a^)~i+R{IcZ(lNfeZ}_3SLFsgROdTq=sI>0eeneN& z%;UpY{gqw%)`;}fasKj~a5o4&(xWP;-piKlo3Iym89mxjgaw7uxPkxf-x|@SV#z4@ z&1e}e6K4@fZ#jW!$Fs`JRVA76gbw=GiJ6UXK7i z?^(hV?d5{S4ghR=&fZJiFr{PC+jhyMKA^sj!M|GPTkvZ1g0GZyHAsD=dNc1Dw7B!K z)4^XoDp01PP)yvX?BYnu`y0L=7-{+Zukjk*>vDg7lCe}to&DQh(P38N z!!llkaQ;8Ri3iB-0>oQVXkb})wL$2$;%9%hGv2-oVBaCR-IJHXrSwZpfhh=*W=5F^ zF%_gYGV!6Q>N@TYZvh4-^M&3RaCM(V?O$^zqM{$}(OsULgO8JLRC4`bm*-?KU$H09 z`bPQf9N~o_$tX{=3VKzCxxTEzd6P@dkAv-+ev)Hi;GTT%i-2@`#n9l*s72?Q<_4~& z)w2cpZm)X@q~0j#16_K(lxyC1B~$5@IrR_>)#J}wMa`c`a)3kEvzFZ^ql#+`=M@6> zMOZ_}`uu1&eHDXxQSfnGsORCn)d~k!u9~QN;$s)8v5ALNR>E`;TJmJPUrDAY3D6QO z`nBlY_^!p$aJdfC@#7ux_)tPl1RT}PnqtF$k91qL+^|hn7DRMvo(`(rH;w6=6?X=i z2G_`VhgTzvzSqhk1MGvSMMNR0j9kana_8i)h`pt_d$#?G#lnhK5+C9j2%s0Ce)FSl-PK%Puqr1H-9YS@;N_h3 zqPfV#iZi_6)nJ497PS`dqbTF@0}C@j$3kdE&N?VZ3bmJQ2_lak1EA7VW$cR0sa;^3BKFXi`RZ>9Z`jfk#nYvi z{gEq@h>4VEAn4@ub5WxGhC&|kP^ZH8?3=jXYJ4S?cE-=yH(0mttQZS*)%>!5WXD!P z5c%Z%WUpR7#Bpz-)AU0;^=ZSgRbO;s0REm}#XJ6kx{bCS?^Zq#WO!r8)@~=`z0`ff zb>tccgpF99XgPH1Ypju7F3kcF!EHL%Z-rP#4~VQj*=T(44sRvIBK#+;-lEecUE_+a z7!U}~`qBe|fH~frkfOw+BlUY*ACboSxk;7I1w|2uZ2NWGcXJ?%70YL8>~0bgp%#=7 zzz`OvrcG`CaVbY??x`b~0nv!Mo4DJH;AQ`aq6~^&8Kr7>=O8V()2BE0Z_mjpH znT_+xn0^sK&k?dqBc8&eE4v|I7^4PxXNUfi+O(3!-uIH!&znle?ZIDn+A#fcE&J5R z9;0;q(I&&_b$>Bvz)bLg0aatyU9uSY?F2QH;NtrQi*PKv@yk>`9HWwur{OF0Jn;(J zqCiqwZg=exwiLzR*K)g*VYUoH`jwHxdpkl@nGg+!$Jw`)VlTyVxGw%|l@(xIbF+3! zuj`4mJ|(}JaWDC&M*<((`2>}!2=X|?8GD#clpdrPLKyXS`QqPMZj7)Q1c{#a!Vnx? zLLOuz^x$!*vclClV4}~=X%ryF-G3mTvI@OOl82S7p{wd`34GEP8`=VGm)qHKdvko# zz~<$_%`6-Fx9VcvWC@}0|0s>g><)Uy&+eyyzam*9=eNN9H;Njp1y3Ca`UTp z(GzR3fVcFo+ZKHiidoK~t#_&Hvv|{ykZa9uI<=5cxykd#(BSGkZSq+()0gJIV}3uz zK0W#{KkB4wX**2So{(!mt|!rI1uvLBt$#yWR&OB2)V|O0#`z4<^0UV&qQ>RZomj`Q z4LZ|bK?%tcUri1wH70#L!or+?jD7gYs7;3mAJoWt?=uZG#S3|+KDE$|JtmKA^79{@irkEOBlKi0GA{*)f zAjwtCH9%7CjD0cx&4CAQHANq_dvGGP9}Vr|4n48W6~0bps$c%fw-5gS;pi=IF+Vw- z<(atb{h}y%ez^X1{%nG%L*iB_!$qaKIqP>Rx2M#%nvaWjcg*6lx+(P}&Ngbd!kE;> z+FPv^uAiS^WLgu-s*Ummu9{9tpYML5o5!W@koP_bUimz!Ab9@gUvC(b0ola)vIX_k z#LLtAt%I=HW=O^pg{cpjL%hM4`}4=Ml&zGNm)~2z9e+9W-iUT&_p4o(!TjHoJMH~< zKdCTl=w6*v2+neuXtFIqYx5!JKsrtN!`vq=4I~ziiF%o)l_$6-4bryI=9#QFQ`PlS zRtd#B16r{{#*3*B$ivqNiEaEMvpT6zVDJ{?a2zQ%bFX2&sx-a@lUzD_NZ>YSR%i6ebA=JX+BQwd*ygJsavfa)z4}-e@VK- zxGu8n80r_q@P^RywUyn2)|Cl)n|asDF4!v2jSJw6s?UOo(el+Av2 z)vj%_&MlL@mrL28;m~^)ObHgu(cTd@NQ6Qog`o!rt(V*_VJ>PX^K~x`^#7fA zv|DpDbjrdm{+{m7<4EM$L2H79Bedtj-Q^6-EL6-9Y#D@{qb@? z`rnGi!uZ9X<-U=m-^I5{%>2|TNr`^|0-LQ0haMZ2Gv2I6|K49JtyzGP@)(uIFSj2~ zPjBVNT!#EZoOF<$WhP&qEmn@~Z)6F&tUt7faU7iygw<_c7wYay`)PApdH7At!@MiL z%EC1}T_ftDMO=}YyWQ}?a+tL$(?#V)s8gWjaq4u(g0>^~+pPSslO?nHvF_u6DzRbb zV(Zk;ey*NJ_a%r~kj96v58d~QXhzHMR`Pvc6`&sLE!_Y{VyG)&jdRh--i}-hX<25G z(BJt_Rjmod$sGw>;@~F#Qr|#`To=38uB%*N&Wv*$n^rmBDXU&uO>BL0PzDd;gU$Y} zwT_vnXr%;yT2RILert8s`ekT<2YG8kJ=3o|5Aoj1X8(ADOTYM$S*g%~gQUt$i>7EM zS++kLjhEE7#F~|4ivNBbVih-TGNK0SDXLNDP3ruAVT=;m{|k1@j-(Q&e~~tkOMm@U zenExZLul37&>fyP?D%&OUGj+WftPVA%?oWxBKl|(!??aRE+td3p>e5R7=uMUY-67H zf7T=&QMAq-wa7tzqJv@e?GiwM)vucWSpXeyF^F~VDJrjlMgD8S`repT1;+n$=Z@Ne{8w<8o2n)G(?EymK4 zl&^wlXnWGWT;bCpfLh%JUL8GOaJOE&E^tG5M{vuqswa!t4lm4Gpmc%Pq^$O|+@j8v z32#^Q0*+Zc>{q*d-CH;3id|I+kxt~jwqG$DbWm+c+v;*9d>)lmH5g4HlK%x*_Z}lW zfkC)>T+&rEtv6v@!rRM{K9%oQsi+t+41pf3{&yC_hktwQ)Y`Ae-hcOY>=qW&x{c{n zhrDFUop3&{)Grc!Hw;Wtcs)J_aFs=Y=Nz>G@@yIA1%T>QoA(o#$}{G!Q~wnCj}vK9%o~V?JVX=Ovkp9{fg}=>89=Lv{ zaNC&5`B;uvz)j5NZKq79!6G(Q-(T4Nctg%4=8xm@j|P!DnZDNw!**EI>i@nzy4APi z=f@7)d(Rz}8OS9mHEG$Uua!5f4aluZKUX=H{5!Ssi*44efs4Fz?&Oa26r-^s)YHl^(*DVY3R$xq1mYC z?cUl`qrge=JSQg)=$f-IIGPzBcNwg6GovbO1@;Jifhw_jP5m*TwLive`_BYE4uq)6 z5T(j5kXvSENqlQk2I(=Ol1fwPTD91nf>n?D3E(!~X~7$C>ebR&Lk$Le{{5n@7 zUilhJr9xkB{OGBl!ZQiO1Zyc1?f$#^v)2N|I)kyyHvNBr_2@-a9NX}EM1~x^MA%QNa2HS-T(0xQQ!XmoJD}K1h=Hti=K}Ft!eb=E2C~2*y?LM5EgJ5$c%h- z{LxTnu@YEOETrxSapO0w`>u|^msvX+%NHpu7Lk;$`2h>@^GP?qSHk`jx;`kLvjB23 zKCKZHvXKob4A@O#vh+%i)u8A_C%1P@Nouiv9+INX0D!3X%yGq;thMnT^XFh zH!ns$-WLQZFyKpk_aMuqW!xw$$6J{N;iY~8vg2Y(r{Lmp0DqK1?_FAloSpHicUMPT z9TZ1D=N#ddbF)en?I!wjAe!>Z#gSQ2^aXIKykfDpd1QP~Z;0eU9 zW44K6^*W#aN5_;Dr0aU+=6!?T_Ck3=VFXY&~#twgYah1pe?7|ETH$F-vL;rDF z$3XkHj4FsQ$VzY*2ONVKQ#)9mHZQ3pns0Cd%+?17q^%W*FWF*Ibj%ytFFfqNGD}#w zPbvViUI*ZZkKuD4u>j*aeXM)@7Y{fc{bT>}-nCdgRF1kNA{*)(y>Xvswudjw`D}5;YnX?UAneCTN>Oo$&&o3& z8?%``FUhxgfXRxQ;dSr+$fACLwK&CiLo2U6dbU-^oJazH>5LXOd<|Dk;#82rdmmR= z2w`SDuC-IbQ7VI`==jyf1H(ms&g zzCB_MvFL@>Buy**G)SfrCsapnbW+llF(ct>S3uFrO^~5ne!) z0QfU-1W+?l!Aui(`Y2_}eL4&*^&L zsu73$=Xv4FuaIErIwJGcGB8^F%1Ckh5>Wg4W9|?&;;ETTb|CIO`tJGLzxPy6vF!R& zLDJ93^Fdy`e-uX@fJd~0T=qC3Y3~HEL0yx#0AbVJl;(1F9b}IJK*s3PAFd3U$lnvH z+Zx0?m@|}QG^_f*LmR}CuSb19<4?+-jQC1)0*9we^WhJ@`e^_an2MJ3oFAWlO=I`3 zdxLaJ4*cHt{|27y{CNQ>qPAXaI5b&OSw)seW`7ua>U?W$ocOioksVhbj9TQ}ljux~pVvTo4yd-f1&I@mKo zxp834;j{|g)8@b(Q5+dNE68wl_<{6LjA#YA-6{t_!%eaP2CZ{K0d=F?^!yml90hyl z`zPQ#Vi3FoJdE>cdg78phN)&#qk!*wL-ICR@_#7GpxKs?4t$^=3^m1jS7QTKi~8P|3?wb!UOWoIquJHkk)0Syl?XYkwi)-iTBNYL*S0) zfN_$f>h=L4mIe3`L!a?fer3Dq^nL}^NWB+UWmL){iJ-A&l1^L4GVd<8cRXjbY-_AS z-%T+iwo9=Ix|j2-=J7o}x(LC3b?2Xts~%qG{eZ{&dja-?<_oQWMR-rUVHb4Z&cdY!X^+qt@nADHCjsL{^_q}xh1!lW>0Vf zKXr{yz~scoFs;>M^nShE`Ju!F&F{@jg2?oMEkrwTPP+1>t&e*)ZM6f(7Z08!SA(+M zi@7R0-exklo3uB-UwrGING<3Sfc1iaTSLPx7wmR$xQ%01&~20ToLD1b*l2XPJm)P> z9IfgJuZ%V-M>A5C$MHy^-nS}-J(*E$(&r??5^zMdcWR0qa&l|S+tr6|{ zpE|6j*vmoOdY)aODsRe&x%TkH2Kxz>2&4G317LuR6^*~I*Gw%0O#xiXeV?d?2LZHc zpCPI35oFxXDz$XhOSI%%X6C1G&jo^)jLt58TK3kDJz;KQhPZu zv5UMJ!?$YJP@T1`inr-P=QPjfg|s9AID6!-7tasgImHO`8mEcGe5(pH-8Br>EXWbs zAf{r1Os{nwYHwLvAA%dF>Ok+3sNM}w^}6hQ4W7=-%7)oB4m+je-*PD;|Ey0lS-u3w zTBn9&SN3+zwaw_sR}P~BWnDj64**{pzD&=fQ!S?D$BPkkz1pm74}$adbYBP{{&CO3 zeR<9WRXgXYRCK3elpoP6kKzc`6e(NI%&PB9QpxfU(bM|00fvomjQq=Hs!DO zWxvdMsf4}rBQV~T$J0P)n&xYy9)Z88leaLX@qKU-*t5C+=Xu0Z8nJ|_42JcCZR77T z#@F|oo^F8{Tck`U$1~&L3a|;B4M~#~UtdU+;bmB7k%(sK8x# zgQq{bGiMYA+7sV7}o9K@$_Hd;ElyI0h;K(2of9? z&6yB4uKT3a-m=;ki~UZ_SwjnNw_6A-f@BK)rUAi)taO*QlV4DELAJ>%*#{&rCigEN zY-Yhg^KSA#Qp`IC>_9Qg>k@OF;K{Gg{5Ke(T92ZeeRRFV(iqvj;u&tFl9T|j@Uo1{ z8;3soa|~zGicVAH5z3!eBk=(h`5TjnrLJ1-nT_!RerlB*q{3e{u}5*7kM@+?8KbW; zW}F;0g)s~LBY2dsZkW`=2H}S{t(j8$P82t(SR(|6uw&bvT+vL{i~^(YCvP1Dz$Yl}Hq;p`Th~JSq}eT_bI3GtgX1q>zlzQjcc}JY z@aI)Af?Qw9fnNF53Lode47w-&E85W5+9g4)A;%@0oQYFjZo#weJYj3OPUqY#uTpFv z`8~qp#}UVn_C{)_L!GR8S2Ie0MZT=rluJDWJ2~g6 zrEHUO8*xSBn;Rqj6HOPA#!G%qPHz~r{zim7Nu>LvKs?W*tayxiw@r*U74sQ?KY@aC zmj8gtANc272lgv*Z6-l2fiyx3%r~ZS=6f|bRIwLx2zf$pTuf+?n`FZ_xKX)aGHgOaWhD_$8Sl_eX~~^pOX?8 z)2BWY;=WSGsFCJaGSMkrpQ@XNka@limnS<`Pgb1^g7ByvdzasfQ6;kzTlmLBSz%zn z{F%A1rTv-40Cs17`tF`f1#P=tRBQsNFNuhLT7~mAbl_$tZEa%D;q~>m0e%<~7J}?o zS_L>3Q(hKJ@))oK8-OWb8Rr$X5WqSog`!Fz6P}MK6y|-Dh3pyX=o3Rs)c266bwgb_ zry{X&beb{YjUb%jkxzZ-R6urbUoYN=?<8%Z6MX;)K{KouMWy$UnAO|Qb3))q6$wNV zS^!DH{Ff7*opvTl40d)S)bxn#`G4QyK9XK-paJ~OQcW)=8D~{eJ!-p%8JODZA40kA zK!OZ-frl8BHVo^L65LK2#*c3@BxrMRF|uBBZC-$Kl1&1elr>MSWe|IJVMhH5FS6MR?#MZ36s>Tp?-0LdfW?(bOjZdHT}F7bjR<#; zz}I}jmo6yP{Yd*iSN?lqz7$ikbG|#}05|}~TBZEXEx(9a64G8vphO~nlCKCY6Sfng zEPwwj%cS7`y)d+O0(KIYZ{X@lgPM>kjr03J(|s8?lhV zN4WSAnjyf9K*fO_#8}XyYAYDJ`i-?LMmzXn!2opnf-(Xe)MTQF&79T>407Mei@%_X z-kkfWn^9Kg7b(gDAv!TuId!0BA*_m7v&%;G)EZPrKl@Gc7RSR9M-Uu_;>KD+yPt+m zTr2YFCO!i#0fm2G%-yBkQL(cSU8JNxVz9eFEf(6FbK)LyMV9^2JLCNz6;CHlDE#Js z@+0awQIh*ER*UYHVGs$s5AKhdPC?q%dA0G~RWPfmi}=e#%yDCZ3X#+sBQ0CmQdk;6f`!-yojRuT|P(H*MB(0-~F2RkNgu;j{@=6QINu* zw`8V@3+ujJdr+?I4~bJyq0A8-$sVNfWhHAx;6a#mm>x>tFt&W1Rs2$_hmp7GoF{|g z@^tTy_~Bow2F)fk%0 zfy9ETJ!no+?D?VU%g8R{`oPs)7ov>a3HYk3A*El}HZdMo;?|4E(tiQn9%z*RGIN#&4E3Q$|+e2kN6f5*aO zf4S4*k-OWME*woJF5eiO_0-8+_kBk480D8#rKt;+LUA9!nz69R#_vjlZUG1y=A%L# zN2!m49e^)XTWzO|{S_m{PIUzep6(u|7#^|hKOB7w+gq1QEVUYkkAz$teGYqQxiIX= z@g$pF^xe_rCx!~vP_=;5Et2_F>rjfvJauMSN;@xifBLr`&7BXV-ikT?#1VHXb|Khz zcG5dC0{OdL{}8@=TDaRcyApR*4lWA2jC0h?9~z6>;0YRvT~E#Y$~uPdC>s2vnd{a2 zuEqm_GMNwK`I>frVHn^t;DrvbTQu8ZSki~L!qeQ|r|!MAZQ0aSIl$+K$zAa61K=IH zTYZdT5;3&Xb%ny79hs_qq+ z&8LL6DQ6TIinj{3Hdu;&Ozqu=Lr<^%3w^tNu6&`lsue>E^mtUBt5pGedf`M zbS+O(`7$dobuO}eZ7wsY2i@~`&vR;|+eWgqca7d#z;#yfdqXr|i|&1O7v|cO5aPab1^S@GSigt? zOX(78gKwNVJ^;+7F9|}g@+R?VHw6X0IxwB9=k$7wW$yr$Cr|jY9A*%4L+|dGv9jnC z`fO`fD5XDgZu%#Gny$~sQr_||Zm zviwH>U`zjHOuFf{XKjWW6OCpjB8XJQO5K7^g zkAgUS1(U{K8U4gerp`4D+ngQ1!m}9+iGoYg6}zWKubqEzzWVt0$j4(26D8JE%CVOR z^EvkE;97eAoyRulHn5>Z{@o#9bo=5ty-9%kyPP5HnFh#ymTkYn35YfeI~UJU!NzY* zPfOK?x||&1T!?QMc7K#ZWixjsDUx~yS9jnldAJ2`#s0@%<23qPbq1Tc^(~+0(E}dq zkh9Ob#iEblMoQx97mqE{I&WRlbBC4s0P^Xwkbu%Q0-gV1F zZyd9bo-~`_qxRxLI5r4PLn!dnhwhN){?E<7zVfI)ESIS=$={hDq_W9*PSI~cH3nj? z)unv(l!#0}<`8{LTiY~&@O;g)J$T};c@Eu|k6n5a*@ddX;<(F$eF9A7w2$hLKG?zp zDFu{xU-db;XP_PT2fYX47v`RY0k3mk@^CXiZxOGI6==r&YLpbXTq3|AHdb`b+e+Nu znh~nnkqt|>JZZ6zC&luvSX!xKRj_9^mnS8s`!<(Z2HHnHWB0>qpd92df6=G7Hz$W_ zk%<8n9pAG}RS{kXiysxBBl=I7p_D}8)ebgNi)cGLXLwcG6xb{*^Smj9&4`g2FYn!f zTV3nvYT}{uT6)pCqidiPX?f#&de)P+;9%;#i!u$EqJ2a=vTK1PV$mkxttQFpv;7`n z2_$EE+;XCirdNX!ohDhvHAROLHKhdf0I`Q}HJLarf*|HhLByTyagfJ*;F`#dp<0-> zkqjgJ?FTFhPK{lEV;We7%c4l)D|$ePxSHoC_v2?-q~+K0bIn9#)#wg*FRPVln|Swq8LV6EN(7AmyDT_aH(ny2PtEq^&_CZLavu; zTqySTYl0I04W1pUx$Ez0FnFHeRvRE?dUz0$UQyki&e3pZ7~?>%)Ed)lu}=00-%d#l zm1BhrXmg}X+~GuOHSFFdrW@;0u<>{&=0i@vhsu+E5m>b$QDGIi`WWZ~2FdB_;}E;V zad{SdlrS~xHfhmxmkKNHnZg||zXzvJA`I0eyuPlv-2G}7%2A<$^b1A2CJW+yIx#8) z(1iix6bSw-S{|8gl{gL?pk6VfbOtEJE28pcFCrF^u)9;WOD~{tWJIOPri(Q3>U4U< z^80C+BHdJqxZE*=f^(GTKf>s|+#tyVZ|dMrm0`i{RqHGau8wz4P`?R8$DW7ypTAKW zT5s-*)uX2Qp){-vy~_pLZMH^U+I%fmx94=rV8E?kF%@UGpHdH(DGxb2Ue@%WM<93f zQIGtw4s>UWd!~mrTJHNVQl5ihDJ#{JkP&>dWu_d|C za}Y~#ARk(qd*ha;Xhi)h2v@Wj^_hCP_ZEslz~xI*`J;dZyQLQI-cfw)><_H96X1;= zcQHlt;X5K%w(OpvEW6&Izk7MSeH(wTfo}c9bHje0`#*A@Q}xh(??`T6c5Ks&;BX(W zw5@mde$DfSDmg}k6w{Hs)N41fAjBWrr+$@x#87cvfCFc(FF{rx134fL>j`O(VX<;T4}HSM6?hcF ztQNMG$7OOqG%8SIMBuvB8*VL9yDA88qx0sXmDg#cmkr0Z3?@j6HL2LV1O)=jaJ3M3 zK~bUR0ZDgWRRZ-`l*Y-3-*4ZA`_VKi+Pf47L`~_yaJSg57^_Vs%6Q@2w}kq{s^2kH zxz}SK>03mdrL2$wS}#kcb`W$WKF6uf#9Ex~CJ_fkz0Y{UTr@0|Mwx^*Xbb1od?U7M7UP^JoD?}mAE%NID%p6X*p%_rMzpih5t<=D) z07P)?vbouKLxZ3 zct;JH{|8i73tGg>p>vM08ve= zGJ)fLr3lH%+WxPg>~U~7xqnGv>@QL>S7^x8c|*j=AVlyt>+$cOy(=%$-~7EBvj8UJ z)PRWf@PY{%t)pJ}*tLHTqbHMuhnXf^853}jEOxS$)zMlfc^gww#;EMfJL&wD-HpKeRR0dChD1%sNC#xiOhzC=Co8*gw0i zv9H`QekLMr)jVEZqjWA0H1@KeLfFo3DuPUY+C@-9l4(&|j=H8Tz4sBoxvNd@#_cOI z9tt2u9(GMIlYDxE_Y=nWmM-)EF8NK9J<0<72E?6br-SEUj%RW|GM%>x?+mra%(OBJ zeb{6Z91OUn2*Tj+nbumD()2WTX1?CPA7!4$iXTQ=W-ffM`k9nE4z^nZFgMt6t;_Jp zYnvU5nI4+n6rNk)S&Jbt6}mbmyjyVzvhx~=%&ihIYuGgy*B2OiqjK|_a@A4L7Hrr1 zb+?_$)bCAP`jLH(w2K|l#A3GpLBE_O#z@Otd?WF1V#}b`qllcEn#Tk6K{a@LqZM2& z*&N8F$(=v>eDOr_4B?rfaHgbG6V=FU+?f(HKNb$iz6!6s+9{63JJU!5pb&9X?Mp*N zktxu|IgjE`sSIp;s`_{B-3YvLq5D5Ofux<*323)y)Y@e3U8WC)X?Ya=f0Xgkh{+WB z3LvP)f!?S%yow462H!OsIp9*b{`1jVC`NNV9mnvUe>6Z{a|Q0wc)rq%S+GKzzGmNG zIbsPkk^`_-OWH4jlO29Kdj`iboiJv9Py=^^%JRdJ_QmcqUK^hniBTX|3d>|DF~0be z@*P5c4qB6hl!0Lq)J?ww_j^QPcA*e?BWBRjbv3{3ko`@&}+i%ryXD%{(Rm ztEzYAOYrytG)vkgEnd9KoEsTimO7XWe&pK)S*b5I>kVFIP~eG|<7utK{`rC8Sc%QW z?8POOfzXmbJ?Cz~0NDz&37l2UkZ7i%*?Fv?=`44>{h539?D*X{8%=4u0!?45?G}64h@G*2g|u!+}s%9w*HS&g)K?JtP^+Iv&oAmt;ALGdUuMao`j1 zXDF|YsZ~Olt^5OLsi!ImvY})b!iTZ`kLYKz-50}&XviNmJ(bzWPaFjsm62aE#GVK7vepqSit^o|a$xDR&_O#3>yrb)29{8apXj8v+v0pWlXpTvgcq3`w zl_ePeZMA_paHTAshxVn^)n^DvuD#CW_Nc_}1*epGjZd{d?t)Rq{h_}=lQ-jaSOkE? z+S{l29>P?EIj;D@c#wWp4G?*@vRk#pETvO{lTW5DB#clyPp6gM6{n#yo4L>B<><`` za3iuT4xIOUy9 zvUT98wLknohP}qDiKy>;XP<4!@)AN51&vry=d0mTa&?n^S$}S&KjMj!2QdlUgG*4V|(;Ifnc%;wsyEA7YfHj>yUs<#@3#l^o@M`j76X{_1jD z;=p_nPTA@ho5H&}j7jVyN_siDs5fkzhpPdC^AE-FUBR7QdI#=}AIAI)7la??3ku%u z5wKp=gXLW`)*0w0@;ocJ3LZO`6H3Qi^!Vv@zpfOnCM|B6V~m-~u3d47 z(&VCO&S$sB07Lo3t)J>*Anc;%NZF|g)*I;5m$0G2ymvB!BiF zokx?i@Oq*)dNQ9@V;CHHtsqR2aOd+7+?mYNiJ{7%VxgdrXF6n+2*i`o9fr4UUO`zL+9DFcWoXLH7j^}weevOx|Ed_$ba~{D4|?B__1}%VDt+Y3$)_=a?Q2@ zdjsqw70@pUisJ0 z`OkojU;dusDq+1l^?SUkkQplIOR@UKxCxR=rB&JE`(2gyk0ad zYleYrjwD+0q-|av575`6Ra z?~5+~cd~wPeLM>_sr} zl}awl6d<{B8$JE zwSCXlUR`8egoGE2fjCtIJS?`N&Z5wCZU59a(=9_QS9a6piu!wBKSP1c@ ztc!A}%h2GBP(Vd5`apbUg8T997~+S0R;gm88axjT2tRp_W+0UiQ{_BKa8x7ivM#3S z9lG+DMWsEGwAZ>^|Bt=UXjCf1qA=FMrm1hj!!HW)Bd}ohCa47t!gtK99qK zpW0O7K zvS^Mmi5`49F0}B5mi!_Qm=HcHU>02IkTlGC$EmxT?$Gy`PhQAp&n2dWm2cG&s6wy< zaSVTG2lVt|#B}^f82kf-X@)`h(y*EH><_Kl+@pCOC1t(x#I;87M7?P-HcmPa5KM!z z4aK?ds(P8dUF6P3%$YAm(Llc|^-t=g#JMr>3;^q&)x~DQ`85hE7VEKK!J7`%szc#j z8ZfS@LGl(~qlw79YHio9Xeh$hI+XhhVKZ-_Zm0G0HkQz4 zm05{G(bHwtu%G)s3OByuYIw_kO#5^C@1qwEbhn8jdg>=`;Wj28^Nx0XdeY`sO1&4j z+iE%TgHBFyUFWg!?gnU=Ely}pK~lO8D zP}Cc?zSw8+F>ea@sZ^W+cljtQ|F4C!>BVqFz+hHQn5r}6D8)a#loEyfp340S6{5vu zbv2JITIm4LDsF6y$8@qw&hzp@lF&Gc;M7kTl)mbZ@GV}Q3E2h4`QKiu!6%URNG7V@ z#@W?PDuU<}hfAcVbPAK4;@Oe{?z;YK#vP&h)Q4! zR~@p_yTNgG{$l=1hxZP%z9KikBhyDFezx_LrayLU($)GGds}t;NQW~5r#H8+W*xUAk=l{9Vo)*#Oms+)ug~ILA z7L`>rej}Dx4PWDPZxahUyhw@{Gk{YmaOX9Q|EAfyBjk0ld6OB32rHkgnj@@$@^%IM z@lsC7n>fGbY=QdL-rts~xu0nLiaA*Or-KE#7L%kvb1*7`kJJ%Zp`1b%+yGE!)WqsR z^BgjJSIU8_1rcaYpQyDfYds7Qnc~gP%CVGkWD@$Y`@s!0DprH2>sDHv9NVp~6%1jq${XZk~OAWv4`t6V`>NGVD-i7|;S(Hum6T@y;( zxFW}BeHa?rHl|X+muHsphBTT*Wh~|f!S|@y=-9+X?C(CmE(`gPzrK@X;u00NlBto< zX21c(?DQRHb;-I+DLavW;ok^wjrvRY$IhU$-|N$Q)&ujCe{^yabAjDt{`SLjI8W(0 z)lQPsqH8XW%ct!mscnmw^07%r{q!5U%aLoU@eUO*W|SjD9lB|}1DYQoaOB&(G-4)|8*om$;_Scq_&;!MO$XHF_uvUcF@ zst{!{2HWJg1I*L_)eHw2F{{Kg>x?Yw3Zk)B2W_7)(#QRY=@Jes2z0hH?@6gpSRO8W zSCEHF9Kn0O6WRM2x{AGUF$&0r+GP*a%}I<+x0cX#aFW?2Y{-BHnOqw9FLakU8tpk# zQbmIk!#r&55kk9CZhNQ-tabL@p|_<8hL~oK#s0Y}uC4m~1U-M6R7Q;w{78YRd(hev z5}GY%?Wt@m87yP_ubYYZZe#dff|~MsDy+~A)$Ja$`@H9s)KI%{?s)Q)_aZITyYx1> zzJwpeyK`|yOmc|A)c@+QzsICASFGXuS$gmJY zqXdyPaw`f5daTtP;ae6aNfa@((GJ83juHKg00Z5Ud40t z@geI+5jo5V?0vySDpz`hORz5U!iAp6^s0sHm?Y70B zJ4-2zL@V8snh2{$zM^7`#Mg&K-x(!yWiVhzfc4Z<@|uA8VV=ugpk!(mb7NP=-A%QS zf)QeZmNPq)Sjo0e`Z%Z;Tre@BV)0{KFIwukx1N#6l%S>x(-Gh*(i2l@TBB2+fxw8# zSz$KZtW?Ce?X~%Kb0m}^vne1#kjy*|6g0>dGDRgY#jh!@@~ILFxwm+V{_%-N(?5`y zxxua3O?>*<`Xde6^rb)o1=BTM6Jw3WMlAzNbact*?soh@$&b0>|EcS{|9&k>veIuyoz6~p18~&wPzy@AolNBDkkn!N?=FSmdP@xzk@PRElMOx8YC0mS^zI>dOYr+%=Gty(h+hPUaXjLSI!+-xys(>|p-ZX*(|ztWxZs&;q=_!plH!Cj_z|$|J60>XOte2LMF(5&k{2)@13V8)Flz7|0sgF_jIR%pgh}~!=%T$A}2-8_TJ1e4I z>GkT8{FUD2M{4}W+-czcYiiQSCX&7jl5>bDQ_&(4eI=9c`Ltm%+O@nw6iceNN(p^m zn2sc*x$MRwKjHXzl7|)>)j(vxh)8hD^0aCHB*=~5AX-cqAWl2^Ct-!3zvu@0#$5`; zigQRnQN*IIwoNNOodh^?NZ3N~IN8s4z`y(InNCxVz)f3skOyMiN>lm>Uf?u}u0e~L z=e}2%Ajs$8=woA{L$+TAuE75DE(G2+8p-PG0Nj!m=(;aP%T2|yBg&rA(3T*VNHVb4 z71M$EaCBZ21}5N1CjR>Gu>YO@4KY>_!@xrF$*`z|gIEk8o?Y11%4Do*6VAB2@ZWH9 z47gbMDc}vVg*CNlL}b{bG`;6uEX6CBC%W`+3j^XPoik1)e11`a#JNQ19X15TfSN`s zoHQ(3^zI37bz)ZaDM%^Nb9m0P37Jbo043%9qS$!a5;W~nk|RtiOa>AmiD5(f#EK7U z5#-O--F*R^s<$QqVQpn`7IOXSzrdZ7l?YLR7}*z}2cDINumG#xw22svfBKn44U^4M`IbM%B3ua_K!Zp5VmLRdywEoewv7cy0zWY3>$=HP?+s|Au_@y%y}pCG_AFO7t$k8YqOLTw@6z_%{it6*BdD^fYfx|FP7a z+MKEJXhweFV?xCXWX8pXTlcr}QHS2sCYBA2jr^`;ro2SXzd=~>K6Jn-?9pSD)BzTkR;N5xv> zKCn!}p~rUnn}KV^4YS9W-<@q4%)XovJch1^{namqVPKz8{n*{O(zXk9`o;+x#Gy59x|yFG5&+Ad`}^X% zEkDZk%mVErYXu}|NJ;UA<{P}0a?>+J8Iq0#$C0NYZH#GaGRk=>Hi?cY>yY#@zudDc7_T z$l7^R-TCR+ly#bU9?c=RCD-2L9RH^KjS7eRU=HA(icN}4+n2eVze_AiV96yMJlfprQCDac7!9S zJH(fE;PryJxQAJ1pFqh2yRx5@DratdBeHO>3L6@zCFlDE5a8=j>qjY6McJ)cD;PG3 zS*1Ug;yr;N?a01v_m1gmllSw~_&~&g0d@(*S6hD7MJc?yQ}@3d#&1l!*9;+hk`9oT zT-}k#F=})}oZ%y9kxIqs0D8dMOW$w*_(m)SNdvC>nf|U|cVIhNVOBQ?tu+(xgs6&PfC}u65T@6rB8TROvhD7go)&E zz;w!@%ct2q4LT`jKF!s6WM^6M20yxx=h@@C6epAAyoj!OG6gVfjip|W{KVu7&{_1? zEMHOJi+swMCWSp;&caHafQ-Rr@&QMW4idPoNfBrQf2;iM&O~T?JoX? zNQ*!`nEC7q#8XyyK9=%<&efBYy_b)`mXwn=!ZY{w%iWS zfN<+I-H85qunu?Wo8}W!w}|vbWRmJGM&k^X?(h3MI74{|RaDsne;@rCG7p{j0ME3v z42!77V{hugG!GW#d0UbGZa6mWjN3rvh}e?vsVOpeY6>=ID2E|M>Vr^avH{BI|47YW%{rQof`(W31+A7Pyk?F~|BeRVZ_^qgYc+J3_s}kN-NP zZ+j@t$)%DYmDh~T7vFUKZ{@Z7J-;FtO5~I}^+&hoJ7RR!#=RifM#Fu&$z=#~6L3fR zG*a~)*lUyQNUNWy4L^PyEz;Va@)TTlHaH%^8DNr|@eHCsfs`9imb~=}i+ZynjQZ}{7}qmDMv&hn5DT&^+ywHMZjk{x>!-06Khf4=Ih0HjYRWc^ zml}9^^o`dV13p{ZK4-&Tjh*4Cwy<)Fg>TS102Hs1nT2Grs#67*gVq6FKEL%>UFtMD zUTU0;NNnz68B+U;gSg%jJR|LM(GXzY+Xg8bBJmqpZ9}R~*yBESM0H98dJtVNTa6#^ zLnC{gub?;!h2nfhDvh(|D+~|NeOS z6-~N;eDpV1x(XjQVNW(a1Grj$0i%K|xO178DgSx7Ifs##+pPI3{=KkKT+6t1l1qpm z5h!2rsV$-2pB92H=!xSJ66CutaD%}Rl@#2W(f}4(VUKPchRMjmcB!$AUF%tMQ0HT8`{33l2ei^ z9$ufHdA^zbC!2Z_ZGR%BuU$$L=SsbyG2UTZ$fEbVFQl;PBxs85+rB}Hu(N9v3glRIScxfO+`q zME#+2@TBHtQ4Pj5fNaA|OzY3@cKVwIc@$AL)_(UsBIoUZ=8{bsBz2@gEl`3DeeW0t z>WFz9#}(=WCt!Cv(UF=|(#@+Nz80as+8_xE-yQ82JQ_F7!h!S!q{-rt2Yu)F;k&Kx zBlPnl^GYDBU2}PI1qSvu$#eTg%{Ib6T7Dn4jH8{T-QU(?=tK$Y7hrXIC72|}RJiUg zy3)^%H1b9Nd3T&cz`mQ1E$s2hzft7*{K4gq*w52f+5PQs+Re9+Cy7H)Cx^-s-Hn8W z>I4g7A1=Xhfxl5F(f_=LjQ^x%8;#bYQohW%HYtbtP<}0RKk4S_basf^`SJ!5@%6v; z&O_VKHd`3D6BwQ!%|Dc#`5ZI!$MnEG^W*?I4$D`1FmvOpvG!JMW)=*Dg(*3c zN3Fp=B-A}|mf68z0zFSvuO+kG0T$e|q;t?#C$3Pry=#7X;slfQX&w5W%z*=A`ejWE z$5dlOd)kiOl^ZLhE13;fLs5>S$1O%cyc2RIc2D*)KaVEMI#%}{R^ye(!n#le<5F7s zO2I4)9eF7&B-R~wwHRc6{v-nOvJR=z&Gk| zg)4k=@dF?7bY#J4K)OK|>hZ{kSIx;oUMANx$Y&E4V=ZgBzHR5r^y>Ki3~uF9&&$P$ch<(Fy%#&b z;(+rLKU1oem{viZS}Z=!SMqKBD%lXHp{y`4<_OP}yn?7LWZdp;sj^_tM(nTb>;^Ji z+8XOjff`}VdECW3%qF|64YZtO56>q^-&6HEvxAwp87kznMVg%G)VTi2^rDM%ZMSCu zN;qVb;TJV-jO|9HoUfo0RjaTE{|Y^%g&M`UsuaW{A(bd89jL!m=NqVDn3zUly-(S; zha&l5;Yb4Ds{MM~BAmhJ%|`d3&89*arqm3PQ36JfLfb+Jv$NxNl@2#0H)zxU{>iq1 zcoVQ1W<=t{zrgWl#%xN48|%v|=@h%g=dyeAV_8WBAr}h?iN7UM{!7hBvi4~(?W2+u z1}eIyR29l-uZ$iE@j_@!dr+8pg6yjbxnEExwqd->$XdA ziw-VzllTW2YeZcLD`iaCzXTxX22~#JK@sL!F|~#AsKQRN9cjjQcoSAd1O;DMC#iZ6 z7NqLA?W!KwLv?}JNd+NyIM z6Qphns_*YhM&nMJomA^OA*cw3mL~kO5kTSR zma6{|nIN9$JCF)$d08?R`O{Dsn9}%DgCUgX7A9)QlB2~$R3;9255AVz1jnf7h?v(B z!6$!VrUe;FsLGb39~iHN_HnAV=+j1@!p(z06YLxKMy3C~-{-e)lHyM=oNCpc0Tr}Q zR3KXW$G3HR-1ur`<(zI_y{wE3+nekAum%>vDWPzL@}7gA^Z0UjEDA z?%=gvoE{FezByCxuRjVG<(`6CClvDceu>Jt)VU#otjM28K%EFKc=Z;hm$ylM`^VD) zTZGZJZo+~oPjT?tV5;@xjQnx0fqf|}6qzXzP0R#ar|~(QD;44yUo|n&t!n5Mk`?b# z+uo}8AJsw|4&&_I-!wimi;+Did|tn9>HCsDN|GpjS)4cBF&kZKeRE5SIti?mWeQe5 z3|%W#n*oCgp7^ddjlQobl+g>!Gi-~Zfw!wF4Ma=9x&vwaD3Afz?0Am*lrr*m9~fOs zUqr%&yp{j;>eccR$2DOkn2!TYN<4iD3cIu2F%%zQg(SdGmk_!{W|H?e3QGa;Z!yWk z0Ef~^gUjvA9ZLIk<<^TnJ%oGbSFe3Mi$n|Y2B9>FSmP;hLY_H;Cx|`i8fDQBT%j`38g?ZS5_6wp|B3ix0Y(qwSFExfs z$ax>zKm6Qsb#5RGz$bZx2E7vU`S^EEsY4Lkw0OaRJaf7(>TX*wWYO|7LF+0)%}>j6 z$FbF_S9(d}e5AyqTIThk8F zT2x6`9Y>DaOSy2msE;8>L21?-P*8k5eY}%nL6z$^4(jP?(1!7ZUgGuA=@z$Y5cF=t zndA_bIH(2#j5%>D=uVwhIK%L_^_aQnL@IQMN)VSmV}ZHt8e!G=2EIv-QAIk-%=qn` zfVbi@1y_@8_7HyD&v~DF9xxMk*a886C5Kox9hfz*ET7W6)Nc>;#IzBt4&zxyb|$Jk z`tyqP8(|bJ(Rz_Q^599Li{fy`G@ z3N~|(rrv-g&34-a8uL<-!-P9OJLc1f2wrh?VuV%WTFy2cQ*q#^W9T_q3y{<759Sdh zV*HT1g!bOjrr6x}@kzpUz5(z~UcEY>S=7B2?E z-ii^U_>V=80>#vSjO>yhlhaXNi_d7yNyl@eon&3D($%ne!ZCdt==3W%ORVY3mIeNeGS#_JtK z$z3D&(&IJKU&i&kxF-_IACe$_hFX<|B3HcK>nnc3rOlav&hVjZI%#KCOzEhQSk5$V z=&>CkE@70pRu%qc%|$y>C?%KS-)G|U0yBq&=EO}_vN|yoo+szSMv{0Ieu2#`j0cx_%&|CQVG^3vHut%!Su{&A@{uc zA8{VK&EXX(4ONmKGMx8oA)A6ob2XKT(fb@~x;6&yGZ%+b2G_BsMz;AhBLI><`Hl@W zSNF(=L!&77pF_h@yhQdZBFTGp#N7YpepvI>cg-e8;r@4ZVKfh@FR}-Z5=@dZ;_x%% z3lvTn6Ge_^=h)ID`tb}DD8;3NeqOh@jFfjUI|ZY-;SWeB4aWopQX**sA300f*cMv9?@i?D zKw4b1+mmOiV7%jgcJfg}ELoa(D4qMu-ANsEKXcsy#OaC}^oPUE8SSf6623a3xD!jP zR$;C6y%_sZINUHuvp+TK!o&f|)A3%=@*(Z5`6m4~w&w#+VYuI?PjH=!MHjkCw|y2(i5zmB zZ>TcMIQsSZPDF8dT}PKmca>aw(Tys^I!VPqi`k|9#3 zarJzFO!olQhh2CGB9PKHpN?S1Km#w?;+s1H)<2=IDb@QH0B<5d?(X{_+)EVzMX8kgzeBKk&8=FMrKjqj`u)x6Us zG9WlpzYG6Ryxy&;mnwF>*KWj`7Yie(?A$d*64zb2=uq$DUtpkiO!FS$Txyr;$)J)jvqU|Lu{6l!QM}IjsJix(Wm|x1P~x$=(2Z=-h8(N7#UnBB)f{ z3Ss7kT)gD4Y)Ai(TDK`tsS+=mua?MK*5D9+2ciQe7LL|3(rkq0p#Z=!>4eSC$U^mZ zImz>UAFb1Ac-~#&Nk3Dn)o2=d4{yPQZ=^#Lu9{npT(heZ08|5_FDlFuJX?NU6Z%kN z(}p{MYQc7(j_hgBUs6MYV;+w>wG<_?1my{k_y2gwlks?+9^C=9^-FYuO`tH-ZN&cw zR2OywxQy#B0zP|24I)rFqr=Q+tox%kVp+~UY`Tr%Th94YOf1y#NdPr7jOnXW1;w4=N!QVYkGKx)$j^SMa8+kAuf z!gBHj=>a46vi1pS*khc!GR$0V)zD5N6bb{EIpsP`+ZHV9>a_k;XU@f>9Kc*yIpN^& zvZ2xrdPeuR%YDguD7aBWdkMuSFhRCsShK|D(%m)oVE)Rj<2|_B@(!gVewMA$vI$Ts zB0zq^jYt=q@I!PzAjnhXkMk<{^eeYKVX!!LYyXQE3^ryeF2c&>j(+^8^;4fzOQ4J* ztq9#<5C8*NUvMf+8u*Zkw4@w&)`nGzrb;;Oq*Q23@%zw21HQhI+wVmEDW9PVv- zm`lS)aS})WH;ifI8zh#}8l%tUjJo`%pSz5Hkc6rU3nNw`pn2Q`lXE)^ZT6LCUB!9( zu30MY1__%DBkGnOEP_jE1Ze9%gScHMm2r*t1f}w2O1u(eFH1)n=Km)Sm6%TFSsMWp z;(#|RE2?f+b~g~6k8!qDQI#FrK$%{qBC${cAl&JR4=F?Y7MR+LgR3FGqk?Fw)t|9H zhEepAU<4Me?L_cmj`p1En^isGRrWpMfO&?B)Xz&;LVHxkBN3vhf{Fu8;$)nNIZ+vt zXG2@?Lf>bN&nkAsw^*yJ@FpNg?F~?_g@3}Xy81v1$?}XTvs0kAzHTcEOK6el92&ay z-fNbvK`2Lv-E)$KV%-7bgK>~MQh`y!|LL0^8WRdpZ(k&$wQKxp3(j5AI)==L%kLZ2 zz940>OrYgnvCD+9snj-2&t=D8`)@09!_k@n5K|Hf=vjrLbWBEN;~=;TnzKGkBW<{u z?4sy%FZbckvjCS8-5dQo_VQe6w#kS(b2AgWDkd1}fZJ_1S$V6A&PH6DukM&_ioQF} zI@6j#M$9yBe4@t+XB|Y4;;5Ea#y}i2w$~=D{DF(>-W|(WCXW0ha!}LDn5x3%g5tLN zA6$S_^8ZEwf{7~;A2^cJB}}eH0jr2$BkD%fFf>8JwD8NIIcSDkVsQRG=Lp&IbI$an zgyj6%I^|q}r{xTvpE}4&1)3OmN zT_}XwPD<3?fjXN;O^T8noP#Bw9){zVCck!&h_J)p!&>sLhkd+x+^_2dp4T8T07eFvgCnJG%?HM#@}Yk&@DC5V{UK*7Q$<#x0$o!^>$fGJwh1saEvJtnDqlN^?W+9Bq}#$Y zTtL9RYNtN02xHJnmElm9lq4y(ZJp$JMt#Ojk&af_O04NiFfnyqn}qmG-3g)$(74Ur z7{95$kI{RzZ9i7X%C&=l9}j9K6lV5*wGpzRrEiKg#reC!cG&4T?1`hcZX#rrLWHc+ zRcle}Y&&4rg)D?cF02@`7?3;F{(x(Wq{L=-;aqVs;B3u}c2Iy&ugP+*N9&v%_)Ew}pWuHsRvk|HS27c7La zc@u0INV(3(lRjWae=YQU8}BHp+^u>0qGIE{P{wB^u$+rpxHVcvJ-1eTGdpUJM> zP0)3Q2?=^a`n%c2P7BHlw8AO!D1mKq=NxYmn{$xW^@Y55S@ zH*Fcv@Vay`hs=GTZp$6Th7`z@7eBqWDMM0`KWc+!hXR~ZzrZyXKT6wT8epIk!2`ry{(GC_1usxGe8IM;R3-o!s(L}0zx$CguA-f!OQ2c~&rcUou1#o{t zZ9Bq?)5sUvNyW%OK3cbXPJN!kY3)Q*{sEvK9=9#8iz5+QA6wqZ!cMy#zS7j)CK~|v zB*mrR^y4vfaIfy;Ex6ngbj|vk&vg+0bij$S^TNJc!)#2dlzh!2YJY%M_5EN+#*6=FDxWCpz)c*b~ZpyaWLD|E(LB%5(BIB#(3; zIMLFlk1_ZX2m*Peff`)X<(KnH)JMI+dRR;Uu%M zGGyp9Nh#Ln?RA<{iz9a8b=mG@-*m^%I=8x&Py3*(nv!b_=7y6$kck=T`V&>Up2#9x z%t$K48@ne(SkH8C1!y~`-N@5KBj_(`sB*oj^Tp}1psm7R-y0%L_O;FbZYNK)*wbi| zI2~*WuM4MS7)qm6dcW|y2d&$S!adc8)^lBSUgQsScwLtQzut0GD6uox3Kn9Cj3*Us zXti`$?reV*Hb7B+!GoZl-|izg2xHVS$OhrQDz9f`^fN1i01ldN!dP;DmR!mvt*}rx z(`^3C%Zvjz%H|cJa@^g6*J9kT3&-|5JgwO5?Rc40#D&EL(tP!ibG!rIzML%Tiqou9 zI0pTWrkO@YLP8A%yJHX{S?W7P3ayf-3^K;9o=wft7U&l4YDXVT-U7P8$ z%f0{-Vj-sU!5+#D>^96t=X;O&-_l}Pp3qslTZI5PiuqHrb2ovwhxo4u&#%DNjDkY( zi?VCfVyn1UtOJWCiRj`K;D`2wQGVLo#OE30$7y*_Q0=TAe4642-=Mxsy?3t*GtLii z>=w?^jGvluqojQ__x`-fdJnyHxOF_%F-G`~rhIhpFn)Z;NWyQ}c@^bqz_IH?FhDg~ z1~*Nb8TJ_qki<~EPDK7V`hFfINBAha6ETWvIRP(tRLk)_t@eCUr~J1EJPD2u2D4Wd z4X;h$@N8&~>-l^UYu;~{@93hFMhsvVn*Gj(IOI4)M2lK~jnAl+nzEE^ zf^SaRS{sh~m%on=OD_*QKyDx(<}LkdNJc2 z_y&PHX$p_b$_C6rHy1V#c40kYKwMU4++oylQ6ZIqj*TAITSY;&PbTyg5HCICzY}{< znuxMxL@313s1uzErIBMb8@c%`=|a-0tIg!$_t7>J>Yq*H69=p)BtFHuidIB8-ggzVu4x!YT;+#aDN8%&)z1~m zf3bsX`FK@430j=@t=B~s@&_{$%uspKV0_ZsMwO~aAgsG7$@}`~SUJ<`?Nx7m@yI%a z#CdyfrlUP@Eh~<{i}yBJMf9n!3?m!Fh7gT*elOjtJX$EC9eB; z<$vu1w9>GdoUQ=or?XP^PWe_%K!9mSv`2ovGE~2$8`Z`h+nmPQlU%CF`U?KPE6;3eS8h`ZglRPbUs5ux@AG0U(um-OX(X-JZjtWIPg<$P?Z0A+)7{eGK%ijFO8p@^xw34YWJ~CH0-Wp%J_V8sv5wpsN%={BYaee`g1stp~Nr4Q! z&K-=U==STI&)eO)0;vYNq#_4!D>3aPlV`ckJtwdIy{;Szc`jFH&I=@&czL&Kxg~b^ zna&*CEheE=2>j|mEeG2o$r=tNBC!JC%ZYCyh<_2voG2LxYt!lMcb2kA@-i6kCUdy(9b^Lu8kqexwbW1{D_85op#He3U_U3T4L6+>EiXGQCx84zc56ccKX3J zrUdE&9VGM1br_Dl-xa2hCq@2^qoTV{7qUJ_DxpC15Nvi^kDNkcVx6O}^3$At{hZkA ziMW@f_dQI8cgUCqZ8<8e@cH(!*IZ79@8~?0J#{T_GqWijd#;lap07I3j;Y>C*q6Aq z4BQ##z%Q)*OanBRX}lBS5JLcU!_D&q@gcIJoveq2&bwd*vpI`l@nnuCzPLqHzklvM z8WmJwYQcW(uKh4=kdfWS*RXV*#>y7eOSEqp!$Je7m#eMb=FmH3j`wVBreC0PR1xvE0pZLynQWc!9M?l`>FD7L$Yt4{Xv zW|9rD`{ zp>be>-1dtq^c?N8Y}L2)QW~P)?TtqyEg}uYD_L@RPAlvE6xG??nEQ|(xTB;S_b9?M z3z%8DamFWZd`(QkdFS0&nX|4Owdhk3TXt&hNO6jAu|obm8Z${rVZzjM>-v{P(MH;P zI_ZPm2f-sPf_*+=y?A04xi23#y9e@(wRMYp>zb_$k-7{I+QW}X9}6oMO6N2Dagm`ajU2ghxe14PJZ&XF+5=%l)U#t>9djo=h$#V|E z)>c;cM^hveATr?|4_|QxpJO0K+u-6!O~Z2rE(FnMC37}wY2uxnr!fU)bs6*tHI}dy zsHi135fi?$`EN$T;6!qn53@tMmyjt=(bDWTz?1@EvU1J1M0pf|~r=L=>RkVH{LVhUC zaufpU91mLl(s)d2C=FKU?jimkr$JALI1Sj=3`tAU^X*bl+BL}a73uizu%5Yr7GTHX z6_x_Tf0n*<0M6iO8L?IrI z28=ex-EayvR#<~KV*vIDJ5Da!x@tRCc!Vq>o_vu!z8G0JaiBV+p75caCu$=4hIYeC zluHb~SY2SNEO?1!NZX-erhyXf@*1nq@hR@!@e16emCJqrH~2N)q!wQejWncV_>xjx zWK-Lu?UI0?kw}DP5(Xs0;YU47pi}T+Kxll@?$cDi|A170N2wvn13((^n3n@X%MK7& z0RKbWky~R9#u#cKWFdP7f+_xTIZ=>*bUx#?Z{)ZH-Q_7=if1GQ6NrT1SCv~bEv=8q`;}nEt z-_NK-b`80(YarWrl|5>t$lc?M!$J8ueclG)xnn8D%sNct=L=Rq-iMU#3tFjrZI9I{ zI)GP0GSRI3uvpxa{jDBEb_@|geHb(!mfK0@GYoYuS_%REdT#A8}ue{+q zF*gqb8HV@+aPwSQ@mJqc6-Sm%>PIxEw*}7pIQ#R9nozmgt1+NUgaNImy<3YNrkySX zfGv|!_fP{G5g>j)IksKeETfAI^G{P8KX}~B`gw_45&>YGXR3=ubSA$e;Ms`|gt&!3 z`AMmUwOQLp#EMVr4Ttclud zVz`0`3lKj}_nE)a1`8^~c{8j~3Mq1^XJIEvvw94r0GI!Q%x*B+b#}AeSS$DfHXmks z>Qwiop^ZYKnGn^J$)&8|iO%3>&SRXX zPs;f?Fi5$koPgz^3D6@AT>tP}UzHTSRvpbwWWfAc?mY#>z684q3gy48ZSM6F+AlhE zf<}z;E!>U6@1NNKVmcVd<`bccFKCg9s!yf}7`4L!L*&lXbd`Mvykbu4#K<|o;Y#|f z@cJ%XIEx9a#Rpb2Zlz;6Tkt`9^URH!etgKgLk>0d$)DwuE6+34zw2kGe@~GA_wEaF a{8WnLv}gZi<5zSH{?gLWSFcpH3H~3CRmyz; literal 0 HcmV?d00001 diff --git a/Documentation/docs/client/concepts/rooms.md b/Documentation/docs/client/concepts/rooms.md new file mode 100644 index 0000000..e69de29 diff --git a/Documentation/docs/client/concepts/synchronizing-objects.md b/Documentation/docs/client/concepts/synchronizing-objects.md new file mode 100644 index 0000000..e69de29 diff --git a/Documentation/docs/client/index.md b/Documentation/docs/client/index.md new file mode 100644 index 0000000..698ef9c --- /dev/null +++ b/Documentation/docs/client/index.md @@ -0,0 +1,25 @@ +# VelNetUnity + +### NetworkManager + +Deals with instantiating NetworkPlayers, and dealing with join, left, new master client events. Also manages the list of NetworkObjects. It maintains a list of prefabs that can be instantiated, as well as the prefab to use for players. + +### NetworkPlayer + +One of these will be instantiated for each player that joins the "room". Most application communication happens by calling methods on this object. Voice comms are also handled within this object. Only one NetworkPlayer "isLocal". The others are remote. The local network player is the one that can modify it's "owned" network objects. It also has a special networkobject representing itself (setup within the prefab, not part of the networkmanager list). This is where most of the user behavior is going to go (e.g. an avatar). + +### NetworkObject + +Something that can be owned by a network player, who is responsible for updating it. Only the owner network player can/should modify a network object, whether locally or in response to a received message from the local version. NetworkObjects are delineated by an session-unique id, which consists of the creator's userid + "-" + an increasing number designated by the creator. Only local NetworkPlayers should send instantiate message, which contain this id. This class should be extended to sync and send messages. Scenes are basically built from NetworkObjects. Scene's can also start with network objects. Those are known by all, and start with "-1-increasing". That should happen the same on all clients, and is done locally at the start of the networkmanager. An example of a NetworkObject is SyncTransform, which is a simple one that keeps an object's position and orientation synchronized. + +### Ownership + +Ownership of objects changes regularly. Any local networkplayer can send a message to take ownership of a networkid. That client immediately assumes ownership. The message is sent to the network, and will be ordered with any other ownership messages. So, if two clients try to get ownership at the same time, both will assume ownership, but one will happen after the other. This means that the one who was first will quickly lose ownership. + +### Joining + +An interesting problem is what to do when new clients join. This is partially left up to the developer. Any objects that are instantiated (or scene objects that are deleted) will be automatically handled. + +### Message Groups + +Clients can manage network traffic using messaging groups. This is especially useful for audio, where you can maintain a list of people close enough to you to hear audio diff --git a/Documentation/docs/client/quick-start.md b/Documentation/docs/client/quick-start.md new file mode 100644 index 0000000..1d2e852 --- /dev/null +++ b/Documentation/docs/client/quick-start.md @@ -0,0 +1 @@ +# Quick Start \ No newline at end of file diff --git a/Documentation/docs/client/samples.md b/Documentation/docs/client/samples.md new file mode 100644 index 0000000..b5d78b9 --- /dev/null +++ b/Documentation/docs/client/samples.md @@ -0,0 +1,11 @@ +# Samples + +This page has a brief explanation of each of the samples included in VelNetUnity. To install a sample, go to the Package Manager, and use the Import buttons in the Samples tab on the VelNet package (`Window->Package Manager->VelNet->Samples`). + +## Basic Example + +## Full Example + +## VEL Voice Example + +## Dissonance Example diff --git a/Documentation/docs/client/vel-voice.md b/Documentation/docs/client/vel-voice.md new file mode 100644 index 0000000..fc55e76 --- /dev/null +++ b/Documentation/docs/client/vel-voice.md @@ -0,0 +1 @@ +# VEL Voice \ No newline at end of file diff --git a/Documentation/docs/index.md b/Documentation/docs/index.md index c2b4873..6ca0833 100644 --- a/Documentation/docs/index.md +++ b/Documentation/docs/index.md @@ -1,19 +1,57 @@ # VelNet -An easy-to-use networking library for Unity. VelNet is architected similar to Photon PUN, with a single server that acts as a relay for information sent by all clients. +VelNet is an easy-to-use networking library for Unity. VelNet is architected similar to [Photon PUN](https://doc.photonengine.com/pun/current/getting-started/pun-intro), with a single server that acts as a relay for information sent by all clients. -VelNet consists of two main parts: - -### [VelNet Server]() +VelNet consists of two main parts, [VelNet Server](/server) and [VelNetUnity](/client). + -1. Set up the [server](/server_setup), or use the default server at `velnet-example.ugavel.com` -2. Install the UPM package in Unity +## Installation -- Option 1: - - Add the VEL package registry: +1. Set up the [server](/server), or use the default server at `velnet-example.ugavel.com` + +- Install the UPM package in Unity: + +=== "**Option 1:** Add the VEL package registry" + + ![Scoped registry example](/assets/screenshots/scoped_registry.png){ align=right } + + Using the scoped registry allows you to easily install a specific version of the package by using the Version History tab. + + - In Unity, go to `Edit->Project Settings...->Package Manager` + - Under "Scoped Registries" click the + icon + - Add the following details, then click Apply + - Name: `VEL` + - URL: `https://npm.ugavel.com` + - Scope(s): `edu.uga.engr.vel` + - Install the package: + - In the package manager, select `My Registries` from the dropdown + - Install the `VelNet` package. + +=== "**Option 2:** Add the package by git url" + + 1. Open the Package Manager in Unity with `Window->Package Manager` + - Add the local package: + - `+`->`Add package from git URL...` + - Select the path to `https://github.com/velaboratory/VelNetUnity#upm` + + To update the package, click the `Update` button in the Package Manager, or delete the `packages-lock.json` file. + +=== "**Option 3:** Add the package locally" + + 1. Clone the repository on your computer: + `git clone git@github.com:velaboratory/VelNetUnity.git` + - Open the Package Manager in Unity with `Window->Package Manager` + - Add the local package: + - `+`->`Add package from disk...` + - Select the path to `VelNetUnity/TestVelGameServer/Packages/VelNetUnity/package.json` + + To update the package, use `git pull` in the VelNetUnity folder. + +Then check out the [samples](client/samples), or follow the [quick start](/client/quick-start). \ No newline at end of file diff --git a/Documentation/docs/server/index.md b/Documentation/docs/server/index.md new file mode 100644 index 0000000..ca08ac2 --- /dev/null +++ b/Documentation/docs/server/index.md @@ -0,0 +1,17 @@ +# VelNet Server + +[GitHub Link :simple-github:](https://github.com/velaboratory/VelNetServerRust){ .md-button } + +The VelNet server acts as a relay between users of your application. It is not aware of the details of your application, and a single server can be used to serve many different applications. + +To get started, either use the demo server at `velnet-demo.ugavel.com`, or [host it yourself](self-host.md) + +This basic, single-file relay server is designed to be used for network games, and is similar to Photon Realtime in design. It is written in Rust, with a single-threaded, non-blocking design and does not rely on any network frameworks (pure TCP/UDP). A Unity/C# client implementation can be found in our [VelNetUnity](https://github.com/velaboratory/VelNetUnity) repository. + +Like Photon, there is no built-in persistence of rooms or data. Rooms are created when the first client joins and destroyed when the last client leaves. + +The only game logic implemented by the server is that of a "master client", which is an easier way to negotiate a leader in a room that can perform room level operations. + +The "group" functionality is used to specify specific clients to communicate with. Note, these client ids can bridge across rooms. + +The server supports both TCP and UDP transports. diff --git a/Documentation/docs/server/self-host.md b/Documentation/docs/server/self-host.md new file mode 100644 index 0000000..3b2672c --- /dev/null +++ b/Documentation/docs/server/self-host.md @@ -0,0 +1,53 @@ +# Self-hosting the Server + +VelNet's server can be self-hosted with modest resources. The limiting factor will almost always be network bandwidth. + +=== "Option 1: Pull from Docker Hub" + + Make sure you have [Docker](https://www.docker.com/) installed, then pull the Docker image using: + + ```sh + docker run -p 5000:5000 -p 5000:5000/udp velaboratory/velnet + ``` + + or + + ```sh + docker run -p 5050:5000 -p 5050:5000/udp --name velnet velaboratory/velnet + ``` + + to run on a different port and change the name of the container. + +=== "Option 2: Use docker-compose" + + 1. Clone the repo + - `git clone https://github.com/velaboratory/VelNetServerRust.git` + + - Make sure you have [Docker](https://www.docker.com/) and [docker-compose](https://docs.docker.com/compose/) installed. + + - The docker compose file runs both the control panel and the server. + - To start: + ```sh + docker compose up -d + ``` + - To stop: + + ```sh + docker compose stop + ``` + + + This builds the images from the local data in the folder, and doesn't pull anything from Docker Hub. + +=== "Option 3: Run Rust natively" + + 1. Clone the repo + - `git clone https://github.com/velaboratory/VelNetServerRust.git` + - Edit `config.json` to an open port on your firewall + - Modify the `user` field in `control-panel/config.json` to be your username. + - Install rust through using [rustup](https://rustup.rs/) + - Install: `sudo ./install.sh` + - Run server: `sudo systemctl start velnet` + - Run control panel: `sudo systemctl start velnet-control-panel` + - Install tuptime: `cargo install tuptime` + - Install onefetch: `cargo install onefetch` diff --git a/Documentation/mkdocs.yml b/Documentation/mkdocs.yml index b7acdcf..e37a4bf 100644 --- a/Documentation/mkdocs.yml +++ b/Documentation/mkdocs.yml @@ -1,33 +1,50 @@ site_name: VelNet Docs +site_url: https://docs.velnet.ugavel.com +repo_url: https://github.com/velaboratory/VelNetUnity +repo_name: velaboratory/VelNetUnity +edit_uri: edit/main/Documentation + theme: name: material + features: + - content.action.edit + - navigation.instant + # - navigation.sections + - navigation.expand + - navigation.path + - navigation.indexes + - toc.follow + - toc.integrate + palette: scheme: slate primary: custom accent: red # background: custom - font: + font: false # text: Oswald # text: Merriweather - text: Merriweather Sans + # text: Merriweather Sans logo: assets/logo.png + favicon: assets/logo.png + +plugins: + - search: + # - social: + # cards_layout_options: + # font_family: Oswald + - git-revision-date-localized: + enable_creation_date: true + +markdown_extensions: + - attr_list + - md_in_html + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true extra_css: - stylesheets/extra.css -# theme: -# name: material -# palette: -# # Palette toggle for dark mode -# - scheme: custom -# media: "(prefers-color-scheme: dark)" -# # primary: custom -# toggle: -# icon: material/weather-sunny -# name: Switch to light mode - -# # Palette toggle for light mode -# - scheme: default -# media: "(prefers-color-scheme: light)" -# toggle: -# icon: material/weather-night -# name: Switch to dark mode diff --git a/Documentation/requirements.txt b/Documentation/requirements.txt index 898468c..f522c59 100644 --- a/Documentation/requirements.txt +++ b/Documentation/requirements.txt @@ -1 +1,2 @@ -mkdocs-material \ No newline at end of file +mkdocs-material +mkdocs-git-revision-date-localized-plugin \ No newline at end of file