[prev in list] [next in list] [prev in thread] [next in thread] List: kde-core-devel Subject: KDE Review: Rust Qt Binding Generator From: Jos van den Oever <jos () vandenoever ! info> Date: 2017-09-03 16:14:49 Message-ID: 9899305.xVLuBazctL () joga [Download RAW message or body] Dear KDE-ers, A new project is up for review: Rust Qt Binding Generator. The project is a command-line executable that creates Rust code and Qt code from a binding description in JSON. The code is currently at kde:scratch/vandenoever/rust_qt_binding_generator If you want to use Rust code in your Qt project or if you would like to add a Qt UI on your Rust code, this program will help you. The binding can describe a Objects, Lists and Trees. Objects generate C ++ derived from QObject. Lists and Trees generate C++ classes derived from QAbstractItemModel. On the Rust side, a trait is created. This trait is the interface that the developer needs to fill with code. The project comes with a demo application that shows Rust code powering a Qt widgets project, a Qt Quick Controls project and a Qt Quick Controls 2 project. It shows a list, file system tree, a system process view and a chart. That demo with the code for it is easiest way to appreciate what you can do with rust_qt_binding_generator. The idea of this binding generator is that you write each part in the most appropriate language. Rust bindings for Qt are hard to get right and will still have caveats for a while. With this generator, you write the UI in C++ or QML. The generated code has no dependencies apart from Qt Core and the Rust crate libc. A simple example: Hello World. ```json { "cppFile": "src/greeting.cpp", "rust": { "dir": "rust", "interfaceModule": "interface", "implementationModule": "implementation" }, "objects": { "Greeting": { "type": "Object", "properties": { "message": { "type": "QString" } } } } } ``` Preparation: create a new CMake project with a Rust project in the folder 'rust'. ``` kwrite CMakeLists.txt kwrite bindings.json mkdir rust (cd rust && cargo init --name rust --lib) ``` Create bindings with this command: ```bash rust_qt_binding_generator binding.json ``` Add the files to the main Rust library module, `rust/src/lib.rs` ```rust extern crate libc; pub mod interface; mod implementation; ``` And modify tell Cargo to build a static library in `rust/Cargo.tom`: ``` [package] name = "rust" version = "1.0.0" [dependencies] libc = "*" [lib] name = "rust" crate-type = ["staticlib"] ``` Next step: put your code in rust/src/implementation.rs: ```rust use interface::*; pub struct Greeting { emit: GreetingEmitter, } impl GreetingTrait for Greeting { fn create(emit: GreetingEmitter) -> Greeting { Greeting { emit: emit, } } fn emit(&self) -> &GreetingEmitter { &self.emit } fn message(&self) -> &str { "Hello world!" } } ``` The GreetingEmitter is generated struct that can emit signals such as valueChanged(). It is not needed in this simple example, but the interface requires it. You might have new values coming in of which you'd need to notify the UI. The demo has more advanced examples. List and Tree let you implement QAbstractItemModel with Rust code but the API is quite different. There is no QAbstractItemModel::data and QAbstractItemModel::setData to implement. Instead, you define properties for each list or tree item and have to implement functions like ```rust fn name(row: usize) -> &str { if row == 0 { return "Alice"; } "Bob" } ``` This project is not a typical C++ KDE project, but I hope it can be part of KDE anyway. Best regards, Jos ["demo.png" (demo.png)] PNG IHDR c > CNw pHYs + HIDATx݇[/bCa`#baޱ+VD \ " (J3g*Ds=]`vƽY @) R J " (E P \ @) R P \ @) R J _ |eïOw $Zb}^WD{? WZ5~X \ gbOOOmm7o߫ iooj4۴cOٞ!00 \ OY^T/~Xྚq(aaκ;&ֆO00| \ Ցzqss٩gqJQ͛7A00LIIImmmSS3/+k^PϬ-0aa \ u֫W$ۻ/ˊ*ŀpaafqX*edA.J3_}YEEE}}}kkkgg \ 8h[UU㬟)"%0o003'旹%ZёdϹ?|ŋ555݊i)VVVD8,Z}jn]}i 3VmaaYRS[LT#f{WYYYw}YUUUccc[[[WWX ?c7s])y[ <%7~nM]gLơLA+aaA9Z,۩S>}* ~E{Xξ}QQQ 00Y2onQgogcj \ xW008vwU)νu@f\MӧO \ R-;hXx_p)=}ni+}{&3jyIr7T^˗5a$/]aXNށW\)7Qq]|((zopoԡW \ 'P0{yɇW2Q0#`.oF<l̽76-L^Şa< KJԵRc479s.bE5]a)zjZn7mW@_><2DbXw \ ^ #8f1+k,O{hL<p3a4s}3(Wq微5T+/\8t[ \ =yVR>m;OڍVѼ%jF3?)Qëd\5o/Cu+S[[=)-+Z~4e&+EG \ O}PM_$ C|.>pPwph<*eYp/_o9p3o0 DN%-ef.!aqTTU'.N. "[vek7oeؚںsE*j$s 8M]}6`?vI]}ÇoL:t0e&+E \ Obk#""BBe! $,(GҲ~V;xpo(eMsKa&~ y3# xESGOoi}֟<{lY8{j9dgPuijNis}fx$ыNY)pð=)ukzZp qt ughM첁ME)U,3o0̈sޗs/^R:UgΚ_S[ݶuefvk9~ \ 6fxt/yOJ%)I/pgc5wc!B#Be](а \ pKWjw(elLCc7af9 \ =y㧲5/MΞqZ2kvR$>~J[5L6ǑTPyK|ɲ 7?}KEn2R M]aLIFmsl}v^~!}? 0o0/ObeuwÌЙ6{,8GL)X˼OdsiSeAJqcj) }[a6 \ IUoZy !3LGA9i {nhk&0,Ew[]\傃f[0_e9/:b~>*X2|%[o w$]p٪~+?s`fDδYԿ \ kgkzGJںOJgY$+J1Kڍjy \ Oɵ<d9a/{E%ڿmX۲ \ 7_)ں}XX>yuӭt8/etz!ĿW?00dq5o>WV6ކa) \ fj*>Z?o{ca>'~Zoj003L~U+Ekaaf \ q5?DVjddA.J3d87003C)200"00C)200"00C)O30 \ 0C0ï?gaa}4ٜQ),*>ʹsn/E%wGՃ;zgJx \ aRRyfs?**_B)xaRR=&R<whD5R#Eryf) \ E2<0C)R<R"30H)J)Rϔ"0"3+H)r<SP"Ϭ"L)2P<R"30C \ )u<pܼdϬWm瞀pJRs,a(!-Ž*:ylVv*k:rloR \ G)!;m)Ea(őYMTܴvRhKRWOJRa(WE/u26xLKSV \ 9Yy\ԯJ[$'~="~Ͷ{,yܹlcR雷yBޭ83+;>ܯhK'n^?M0ut Gʚ<8xcYٲԙ>LYJP>9<d?ȃ{7)EyPB#b$ܼm\SS2k5M \ 9G;'MY;XVm)k~q3<zSj;v:Cl_f9}67Pn%+cP[)k}K| \ 9,C=:9dL,'X̙Hb|Bb@H֥oR[t9 4\_8*n \ +/]U:;g[Gt08Jqy S\r<gy q d{tTR @B*vO@ \ ^.}s_%+]<}kZ).^<2v3f k]Rhwpm]]sKT \ nmsͥ0j&8fʯy`m۹[?!xtO歟:8fΙ'l)!x19%W)eAp \ U?_ T}{;<||%C_],gǐNOxT)N4T촾ϼ|%˗ \ ]iUUKFKGt08JQn3RjnmRIoܺ]}9[Jcvgk0%%eAnCR \ vعg<~{( s/M]+*̪kjNΒжqvᛔvQ ֛Zh\t64xP~ \ xp^vq~e<Ysv>sΕ_i['$z<rvϽIؽW5T,,|!,]?vTN_l*EyUa(Wga~)cba}id\1˟ri }dH*E b/ n4"KQ.bDTS[GW5&<|e JSK[9I){k \ ZKmx?xDZgSXT?YFy'B#b&e͝?ԡW4Ylr6EN52JH^YP )_>|xߏOgEM 1]4E+E2)EaJFD; \ (~f~zM_ʔ'~+]y)YGù/_֯ץ/J2G5O " \ vqμEd>X}kթ59~SPx'~VK9A6n.,xb8W&.zaCp<_rU \ ~EI22va)pJ)2P}[;%ɩtvzn<yg).}>EyQuN \ +o<s˽TEɓzvxnTKqtݻ~EC_N06Rڐn)jkooimAV3 \ v8zd۷r~oljVS\YIu;vg|X7oOmܲ݇8M>upHs}ciGfPlچ \ RvOL`cFSM6>}6[Qns}3,'@ۅy7|ӖT?F?-;S5rr_)_a<y ?Zoem[Gޟ礔R-TwoYifisϾ<w66_Rరq4?/^5+&Ke䱖NT+?x= \ ZLO@H Ҳ:{^E/ 9(](kL,]<8%%JfA \ ݷحM;Y9|-Xg(k(ʵXytQ?th)ʂ9kPNO8yaR7?y98H"3-_Zꍉ{a(J*ol>4{Y)Ko )EaJ[bFfSxf)EgJaJR䙕RL)2C)R<R"30C)J)Rϔ"03+ \ H)r<S0"Ϭ"L)2Pwnj9}6{|<0̷;-#=%00Rdaa>2U"003Jyx00̍[$FK)y ~M%SXT N`a?UZ\i_P08SRdJa)EaJRdJa)EJaJRRda(EJa(Ea,ŞȂ\)ERda(>R[F.R"C)20b} KqC"Pܼ[4aSRx)FNu~پsϬ[̈,y~A&6ge+ \ 0C)R):y(E;_|bMm4Gd39MXaJR;hdfuoݼ&[9y_rMqt=pO`p؍bƻy9x:ijnYvlii디Z/ ?Sѓ1c$U fd]@H3>rDO08J鬃ɳ \ (,HM9kO1S%[N牦%zy52q6ϐ8XAOeJQX@-EG;'ο?M-mPnrͺ \ }$08J1iY>?yqQjiX,YsZYWO?VfpcqL} \ u7[Kiuد-L`bZ]Qţ0C)R|Ťɺ7wPܲiЈ(0yiUr \ OeϞM-m8XAE'7/OebG`bq=7!}%;'w'OaRu(sQ'7RL WVEܹSTrg%Gu W+,l%mYg)ſ^AsvW*v/-o/[Eqvp,0CWÇ+<zʪ \ Ʀ[iin0Tlv+rwط0-geFeYj&6_q6Ή.`ey)J/ \ 9 Ov;t4S\"zL`hV~@'0P?Zf"0C)R"P0H)20P" \ P0H)20P"P0H)20P"P0H)20P#_,gaUC)~n) \ w H) P" H) P" H) Ps) P" H)R 0-Ŕ7l7p \ eښY23gkjjmmmiҭ\&ZܽǮ Jq4bBwʧ.ٕ6^`p[|Ba)& \ _0)[Ƅ9SeR)ŪꚞZ; (X+s91y7++v0,Ř)39w \ 7+q~[};fQ]}=; (~]hxpz&+#Ci=XTrWg|7/z \ (>EDQYYelkoH7,E9yܤɛlSz;gܼ7 y24}QCgD!=a7,3g/_FI.X]U[Ww4$; Fۆ()Ł~'2Cȧjz>fQKkXU]xcuz˲|twG #uo!Y//R@|7/?Q|RnG3Og}>!uǙlII5]]]: (o \ apᛗ'O#cZ;L>SQV&%kd87 R @) R (EJ R (EJ R \ (EJ R%XXT̑ (EJR "H) JR (EJ R (EJ R (EJ8/ə차8N @)RUQY7-+; \ )EJK[.'M-l>z> P#;%%O322TյaV;gw*vZJ_G \ JQ/=o,lظE6]r<)S3XB<z$8,J>O@HQ]!.Y>}s̔>Nn^O(k \ y|B"Pc`YgglUi 8D8|ziyTƌ5RyYݽw'woiDYeN \ D\|Y^5E3d{YkO>]ݴeRprmmmo!/\,W]Ͻ!ܢJʶF52 \ eaܤr^GJy7]<|Gd 8_SvpJS˵uZ)9IRf٭۲l/Ѥ"cmظ \ EPv(\<]U/^rP[Z8gϝ G*ҕ,[;ܽ'RΜwC嫆<|[ \ H.ş&<-}a$U?7~ZZm*牦UZښZL>SRtvΒ}?[P[Ei7ܹ;cF7o6 휣'" 9؍[^SGƲ[ H.E8) Ԭh]?>b)yzدVڻxm]1G->,ŖUU溲xCfqr*fS (őV)+V \ iX56he]{9x}7FԼy;)>{ndf~Rc \ }T*<R6Μ!{^cR.1s|buDxt\r?xZB P#{{{]=}Oger[[EIf \ V:;;{RT,%'WN//nٹzJNS.-rH_Z8<a)fjacl \ GĴ\y7e1jkb/ R (EJ R (EJ R (EJ R)E @)R" \ )EJ P" @)R " @)R " @)R " \ .Yq6} @)Rï/]*'W2Y.{._~Cr?? JqؗbAᝑZ8 \ f Q(vxQwwwCC߱k/ @)Rgt7/?S}D̋j>:{逼je΅Kuv_Q \ *f?gg̜#[;{o۹WOJNPn4ey|Nn^VUUU[;;pXC[_PZFg,%b \ %rxEōk$/^\r8z^VV_^ P_ \ b>E[wH~n}},>)]]]c̞=/ƦJU:)<ѴR\}HZ.^V%:,^"(1ڷ++?Nge o۱[e3k}V.nܲm6e i_oo4 \ /H/^p_)Z_^ P'Kq(3鶬,OLn \ øIjYmiʊZ)Ed\{vQz4a| A \ B?8Lĩ3aQZթrޭ|Fmz^ERzoER1s|0nm;wk, 0.y \ :ۅswFxt>26(4BbK]ظz3+3gԼQaV{+32[<yZ* msЈh'$jm] VHP?V"QF'^bW.WA)~ ~AүչRW Jqؗ!qqYĀwߎёbD~E+ECR.56̚@ ֟:s70Txi(W+ݰvJqM> \ A FYR ] @)R744JIyOqu~%IR**cOʭ>N:#}Z_?,3+3gϩܽ&_T%v~C#RWmL-%߽g\8E|Q_ \ Nn^t#V[[lP[W7-~VD Rޥhq_cs>2VsUuM>RMrkv(JY- \ /Űtv:{jlXspXԤ:GWόDS)K-LR"2O2笽A)vZ*涎n zM Jq"ToLzTM Pp*~~Rm \ )EJR R (EJR "H) JR (EJ R (EJ R (EJ R (EJ R \ @)R "yocf_Լu RC-p@z{{ftolytv sAeᣙUHx~qИF X ).I .>_[[Ҕ<).'Y/p2R{rYt媭\VnDSJ (EJ{EyR߱k>"F=WUUk$ \ Ŀ>}s̔>Nn^O@!/deyy~A{bɩ jcXTrR,=|493lii/yЯͬlkdyYX#Fu(RxFښ{xtoM9$ u[RWX-Ry)~Ui`R\l<ӗܽDZ!GH_֧o6\ٯTZ]U_-J{" PdF-ξvaRLp \ ;_fϝ`:?UynhhtrRDR @)Ri&;;;;o\V_)nܲR!9uHHJN헉 \ grUUw`9[ΰcRLTohh.")E舌4eE[{cRloxn)+V5 jjk`+} (EJoJqm{xgJ\pC#(E'wo9=|vk (EJ \ o7 P" H) P" H)R R)E @)R" H) P" H) P" H) P" H) P \ (EJ R?OB!~ 9v `3g9F垾,3\)gu \ rPik֥[;L4+{] "8lbQ \ 0z\x->!Ѱ:{RRU5===1v \ PEyR߱k>"rrQ%<ee/ܽ`"wi0ݬڹ;ð \ ~7,ECoߎkTW_ JRb'baQz)#[ZZKuw,47H\Է*+]<|OgeƟZ= \ ''h}מ~?}%>UW]w` H)f)~Ui3Ya6'N O)ſ-źz;gܼ7 \ ))7niu ym]U|t=H)\uun^~G3O RM&RT?A?7.+{qYP \ m'O?^H)~k=| @)R#U){zz6nͬlϜ='˯+*ܽO:?L,N JQuǙv5]]]: \ )RC/o˳KW\<|uX}4Y꙱ Zxi.hXIɩc: \ )h R (EJ R (EJR "H) JR (EJ R (EJ R (EJ \ R (EJ R @)R "8Lܳq8 "H)hoضs{CG2=/1sDS \ /7\=}>| "eo|zJP۷32#GWVVYX;;~M.ȟMM \ WN:ci> JRR]9>2f﮽R|IpXdO@HQ]Y?yBaPhG9!GiVv,,MYykkOGh]<|/_ "?Ţ \ brڮF0Uo!~zx=MssˑcǃV^W52YGG̓.MMrswp;'3Tʵ6-[RI \ [b H)XWMGB]<sAs}B_tjKK8#JYyێqďffVrX:]zMi \ ɔ3zzzV-+SVeVKg H)Xt'3.)Vsw;'75ǎo۱ \ [zĿ?Ӫj#;;;ץMQ` H)C?\Uy7]=}%l#(B{ڳ!jʟ'=w^m,O΅K4 \ )a /8m]zwwwssKXT*ŖVY8u欬]SU,8cu8Gg<|gW?OKK]<9&;S[[ٹ`3g{fV*ǒQ&o> JR_I \ \=}sk,5; FGĴ+7ke9ua&dܼ$%Yiv9L-mohlT 7iYT\ \ JR (EJ R (EJ R)E @)R" )EJ R (L @)R" \ )EJ P" (EJR "H) P" H) Pw- \ s JR)ZEeextxcsy\s! JRఴur \ H)'MI7hk,muvɩ۵;xX@HO_p{wæ6ʮ.Yi \ >Yg;-uE凥x.l/w55o8<(:;;eWJc (aP~qcYU]#kWǵmy/:OcOz \ b)BR_ m;â;-hX%̬l^c.}ShD4'ͻ]<r kQ]SøIo5눯^q<ƪsuOLd#*Q˽.o c555s hϞ;g (EJ?Jޓ3\S\_kꒌTOWOKKg]`jar?߿v(q)+; 8ua)FOnji+=/J7n{MQn PHhr \ Z#X^5qRTjkâ6o!6()9}VNofzX$Z \ )lʶe}/EI4Eyt.Xh)Jp,/W{{ %i7;B \ 뻻wS4t\xC/<:N/9<|dbn]T\ \ > Py#9hjikl۰uƦY%tvIɩڻ?Z< 0WӳaY;5Շp5/`#3:KS8^mm]̔偷w>y \ > )E JR )E JR )E JR H)R R)E @)R" \ > )EJ P" @)R " @)R " @)R "H) JRm,/ \dJ9̷src (EJԅm Kii "a:Iuiҵ5:;UmjKIâԼٰq͖\#'w \ jR|Y^_Px" RNKqO5<:nҔVy,kd>2V_[[,^;Eqoo]{,) \ ivNH~?}%(E 8_SaܤoTUUuW^8X^(phjK<" R \ GN)ܽgbn/5fQEe*[~hs}?w&,(E H)R{y\W})vuR/( \ w0GP JRQ(B#-_LքE-MY!эOH`ڲ_)ص7HYUU--ϞsP JRQXSFr\aVY4+q9)9U{cRpp42qt=yR P*E JR \ )E JR )E JR H)R R)E @)R" \ )EJ P" @)R " @)R " @)R "uuttJwՏ_, (-黻;;;)eyo \ %s9x`baa㐜Ϯ. R~GG/:'$j(vx|c^v Ry \ SK[#3+;'y;%%O322GܼUhhUz9Q J*Łgp?Օk-_F-^!8,Eԥ)+ƌ5G|X=== ﰋ UCxjR8c期'4yݒ" H)igjY&Qգrꌄ \ E JR죳wwK-755-Es= @)R}VNGƶvuuYRm"*rm]ݴYE JR#0Qy>*Ʀi}/9X%6 -E JR \ )E JR )E JR H)R R)E @)R" \ )EJ P" @)R " @)R " @)R "uuttJ6gC \ ezX (EJqSgݝRQY7-+; \ )oLN]56.]NZ<|} \ )ؼuۍ[Sg$d?];B8gdlUi 8JqOuuWQ˔葛wWx8v R5EJ.^]<{_ \ )- &u#V H)~wgWmHU]S3L^u19uҔ H)~קo:#A=dP#[xt\r?xܺ} \ )ObcSS_ܽ6nqGں)3읏f` (EJ R (EJ R (EJ R)E @)R" \ )EJ P" (EJR "H) P" H) P" H) P" H)R R)E|2W \ -wvv.LJ4Ygjifun @)Rf JqMo -E;''O9zFܝ:#'+ji&֮ \ Ahjc,rQ-765%̙oih!!Vf?}\۞˹ l2}fMN \ !e<KA|%9K J*ŁgK1fʌikdV칬/(42Ro`5뺺)⦥JĴv(]8@)3-+{!k]ЈhN \ !_^hyT)vttk$yYُ4 RJq(o)s/1jϮ.ں?֦gkjoߪ˖\r xiJi \ MM͜C mF]*Ʀ&rV 䡔m+ 8zKVm,%7c#PUU]\r \ ?ޝ⏖T)ns.'u)M-muϞq~mw]]]k JR_ \ j+WR41|=*Ꚛ&tvv@ 3vsU7obS42RFX$ \ \<o)R\xÇ} )Oboo_M-qZ)F8;ަާ=e+1ea}3Ա \ kOV%u~/Ϯ.-=U7x,ȃu8Ͼvf_ (EJ(&ܼvg \ J>!!чdZ,u42r({M;Ha7o'W^'/M$bO|?\'#r \ Go)~{Z) JR)E @)R" )E JR )E JR \ )E JR H)R R)E @)R" )EJ P" @)R " @)R- \ P.Yq6N (EJRGfeC "H)/aiࡩG' JR_~ \ .{Ohj,EJq$y]Q9ȬS]\|e4v R8z)#c;::dhwWx8v R \ 5s^-z]Jq4xO@v~Azv RjzXKGs#V H)/EU~JS]S3L^u19uҔ H)~V)F8 \ ]]]gQ#Oxt\r?xH1(*.a (EJJ>!!чdZR#Lmm]̔uG3OC " @)R " @)R " @)R" \ )EJ P" (EJR "H) JR (EJ R (EJ R (EJ R)E @)Rs) \ ^rU]·B#&t7 JR|tv'N'7s/O "_:q? \ _, 3E^<=sTO@Ykᆪ'|Bܽ2Kv&Uoo,Ks9LΎOKS1e (aP \ b̔vuۥDz<w{OwYs}q=Υ\ƁCp_Ͻ~< \ O ")/ŜԲOL}XNMM\PxG-oظ%)9U-0GĤoʉ;xN4r; @)R \ )ż:ۅbpXœjym,Ӯ8牦-H99um{>s=~4 @)RKQZx \ M*{_)Gm))v`EIH߹7gΞc (EJ)zwuuX~+o7d \ A.~N)}kzR..^\z,Y|B- JR_02Zy┹)-Ģ55o8g/]vp_|eGG @)RKv!= \ )ŏb~ (EJR " @)R " @)R "H) JR H)R R)E @)R" \ )EJ R (S " @)R'v \ )ŏw\Gaoln䖕 POX]w~aK[.'M-l>z> P \ 8:q?_, 3E^|ipXd܅K8IF:;;eWJc (a- \ >?pcKwgw.wh,HX<-}I2t.9v\ev R~UI)\ \ ~`_)&G>xcĸxO@v~Azv RK1fvqήvaR>p舣EQq 'p# \ Vv R7ZSg۷0nRًfeL0k9OꚚqFfrɩ` (E(+ejO@)BYodjy*K_}(+{DS JΓ \ <:.mF9<|dbnͫ Jy#qo`>2Zy┹,,mݼ_I22L1Xg磙'! JqOqORa H)~(E @)R" \ )E JR )E JR \ )EJ P" (EJR "H) JR H)R " @)R " @)Rߗiǎ R \ )EJqxoln䖕 P"K6=f (EJ9ܽ5ȬMnM j3Y.YlJ:Ig,LJO)˹ \ }CoV+6m3en$wXso(GS]4uU @)Rxܼn)jim-{yYZZxUc!w5Yv=\gy3g6d'O L+/J֩A33O妦fcs݃8|K]<rxxt @)bR<|4W8R:]dǮ0oaRںtm*E) \ 7oU듒S?QB#\2/_ .=w/Hn PbR~:,.\w'~5Ҽ \ UӞFdelɖ$"BĄITR6[R)T*L1~{߷\:\㌇,.^6klᦖY \ ghH{gk"rN[nfuA"I͌9Vxc2nwLQt H)/̻Yjv%Ik{g/5_8n*E \ A6hCBP߃jn<{ml \ )ŏbʍ4[WyPr~SnHM^OIU)ʥ,lާx/F']3/p<?m5F JRp)zj y.]rKQB1cͭ7l&>_6~dhu.!۹! JR \ )E JR )E JR \ )EJ P" (EJR "H) JR H)R " @)R " @)R " @)Rv) \ :zd (EJRrxOKL-m6 "H)E.\5C+}gmj2z>w R|𰽋{9ODenm?q [pǤ.nfl-14v|Ё<seP^OIJqػYj9!1Ip/ (?=_q?srƵrYYY \ zY?Zya&cdq<KWW<ЙwR!zųG4 RJ{++F[<bQR%;rV减KCtwwgz'?DF$U)646J)ʳZm \ ɶv+ 8KQ\~מ}]]ogUVUUK+hxaNskqnV鳺>Z)rL @) \ RP[[=Б~zR.Ynbakm,#N"ICUŵn's_ (!Z:2u_ߤ^Cs^_&zDY>>O}s#Gs_ (!ZOOust[:-␢,^z-`<2 \ ' -E JR )E JR )E JR H)R R)E @)R" \ )EJ P" @)R " @)R " @)R "} ?j?O (EJqb \ bJq(x^V6sښhr#{ @)RvÕ w-DzKh-wvN= \ b)<lnn>^vNa&vI)̻&yZ۱kVO \ z-'{ɻVʥ?M,tظ+D>cnm/뻒~veeձƥsO \ Po)~z~f:kkk岲rCs,L>K;X_0rubR4h1[ZZ%^ &*EWRrUr)El- V ?a\leda 0voo. PW)cvee_(3.ŋvm/'L;SRmsww7ϫRz}<w_gH0 R( VYonmkϾή~(ljmаc9ZP_/Ryϸg@E Jq薢R[['Iw~5c>Ÿ+W?RwKqƜ<h)] \ h)Vt}SY^t `nUrʍޒRk{gUfY+٬izC8KQ \ PL}q" 8DKQ \ od/[;G?ShyK;GudQ%SL,l?yJsQyͭͬf]`0(APl=yIpS 8tK R (EJ R (EJ R)E @)R" \ )EJ P" (EJR "H) P" H) P" H) P" H)~_ \ OZ/:]kGGO (EJqb \ OWyt&xNߴU[0mRnq/ (EJnr5ӥAZue+V[zn @)R > x}!L,,]=SdۙwM2c^UUU?3eLysO8;EBەUǎG=; @)~6M > Ͳ0e,b}}։IҔO R5Wg'xNY40.EYsu?VT ?`WVVIERKqrR;k}ͳh^_/sl] \ h) k֛[ڳ_)JF,[Z84KN=Zϳhb:r (š[JmmlCG+Xs>>̻Y+Ŕ4q -jyYo "ˋVՍ0JN[RRjmL)Rr/Й8E Jqb \ ,lVN}G.,ՑE<&N13/)Jqp,[qen:n<! R @)R " @)R " @)R" \ )EJ P" (EJR "H) JR (EJ R (EJ R (EJ R/a'VI H)RRPXTK1)9E</+9VmMtLLIƽ \ )w~^Մ[X9~\KljR<~rSm (šXۻ8O?d \ GRrls;I^v}vګbYs]=&>\Z9Zg-]-arw"ʪc#Kq@YÝ \ R|ut&eefY2}vLahĤd 'OG[QdFz-N;Rܕ,K)҈ߡ \ ƥ(VvNcw" }?`WVVIERKqrR;k UqWzGzA)vtt \ ܑ9L9wE Jq(,*Zf=:dIJCÎR[[w2]/œ")ŁU[`] \ n)*u}9گcbf6ާ{sLm/cҝM-AT)wPSR\M. PCueeZ)p,K V+kFY%-))wާha{9^yQQ)=!M)[ZZX<z{\<T) s~w[qW74~:x9z @)R,xZ8~4ۊשO<x}:()&s \ <eg>vq3ש\"9m<!GRcedZw[l=y<pwwws (!Z " @)R " @)R "H) JR H)R R)E @)R" \ )EJ R (EJ R (EJ R (EJ RRRPXTs`3oGܕ! JR\MP\=&"z: \ OGͭ' JR|'p0K;GGWȳQ&whY1g~H%Wi[<xJƋ&/_T'; \ @)R|]2}vL1-=}ZID7roocJjOA#=Q3ߏ @)rLJQ-DD,Yq~OA#zd ' @)R[i7O-w 1dܺy- JRh)b\r9ơY ύZnb!^ur[n w R`x]O FoP ;6}ܩyb>s''q (EJ<|>QYܸeDäܚG"On \ #̬] P_SVV>ruKK+O @)Rtuuj _ (EJCBͭ.g )E JR \ ?QoR iQѭwJ)6dܾ#kaa?DɧR00Jaa2aaK";7ob9+700|dJV RdaaP0000P0000P"00H)20P"00H)20P \ "00H)20?1VC)R0#SvݓzĽ6yc#'î|];wC)R0̐]c[p^Mk+wmS-(s>ID \ ]^urNjϽ.Ra2IVq}-ֳŊ>ɝ=[lY&gJq`?P"03'aߡwub<ٰaᙨW]yڣY7n駟evH5JDI, 6|G@)20D>=&Et`|Kŋׯ_/;^{%zLke \ y@k*lafLBIU\gVNj]` \ _rZ3g<mK~|tWsR{ _y>h \ cG)20`6˯Od?\r'w҂~~c*mqc߫+WnJbnڥXđǎ \ Rda0r_9^ykL:X(pBDƍ"#ܻUKpuntE>I)2"YaaT7O:/N{r*̻w]K<p \ dɒ%oR۵kŋ1Ó2%5B˰3z/Qվ:'RB)20 \ 6'^.wXv,$ڵK2ѸtѢEK.]v[TZ>+낚!<@tcG)20 \ ̿6ktڲeƍ-[6ڹVX✕-ըϞW7>)*cfrRR)Ea{6nʕ*vhg=+){y \ O-;]ā!}M/:FǼ}c~ҌfJRaf ]k7o'qvVB \ 5ҥKCBBbBVؤR_(5f1or_}qm5K2p;Jaa \ 3nR3.^ > \ }N```)Ns_TKv@^^73n~ߩ3|[#00{-ޜ, \ ة^S>q:мxbYSYU|_PО={T#6WryF]IVqo+;z)&%3f)GǨ~K~t@lSgk'O>;i,$$^}R_-.pQ \ OP"0| "Hۯ?|HNo`-[d+#x1mV]cGB[>Xq # \ ,K^T\t8,\:q*RKCiAVcJ՚V{(wkqIgc}uoH"?HjZ@ \ 2Rda0i=sR{vm?wnM_^t|QWԹo'Ojy&#wJ1V:8O|x͕fVUՏ8 \ Z'+/͜oOr \ xf,;'>>yzF)ňȾkjmba`zx)]6.I5za \ /zVkLIe=4[/[dOo*kez͘#3s͌jKqZ)N.|nzs \ d/?])#00~=R)\r>qFuoƍ49)M}54eCc5״;ǿ9vR|V\,CRex=E\<da$"Ϟ["'fm-eg\rmr QUzQQYS_qWx_Hj%JY eY_DTݓ l) \ _TD᪵ʫt5rrrkI/*eYZv AfK;L.%w[2R,0 \ Ǻv)5;v[p;w':thٲe& \ `DOȲmی^GE9;>rq痗DdYً~m\ ;vI8pSKа \ iT)\~ǮVJML,y^8K>R~(6~M[};r07en}6Z/ \ h5IP< ӵKzL_T\"V+7m۴5@f6WOd"Ya3K{6ye˖;v8%z* <}qƇYP6/**SRS nV4&_tKpn?+,{`RvSnܔߺ4v:w,I))7da<c'Ni= \ 'YYν>VG.m\KҦFvڸy6^꘢,ݒ>9˹_f69td\PRJ)?S_QYS'?_q]=& \ ǶǎRda0*:,.ٝ+ոŌ[߸iΨgQVT}blyܮGn \ /Ωy?Ar,KJ' : \ [<i[̓GJQJk}OT(uu-)YT(5|TPjNذyY>+E5r|_QOyZX,ͪ^z͌ښםY92@;Jaah߀V \ ZJee<+)RqHX_wP_]O}C5knz'3srΝR[lYrm2z\ajy)% \ IBi3-!FմRZq{𨡱R\Rܼm̹* \ sZ)8td삧E*Is~;8:>!Qjid9Kyf|厒;OPۯeD{ٹң~|?M[edYvCQ,Zko|l?ɡafL'gt̛k,8 \ BZ#,YsZg|U!!!X'NHVn۾W-]:'!)yy#G[KÙz1=AL-mk5.k7;잔|Cd*[G7}^3^RlK[#džZ[m!$ N:PP6w} ;&$R~wr#;r\{$.e٨ʎ2mּyI)Q6c'x̸}^ %fu%r䱣afLMS씞zr_[ž9&'w_-Z '7%?Z˗YY;nؿ?8FÖ{5;uoW<RbC)20`:Cn2$4e~}S}il'W_O \vmzƭŋK&YϞg.W?[ErpS˯s<z\X[gɔ_y( \ EaĜMm^ͫ{caGLkckʏ=>CjժwYNHR\'>!mQ6Wvc@00v[/\u6:ĸ>{Í:/8kSo_mR \ JVfs.6+I[Ք"0O(ؓJN%U,ޫp:v[ׯ^b \ &CsԹs˗/?;mw~kٟE)R̢af(MQ]'{lb;и0gվ< \ +_>.5kH&J/=z,**jݺufѢE'rd/E}}3Rda{ \ 1#0go/vsͯ:t::>45q \ 5_Nߵk+)eU\t䱣afOq]{TA>=U \ ERSeқ7{4R3kݫ44P0v \ fyǾWS?{;2jSf*ŀWz_j2Kkj?]M-3PvT^UYb{RdaA5ڣ^uݽ) \ d~g_ucY973n1qfo5^a潨l`⼨ɫSZzKbRdas3k \ L#XZW#(bRdaKGRXXTTZbIM)20C)Rrr<XaEJaawdhA)LϐX,,**Q%)EaaޕbcRx-1Nft5o?b \ a)[qLϸ᳒/yRdaR)EaaR8;'7|"yG)R03K֝Y|Mm \ ZzNy9>A_|ՁC_8}\Sϒ斖XI)R-e?0L,Ǝ<K)R0|RLN1 \ JZkhlLbm|""R- \ M-̭zUkDR$srR8}F:2nݑnV68hKg20:nҡ#GHK9ZR.++q:4w \ %W]QqK5feʲG,uٓ"\<,|~+Ŏ,%#FULwwwv+"kf0dXY/xZO+EeYc-Y'[5O z5#'^xl\Ǝ?wᷨUcfe'~Rln0͛vdaJNYIz \ e~vf_6K!ko[R0ܺ˸%1b/5n"e0^|)'U)>k]`he@SfbvOc+% oR&+'%^WK>65dYZ6`w \kKI>&~R,x4--UUU o(%$̾RǸ#0ϔDdYccS"srz-I$v ;hNnj)Iq""rA8Uk7xwc*E{w3RJyK>!1i$~(<&Nٲ}gNW;r \ pG^V% fh;3)9EpS[wڱk-7oS\-W^w^~~~i \ iNkjjNKQڕjHݹs'555!!!...&& ŋ?YN2sZ}ܩJЯ.>u^>~% rR܊zWTRohس/ \ aUv;(QXT6~_ΩRT/+ǎGm,&;&%}\Imvix bu/-[>u \ ydR,I&>|B777KJQ{bWWW{{Tmmmmyy콤s z}RWONM \ IC$Թa'vX>/+WRZAj3n*E+ZhiiՎ)Jɼ?;KQؾsy~ܺeg̙r8jNUziSܼښX|IIIwܑGV \ q%%%%%%&I;*~;;;[[[e%rKKK( _ӧO<ySRFY:_K&ܐNҎ \ sg윌i(w.))ᦪw ;.Kix4YU?SWhbn)Uw_ \ \Rl#t\XLW^ɖOGeKإ>#^^P[~[xɋ/J&};// \ ѣG$$$$$gYůY갢zԽ^tUUU ˼xߧxG[KY:$$&{0 \ 4N~n6oxc#85߰yo"}ivTpSKa'N4wq>}|!:F6up-~V";&$R~Rx>Er AԇlXvL~Ys}hij2NJˏ=nWO ʝ ^bQWJ1**իߗ@,))GV q%%%%%ޡu(~R4>bQ \ Y~z e$jkk?;Z \ F[v#()/\ۥxŔljyd?WXZ[]Z&~_ŢĻ@ \ CH /b0o3 \ rA|_RW\xaiiiMM<~+I, -yD$Q&~R4Eu\: ,hooOɍJXZ:]RLHH|luhP \ q%%2뗢E{ _F^"n)&%%eeeUWWe}Iq#~L&ŢE? |!.Jq \ brrrNNNqqqMMMKKD>XZt߷ ף~#8J1%%%77߯[ t \ (ԼR^ޮ[7 JR RH) JR H)R R)E @)R "(E 0Jqܼ]|z]}l>;mJ |xNy&6M-=ͼ \ /Yfs/>sv܅)gBZzFsKWL?wR brʍfVgu)'""_] \ Kb^Wk~Z&ᯞ\===vNn55H) ?)Eq9jFZ--ee?0S_d \ 1$˲se#nS.rm>~%WGGmvgO*}^&뻻CBvn;v5}~f2y^z-}vYweN2} \ dO춈zm$/Y9m{jKEԹ1%%gTR @*ں:ig%oۙ}6.f,Y1i#%?IIQ]]])&ie$&{9^Y%W>˗^bX%JY 1Ea&j+*+_=)EfCb19'v^v/xZ{7+[BPڴHY٢+&NV_<|$uewR i$kI \ akoP!:eeuzpS˶6ɣVkŹA=-=CRt;A*MOHL7ɫ_) \ SlY}I)Jj]hO~K58P \ 61)yzW;L) S8x/;GLw:w)/.>u^>~*;rtaQ^NR[st Է~)74lad*_9ݓR]VB04'vo/!6lB \ Ү0g_?aJ Rn'>E)6Y647K QJ$4}^V/o > ܸI^*k٢U;4vzbø;wϚo㿴{R3?R{mPr5o\܅h9t/ > 7t)E 0J1%5mՙ:^)7l\r k1w \ b+;'u_eKJJ{{{gJ{_-MgͫVWTL]zagggN}*7|}?YٹO ާx/KyQ)iGquurR2qdS7VS `b)>QpF I 3S9}dSL1cͭ7l&)m-pvNn'OE7>~ \ y0{s~Y,K<-|?>>Vmumd^32n.;i߿ \ G"/_ @*EMaQh11G|" HfŧEee===]]]{=&M(E 0J[:4uYI G) J" \ A)R P )E (EP" "(EJ JR)E @)R" \ )EJ P" (EP R e)N❓yz{9H) @)֝Y|MmZzNy9>A_| \ C_8}\Sϒ斖XI)e?3&䩿tCsJR R쓜rcUDj1z \ H9s423՚V >xYJɭ3KQvwL) V&:rx͍[ZZ \ a%$&͝pUcTI5feʲG,uٓ"\<,|~+Ŏ,%#FULKv \ )kf0dXY/xZOb3k2NʹCsUkm\e$Kmܐe/* \ *7mЂKe]=&zH) 0TJNYIze~vf_KK!koꊎ[dXƽ%ie$&{9^Yb>˗^bXIõK \ ,crL,546VTVR<rduʲR]RGRu" /E0ɲ \ Ʀ~EbvZ,HwyYY^?ԲDDe+ŹAJ=-=CRt;AROHL7ɫ_) SlY}<zRx]v#%5M~\me!mw;T)nںnɻR csd9zi \ G}ܩJЯ.>u^>~;rtaQ^NR[st Է~)74lad*S<y*RHM9s|!8 \ Hscb/R4Ll^p)E ) \ z{05unX݁&MAj3n*E3ZhiiՎ):!;KQؾsyZ|M-ART?sRyQϛ1EWbHJR `bJj33Qz \ 6.B5cYٿX:ׯ%%[SR3T=s/lmmJhUUU$-*~F \ u[gggN}z\RO0GG78xR|ZXب68xCÎɏ)TWSc't>EJR `b)>Qp I 3S9[0ۼ-R@<v<bXsk IfRlkk[qSM->,4wq?wᷯԹ#:?+]s<-R⮸9m<y \ c/K5J<OGs)l\-βrϔ" .EnG[v#(=R Žᦖ_7tuu 4 +oAnT ag%%4 (EP RH) @)R \ A)R R43q(E @)2" J P (ER \ JR Rd(EJ J7>x֦^4" NKq͆/kZܪ \ Y3]Nn|k7[o5IiӾ)r=H) Vn5J \ 6y$;__}%(I{o \ -r+5I_hC)R -ł,hkjsYqSE \ =/]tY}jmJ~[컔eأ&9)mY<һRb,P" Kj}sKW^Vkln]v9U1w+Z V*MrK2NN7>xA \ )E 𝔢4ӕo",շدwf7>/ʼn5sJeyFCWo7{$hKR )OSM-. \ ?R~_)uV5ƣiAJ |?(CS5վ)>"ޕ(Œ;Xx>e^-H) gwg7;\e-C=i>u \ Q}D Wr)gY`m%Y])=;}^kZ6" ^J>ʆw}-Ԇ \ ږudsޭ(Q(U72>wjZro7=1EؾcVߒ=Q2J=EH) ~e۽ϩ \ Ɩ)E @)5 !EJR `"C)R PH) JR H)R R)E J5&J P J P JR RH) @)R \ Ssr>xVlܕ>~gUUU0̤R xNy&6M-=ͼ \ X;{&^M,L-,\?훴斖])i.=5#nhoQ/*V7m5fUu" \ )#̬""Vt SODDs^wko\Zw<(sܼ;}r.:&ɐqNMM_;'z,.\4" \ )Eq9jFZ--CXX9:z$%t5?0m}}GFm}3Prqu \ +a9)m:c| 8ey RZ ]IsKpS)7^_/8Hnޮn&M;s \ uz܄4%7-(7y[졹;Ϛc3ݶwq \ 'xin'S" k$;Qng鳴c %'cGGbh1 \ ʌ)J*z4҈fVvlY|wֶ|hm'^(y톝{eY:RkF%" r&$kIWTVJb^b\9ndKYYVVnhnXa6JR `04PccS"srrW0nғk \ ?ƎOyCB%]ߢj7UԪ\\V1>~?XrrlR(V \ UDR1Yٹ6.OR `')X?TR<y*R-,*W6,W[D{?r꒟Bmi&jA%,IJ?c}+ܵg+y3>C) Q \ mߧhjiDaw<o"RM-A/E)=&M5<GFe(pSee} \ }E+~8c|bb/{N~߅um3:x<)xʷP RLIMafu&|^ohnNNar6 \ :WjooP:Шއ7yl͌Vɦ"ͬԁ4Y3|Yorz84m\Fiq?3ͻwY9^O% HVzԖ;_|)+Xf&6~du/?㋊JqcbZS杖 oR4kO?VcJ R{v)20fJHLzi5ud97nl(O-m|)d紙|y%sr9Z5q]n37ȳQ-J- +Wm5m O\\_)>{16zڵIԎ%֊DDxԇ(EJ P \ "i/uDOI[KcK-" ŽᦖGOJY" (EP" "(EJ P" (EJR " \ H) ZWTTJp0q+*rr)E MJQ"'͌[@[n=~C}8 yi0t:]qqq^^dG*yQNAyєTYJ |i,Ê ?!<j#L) 0JQ;*K1p%<v~)E ^,~G"`0Hs1p%<v=P xbիWR8GM;yU&R +7oT/vww \ !jD" 1F $g @) R J " (E P \ @) R P @) R 1=Zuw IENDB` ["demo2.png" (demo2.png)] PNG IHDR i 4' pHYs + =IDATxXYzygmuݢnmo+** *^UPKb"Chi$![=(Ud2qM&39'3s~s BP( EBP( BvDP( B!;P( BQ( BPȎ( BP(dG BP(# BP( BP( BvDP( B!;P( BQ( BPȎ( BP(dG BP( BP( EIvlDP( BȟIBP( &)K/ՀGP( BuHRrdz/Tr86 BP(TQQQ[[ْ 5!łit%Fh4mnر9 H _=x᪽ 4Fht%[HTQQQ]]][[s(n5\Fh4ݣeeeUUUJ|=Ŏ|>`r4Fh JJJ z_=i-,,oFh4GFF2LGX\QQQSSCަPc3;Zh4F;ٲ=Ob E`XABBB '{\<S.Zrlsmk{h4Fkm6x$i 6qx<X,${=j;r8y:6{=7liGm81wMh4Fk= \ aجC%&&2.+kjj4e2Y}}=͞Ȳc|n֑[w^6_u?lYsOȪݻbWOp Fh4rNQqGuV\\\VV0Xqq19bFQ3QE]{qWXanx,-_7w[u|N}Ń,qXxCh4Fw' \ ?_^' .חj!_CV[_ ̭Z-3^ \ \ R 'xkXhtO3o8ᣰaeK]hΎsLKVd内Vs.^\`fibf|%V0b-$^G_Ph4cPnf WdX2hto݇v8gs$oBwx5)*}up@Zy{[VRu{Z,Zji|2j% \ ?/OgfqZz"KN!o7_Gg.Fw#رG7Ϝrya,֜lGQxdJz@7%-qQؙم|ARjǰh NJE G_^WЕ2s_ \ %/ `إҁg/iϺKVp7hfap\ssKkc3K,ᣮi[dZzS"Kmh4ͼq^`ǖk aIt܅KVobs;+>`kKWay* \ h=C.o͖sL̷;/._K 0 NW~"aqzFtp@:ނ%Yw \ <lr`G .0ӥVK,ٰ,˭N㦷#ĥh4a;-.Yw5[v\_*.X\s'}p.rBc\bm\<n) \ K,0 6?A^Pǎhdցu~*x_fֆ5^bzrKe.md6bY{tVhJ=rDL⣽.Fi b͆mps0[v}L,Na`NG7Or[wE}'u,<prMh30N*^iyt{fvΫt`G]#ӎ=mǵ\ v]^r%1J k3>YX-6ZʉY&Vp_X$Fi ;\s;5#XWR*]wp \ l JaC7[AD'6T \ 5ai~?U.8pq'^d'uzD~Ewٶ&.27[J^bѲuz \ \9L#U~f/<h4^n`GX71_v3Xi>o 3+X6_lZX vAnfʣ=O<~,lu[ȇofuApp,m4ZC UzCJ(i/F'5K;,g.n)Sitl sK斋rLc2{ \ =Ni@Ѵ%&{A*]`Hi텕;x٬`gx|ߙ\6)5}Xh4Ukh \ ޒ[2268,.8`ѫzbmW'|4'6ی3wh4Fj<~$,`㎏Fvch6cɺiMri3,GCh47n)>Y;3Ah4Fw`ӭ _]9q\4Fht֙p~YV \ W]<=Fh4#;h4Fh4FȎȎh4FȎȎh4FȎ=ώo h4F*0رet"Q8 \ 3ѾYhc=8::.^\* h4~=ӍT0#0#éh3h4cWّ-\?讦#OΎFȎ]eGT\dGdG4FvDvD \ ;";h4## fFT0#ȎȎh4FvDR \ ;";h43Avě;F#;gqqh^Ƒ2;WM-!r!;(;سȎh4lJ \ ;<sѽIUAFcaǸ4dG4Fv0v쀱^+V-Eر' w\dÎ[d \ G4Fv";{p90\~C%l<z|iƋܽ%${ >NyΧqʦ;~)uo߽'aKjg-4('O406}Iьћ㸉*2oeu \ u5Xsݬ9:cG䎾~&}C=H Bs;:)N!;$ͽyy \ pvֿZ|b8UGƮgG6D:CCGZ7REnXz4⪙uRV3zŢo`ש> r3s<h4ّZa \ cu0jq`=TՀ{ZΕv1r{&v>Ϟ4.TarB;*q#WAw^/={'-) р^&OȀؽ%͓h \ +G!eG-ò-@!So폩Af`<xxPi3_5b@18 ag \ r}!HXI8\.,#eeEB!\SފE`_k[ t);h4#E \ ɕ\|])_|\U&B W-@EKigg \ IU=;ZXvÖ;ˡa2>, 1s7oI7lSxSgnZ r?t \ _!㵴<CYZ+?jϜ{U!wiʯh4ّ (?2 \ .wtvScoL@V<zrF#ӂEK g_,v$yi};wu \ d BO=ϡz).6Y]{جHN-;._6} \ p;>wA=I9z2QDFΎP){ ʱ1O 1_hwegÁ^Z9o"j&1O;ݰG/_541UeF \ U6k7<dhr֩Rsמ펫vjW#a##7_'E!ٱT"OܼmgKv)_hfFȎe_8qXl| \ c''[n G%$B7~p/ ET38ZX[s$.G \ ; *7쵓u \ dhMc^@Q>