From 8fa725157e209d7423581681f707675b16e9eb95 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 16 Sep 2020 20:27:50 +0900 Subject: [PATCH] README: updated example --- README.md | 63 ++++++++++++++++++++++++++++++++++++------- res/example_path.png | Bin 0 -> 13208 bytes 2 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 res/example_path.png diff --git a/README.md b/README.md index 5e936a0d..183232c0 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,13 @@ ninja -C build install ThorVG renders vector shapes on a given canvas buffer. You can initialize ThorVG engine first: + ```cpp tvg::Initializer::init(tvg::CanvasEngine::Sw, 0); //engine method, thread count ``` + You can prepare a empty canvas for drawing on it. + ```cpp static uint32_t buffer[WIDTH * HEIGHT]; //canvas target buffer @@ -47,11 +50,12 @@ auto canvas = tvg::SwCanvas::gen(); //generate a canvas canvas->target(buffer, WIDTH, WIDTH, HEIGHT); //stride, w, h ``` -Next you can draw shapes onto the canvas. +Next you can draw multiple shapes onto the canvas. + ```cpp auto rect = tvg::Shape::gen(); //generate a round rectangle rect->appendRect(50, 50, 200, 200, 20, 20); //round geometry(x, y, w, h, rx, ry) -rect->fill(100, 100, 0, 255); //set round rectangle color (r, g, b, a) +rect->fill(100, 100, 0, 255); //round rectangle color (r, g, b, a) canvas->push(move(rect)); //push round rectangle drawing command auto circle = tvg::Shape::gen(); //generate a circle @@ -63,39 +67,80 @@ fill->radial(400, 400, 150); //radial fill info(cx, cy, radius) tvg::Fill::ColorStop colorStops[2]; //gradient color info colorStops[0] = {0, 255, 255, 255, 255}; //index, r, g, b, a (1st color value) colorStops[1] = {1, 0, 0, 0, 255}; //index, r, g, b, a (2nd color value) +fill.colorStops(colorStop, 2); //set fil with gradient color info -fill.colorStops(colorStop, 2); //set gradient color info - -circle->fill(move(fill)); //set circle color - +circle->fill(move(fill)); //circle color canvas->push(move(circle)); //push circle drawing command ``` -This code result look like this. + +This code result looks like this. +

- + +

+ +Or you can draw pathes with dash stroking. + +```cpp +auto path = tvg::Shape::gen(); //generate a path +path->moveTo(199, 34); //set sequential path coordinates +path->lineTo(253, 143); +path->lineTo(374, 160); +path->lineTo(287, 244); +path->lineTo(307, 365); +path->lineTo(199, 309); +path->lineTo(97, 365); +path->lineTo(112, 245); +path->lineTo(26, 161); +path->lineTo(146, 143); +path->close(); + +path->fill(150, 150, 255, 255); //path color + +path->stroke(3); //stroke width +path->stroke(0, 0, 255, 255); //stroke color +path->stroke(tvg::StrokeJoin::Round); //stroke join style +path->stroke(tvg::StrokeCap::Round); //stroke cap style + +float pattern[2] = {10, 10}; +path->stroke(pattern, 2); //stroke dash pattern (line, gap) + +canvas->push(move(path)); //push path drawing command + +``` + +This path drawing result shows like this. + +

+

Next, this code snippet shows you how to draw SVG image. + ```cpp auto picture = tvg::Picture::gen(); //generate a picture picture->load("tiger.svg"); //Load SVG file. - canvas->push(move(picture)); //push picture drawing command ``` + And here is the result. +

Begin rendering & finish it at a particular time. + ```cpp canvas->draw(); canvas->sync(); ``` + Now you can acquire the rendered image in buffer memory. Lastly, terminate the engine after usage. + ```cpp tvg::Initializer::term(tvg::CanvasEngine::Sw); ``` diff --git a/res/example_path.png b/res/example_path.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9b39e693677b46131759d271d6f3c35690cb1b GIT binary patch literal 13208 zcmb`ucQjmI_%A$yXh9HNB8VP6N`#Q;qBDaLy+s$jmxxaE=snsn2uAO{Men_h-g|eC z@BO{+A9t<$-(A))``Blny`TPkp63KBDM;aBQ(%KYAY2(~aTO2rN`Y-d6&&7x5KzI=CO8 zG}W`Q-eM22m?MrRE?$}U9!wj3zn6!zbB zK5p){9!6xU^Ph}n(B|YIOUXdWa9@0RJ#gS@zaXIpq4j^N789GN4ysxf9vc za;#9BmIj~@wNpar6C#H+iyx}BM?t=pvl+k)@;;oGjDfu521cZKf9QyYOqoUmua0s@6ajMScNd2~=@Qirpm7n$ZwY$@FO7cr!CMXU^(y3X>=_E1yY4z$8NZf1sOO+A?(vWVKghkr2H2BNfrO(%08Fvziu_ zIaw6NuKk>-jpoe&TEP{YcF1U6$@=k#TQkU_Rlxh>$VeDh3O?azh^5)kYjG*c966I* zojMX%S1LjSXw*M!R#IUv5vzYVe z50|mBsHmswSqsM765u%h=oqEEPAGR5;FVTl`ucRTZr{(6(n$jJ6# zD5heA_GZ321oM0{7o_$MJ9VJXGBEg~&OuBzWfXA<|Ju{}44@x_3Y3M~+tLc7q16co z&^>eXbT8P*NNi9@SnNVWa$|#FAFBaWc~qlut{PGlfG6QnZIDL_&`KVxE`}BrWp{Um z`ONZqv8hxkS26zKnnUKxYNJyvZ9StjDZeqcfua28Cs|oZIi)iQoI0lhTuQaCDg6n) zL6{TPfNB;mMAPRN42uPBpYNSrnWFP$I_)j(;cA4F3#)n zP+7*QcSW4ozs@Dr{yoZk&=9Da2g(o&>~x;D`1$9}&ic}%?#|tfye9c0m4iE>xD!LlDufp<~#^pYI<}g0}c6pQB zD{DV0Z+R{%$68wf*ZK>nev#V8kK8V$h>)@9+dKH^w)5U+7Xd=T%f#oVKODGD)@eRa zf}Y}uJ2-qHg#c`;rTyU4y+04j`t0f|qY{nq8ViAxbOsaMY5=17us-h$Coa6dBOq#P z4M~6)eIX|=b1q@wP{#{=_HyRhpZLGscU)aIPfju!M@K)WEUd4GHkHB(qQHel+iIF+ z;sa^O1y)#>`;S*_d=SNChPJ@uc5&k8dZF+2Oc?N}l%}V*$JKLG8J|(KD+X(55tO=c zg$*~jTO^AU`vhTLUQ;xC9QiLG`eJ{V{b&4CT&nj+yJqAbmIFQPA`>8JZ*{`zg+4Tv z+AHGi&!GQS2iSiT5;D@@PRE4lqf;IEs74wZ$mt6tF8PmqCXlp3=l;B9KR~hwhwF+t z*S!7|=9_aF`EYsF*MiWCZQ~z5o;@DRwYX}bl~gxBi`H|OjD>Yp)D_|R!RdexiF{j< z09lh!NQ)(ARZ;?hj*bpb$`8JT2M-IoLy_aPj@`X0d0iE>ipLA?0iBuTl#gs*;-UWIK?In%h#Q<=!NV7e9C?b#Khe<84pEJu zQC*iys3}4PVai8GBk<(o6ARQm5<((J16q&()h*~f(VM}@bdGed5FXQ_)?S7^l42@K zp68>zs{QE^MQ@G6wue5sohsem?;1XOhx9DktF;)uuNtYWCEPq$`rPntxYc|}3Ke}; zR(6iFjdA*~M^&yB4a7S<;eqx|{k6KpEV7z4y0mp&Bao3tDkv+q1DvE`{UUPcGd51c zt>WrlHQu_d`|w#O4O%@E_R_+@kbtZkI|@Nulbz2rpXp~^r;MKA>3(@5ChmR9l}-hm z=>xQ)8>(xw6Y%Vl!#j}WLYU``oCNxYAK<{XLPAI9YZHAyt1KnIUam%R!h`(d!uwd& z4Fkd{|9Xq`vE~xjgqCp^6q68KT**4`YUt{C9%HFLa)hMPDn`GJ)16O6HGFjIqiL{U2uQ2doNfgKpMj4q2nJjCQ74g#@(Ol zQ>Y3{LxOCpT6;St)t$GVfGGKz`*2bPk773DB4?7qDUZ%3VYSe!>sl*)fPdyE;zs*l zEjr8(^@z#0()_`w7L&Aee$*dFLuO*xv>qKlOl4t#+bBr?aeA2zG%mIpn^jzjHLy+9 zIsvXh!_2&*kgOMMhFo_$|Jfw+SqyMW_|U(y@^R|AU?K*+e-x^!ZOwLC^^BVk50BF# z&6T}yA5etGU%Q^(&#v!7LeFjvzEoLn&L@*Tv0ydFX>D~-iabxre-as~M;u+KzS@kU zs{QXc#7yG+d@HYe@S>f6AqPj$k-M=m7beT0`J>{U4i3O(cb#@*r_zHuejm6d<@dSd-DLeIX$M;VK&2d9jRF_xlg14nWsGWs_|PR^W5M@1HdkQ~d#=5&j0 zQoE~lJ6cxO=-y+_jdi`BD>3m|5nsdw+Uy@JBHO#O&Mpi*42;$2fwYe4a#`_)hsH2U z)0LGaWQUQdl?2;njG~g-AJium@$nEL*yV_U!Sk0^^$qfxi8_rbI2r)Q>g)tgGd=}{ zJn=#H9qm=+7XLc=1ngf=AFR}@U#%kSUi+$@i=N)C1N*o7?EL1pF--W5+Du|>jQD`?bUP^=$kl&-GZ9DJza*0f2)fHNIUT< zq_t;?C5SXFqk_!L%3S{Tb}O~Cj1Fn)o_K&5$zT6H>>-{a8!(nU_5Nj#%3AmUYHy*X5EcVE#GI+f7 zb#G5pfhqx^U5mGX(_1P$Rj7Gu8^KGfyVZjdq3vCyNpyls4|pbuP8n>hq9P~Z&z-xh zlr9VeJyZ&La}Gqg3KAFlXCiUw93Pxsi%|dlyE%b-bkw_;p8mq3kPjKozt%wt)?cRQ z_!=m--$+R(b-YqJxyXe?b`MHN#vPmN)ayf@aPx5(Cdy2@NECh7W49hnsLsV zUt{A+2)tMuu4&Zd6%=YH(K!P%9-n}gzn{EzHfQ* zxZiY2p;AaNVE0#6o|EKK;pw#VWg+nJByBls9cq@kSXtVaeX1@bSmvJMe*~-VoI3o; zGi-ahBQ=AFS-kDMUBbA$*kb%!X)X%}bKAV)vua&#lm1fIZHXs(v47k~&G!|%peVMa z@v|9oYwL3&zkH^F^*L4J94f(|V`^*2<$m(mIOe?a0nirhrhW+vbUwy6YmyRuQrO4y+^CFx< zI`hKT&sW|L_!bjOm*2-GbUeyc46^!@a%K>9OL^jN*l=@lZ09piE=)O~ z^*PxTr)sWzj6V+8@vK8cB2Y}wq4}kAhO^DSVeW*QIwL*(guINduEU;NRDo!IpV zVm`3ZlOsWYcg9~eZz$6b!TXl8G+g_{s-O~3uIci>)-Pd&99Nq%9`&~y-a2cBOdO<> zF9k(Jo)RHkY35`j&i9rBVA{Ji z#>11krKat19DRKTjzKhx$;AZwyDu&RruJ)F6%)R`@wd~IHsTHy@9o;x)^$8AG#-uk zR~T$46BQIj6?}h(vXpFNv>-(FG3gxd?d3|aoz^mB+<+HXF$Qy>z(hlX|)H-(s5hQSa za@?QW)$L(WC@kat4wjRO$f_p0SO_Jc+g`jCx%aIV^tj6DPxp@6n16{E93(3D3=otA zE=(N5Hw1{ryBp&@sN?n+vN4Ruq`Sl`N6^uHfnyhu8y6&W^#%g}oTniDrTo_i5pRau z9o@Fciyw0Zu;_~gF{esIa1U=>Xz;S-ukKt~**AXy9#CYG&{vpRBb$Tcuv5eo#`#6LdYM6`>?~3a5M;nVx<>9N~iU96?S)Blrfb!EO9O zT01rNcM^}OoYzMxJcm6PEnVCwv#zH#C z#(I#Df_CceTre(WQJOWKl)>Rr?t^NQUYxc#fRcE9WMOHpa}-a@t%OwCbmhv!sx?r^ zK0v(gEF9Z#<hTHvd-C`1 z$%H9*O!65HifoY%eYaeyxtmuf1Z3Ypsv7x=UX);PCz*8zZ5d+jt7an=B|pp$12GX4 zV*ZabTWeP_>79)CDZvba$LGDhBq_14zJ!r!oWdm_CdYh3{;0u+$lDZxe&6f z`%p%b^l;O}WuJ?UWrjS?;vFP1(j%Bwa;q(Z`qN3h$jHiCOEl&5tTmr3J~RCc_qb*T z1Of8vWem6wz%lnW(|9l(0{%|v!FN8(w53vv4%gDrnva(Yx zo8@kTHh`3H8v}7Pw~OEEIxS-O+P9?+5ouUYn3y7I#DIxm%0S}cc`fm)iXn@HQ_tra znO;eBuMPq%{!^!cBJ~3RxLLuyHeON*bz_I-=Y&)E6VO!%XZNxr;`)ZO?Ydq9Ssi&c z72Z_~KBpdt^=;PgP?*=9l zEif)fMfQ~!nT*V{w^_Ms4zjY?Dk?y(maC{PBV)CCgEX!pjZMf0Fv1T9?*j2Yi4Uf8 z=;)XI+|EsJyz*oIvc92{GtK!DD{lf@7O12Vbq*(@w&3cl&@%l&^9 znh{oNRheh}5hr0&;pI(vN~j%^M6vVDc#`?BYMxLG?T;erOnAgmYF(06_Q(<;^CgIiiR+HBKTw41j^*@?x zJRm0b&;UbNa@K~Wj&4t^cwu^NcaTMLjm4W+z$$=&{r-8so~W_$s}E!CpJvg^>(3U6 ze7H@Q{@W99TyNc(5xF5Ge^b=r!vc6>C4kas2vT%6EtVz*T`3_by22VlOn7?%TKur?g@jN%Qx zP&0O@kh)CppIlnb=c$4PTGq#gLl|i#*j=Zrx~T zKE4uZ42)8cA^_xJc{f&nPBF&;o7t8-qzV*kx))4yX}!E62Q7MJ<5TIiJv|m+RO~G? z7I0At&hM5+!>HSsJvHC45w*C>6A6xpa6OS%gRoFjmlo4TL?<${s;?aCqvw}$UJXas zu7>YlDa;<$f>C>VRJ1~~rQ$|=s%aIY(%4xcOPk8*zze6#5MkpF{nj;KBigF1GnSPYsJ63!bTVogg|gC9EQ%Vm3q zoNcJPUFT1DCv$b_((b=k$@2-6lQYsJ!p#E@z6&D{3Q>Xbl;;2I>xo*@lS}Z?X%O11 zkat#K1)Xg4#VBS~jMbVQU#+2~eJFkXsj&`jsAd>Tlef)8dBKN2r9oS0B%D{}x zAzxpKFqYgnHa6%Rk!ymGkQW)Wv_|W4?VW%?DR)$q3b>v> zSh7uE*A}|78&5ld*feQ-AEIPs_0_*njd$xf6=*_8>pLr|(ObX?Ch$D2g5 zdsiPhTdAVSY%yuDp|JDf^1z$ge!XHjJ1!CO?5&+5F>#p*uG5|h7>pe$Mcu*SUEp?R zpf)~A^+SqULhm(5Aa%u|ObZq9Yj5_ia|wVw$@YYiyPRuE5|3^Z`ht~dyf0CK0L9}Z zyZ~;jryNQc6-}rHM7*vmSVAXZ+Y{l+kRNDp|E&0nxPdP?g8_>^gg0PpN@j5DEfycEga)%V{o!cFuTn0anj=6nwDll&@?1AM} zYk=qbVSwes@i2WN@B@MT@}GghXmmlAoHx1PD69KrO4$`ZJ-`u(f*4o9LS^u958corfO6} zyVrX3^oE;4!^XUCDBaH2q)RK!g~!JM+pSTp1Xg1L$;j9pG<=&>VD9M8a$D`Pe_$N# zeQIvL#wgN)L9JmLgNEKS=>4l(`Y8z)ED1+_nzE-$3b4(&@;skDJr#AW0lYC1NkwL$ z#!FhPrQJ5=x+U_U2`Q=k3@d%Ez$n!*n);Cq15eaKTs%JrlVnDYb=Fqkbn36&^*a`p zv89&7i;YN^TEKr>#9y!Aj5Z4IHzu#PBxa-0O>i zp6y$`a>HzCp(1?Z^GcZ0I;E$VJBERVD{8f+qRcm2Dk>G8q5xLXyA^v0KiegO;9KXh8B{T@xSuNhbo7T z6C0p?p^}6!>nj4RfEPib4@IPj1+KMY6%?)-plPdoO~JzA^1;Fp69sjxLYWDcnZCl; zjA|ad9Iq>Y$m;Hz*~aFh+9y(=G@c^pPksNKf3CT!Ttf>HF!)hS0v(hZV<_w`=Aev) z<#q|cKYk`^TyUtAQ{_1CJAs6GQlNQ)?{}PWoSMGAhje6+neo9)h_={Puhl|7LzZ0O zgp!h;V4VJ%P(;QFeuSQt#A46vY^_3B*=5D+QJ8UDY%}6PL?{J8>{$g+ zuF?ab95^(I6Q!kvK@bWQEh6x{{2Eb{gZPM@1RKqX7`I7vW4F!swKG`dS@{Tzt;Wr7 zZ!f1vwF{Q?E^jECU%bf3Xdaue%S;6%dhjYV9uLd6gah=i=k;hv_r!qiH&ZCkAhNr2 z>+iGx@D-7Ab)pRE)X(S~gVfa2yCgu^B*g9Pb8;oamZ8kr1=RxL5`brE@1lDfwmK}m z>)_#-=B}XQt?eI>#F(a(nOV;!tq$N~0CF13Y`&?a!x!Fu2T?bj=8lceE|OD+$Vy|z zuEa^HzY);Dz@U5clddIEFBHgu%D4;5<02vq)POb#%aBy~CdJ=ircoGj1o#dx#H#r! zP^z>N=!Kb{{O?_JFbTYw9EUs=)p>=D z6F!O+=toLuQMkUm2hYyt%?_dPyhFoi>%!>VOrc_bd>YXQEnX#M8q>j$(dk1I53>Rz z(=QU}H``w;>Yr3QbR@n;BmhpJ0?Yk^1^zEPA}LMy`#}Q>A4y+49lgZ*KQVI{HZCv! zoL&IFRGm|iBwJ=CCZ?ziR(vtg$Z*@+Yjopex%g{D1)WLsY>yTHW6+WwsQSj5O5~SB zXlxM6TeZI5H19P#fAPx5urLKBf}4g011hN0EqQ5$O=J#Po78h$_BZt zD6rQm3hima3GcAP0$Fr*@vqB} z$ew6=0XrZif*#bmJG)++%{ebRU%0WqjdeXaTu<)qSL@Vha@ka}zu5~4I~{5!j5@ZH zOUSss*ceOTX)!4^#=)ZoS`Mxc^~c6sCfs$KUNJL6)Fh<(zHszRz!N^+h0Kfu2JYmg zjnp|U=ful({dz(M10-x;Qa6jDmlo}ZqaR5PNrwE|rjHa4!i zT(_rrn`2wBjaDu$w*e|38>zpm)co7})Bk9W)NQ`|4Ubd408xXFHqY z-W`s}elhMNdBd1pKX-Qe?DlqTIq;}F zJyWY{BJl?AoU1jA+_1H6exrK&$CDIcoIF+U zs~owM?hk+D3fE;=`4gV*Ptoj5W|t22GQ*L@b%*^tn~SGOKA{?!nHWy}A4Qsm=li^kjn=%{f)|!2 zTcb=Y+_ZYh53DU4XeHf+C9>bS3=HP(o zpAU65?iKgwS;2Y9pW!0o!_1ITy?w?vPP?;#31oBj5g|cJ5Amw|OXssFdgqpZate;^ z;*vrXQjKn1M(dol%*9vDX`#^G$GAWdtV&nsY`7}<;sukTngZVattq)M#s0TET%{+xCsJ14 zFTc9s7IYjbssFJxiu}j_Pl~$W)`LE)>7GJgpWCb6^FsLYdi(y4o`3Qg^{<77EBZRx zxt7D1PJ7XT)RNjSP5MQ}e>OBeDCFJl*+|PH+;T9`x+~0Fwwd3&VH%ukvOmnYJuA_u zRU;-&oVDpn;Bs2bp`l&vELdo$@$^N2RTDmt<|!8T%El!!)6g8AR}Nd)3pi+}1~o57 z-W+uC3}&cvAouoa;_uHUcbpemcm}1-m}?!BKRCm}o@q7d!OwoPDTT<3Cqm?D=-S+* zhbBq+Qq(0cI*p{cjb-2XYSM5{5gkLU7l6wH_%IH z3do@Vq*5Vu3>6;$c)SGEQ#B8oBDT#1Qm;=2;gavNrRua}(}5+mP^bO&TzMw;$^m|eEMUv**E4iQA{vp-djKTo zd9hqMYqX_u65o`7ilL^R%EC0%_j`G#1OT1o;@Q~*xrAI*ezU1EGjDej01nP!zaRg? zZYuo14(b)``QUZ6O8wU;n1yAeIG;ioIstF{fe!S>{L42dL_xXE3_RUPUxio6EjB*7 zZgO%#I#e*2?OJxg%1Fc(1T^%-=vz5jA>s-xzV-E^IUoEs?o%@>AeL!x>nZW_mx)nR zdM*arLRjSG$+rPbleU>x8zS=Gxqz;To!P7s-~WVwfiX|QqHsiom1?#sJ}<4c!VD8< z^=08YF-flJVCU}i#DjLzD>E~A3`9brlk9NS1j?(jF>rVu(9~36vq*>-59c>n5+x!r z0jen09EQ03zqEeRSHKe0ZcLnQM%Rfzo$Q5=zjPrkc-rJXa zd{I;oCG2jyhIxG^*5uVYs3@Nra%hWJxfezmC=n`W&XS_wdCB?fRoq9<{>!6W)x6w# z9!kO=K0enKArTwRJa9`t!V*HT`&vd3Dvh zHHLu?V3u2xgO80StI4_lmTMTYz5?;~bjQ(ZnH%pf>Jpm-elMXuuezNH`Nt$&F@92) zzb_sLsKDxZ7YALLV%&N@W{I{%OYT3SCFhAsP) zSDK^eYCfFypKe`V4G#aMv$;ZWi3I@V9pep!N5KR-PhD$R-ik|fAnq$s zPz2wI*Ei@t6W4oI4P>0-BP^^ymv&^Db?R0|EPx25d6G1^*KPd8d&NaG3|Q+hG8(O_ zq_Z9QgN4I$NwY0rjkbWy+L^E3!U6aji~8|EbQgcxNqIbDAuZb)L=Zl05tGj0eOCxX zt03!oWgVBys3!dBxd2=Nry?`2!oP;o*{NoZXCWa*OQI>z5lFV-hu+?* zJsL7T9-U&z+y9}8cNs%OR2oxiVAMYVXu$eDC|suJdo{b*|JSgWEG{l*(Opr{nGbMJ zZl_D~%aSXtz2pDTQWd7_)OB3Zzx>W$G1v=%5zrZ3*#V{e(};Q%N}%1}`_{0*7)Qrz z`V9lN9w;@fnBP(qG9lsB5JdH!7ARG`)n?)4oqOFov&}NvJ8r&xo46E32Y{p8+(qS4 zD5ty3_UlV&?i$OZ5)PXg-dA6QE;IU5EfzdU85IE#-$i@(gSwK>zvOX%z_o%~Qv^be z;b!9riAyyfJ!UI`LLjVcL^daZ?CNTe%Tw_4=PAwzc1D^{O_#JL{gJC(@{`5?^*!<3 z@*)rui@&5IR!+@+k&kYN5WkRit#J&?Xlg<XQet8rW%%xqI#F#D~&pvs*ChS^$ zw94fr#AnkfMcp%lVBr|7t~65zYs!n)tooWcO3YLR?oh=Jq{6`gfv-N>avn%45mEBv z-JI*6nFH-By4uB(>YqMQr3FxN)E_>P%Jgj(<+V&8XaV{Ic)x_dfe2Q%=K z78KaN?840`>VHO+U+ZXSHU2!E=#9CtLf-C_uW35Crw6-v>Mx+!089v2F`zvZ29E=h z8)Ur8E*F3@hXl=V7gG@deRKc4;{i;3p&P+%;g literal 0 HcmV?d00001