From c88ebcc7ee9ab136321e08a89e97b458282e7571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Wed, 25 Dec 2024 16:00:07 +0900 Subject: [PATCH] [obsidian] vault backup: 2024-12-25 16:00:07[ --- ...ustでの評価文脈(環境)のRAIIっぽい実装.md | 3 + ...スクリーンショット 2024-12-25 15.23.26.png | Bin 0 -> 51268 bytes content/エラーフレンドリーな評価環境の実装.md | 62 ++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 content/img/スクリーンショット 2024-12-25 15.23.26.png create mode 100644 content/エラーフレンドリーな評価環境の実装.md diff --git a/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md index 027919fb..be4e47ad 100644 --- a/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md +++ b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md @@ -3,6 +3,9 @@ date: "2023-09-01T12:44:46+0900" --- #programming-language #compiler-design +微妙だったので作り直す。 +[[エラーフレンドリーな評価環境の実装]] + ## 動機 [chumskyのチュートリアル](https://github.com/zesterer/chumsky/blob/main/tutorial.md)で、評価する関数の実装がライフタイム付きでこんな感じになってたの頭いいなと思ったので、RAIIにしたらもっとシンプルに見えるのではと思った diff --git a/content/img/スクリーンショット 2024-12-25 15.23.26.png b/content/img/スクリーンショット 2024-12-25 15.23.26.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6baebc71c051e13d31d2fb6cc8485a05a5aeb8 GIT binary patch literal 51268 zcmeFZby!s07e5M!0)l{`AV{i!G|~-%bSlzaLx(g&2_mQ{APqxGNh2wZpdvAJN{L7f zDZ|il_xN>q-}m18=Y8&9Kb~itGy9yq_d08@wf2h7_NAt}!j;R^m$9(0t|%!!c!Y&@ zAqRZ!;$H$S<8aPEEG!~*J6TyxC0SVpO*a>aouf4tmg38JT|7OlPKtEHM@smlFP_Hr z!x(NcJ&hwZz*> z9xufBl+fo*1JT^vaJcmpA!nI6- z7g*Qvuk$*4c;G&@et+WU8$ixbxSNu#yqa-xR&5*c`7$GxBLC-=ThDn&e$r#N!k+W` zN@6{r`o#%Z?0)Pc@wwh@nc?#YTWY~qI9qDzSKUjFKP`PprLdo>lH>nM#dvDVCycxBZWvdH598;W{!6``nk(*uErXrMFvwwfo^-Ux>yZyc*W5B6 zFm_+>Ih7jv-J)Vr>SjxPQ_oI+yI)VchsQ<3Eib%?=gQC8!JTh+UwC3kKY3}}YVurP zzpEd&TEd?F@s?RH7U55VS5v~L4D{?|xM8x6xKG0Pg?KIc^X|%$6;}iw$aXUw9Q(XL zF_u!Why1+cr2Z|xgBb3|C)+zuylsqg@RWq@q^~O#x72`ssFMtdhq{;FR=j`bMFA-u zg(BH)#?esWM{mg~C2eC3lD)k)c&9+!$GMci!*$vrynLR?A0IWl5TO=YwbZo zD80ywvPGLO;f3zcC9Yn+bR7P{tjU5^$XrpOIO*EGYY~bxH*z9rSt4=?p4iikB`)B7 zF6{WZTQRkK-%ngR_2#>uaK=d8YoD*Y;rtdJp;Zz^*}a`TKN9%!`b0>%ZMD=sHYv6b z18I3M*{BB(tqoRrvYuE|YWNp$W0Egu}JPAPG+R<_W4zuF2B zXM4w_N6+VEm@T3o62reii1f*xy$JrSX~8o|$;m;B&Kt5WlAvPs-RSLq0Q^MAPP1%E7jk zcJgE4F;Q=^pvQX)5jG1&g124j9czqYlH>ap+qlD$;E9*hzLp!O8XIA21_TY4)#~26 zFnc|8T$3+s`W(S~VgrVJ$`B$8X~Zgcot)?k}3P zPTOFqKD}7}{P#yJ?;lr=?~~$Rc*sC^=UGAj5y!{g1vBO(LW*Du&C5E^u4LjkUJ$!4 zuun&WdnJ=971!nylk3GPEblqQ3U1$hZl5cX4EQoK%lPE?q*br7f5v`tU-$(#S?B|X z4~o1oVOF;uJ$Tt8M{zs%n?VlFMDQ?!6oW!^?6-?Kv~|zKAJo5!U1r+3^gUQo;fUv{of$_Dk^5)i8zd2J zkIIQuBjFv&<-En0i`r9uxHpG+nn{d{rM}>MBDjIC>v}i+DdBIbeSiOpCc(P%sC~O* z>QmCqFH+>oxVJ+te2QpgQN3kF1|fSzU>!Og+8)a1%I!&JLjLjr#X#6H_MQdrJ(zI# z$B>WDKW6xZjH~;ruHAmCcM2I}8i4uasblM~WRvx=Lv|wN_UuSSOy-sH!un zbjtnW-8R|2x2?U+w~hCT;>)X_axdS#xLe6ubhqKIT3mOWdKX@y;7Axk_Dw!Si}GQ2 zf#)#au-~vQH8u4jbvpGuYO*)asTZj6_|WbcyWGlpk0&jc=AxwLoX ziL77yjrQa)!z+C^c3+Ruu1gpQ*IVs;8fdwZCBG~GLEinf7j-o?iVAik{6_a{A*u}C zjeF+F`!Fk5v5*L4(5Z_bB@mxfDkR~2c+)TnZoO2|J&`}r1d)eiL6j?LAx;qb9;Y7i zo`{}3*lca4fhz|u$EabI-i|?vfqGS{gTBK-#Pu()EaR=K2N08?HW6FTBJQa4THS|?wCPm$G;fhv+I&7P zN27s{c~64s#~bjC*^Eo0@}o%TTFm_C_Y+HrOD)DqN^7T+oXMvX>Z?Bnxb3+nHjLGI z`{_Y*d>wZ`ei>MJ;I8A^>qjPjL7dV@(61Tkw%4^Mx{M01&GwGmGubR95G4Oh?xp6l zX1Q^DYhrF_u6tJvIlVDCXS2w%RkZE*%Vmyxdv^WowL=Gdabvz2-<3ETkA~Q%9r+VJ zpN9V#M;1o~XEMYige-(Dgbo*mXLD)n(q7od=RE`>SC#RvkQkFgBV2kYw;lGI%<0UL zZR+7eZS!sHZS->E3g2$0Fux;jXD)^La1XLQqMjhV_-_B<>bnhv$p?KePFcflkke{W zA^E+G)~3eYpY(jRd*U~5(t-E6>{ScQ43?>Ct7LU2k9qV?v(jZ%1K99AyR{tOST3fU z%qlTAwG>%jvNmWPGUKVu@YL~*a8?VW7O%lrEAxz!?1crq5d(Iw?LzFr2l4Hc?EHo# zFTcap4r%rXJY3u{Vbu8eaNp<`w*fbT;^@WLs|@RXt774gu22nHeZat=wid%E6%Utm*AnZ>UcEKZ6n1_#C7aUEU6%z zZ(TYuCFf4xJKsBbk3Km=vc)?1O9&I8C}kK&vB?ADxXR_FTTAb%<$^fX4W_C-`*gN3 zMYRwdY4aE6zmN;b#Gb6SUYuhaL-m9yT5$@%c8*DPJgB2dfRo%7TP_hgW3~z zKAoBpH`8iQfhW}-D7ZkNL*bZx8K=>a&-7r(4U!AC-DLSAtS zaYD`&Q&rHRj#tI6ZpLHB9|_%bGHE`5Qw$^&8J^URI`Pfu)UTg-b?#1z$#@Ox>g&d@ z-`U_8Kk(4~S?WIfq`7Fq>0^V(UcSVj1ntO&k$eYnd;4ALbz|*_Q8tH$z1)q4?SLP9 zZ#*MC#da%q6X~$<;_w2G7}vvLc1yp3IsJukYFTJzhZSw&vRxD6;NV@+NZ^^<&fl_{HMx@BJ z7xQt?LFFeKjkNi6vA~%nf8@n7LIo~2EKzDGKUlE}$-lg8d|n~lf0KN3m2DQ9j^vDcM( zwyXsYJS#L^51gKzn|ZQh{-b?V;YrknB!y()>4V?DESF;Pck-?KR5M0A>O2Iz@w`nB zoVH!k`mFn;cCMY3o*XSw)^GJPk~i=DM+ez4a-=HWs@z!w)Ny zN!GfZ$ul!Z{-->WjYch4!iFz6Sl!g)?VoY*#Z%tWnL3x0j{)X`lLN zJdLE6G79f?yRf9L&Dd7?X*XJ9#dqb$>@`&K4ttA2jdU*JvV6@M4u5~h@DWNU4+I#m zto4*2YHC<);2Iwb7n>UEBDlf^A4%++=hyPscd;(~X~)6B3b(_;{rikM_(uOlgAcmT z|GqE8gkj-4mu>*8k3AjrkT#dAyYG6MsHxSJJ3^w9(P zzumzviCeZF9g9(FFy4CryqEnGZ3ByQb8PjvqGKRT^_?Eaa_+5PWpffwXP-{HQ;#lw9* zHs~sjZWYzE^Raf+e_-bXcn0Q>6y^~Y|MUF+mq=Uw8iRJ+7w;9>R2Xx<4Zee`?*^P)eMw<>_j;$v!>n5}ga&bnw@6YEVa{O|YQ z8<}LJiUC*u(`0rR2WLfd+&J!^&fsC(N3-W+{kgdD>Z!EoH7`o0f6sy)Jna3iNx_3* zw-};{pHIsX{F@wU1{CdosmsF0&yh9veuyFW&lG?(y#GVmIY0jo*Zx11wE_I&1@0i$ z*~8J=u6DZJ@`^!a_WO1EKTOXKbq}UD19bz>j%E`V5>1<@ep1xl?dEE5w00j-6N>Q4OCj=b{BiMOCS=4XpuUeBZ)_*ZTc@&{Cvfpa5S^m zZ2d-HG|4`8f-3`Qjs*4t+ z`uu#kaCW+R*5x(nq)T_QtU!{>rB=TTs2p=U{@syS7O?K%ROFf1FqPZ5|Am`tudXlP zJKg-71A<>2Z_5HvMGNev2g=v?Cj&&KNT*Px-kgSxALLN8CC;8jcHxV7&no*Q8))2n z?lH~&#*^CrWW6`-o#FLb>RjxjYg0eltYz=JvNe+jvwd3v^sobFmhk6C(U5&I5+VWckm|a zrH21Igi;sN(0uLQj9;SP^s32)!u#&r$i0@cCja@Hvv>1T-IVLvX*V>T{U#?9tP}L} zs3lX%V=KVoB#t#M3XB}Vn_?HoIHX=1L057Yz#7?fl3=rbi1cfNG)H+iOit&8Jv=*J zlHy*<2s#~p!xUHAa(cLMk=y5f9je5|xG8WHhnt8luv&L!X~Hks0$nBBgKfT=(0UNtd_MjUw)r) zx|3gI&vK_}Ma`wKt@rMb23bM0!P4mi*94s>RoZcp!Bz0i!0 zC2AUOQ`&rpK%9up{EoC3p`vIsY6;sPMC+&cHO2w_*P&k&WJJ9 z`(;n15im4q4+0Qc8HJ~x(r4cHbohN?H+cxZO=~MBzih#GVFf6`-gZK5qjl&;rmwcz z$73LrMl)xpd%E%6I1g8@Pg_Pwi0+Ep+%F*HZY=lzae@Bs3cS=$$@FkAQN5uPca$Vx zS$09U>)#4Pf(joH&ASLSU=WOYQQPj z{;+liy1MG3hg#>Gwvo${u1)WYUN$RSLtydM+vlo}k zOt|++bQ?I72-u*?ns&e2_pXoxZaqVc`^_NJ7f@wECspOiU*2q=0*(lJo^m*Qv>Z*l z^diMDg2tl+HoiO6yV08hMUfEHIC#67LZ!t>I-eiGBjQbrx+MdN8B~hoPl-i-Maz%X zt;DO4EH=!ZY}h+HhapPAlq23BV9>L5m!Kk@UvT?xtScV^f%ers=(Dfc^qriX(Q(3# z&02vuRw()IR%RFnd_6mtl~ZMbg*FSI%}rHJV~ZX`N_|K#;`)OCv_qEx@D&TR>`sq|4(4s$UHJXl~_ zQlqWhw3+EPf`_&w8~Rn5+%~`Gr?ZGGu&gQXd?%Y6@o~znTRR-`JGC*P?4rqOpzy#B><~Rbe)U*^Vr+6^Ozj zosN;&h*3)kmcJ6MS_qtx0#2#WBlT7#jYl<5eemwxeCfYm7mmHx(k9aZ2FpeJNOsY; zA*Mg+X#+6kkBfGD#kuBw1#J46R#z*uneD#yAB;_Z+$%f}Itk7}Af3Bxc(fjx`gXbT zc}?+HN0k{T#r|`IrtjNq+cX@Me!x$h>R0ltC!K0baCD*kvxQma#wx>vjfMkNZ+A6iSUbmks!HZ_lgL2z4!O2S87e8K$VOy`Hq2Y8@FV?HUYQx80)QBLi$?hSm>13y6@5CY_s_8 zhp05ceBrMX@=QmeCa#|@mgHxkd_xv4&}}_Mbi9lT+{qrfxAFu|g2N|^EM`fX|56nc zmKp^5mPYoF5NQN%#}?5GLym0Q0&3zrEpd(oCmpru_C9vNz21*ubdH>rAzIz4lH@dR zs2!Ed9Z=wZ&}~{8q7q`TJLss(8^`BhFO>TnC1KHNbuTGR{hwU-=MxuZz*iH3@+|Y8|Pq@F6nYa#&b`Moy z*5mHYw+UAD-wHCB?+n8H^egji0wVoMc<(?5-pOgT7a%8ymUVyUwi1lq%C(x(T4QFaL)(wD10hP|-CGkx>uO47oorPl z9n7jZiR(RleW|;@dtUbV@`VbS=W`K69h6Bb$QVHPh^3CV5YaRZU#T4)w`c@Q9QHW>k4p8m8Z$iUusFJ+B&85KkVJ+&PpRO+BxgSyw)32ye)_I5jvx)Bc7~Jj!5axm!JoKPC{&B4NBTpo%~Bq=UA5QE0Cb zt}|E}F9KaTP~K8;od`NR$-nq@w2z6$%EvYgYsnYN=?LVS{S? zx`P8W%?4+Da`tqWEh$G`KVHC3gZWN1dtKDddq|S2F_|KtLPfPR%5Rhi2eFXNWpWYCMYC!Ke2eemLTtdFt3K zmP~jY9WI^|XgAuiBc6Z4=P1NvF5cccG+BHe1jgNpKBORez>syPDZ#hLwQEUyNn|0I z#Q#U}n0mQl)MJ@PHNA>2I$xEhDfhyp^bq9`2veQH-}RI3wr7aN?+uDHSbutuGZPVv=hye^pAGn6l}IW#pPw;mq=RC zSIL}oC~L~Q_%*jg9!C|LMOIi(kV9}uAG=12#Kt&3bb^RhEy^s+0CH*}BNsAg#FPQo z>;u7r*hrSzl^pl!j-EYa_Wicin=@Nsh?1TCMZDnAL2AXxE2~Zt%_!fnqdaec^%Oc3 z$E7ONs9`PL;I41r=WpJOW2TA>YGsfOPT5AjoqDdi@Z%RT>*n?PZ);DDpoe^>qD>`K zi!hNKD*1m_20y3y!UZx#MMV-_<$DU$S;*{Y)VBQug4~SVbtAM{jW!NLkL^e ztD{8jrjHbXz=~aAI4301W^o5THS1nexKz2qDTW%>>W&IJo@aZ_oa4dfesOT;mE`u@ zsNzK|FHwyXlQ8Uj7M=*C)wgA>jKg8Jq~T3(sH%(ME(g5vYurQpoR!XQ&G{soqIeE2 ze%)mD=tYGW92O(aNnWc5mI+z)o4$R1g^5G3G@P^EcPuQ?b8wIOQ{&{O#;UJ4#tVC${giI-iQ~wn87(MP zWxXwQmh48Qv3$c9C$gWssypTF#IPC}r<#aPx_JFL!HBjy%auqn|K8ywP z%X0CZ2?Uo+UVMXK{$^u9d1hzNpe9lI;&B-B*kqN}dwYNKTblvM<^pt>R(RC6HMv8> zTs4Z6_oGteqY*Z2@;{!ZFS{``S_T5c!hnYkW9m@{Tvqqqt@%!>F~Bvyqg{IHLKu?S zAL5sQ+hNj!>WR8XMH_w8g=q6z`=Bt^9wj!NzlZS<<{22GBW2kmTP3WnPjTFeE02vv zHZDn&t+Q1plcbo`Zw8$mjiimZOJ*GO*yx;PW~_UWo2`~uKxq~Eba~ye+(`&5C!lvE zil^g3qxpJ;v;BXPXS^qNv0#9cV6A)s0qTs-32F4J(aGYRaGp7LNb=@8`Gen?lXQd0 z?WvVzj*CZL4ZKdxmip1l=-50pn14>-lK?i@*7@heim>~t1>mZ&UP1ZcjWc)xdok-F z753%lfwS4S(myuH=w2{OlU#CmvabgSJvxhZ`-~bmY-6($lQ)x3l)b;(<+B;}90tQo zRc*z8MavepPOeI))CX-nqvrswICtU9xZ}&1Lk}%7p9*R9np;YCfc&2l`lN_<`cqf! zj(w(Mm#P8zk=e=D{A;c^IjJL+cv0bbZ;Z?+Y=p7K$2 zzJjT!Hjn>aG&4Va(DCn)Kp255RbGlnWm-*jr+6O+^jcz^$)&+mZbEFP&kG$-iAH*( zC>z#m3}+B}5aPY{Yl=ff>E@rL4mvdo-SZUq4J)c{D$o3GbDDXrwU|o>qV$og6J-L1 zt-sQ*o#!w?GSo~OXCi$8nQ`WS0I1ML8CY}KQV6E#Z-pd6V)Lx?@JQvD#XX%(Af*U#zQ8-t1&|uuzKMy4tq#5Fh?p?dyOS*8Z zSkX=_RwafCG3kq<0{bdup3#SlihvbR&coAF~ zv~Q>3XK=Ec8b#nlf7l=1^_ zo)~^SyaVmXO=M~h=bJi;QQ=}eV7#5R*QpWc#?3uvgh`>lr65&Qs6UX;-zK<`Je0Vu zu`OOS0;wL5i=a?zc$w_JK}JXa`-Q?|2`>Ul&w?lwo-SWQ6`YlghD}MQUh@!#wywSA zy(YFP=b8x!2(G>CPV_pK^l62UG9lN$8;Rv^XsetcF1nH(SA^S8bau}7R76Xs)K$%b zlt&@mVk-9>>*Na$L$X&hr@OTpC`ewZ-)56{b&O;0ThR>v?aq<%>EpDTPMSeHiRJqT z?uEnc8bd?IB=<{aRnsa2R2**R?(vr~ZRM$v{ScaRZ9ly2F3CKcpU9sj$%HNH7o11Q zHwz2xz#YJysZxt9(Zw&-nBj_s2rP0`#QW8clsIc&TyPGAvCvw%o)dOv7hPM25`_- zhIz4>3D=H6qOEL3<^8v*hS21lAI9jE+|LN^QVQNesnqfqtmqi&c-MhLk~5H!pae

jM>xlF&6C6`!T#0HTRv)j2f*pshX<_VRZ zPsh?p)Ikoj8p5i2i{M)mjS13eg1(1C876`=KJ$n3#u9nc2DMfNQgMF3>_pme>VFYA z@=y2rZWsR$szV~WoLL|XA^wyOwG7s9YhsaDQ5p%%Ey=f?CJ`vhhigTJxC zM96H-Wo10*o{$y0QeEu#xq=emuM)ECyOgHOxfq){RyvGQ)>I&FLYDfa5y{J<3=H>2L$Cv@$)kn3Mc4BOqP`?n4bbOeOWRuGbH?M@bey~8(3xZUF z`vf2LU2VHLYg0v?Br{CLcDAi0f1-n?iZK&EwI-=q7J|H$Pw>lyA~rIXGG5TjI@EIQD9JfXvscH7mbUlwt<(Bm! zPeGc7U0`{iryw}9a=*`iCbXGGcat-PA&Cw#TGPA4`#?m>>{s)4fa0X5;iE+VM5O74 zQ;jrrH?mKvh5BkVGEbL(78NeBWNTV|DX{$NyOwtI)8gRiNw zM2hzpUUYG}|5qv-)#{^9c=Y1DVaRG%af|`T0+FxGg1_^99D+D~y}OgIb8-^-i>94H z=8RC(bVw@BH7_+eG+>#KGo#urJ$C=MwIU@BKtytX}AxM{k|wNV#pm< zo;1@EA=#F7K|jq2p-s^`$DSmA8oMT=V6C4#}QZDxt8lKGC6a+lP^^g z#%|MWGo*q@+x+&sgWi<0bq6G)pY*cj<4NvO?fKUZR>C%Q*6_3k$xjBN0;{MmMvLYs zND=B=>s6k6U_8bk%eFCBhK+Ca-byD8-aj4pe2q}_slB@KtxtC+L;Zi`HC# z$x`jxC@d-!^)yB5iCEzwic~Tw2iX&3`JPdu zfu=!>OHrme4B&c;d+rVDJpxsr!O!d$NEOTGK~c_xSZu9)JE=oFFGV(`bznF~GiAiS zQct}}%D&c9O%uM$U8j-j7u@ruajT86NHgVPLOmynX9AsP&~{zlb#D^olC2Kf$)=Cj zQWwcZq`_$#1XxF$*n0Sg>fl)I>eYWn7-r4qIn{c}`*=-dy4E%|rp{yB) z+tKtmyexb(vj@H2g(W)QX$+cDO;$OgQNTm1L8z^J6rYC@xMAF&5Z-cS*bMjLAfeZ% zia`kgqWi7OLJ%k8XezkBwEE!=l{LUeE6da2Ld@iiSab~FZp*FqP>3oX8sRN|A(djKeP08RO=O?DNU}1 zwTg;S1BW+#YIWq8WeWc5a6e9$_QnDA?v^f*rBtom?+#^d+np?l*LC!=8c0N6oy(6j zJy?9npP~Z6dH6;FsF8)%3nUyJ^g;e2Kb~GFTv985LCp0>YO%vSspMnW!t2A z>P%Qfa4Ltba~V{7tAv$<{kDf;C?rzy3=rk3O(4R@Jo)X*|Kn zP1&gRRi+Xq@pGLa(gNF9Ub6%Fa(1gDxV^9wGfGBxt`cFOa6zm!TTQU@Fw=O`HbAK< zr#e*OoNMMl+S_Bijd235Ef0$snCfuban8NPaLG&$OkMuVI1zAb5kXtRU6NRpu%(Dm zA|4`8kG+8?RmzOQncj&UO&n7(Q1LleryF5_ZA6}9cls5Ao&6M6*_QuHxB(!%>f`Fw zRU9nB5}~sLbzJ$09$bv)1t|P;O}h~S9z{FMZu@iLeXEESCW)=q3*Fdw zG(2T}B1ss!pSBJHjF3w9QY9|+o$~0Jf%?N0CS#W-R99`w$$CZGW%glizjHbn`gMVI zC~H(#H*>`yT&FE@c>mwmybE4abFfqvyr#;Kn1Qatgmofk1O?}yiovsgUU#_x7#?p6 zN{0TR;N1V0QSiYiq+O-=!6;43v?WFP|DELDw*jk*{!2r@3m|c}tycrxdkx$!_)qVD z-xiwo(5gG$?(UYOG#=h%`-49K#Z#g66K!4NY8tO`^C1(56U(}V1a?sSaMt%-h&MFd zO+DwGvpSkDOX`Z9WIv=XXOd5H3oN#wM3#@ZNbiwJ>hJx_E&6@Z~-I83??MhtAKnAz&95$!uke`adTRn zO~GshkdQ0nap_!6Pr-VgJn_`Qd2dHB(UU{Otb!FgV`|Hu^u|yLoxAafIjJF#F!)}>5U}tiahp|w|Hp4 z9pQ~q<#XMs1$S!S-o}58=E5L6fBP>9!5;t@I_iC=X@VaCARW#*3-SOT)tsnMxB71b zSx|^pm&J_L?+zN4a?}+wfvK>o{4VQ+NlN1W1?1f3NdPR+6D)$=`n%b^eh#LkfG;!S zS5cBGPEPuSV+6qLBY4#H#5hfQ7OX-uc?0Ig(^eeNaIx*+M({(x0)^b%Va$Ha;|u!y zs;(1D=K=58Mm@ETu}|`fK+ChfKGMb^1bryqE%KeS`Wc8v@UqsZal^pwN_=%T7sF{> zjI&|31121Bk@d#x&^LgldKejw23+0G0I-xIOglsWW59v}&TJE0=pEn`;1AlJvjEBk z8d8S|2>5{uwFCWX&vvVrg4LJ0Z09AZl3Q2 zM7rS7(v~9fb9KkipqB}PQfXoO+dOQ58Sks&pco!7YXA{#6!h*O2O_Gj_pHGfBck|d zr+QegP}z(T^pP3%55q9qj1)95#2G(pB?UZS{Mo>dq59lud)*9{@X%?Q81t(0KtdxO zy6d@d&d5PV^g5;;HwD}fthOGGkd6YPN_SuMoCVT-VD$7@QN~~hAO&tuQvHt?%>gu_ zX6tpU9uPdsiDGBW=E*|=NYmrbhB5S;0FJuMV`2oX;5qPUJIdP=Cjbc5k@^}&c(HK^ zfud33FInQs12h3`e8M9Q3=e*RiDSnWH+?Co}XZ!mUtp?hXm|xlO!YIjYAm@>qmIZ9V&p{u;he#?6vxD!0hG&{yS8!wj z)5BkE4xUqu@pyR-!Gz1TSz?%I;B^rgzLayd8UGjvD@q&FPHGF#GT(<29&+PI0B7G1 zcZL6aFbTk6KXpVXZVK?j1&btx{}JB**idk$uK$_*iYv&MYKfuwZ zH{Rzm8U{d3#ACA~1Un!QUKjg7c)r*inqc)AQlqZkxDJ@{*g#nV!-H5Bpid^ShIs-Y z?<~cirnxYS9SUUWsy&A`Q#l$l#%M43&njRxTC*2`2c*A^Q!px*iHRKKO~DeL2zuaQ z%)t`?U+Ac|o~8^w1H#&T`J4r6;0EkFFG4O;0W4`0L)tkDGM7L@pHf=1bR{4KQXT&N zpZ5UNtbzdn;bS7O)@49J_H5V&MtXTl!SEkzijQt> zNdZi^Ztyuj3jhnW4CR~fcfcmFel=(4oCP~Zph2X7oXj=>h*$Bh=FM~A{Q^d_Ane0` zoePLefFtrSv{?euBIWq%32@c{Gj;`M&eik=+CMi6(q-xQ212#@nG0hK7|NvqM}u7@ z<;@-gW<0cGMPYmZ)pXFu*J&e?MHLw5@=M+gn8m&d43u$ES@qra6k%dgwFn4c>m&Cse(TM&F-kspT34!Yz{!$2U~fe z`6hfyq1vOPSi$?x(fT*&vS!$Nj1z?KZMznR~*~=O$jsX^w zvzxoczYZX@jdYBjd~pNlY3t^En3q2SiWpw;tlgmmun@6`be2lsv?;J8tOPv*+(mVj!{f5s^ zME2~9N_1+*Eg}%d>uo4>BC8nyxDx^NxO56skhr=1Cb|pD8$S~?o$D5l2N3mTwM?96 z6d=Mqec1f_jY}Lrq#{Rh&o<9a%f#oY`tIIzY5bj8G#I;@YqPT?b>{24BsM#->+k)s zo%Vkqbx@$J0p*dK1nG$;P`iU)EK>Ra!)aPA=JzU3Q%ye1)J)bLqi z%dxcxfX@}ujU{jP9Up;0si%I>391_nx>Y*)j()vGN!(Xs9Q=mlsp`WN+234QGv4X@e8$^^F7`J$p%i4|KH5J*hO@;muHf) zX<2UM3ChNhUTY7HdPbC}_d$$#RfRH|CZ{)aP)7L*yP$wrAOndk=xbU^_tTN6KrL-Y?=J1We!JyzCcGbRRblnP}kYQj(g@Gs_!&18>Itm>WJlx$`1|Fp7M!gSx5I%A~^aH zLt~Z>8@&y5>7=lu9(BBu+XN0VbfL50y&wTYW02+ol!Ti*U`3@n4dD0@)yLdRP3Y(p z4M(%T;fiQP9|{2YeC~(g1th-zgmu?|blqL!5+w>2#cDc5m2p$mi1oIMxR(%a{xGj59|Ij!z-W3H8@x@{M}H=V1c|A9!5bQqmoBsfhq)* zEjEm{SD<2Q5Iz{pkZmL|Ua2*jv7ip6XiKpmvY2F9$j)?^*0mLT0dT}GqfC5%sE;UT zg`l^5Bsr^G3qHtx2uww;!9J_36(7q^<}+e8g5We|i73AIcUllwOUhwx2cNsdkc07_ zMKb_Yq`Nasb0~VEA+>~DA2UURppQr-_kY+m<@nxiYS3S1W#7%~5O!BWr`L5eeoJA@ zXfOmgT5wyuY5)cbQKdLlBJJw$#}og7J#zdN+X(t2F$sXvoB3vWk=6~Y$&>nJQ?PkH zA|IGj4J#Vs)NtS<@Okfzi@&8nZPms>&#ecZolzG6eBHbIp#rUTQ(WsY8rxC~fcGdy zCwe~qeHN($C4o(TyxcvZh({8?7)g?MlXvn00ZNvOCC%dz3L4^o<5~I-P>COe?N0Jy z@8vQsB1#_emhmt}99vx+PiD+B79iW={mkDKw(_JKM@mGYO)W&db`n-47F1?x`dvDO z5x%1K2hFd|8SE7$vAYa4&lDaB<~R2$Dyd=9fDXpyIr9;cSdYv&_QlMMjku%}9s=R0 zUlmEWd$tG29*H9S5Cp0z`sn~ju9haHF{lO84j$5iE!mZ=*UmOm{}fx74m#hciO_W- z>Lx;xM-15P?u?Z});Rs>(*-8Tl(9HR#=!zBVLJ-xF7b}g_sL94U8JKuB|Qmj06#1N zp?kD`0XpNmq;}QEl?Q};ekB{O)`1z)3YMl);rDF<2k=}`OY7M1;vBus0X<>`jlPd`Kj6#uC~ zmB!LD43Za}ll?CSlQEO427-;o`}$K}4t~Z(04(;X1IYNrV&jmNSL~&FoHTLT7KSQq zt};#%-U3J}p-IO|`zM*B^Uwo-y9+CW!wV@6r3H&VkT275@j3U1z!{r<&*d;!0Bvf?v zj}dDJAw>A>C3_yM;Ns)M?_{5Vdq9gVW*hjSAyqK}Kb*O`akC*WB* zF#_hk$Shtn`A7UyL%cFahnUvbi(cD-#>}kI%=ODmqe3HMk<6lymAY%u{|i$>$2^J@|Hhj7`@>*u;O z2mG;imkR>RmC}n*%>3x{0VSnzz8Mp-6~=cD05>0VCb@&NPP!dqMW4YgoiJiwUNWLa zVhTk>3jch8SU?{PTdNvUU$`3O^Lf}jmQ<0Pm#>V^d`Cg*@S*1>!7@QIx?Em;_t6zz zcSRSdQ02I$jCE~pI{jgoP-E7i;`beqKHuKr$?sOx)3U@OIaY78du|78$7W3JcD!&d z+Y~;hbq45t(-V(`ON7S&NmNYHC$d)FUU-nLAA0vbv*DW_jul^(%)=jeQhH7C7kz6c zog21+q&hEVX$9r$Zjoo~KR5u$2|f6Sp5`QiTu&vRt`J2~6L&&A3X5d^1 z)Z?^|D=~&7jQZvzZyqfxNYz`t_y>c=;}1;!zEkF<0E%z^?HqxzGYv#dYSPM4Q;tk? zi`(7Y+<%I&G7fFO&|t1eKNm>41%>M2Ps$cO&X~9_eigUYdAc)k>_WV1v^!5axR@le zsb*5?x|3yXk*7U$^E9w{S8|IbtwCgR-vVCnj;hV|*-&^g6Cs0j^^YNSu@Y+Krj$Zxa}Lh$fx}_>-?jLP zcAbI$_~!^%UvEn^IZ7-V00>p$v!f*Ijl3qTwX}OqY=Xwt2vbHpZP@Li&`0uybi{ip z?jbq#9ogE;`4WXBdcm@+7fVb~75e>r$)YnGJX}T~b)#p`gjNF+Dq<30Y6MoR323My z`as)zC=WR6HE%C4Rd8YP;Ep>3xtrU}&MuQ#n%_pM>GNNs-;pF%ZQ;HM3+~!#XM4OrW`^h)BW*yRs8^DgZ*f& zvd^DuLGN7VBtZZZ5aRiL5#LJBE^IaZ$ych8X!u(G0jP~P6yxoALAbm;U*^XKM3_+JeX&uBDY&y-KpO~EI zFm5!0@W#hom!@1A$8MJ#ZvSy2l1ajc>e2TCs}0-TuAbv>q4`AJ>v^x;8Q`NLXavK- zL|>qw+}k>s{tm0VkQnNfdccoGmKF2f1kV2kY~!Q-I0R>2mTo(`;%K9x zw&Z@B`l1|Ih|u!-J3V*At;+^>5V^WsMO%4);7=4X)MEgUG*EmeH9%L(;%fM`*JKGA zrBP_Ix*PNxemn&2P9Q?5CG|{AI;#XS?4Rznm`Z{pGTQV?epc)mpakIgQmd+0A09ou z#sstce>HMpj*y4h#UU{1icgnrRv8c9HD{H*KMU+;{46+QrVU3#C#Sb+>*!m*{2qDq zPG0|upkck$xSKN37>I>pIE@Eo>!V{XzO0CT*qf$#27-fTaQH>gID@Te=HTrdZ1xy} zN=BcB({{1@ZV&17pCwlp&N3kIL6;=Z7DVin;T{rs`cF;|ElG=z?EJVid|_RoS!1+TJd_$qfc4tY(+{5sbEwFJ&zIab>a3YS#ej6xUf{TKN% z3dG6eE1lHC#vzPZ&l7sOCD3t1lOZ3TXEQr}{*tKQ7Zd;AU$n4&0m21VEm|_!Y*jYo zcvJ!0$sTAi<$3sa37x4Log4{c;Bmj2hW46ATn8qgLxYxk;OtN1F|cceH7}GtqR)Sg ze;8c}RsknLUu}NG9ps?!ScuovF)aGbkuO}WIZ>s|MCQY4(HLhePh(_?@9ea>ouN*4vAHaM1uK031qRfdwK(ps$v2H<9uRd zqId)TTY=Vdc-TT}o=kCdW&pR2NU68{yE8Px=D9u6;x!2Xrr3+6(Zn#e+9j$>Vf7gG z*m7+aFT;Ku0uQ~RP%i&V)c40j-RFb^pesTzR)^tNzlpaMlfh2-$Su$?zHM-T)cfUS zh_mG)Gepr=C&m~=T1D6OD{rVf)PbXRMe7=5^5n{^F+URIVokt7pE2%uA}UD$8tn!_ z>jI+MNNO_HiZLTF9=B^P`Hx3h|DZ;$^VS3X*Y9C5KN15BEfZqWzc|Jt`@5Oh9|`XQ$A&+~#2fJ?ZlmMv>w1;+Hncei_h0)U+fW9qza&b9iSUB;K(>(>lV4We zSak;BYR^Y$$D@6YQ8t`|Ha;S$7B8de}58X71`M( z;X)BIvQi-{*?aF1vUgXZBBNxMl@XUcGqP8a5h*iClD)FU{dz0(`Tp+vkNeO2etiG& zxE|N#yw7=`^E$8d8qe4B7z&SY*DfH=XUxgzLgpI**ycFj%D-v#RWXYlG0||w+CqRj z%T8v|cDh~n;>r>Wmz_Q}r|BSU7rkJt*mm#3@iM+b@>Y zPVsnNnA$LLvkYnbh!`~ANh%Ws&(-pX1R#})t;k7m`=h40s^j$~y*l-~b|M^3CE~Hy zoG)OP=rfCiBO16Bs*=@oPanF4l#_aRRFs*m7|4go3d~)bAd`07_G<=>l{FdDZa?9| zEcTB{ukH7hw4=q!Z}n0&pRyV9*E`QSgnFtB{QB06yAP>MJPA_5(|?)s2xHjiSIRd; zioL+R%*u&$kLas2Deh5wwmf;#CH7Q#Oi)aO7HNA|s|yrPWNygCzdTc8rePIweg17{ zr%k9*)N>X`<*BkXJXNT(u2Zs$Q%dkHY5u^r#NrDP85O(nSk2Ct1C>{dBW#sO$ao+a zk|220sbuP7Zt?Lxc_Is$?=xm0wlAN!r{bj{xobW-{#pTMv{2H;D0Zj3Tr4_GBU)Q+))<~>kuFA8R_&xUE z_SHcn4|Bw)SPXG}ot#qH&HhX^7>WKoEcNBz%iK^ggTj5PC94~y#aNkwgoQAI@c_I` zO4q#R3TRn)BAKT=_@av zTPHo&R2WS?f^XtK0x_*zuUW^0%-IA-RB+TYEoAe-bg z{jB%cUdk1TaVN$gB0X>|dq3a}AGjc)JJHLZPqUW@K!it}2ULk!Ns!iF5)Wx%Fb!Yk z+ZplipP>-?M4Lh6zs-iScyFGN<~6<(g%qVvI* zXs&uV#Q67p(rVxjJby#(uSi1oh{`hPp2m1L#hy|n;PMH>m!>&1U8+gtfR<=YjI zu%STBgYB8~dQvqP1*{!DeMoUF_`%w+5jHt~I*CgCaj~K;K&D6UZ*VAB)t^*+n70jB_DT7!R6o`z^QzUqNUd?%@9e@>7LHsbhb+&ugiz70hnF zndG_&-sAgmrSBjf<7aLo5|c)-weqT(^C-QWf#76%a$5EK#VGs!yCZu5lf+=y97md3 zv76+-1kl`Kg>n#0#N}?9`FO-f48Z^Gs)t7Y0!)P?NENHrin)g*Yv9AFB9T}G*d7sn zL$nN(GCryE&acuwmwK1+@<@B3sIb-F8w`CNV#+KT#Y0mK_=wKvA?_Xx6|16!aAwca z!^R))gI#%STytcHzF&OB2Fx~w#aeSvlWAW3xvb{(AJ6nr9PC*a`N;rWIZEldADZTI zsz_SliD3l*rcgk*5~$ZTA-A+`U4`^6UN-@B52^@07opT?b1wZeltWm5r~4*9zel2y zJ(pd}T6Li`dp!2jB?7vVO9R&svWUf6BA-0O!ziqr;rpXM4nPYvzBpQ*Qn|p(GT8`u z9?A2Tp;e5PR3*Ia>z%9 zPQb=-42??MpTSR-9iQ#~t-fm9AYL>2K4kW84KG>&v^m=2y7j|UPn|b;LlNqFWv@4S za&uPvb;~n1_W&RUMId7DZ;2JN0OVK)n%qYaf3m9r!-fb~g^ecUqgo$J(QDE}E!?@G zM(@1@H&-2~K3x8I3~97{;>PV zhO|2;dt4tUnVkKlQ14QB=RIO6-JU7_6d6_ZGj*(q#_qXLhN9555xn18kqd!CU|%fP zrq@UR454@GygW8vPn7UUJ}v4e0@DQ2pqkgB<6j!FW&&nPa?&=zN=>Ep{`p>F!sueh z?>&#k15L}aMet>%S<2uP%+e5G3X$jqq#a(hB1x6%X$N|&!eaxr$C8&b{JOO2_AJXp zGW3U6cWR<>If`71s=NU(*-*!z4ZDm&a*BuLDLoXgo6c3PUi5k;x$x&~kV^rnf7~{k z)+}#e=^E-)9@VQ&xnOC9Sd=BFT|ZB52cZo$brNL z*s0d|RZVf$8J@iEKl#~U$Sc!)I)l0jP6^^Mf_iXHi*o`|IM?^$s%88g#oy!J-5iNP zaAmn;6Bi@S1j%hl-ul<5_iRtitmBzN1YQWwqlun>5~P#+qpd9f2-M%8c9R851Qe_1 z1Hl?)ywt-DE`N|G1{NSvoj-J=YYgC7wF0Z7C<#k3mAF3uHj5|FI_0AxC6+fJzc%j( z)hM@<%Y+IqzFE9;RM_AS-|auoxg$OY?LTV@k)kER5(u`5bXUbFvm)41j9{w7#B1rj z5%B_M$yWMG`jJ0~a=K}En17FoKlEK(RItgo+H)lSjLg%=FliUV_xpVaH9>vcK3pn{ z_5s`C7X|(F`roZP^}z_Lu4-2>_<_9Fv&3<7Vwqhm&aU*=gux(B)mCtzFGFbV-V^$1 zXTQJt?qq=0Vma+HiQF*5#<4HP$xr;<`VJ_VL-#6Z|DZb=rkDTKS{quwif@-pbb!{Q zu_@!^B>!p+eIL49L5Tj1EoPW@{@2K9pf!I;yF_9>()Y8padOhXT8k$@-=c>viJ%RU zp!+R!t)4zBUDm72KbDy+fGEzzCEOsjfS6wY+Sy5W9RFSX+8?QAfv4ZdQ;W7D}bC3NcdFvJbc!G9tMW-15x&_I(X z)iXyX^GV@~zhk zO~B;^=1}8gg)(hCVhDr!@dguO6ML!%I~D;sq%y~9ha%nrEhtS1OUGx@ZNCMy7dDUa zK+&y7a6ALb)$bOzU)Qatw10puKLHv(Q=GnZ!U9ll{dq?$?LmHz@P}Y_r2x&1z_E%9 zhbYkSe}IK|VPbshlKhS8_d6%5!_w!TiMua;1!O7UqTIbq=BF1+9aMsMwd120(6?sC zCS7pffub-ET&titlvG5+-2CSSWFfkDE<3S<)S?vnoE>^h%Jmg~e!!nNNg54c)HvBUn?ty` zsY9%Se{f^bK(;2N&)rN)#f``fbyjT;xeU#q07i0GEl8@sGQ1B^w#6EP`5TfE%=!1& z|9lIb!_Q3p_Q!Hc{_fle>6|Zml4P%&{}}s!3TryLZf>epd^n)0P|0Y8h8Bn z*ezgdmV_?|p}Bug5sep(gylUNsh-^x7q3SagFkHYgoYNpnk9~R6%E?23#nb32G4re z2-tW7u~zMme|E{!V^Cu@>AX*o2T%1T!hHmgOrh_`1``KJWf1toZ@_@${}>yfjb--H z#s;^c^S8F1uA--43jBDT?%h&mwN*4u|6RuQXQh=yu=W=J{8e$*eZVPt4-K{82b+lW z7UTYu0kMrpSpvA~->qTb2wZ%^4;F>AfBsmx?cc2p zp>;j=RcG8iq38Tp>jlJNtPUO;@dJHGx{YJeIYW?o%!*L;H~Q@uJe;PB7;|~AYRmN$ zmc#*&_z@ycRkl;@xGGRLd|sj(yWhX-($Itg!rXY?4oD?p)l8TF0O>Xmm*e zb(in6d>QBWKJDUDkKa316kgrC!PyE+9*);%o%oZT3SWS;KpQb8T3%cW`uV8j%A(M& z@}x2b@pwe@Df`3&KzMuZDix%+|7Q{2TfRW=yR-9|(%fv1(|2YFuT;1D*UrK<`D>X0 zvE!#seUE7fOJ{o!>#w*Z=bPk59f*N%)7>dS9ir?A0i?JU7M|9W0R18O)}N~_~V zJOdDa_wJ{y%ZG5t6vcP{pv?&6j2LY%mVHuAEWGsZ_u za0k+exixd=#&eflS7EOQc|V8J_xdy8a!Sj^B8td37>A&5r_j(!<-`H_bc-}?78@8f z-Am!@sC)C6sUFT(;*I4g%Co>q(%XT+g>)cSv#^=*GG6HCL^lgZ;kyeN6-O_rXnwgz zB#H}JE>$-OvK<~>13J+&K6ebH5}A10xtnPXLGW|EUf|D>%tIO>&K}r^{G}MYd5I~) zFG5(iNn8jDz5P=owNP2WmT3ra!W*A+CfR>^L4tmCz4_5eQlwx#q{CqwVh!hjluUSG zD>JJ=rfV1D0@l>^b>PgB&-wo|4`@1WFNo~tV-;_2Ox@r9wP`*py7YMj z%6s_<>4bRUdb=;sIO36~b2$A>*NR1e`^R;Cge` zL0U+EqBCR_j_pEwc>ntVeq;kOg`Ekv$`Ab5y7AV-w_7>uf!;#o{i&_TV}MD+8*K_E z807a}uin|L=4#{ZmUGHF&zg7#3*Y2Mjd*M&cVRRBhcgC@*$>&5k1Cs%1L(`>T2T8o zBn$`*~m4&=l9fPsKp(Qvczyw8c9$HNt_b03DI=$ zZtvhVxO-;&<>d8c9!s8gTvvJ_2w|0Dr8IZ~OA>M29l1jLO;Mh~~ z#8cvg)V!=5)mw{nbDQ!|31E}^dQpbZ7+YXlD(p2ZRDEV{6?Gca0}A9IK_YqntECk? z+nb{dd{4NfYmEC>fp4^DVUV@keVxw8N+9CHndrr%VSxF($Wiv~33IOOnDfsc?+ttN z41s%5LXf{Y(@&SW+r2rIfuZAu?~|%`7g{+W^6!Eh#8DvKJiZ=~(Td##h#*u|yUJJZ zl|B~x*YdlY3E4t6p$V1hiOL{(FR#W3-f1D-VFfOm=Fu1DwvxSIXM}cqW#+%kC^Gtp zr%v0hl001i2I8`CvhtgEwVC=C1UFa;+q@oD??hUx6($dmO7{_T)FjR6pC@kL5SmCS z6(A-!+y-2&3$7^w|D0uErV;~Fcwu!GvWFAV7htDv9!U$LyePrGvlAfpVEz&N__(0@ z#v9%NrQkbTomYq&@5o7~2DV&OeO^5uql$Gw*=60B&^P+j)!ef0v4+XP7g5ey`pSr+ zdJ}dB7@zK$s+0c+ge}BwHL*#!)5{`93$m79-XQkoC?ORwWKH7mgk+f?if?>>W*2bM z{5f|(@a>)~JkcLS8I-JqDSnqJu=>rO*g47sq9xx9rK&Dj?dV0N{t#F z=Y?4#lrV+7s5yYHI(WI1&EIQOMrWicCFuj-2m#TvAD$b|pbPG6-zsCSlB!PMAT1@J z@eL~jq7ozjsJvEQ=WRx1+D8OpqpSGHhMAz`3QO~SG@XPsM8Xy35_F!AVH@c5M#XyZ z$cm6GCM{6La?_Hzbct)FztTZV&5YPLb@Rs@iLs&V9- zCcO1`<-HN)os1|%S2>X$K6$W~tkC))T$$VopHf*=0yNhARn>yD%fwp*(kD}T;|tbBxs$nojQ zbvTd$Ao$7||BNkz7vmv3CA}P)SdVHPqh4)~Jd4doedv*uF4JLKS1ikdV+5JQU1ka1 zE2XT&`k9u(!!Sjtv)OJ7rzAuSNl2+X_=)I+1b zO0h7Qzdz%1A0aeeBdLwHtl)TV@_YNF!S;DJYL-i$u2mzh#iwdTWHLgjcCK<`GV>Az z&jyflDPH(SezXfgk>|%YI^Ns55}&7zx#|8bMl9q!xf6ld6tE`+dmikeRN5|(G{0p@DktYdX0ELbBT)g1M@{BPdE?p#b*3LP_U${ z^qf6!>%?1%-Z_8L<$rXN=d7AW_$b~fmBn;{vpu!nDr3y!1&@@2Id%5D{CotLL?Zhj z=HAkYBX|xrQ?=Z3+zNHnEQ|(_cvDZnnyV;eOoFk18Uixzc9 z1_Go)=WfyG%M(`fGzPEUKTb!TIq>KNfhV`Z#oYtZ1`fnR!CNa@Xbc>Ps>-P=;%T3h zV!pC>2qKK;bP*X}6+kgz!u^QS1iRKa$XT#BPle<)3uZjeUp^8X)?&nu@Jnr#&5Nm6 z;W;6BTd$Z7QUlEs5soCp;Z0=i@H0Xrb!?$eNzYt}>r|@i+~>E3bowz*S|iV@=vfL6 zw0zJ}L#J-M>A=3(-pVZ}!buqF6+m3C#+dbwc5iRFUkj^YR8v_rev4169H%^Wvk2H> z3xn6kqBaL$rC9n)&RCTA!SpmGW~Q3k+bJic@h;0PbJ)TH2omGT z%O)H$S9T*_GxfYzNLX7{^vI%sF4TUXyV77Pb0T-Eb7Us*Vq3`j;rJ zw^1EN9SoPE>l8*q3ATohR*(M{pJ_Z0AAYkH4RkCvVG5r^>a0QCC&U^G5t>ZzYIxK2bNX0p}M-G5U`DL4i7wlJ$mDT%M@=1+#SJ|$-p zQx&a@j0%+|TvCt8+P{U1 zLavANlUsWvj+chP{W-irY&$Fsc5PQIHeWe`?X^*3|Cog#FcPgkpYtC^gP9_jQ_?EH zoxKS-{J=B776&%5ph9L-(6}9hy4Pb%qhl4W#SL>~da<_vspa~@k?X8K`$qd_y@Z+# zx`Ef|8JPEp;w$jdeKb6tS>p0={=}9lxpJvCIgBUdhH$>@)?qAkREyK1r_$QZZK~QirNv8Em=o|_%4EDp%zx?a z9>L!5;y;5QiYO)Kz^C%t7k`;Fc57zL-{c%)m`>F)WHiNRQZ~_)FD{&s#=WG%jd#B> zXq}5Q!u%{At=}P34&YPGg=0ghcNJaa7I@~+9Zm%|Gq5$tp9WH(A2bz>B8L09tg8`AD+6|+m+z0CcRv@w z_O|C@e6UIXIm2v$FcP&V6YX9%-Y^p`J+d+n7A?#>5zku(ba7UenOY#)wOe3LhLYPq z2TGJ|464z8RjagEcHya3n)Z?xceA3QxomVhX3>BAyXS1^xJ1m?HXe-J$zgDc0*Qje zmhL|Q^zg-7WA*W=fJQa`@jhAVt+Dsb-BtbHylj?DtI-vXFIO1H)@3k3W5~)n#DL{i zj`=0V4#p!`RchI|1U-IVmAskq6yM6lza8}1oEi0bsnVDOW_@Xk-9k%tYP<3lbvL?0 zY-dZOkMnqn&eTJe_y^h#$$WD@Cd8mb+~&WmP1|HAWPe&1!b_2RD+(M(My8L&R1_;s zv}`$pr+9(|HJu*RNT)t;VmQ)U;Ez*UF4Pz^JXELZ#XiF(%b2<-&-_fxetxrofd@h% zV2AgSLI}g|-E=+{A80GQ5>#j;&&uqrRvFLi)b1w9B58?u=7GC#kOvt4~OD zjjVs%j&FB_LkfeRCZ;qiKyEpXGf*S@m5MBCSPq!GaI#{BL5!XXefYE+yHPp^X8QU+ zeIhvJ>|mzn7+8ySypYUVL&&z8LWm!@H9hhD8D$lWo1$XbXLfIrD%f|8!J*+qzLpk- zs4H-+dpzB5g(a$JIJ1l1$VkAuE=SHB9f=8}$Z3+P&ghCH zSW0bANc#jvy@Oe*VSLcoHl>zDk^oLjpetW6x7S2!6jsMW60D$vE2fxp9lnd6Pvk1U zhf?%tu@I1RXFs!6^*A13yuM=%bG{%&U6L?z((wPNJa^X2{5901Q@KSRH#)B!_00JA zKwL|BIl}6cVRFB!JYLUq-&?&zUJ1U{n!*4Tea$oXXGC$OvIaenGO6<7C%Gq_S~;z* z<|RFmBu;bCr5G`MpTT z0NWz%aACD6U$EE_;%^vD?2OnY=hbL}m2AUi)pTJYf0{;QORgh`GgGyaB+p z;H0M*mP~%4lNVCz1BOqa(p5M$i37)@Vs2F++`7&_s6oG*@i*jArOy)@g9Ei4)=ZPm zZ$G$f`Y{bcKCEFPNCd0t9X-2ZI9Nbub5!Wx(I;+QNwADkSw+CH1==pWr^D{n@!XZ8 zNjv`*KU1X!6SH`o)g)9Ii=2QGSmAFQ0ysSQqn{`y+E4N>$w(-1y^&l5^`Qre?e3aX z57kg%Bu>5U0XvrrWVk+=mD`&KGYXl#i?#= zGOgD7G3nw(I zNUJ@Xv8j!g#8JXLRuRm2@;?1eKG%Dsdg^_)y*B0X6qz!>=QZX%@d`_nU;YX8hC%1s zz@f;;mm|;7VR|}$QjJkT3oM{KFW@e!$D!0ACQ7c8i{Op1iuEd4V;>2&zov2ab$+=+ zS)lHMInA=8>tVKtNl?eGDo^nuD?L|3Ml~=bF@r~a{TM$eGr!~(rJ~5S+Ju_l04S1W zSE&9jKp}eija_~t1$kx^c3;w!`%Pk8^MaUfNHnTX^Pivh4cb&((k2QLP@D1nyIQ1x z&497(dug9F4u*m&Oiezb|1cg2tZSn$u9PrOvtCLn#yLx|MJ82+*}8AVKktf#C%`(4 zQyqY-is;woYC?@)#BEKd0IoMhEhZx;C60+v@?+s=E){gJM)1|~HeVQemACLY=zJBG zg788^%@X=~&=;97!>Q0ZNu1yo)`2gI6YMsrSZs5o=Q3s&1l#3VndQzyDA%81ZjC<3 z#FJF7!2y6hL8`Ui7`LVEm)iK7y}8_jE#JwZQ}GAVC5xlPbcA=K`{j*C$m0v4^Wb2xi#Dqd*4AYdXZe)_ zB&>;8!%JtO1DgnS7yAlE0ijo-;xeegzRyfBn&*w%Enw*<7td^3K|%4xP=@=|y-D(* z!81vZ8Q;8+fZ`9kw~b*>Diz%6pLSkn8eH&V++j*2!E!(TWXC}`I3r0Xe6KP1_^{5~JW4)o_<~5JxKw=%`2z@>EOaJIg_aVZKtIVJ zJ*j(_D_HCf7lloJ-JC&2)6W6mNE24$3Lievexvx=QepXdgG zIp^rJjjMGCL2OP5<%KCf+q5&JlkPeBdBvy0 zC={5|s&)HhpL%`~?Hh=k@0e5OJ7y=r-kps%96>$02DgKWC}fzmxbSh}Rb*wgJ{`Ip zY%k}$^_C^!(V@tUPY9H^g>H6g*Qz*449dbFZ2ARg$$6*?YaZu!Z+~JRrt%F}-anWv zChJWruZF}2P{DK;`z?~|uE_Y@2ophEkzy2{kqVA1A4-2K>E1-C+=4tRHZ>%b$WI%S ztwM9j8vAA)eFTr1j%oRAhvf3U)%(}%kN_tY=!-3g12#q&YtBCm)56@WOzwK;6Qh%? z!$h0UiH}b3zA0O*hON}Jk`k^EXnd6ca5f{Q-U=Dp&MVZ$P0>8Mk&Vw#d_D}3;Nh%2 zH!Eu~T^JV>`&EeqFx@zOs^`ryl`6fO5m92Or`FGTV*1T8T};EQ5*K{LdR+ z4U7uMH|2~I9_~3$t*Ck~rRm+)1pqnMl2}g1X@TO4@#jsn&XH?Vh`gwK>n=#y%`?Fi zJVlx!7+|i&JzUZvb<{dM73$)#iJglmTnA9{ilu%?@c6~v?LmeEj@>hRJ-`GwPjz6iQKTS&bpsboH;rI5teI&mY(eB)V>;=zu+A)F4spHF?mus+TEvUj;JHDzhCwa z+eaH`1j5(cm{VR}XYZNe#*etVo48cc1Lho+q!5!w|Fa{&aLL6+=S0*vWwLGaMRMjD;>}H{?-~dis;R4sQ}!dX4gY_8BH+!4#9M(y}t_yR$ZJd^<~j;L06a zKaHN4i9X)=r6C9s8AlX}%yw2Fk?2KEn4i@(Pvl)LA5t4c0*P*Lb{ZQP^YwDf)l0tt z?Z7|!IRd~}YRwOb<;u?2u@S80{X=B<)Cxs_Vh%Pgf%3T0mllh$`U6sT#Om_Q*{YZ1 zhD=R$)j~^l=c@=}J4GT*@1a99Egsjk2y!XS;v)52JyI3o!j>A5d`i@SU*1brG1rgj zj|#d_>{I6o-kgr3o83G~X%KrclS%oQIgaIT1?P#(jWKN{0ff{NIk9`$pV~^yR<3>) zxEB5;jyG*~af^|lUy;vrfvJSh;Y9M)H@Uki zoBWjjd`>|E4R^2vLEU^e2&=q?MC}l>bN3HpFep^skU(#xgYV$eZAO^CT1HP~hay(o z??2+ypocAK$v0CDzJpKSknMc$@(RUn5@7G?XkG{mb_<|ZuJ3n-bnyla5wWB9ra4i6 zJ@^imC0I^r4l2{(`tY25W;DH*W$!I^e`P!huR=>$@GAXZ zqf5C7qiedEe`D`0c7GK=4uKazDigb1Z*~9a(#bHo;AEqOy|>sMJDL`j$C2yJXGB#W z3_DB`Mn^5xD7q^S`#=15qW7l)X6wHb{coB1uSEYnAOAn94r~sHT0ht|3>3Of?*mp+<5_m#Hi|k>_%v0J_MZn{2;ME= zGkW-P2kvE{se+6B=7Cu0{zQ-B84zB9|L%`)GkuJ3;{S<)YZ^g?ogK`{jS3L?Z$jD`SG zJ=|kQfduQQCVz~;-NV!&z-$vz(_gNq?m7naGmHq+5PH^enFD_I!BPAl_A&MQV^()bh>!eDx425wgCvR3aWuuP4v@ECl5N!PAkns4nFF z5fo0dar#-3G@sRq;l|a1d4{ypL=2+BpPK<{Lz-DNNZRd|A*#e?61a%mde%KN-v^6w z5%F;83{NDue~)3w0*rtmtPC!M9c&X(>mQVF_(L)^FIlFw$S~~_lsQx%`KTP=pk}eQ+c+T6KoqpC~XK?rPSXV5tGyQ z0RyWZLbFt&0E}@HP1A?;bE(NSzV+w&2X;a%1R!m5Ua4C@7AH|eGCouu2nwbX9BjP0 zld3{>lTiLdeweU_A4@KB01*Xy@MIb@@`Tk}$oi2R11Gg#V78#bhv~Uf*L5^LNAN@& zg4xjkrkBI2Ep<%`w9Q4@5@)lOh`+nVUttzl8E&Dpf)}>Y=ua`Ar?ACVx8n%+9G;nT!7OGy#^KqEob4v;G{5#YmF(F+ME<`DQZxNm_q%=*nbyU*%DaPc&FPArAr|8(% zA}^gFV9XbPj|8&U;;nPxW&*=-`HL}Mn6PCjLQV^?bfs_+v8*AQJXFacIq|j~{7Ya8MDmj6^A}gV)x8 ze|FqZJM!|qBmU&-I{96emp(H!#6#IXceK)bJ)?)rUkfpGN4MsW8AgzMYI;X6j0vh? z8X9X$=Xrc`_wB|`VX*9$vMQB=ur)peSeE)JtU?FC9FRa{2E*k7-Xy!)nR z&HWj9fCZJ5sqy>Gx=(2Uqh-=JNVKgQG46z#K zb51|uzFZ35lu`3K)`&{<;iC#<4+I`ui_n98Vh@4srVe5=O_3G2NlUp|ka|HLl0)o$ z1^QFK!9-ktDf2TuBq_KbsCTQ+p5&o;^5Vo*&5@{VbBnCl)~{Eg0@;Ev5DM za%9IIsog3+H%ER{DJ_~LK0QaZkpFBCzr+CCz)c4D78ixS_XSkaF}GWJ%}Z{dvM)q& zXMXtDwZ`;M(lh&3C(UhQxIdbvL76xb;fA3?Wl-eiH&Hvt*mI7L_kD!=pVJ{j2vyda z7l-ogAR6}d+q9!^=Kk@FItTE)#{27q`}T==IJi6VM^faWGn{_>b_e&F9G)&@O-Hw%$?2P-SbMsq=-tn#i3u`9+z3g=l4?9> zsY#e3Coeiv)csYagoC=FrQBv!N!Ivg3RHOUDY!PhwjVh8*|>tTBw}R!1Mmg%-WpbF zUDqU=SQ`xu)ovqp(=5vPfL}96Ffh!er}B1lJ5OGYb71&G7fYz>z5|o42Oyow2q`ng zFM#g}>JTqrFf9n2f*aN=p13MeNfQt;MkA;dZmtOY0+k)N_9r58mZ=zTj+`sSVdk2a z*y<9X#%|I0-umEM&SM&tw~FMoXNhDC&eUYXIm_o9F_i!r*OB${1fr~4a*4wLW%w$H z`(n%Cj`?-X&Igz=q(H8F9Wi#A65oC>7*vNk%RFFzxZ!j>o(Vxn)q|!OnwYD-%CLfS zU||G+I;D}Edf3eJvI?_&d8`Wg2$fwwSi39-}P1?$nD9R zt00w*Iqv!9)cpoq?LZ){D%lZck->c#_)eyD`fxd%qK!Rvnr9~A91ngO3zyZ8E+qtU zmS_~e3~A=hUW41u@evRiI!e6NF{Lp$e@wGi_IxF;C=q0AmYQ(F0z;R~4~F<1^wq+*iG&f4qyV|hip~YnmP5$ zT7Biz(m^k&NU5MS?^9={dT#8k`-uw6ZXeQb=3gj-Y;SY6zDC#s^7{)f+Q4?>PA|Z^ z%^AE<`90R!sF&l_GQqg9oJQ{tAkheUY0jV&Z)^I<_AlcGl9VOwpV|2@-@&Ku;3}x& z?6_PI`W?9@d$FYv{q)-HUdnLGv>u2iC>=BLe9V>>eLAOH8>6M(RyOG@r+(P7z?UU+ zva4L{RHF$1NgXyR)8q=<+Q7P`RHr+qgMKxLUlu1wrfv|WWtEW!IO-cexmSd}XUoRF z@?^e#>ms6Jz8?2G*7e(-Q2={J$TN2k`w&H85`ObinDEiJJkQ4Bl{t>5sLULPs~Bn| zqG0h*}W=oN4+Hk<9a_$j4o7E}Crx;A+7 z2agR4gZHT%Zl*DoHi{Sm)*I1V5lV|j@*eq@&`&X^FUMO}@M1C3 z+YBkm8~YE9)ZdpP!eT*3V$N*Vb_KpNGCYw1kdc=ri5$)%+r9R{C)G6WBDe#$(~%?8 zzYSKm78V}O{8}AmK<>$*a>L7}wf@V}$OcQJcw4Ws7E5Kl_vjLMY#~9UC(;54Pbw{9 zV2G9&jyqR-f@_pBxJ4qy&&0ft9Sb!-t(j;JxXhfN`2p3RKt{*iB*U*Im9k)YCy07~ zbu5i@7IrsV@*`EiExo`TMeYR1-DW(|z>}&sF&WsZ+Xgish2x4%7?jh#kl3tG!_{Tf zuO`@*HS4&mk3y;`L^+*O+a^B`@Zyns@P=JMh=mZL?dg&ztEzvL`C=}%d}QQJb1uj` zhR!bq!{YOJSu-4S=a7=)#``zsd1_Yy_I(`qu&lk}CMW4Vr*As*Iou8JS-3w7(8Vwn za`%gok`Yb-znCbp(kUGxNML^z%GQyg=k)%X;dF04_fH;Cgl-rhFh?2K2TIS!+oj%> zow8w2rm!%|XDjhBoc0B3;>K~!R=pbjgWzK9X&5GcA*E%+KM}3qUh&ZStc^Gr(%n7L z!Hqc*Zg&0FikpYFg5Zqinn(tP~|D*lVoX*9k6k?ZTm_0L6Bk>Wg z;I}dts}GMhhlU2Rb00wh&V$ru$o)2bzWN6NTc{{U7rB4b%eaQ+cOfn0g2+?FrWcYN zw^Rn9&QL0Z5aJc`3)KB=OE?1Wt5DceOZuL42YkdZN+>19sKFzSar8eJHSk z*FL7@0%)EbLK+Iqr4F+IRz5X%_LW zQmK;LWq@ojQWX-UAi^|qEUI9*<6PjF8$q(|cE(p4!0WtWALU3)Rvgvs?|DxtVeEmr7FnDjJJHX3C!?cAalD@>r-i>s_6 z)raN(F-yEfMHTZ5^fORqBTuF%}$kKhQ&o!LO87{zV_!K>> znRCMFJHVRPUbCTJl@_DIlxj`iCn8WT1?KPZ>1r;iCweu>9@rW@v1}e|zY>;0@;0zZ z?qzn`dnr_#n{sx}2LUndS2jQrMH*~8GX8{Z06B7X1Ri=zZLZGg7f9%>3I08_5EzPlvcMETm+p!*06TY=oPd=9El=rf-&sgkR5uoQBB3X?Tt(E&l7MS2#9@>qh761F>kL1 zge5kXS!$%8PTG1`^k<}$r+NG?yLbEQUt6CEwth&Vx@G=9wco(xCP09wB8Dw9aP|@( zHqF*$V$8>!8%QM9S?b5_!*;~vd6`;Mrgauva1fy$f2q{6j`zXMaa&8`T*vbQK0@EC ziM|{c8&Oq%`BhF3wCm+J{m5--C^PUYKul;J%_wli!s45wyaFSW19ak;*6 zOjl`)(lC0s^4f4tX4gH3KW`Et7jo~OSyaVYan*41tL_Sqo9uzBw#_wy!ScPJBOT9!hEWj6qG(qwR9XKU&HsVe~u z6VHW;L;qo)LV^?{`OWk}{EcL`B>`-&mgP1F%UoaVdE_Rtki^MeD0nqQ_C>Q9y5iRX z-RICh3st`~>P?)lsBZF~A8*z^Q^P>pTV)Ow^+M<|@6DBChmRh&xoP)0>%gfK1lL~h zq`sZ@p*s8^ntTT4puygLL_-PtcHh{zv9Z z0)`c2xN`O&q6P1c{t2#3H~-lc>Ak7k_0-?^!+cWKPs{&1^ECl>dzzix^yB>@A}<|A z0K+^N(D&>>ks=T20{cdOIJ%c<-zh=5V5Ef1mkwbef5zT??Hb@INV#1VcfQo#TkQS{ zX+px3GAc7WrGJf1Isr!KZEO^}w|Kk1qIHnW7x%lpB;ubZg^9xGHkumf|DE|NLsE=J z(UsT#J-U5>@17;O+r@1ph26;I8UF9l{dc1Oo{#@d^#4Z^Eq(i}C#fm}jqkCY4|6^Zv;4WkYeO}{+2W4D+lf3Ye` z>=rH~9AKpo39g4ykgu!E$CsG@+J>9C(JrLYm}E*_r<<>fA^lW~vaC2(u$sKLEG8$#0pnpPVJ}IS71NM1W}S*cDWLa$f|3wS`XzeqJaU=3;>>XGVWgm}3?{iK+W7g9LL;^qsK zb%elHu#KHdzRd*zkpR6)4}UOG%jQl0vLqG%RGWBQfI}6jwD5yut=ruYBy%bZ<_YQR z@B8jKOaU)|qxx+ea$oKTg%8y9pD>a*&H*I$&mqc41VShLs9-hP8b+RTfB4yc4n_$O zO7hF|y@EL9P&GSKm1MqaB>ax)KY}IW&WTq=e}LmxnTO2f>VX_fLx30iYbbuvGx(<= z$q$X~cil@5wn8_U z81l(068J@uFeGZ%+`pu#3_5dU3RPt6hPja=N{HK^l71*K?f+Om)y77A7yV%v>p(da zAy6Wr3oEi{A?S4qd&2U-N|}UehU`ljEGmq;@Ia^F`<43>Lbe9jpN(YyVYbdl_^pIi z&2HbiwLlCkZNg;!Byo56?C{8} zM^At4TWE`5oV5){do~M#N%!5Rrc!sW9pe@FU&3RNx~hpttDN-plY2jj!*wgL|B|Np z$SjgzYW&yqve(cI31egx{uW=%7m%amHN1;1UEPyQSv1}ke@C%8Re(m^q$9=L`W$}Q(hhj zLV5)>n@x#VL_2}pb@S1$NbaxA7pX&sCqgNFUW#jjbPn9ssASt)Q$X;+{Bb|}?1wc5 zGdX7KCAHryu^7hoal_LYhZ+ReRv@49VBh~hmOIGaM-H6@GEsOzX+?Rj-5bO__cflS z8<&G=D?GI7vcC}tVQ4(O8ZN5n9B5VX;=B35%f*6`Z5vSVNioqMx~2H)X}LE>adaSj z6DVAjA-)1*>|?kxwpNZ&XR z1VvY9HgsJi32rR_3A7fTMkq{vuR%>H^v1xsrGPF0q+iKco`>?@PvY7z>;WUHN<5qv z*lw)@Ya#p1#I0d$*~_bw_`EtGN%ltP_m`Bl6IpJ`k*#PfO~7@SnWjv?+-nyGTf%a? zY4B2e3{0E(;n|se!{#Im&CDWi8iS<^tz53PbsW4L?-l5S&@?wmoB+DzY*_8u8{-`; za`=Ya-Afrg4Pz`63;2xQ>#P$gTXdn*oRfts9;u{%sU9q-G>9EXs>sG_%w7oS&mmqdZBbNs${!>U6 zM7~;}J81S1F`^)mN)EJC=%SGZz5OLsObmkV&eg4R;}k&5v8_eA@5Wv`M%WTvTft?n z&v{_l+K&tl?3+~=U`w=h8uY2+ltZhTz}SR?&0!G$eVlC3yMm@bx_vO0x+ju{a8U3K z`{G&}Rv(Pf%$Kn8@Lp$$y6|cL=$DJJ=kZ`^FC^vH^&PWe?0j75GN&+k!k!0gSP2o66(p zerFZ%Y6H$DmFID`;dEJ6Kj2?t%!clZLLU86N>qSPLYFOrS&#H*zkv})N9yHTJpgP&r z>gtIj&|Ltj=bmbUfX6u)Wd-hdGua!USm9-7G8Nks1@sndi6#E;pB>s^+5~Cr?bP?$ z{SRUmpT9Q8N$A6j)$6Ul;hX5gbpPW1d3XcuHfr`~wz z<8Q&~^1s@<@_(rFKQ5buawJENK}9G>tyL?cLx<~|Ycjbaa^@=5ExBqXBBJEVkz++M z&XJtCnlx-F*O+ZZj%ITgzOVP#nX%tL;rspm<}rBBXWsLEzs~3L`5J$6oqk6%v`}{C zB);QYj@CnX5bx_VD)c?R#_A1+^!JB7{PJ;%aPF#G8V4Cii}O3Y+j4iq^ma#G_?Dv7+w*ZFfT%K7qd3YjGvI zR)=G9=NWZ1+A}eaE#nbkZLP!b2p^nO2ttfwg%)FmGECb7KfOn)7zU5V2%v| z%-sgc0y?lhBKp(X|9Cv+fnZutI9xtpvGF8Ff2H+HWH5sS`qx2w=Q3nxAD$!yFzpmt zjA_T#?^6ak3X>}L2czk`OtUEeQ(NsAQIBwpG*l;ahtv`D6G@l3Yagu5Wo(OR_w+IHuU(FEQ=U8h{xf9BH{Xc&bfz-J(od`m+T z4Ah*G0e{gbcBPXKnwnK5(5{b=15xj+x>bOfaKMl!SK*(%>=1D8cq~RkMy*9?-FF3^ z;&2A!UYmb`Qop?~l>HlNcue3!mq25*T>Wk^0MKl{FHmioZt$T}GS|jYofr=_lHQNa z^?eoYL${CTXAeRbmW*ocVx(sd#1fd)iNj6u{=CG--QPImF`pnx#tLI%_ze- znCFgO{|c_{pC1a5KzJ?T_%VqX-uAM7ebv6*2&PKyGqf5t%cUYDFgY^{!?_VBLQHal zmbWLTl4b}%PRRg`+XCtk&b1);m##6mr?qe0=AMRYfQl`SCH2sQq1(;43X3 zwXx26dHmegIJtmiUV@1%#0)L(tW3f>d(cZsvzcKl=pR=SYRrgt}AL^27SJ=9RY%y z$I9Ypt6YtVBueAWe%j4~FW{3w8d@G8BHl852%rlQD5-xD#@-r-%eMwtB@XHL+m_#@ zT!OJE9)JhBY7$UoE$Fs0{Fx&OBoz3E+&?a3t0jik^|R~1R4o2!wLgkg&)a@!9CXV@ z%?z{Es-cD!g&5E|0I35uctz7{H(xIIG^k$L+>}oGRAzlfU%mJdY=E2%X}-`hauisJD-XjfUWp`{ z=GLKi^CV}&;J0110O;A@-=*BR#q)&}KE_7PwThtE$A9-T0-sa8EYe3cqJ@lX9|#q< ze$D7r!IH$68?AEASqFKm2e#~RxMduKfKRt$`F(MozW^bfS`JWY=}n&4$#O<8#tFW3 z_7|?=A$(C*v2Z}y*P}kHj;o>s0 z;=o7-+@5M}+n3PmT?h?x(-|1=>{1EOJYswN%)R{UMlb%@n@G&2{%HOZO(_ahz;c=s zevmUYX^`boL7*L~QR1A4LMpz)xn|;AH8j)(e7e_U&uBNv3)0B0vHE}yUHlh*dJj^T zNBW`rxL;4P?Da7+@Ir(7xWCkn0YpR%`$XE+2q&g|LF*HMost1_OL0i4>-aIBNAtVK zmfuX|QmSjfGDV>CC_ehcL2?}Z?R!+5it)N0GlF&#Q9!>X)J-UTZt1J zds`7)N(>Mfps_^PLu>PBSU7^q16mFBIkz<&H zfGRQt*)py7mfCyFr@{&*!9Tn;ESJ8e2>1%}!RL$m3!qYYe*6&`+TxsG#zHDVWp3n~ ziB~K@z8Az?+jth3)G94EFh^B8oZZVzSxsb-+|8k`#O6SJzgI^I(u<$qHuhEmtmc=O zyJDN1s>06}RKoPp>r9bg;aAUlZANp>FOsyWt({( z-Bl2$*NEo7*|K?ogWv`#du-;DH<$T@tpWZi?2l|#eL>B{Y}@GPZkV?l<^k8Esm}9A znvK1)vS~K}*`APeJ*)vY!2?h0sGd~cSvE4_V0l>M4m&e?Dnk(M$;cj2od+!60-iP~ zl3e@*uOa~?;&s9K1npnbd`E6p?o^!a0_#S-((8KX*r#2|*cy9XYI(7{ncWsx~`ZJL&fnxhuf{dA9x#xk z(i?mMQAXmaFj!4yoG;WHI;&(D=z8--yu+!K_wU4`Uc1b55N*E&|! z38n#(v0ZMln(pP8S1^kuQ5SzY^O(*fwL?(lzMbgBRnt&VZnBdjr_J{0gwXqflg)_) zT{P6_9UFGaet#}F-naeIxyw(_@>~01fYDG96D`#nxKop!{Xsm5h2xDEF>sfOVbwcl ze@6DVUDF1AE>nr*fd<1iR`O8~&jmk`tA_XR+J zmTz%sAgxOV;Tr-LQAXcI%>WXEtG5VaL5ff}W7?oA@FjI_O%Z=}pM@Bi2DE=N#8%vT&Gv>F zXyRbj2UOCh>_>Bo17qv)a8IIuY7~@pG1_`q1j)iByFP7e0LZRLI?>MGLqw#I9WgYv zh^p@MaR4mHjiWVtjYCKtnsdw~IU^X}bP4A#!=}Soa&HvGhD1QREms-jdLt3C2Y@-_ z!wt^kASk@;Pw-!r_If#&v74VF30sIwbpVLc>%q<~CcHE=W<0)4KP1NCB1eabIZneD z;@{if;#3K{tY|XCv}{Py8{V#G>rHXzgB!4gLG<|1{c>)~rC$qs53u1YOXFUHu@P28 zLJEQ#+#r193EQ-l6T(z|D%tZ+28^$z8jgRbscfx1 zULHJNDtB$gfW-!Yq~%zqb!1QX|Kj0}(j1^*TM|LHwK7k(l~=xRsH{ild2PCi`~!f-;e2PhPf>IO-5@^Mf;8d0 zPUl&3lq0Fz1!N>*?LUZOcT9oP%S)eSVTLJlkbdJ=g#)7Gco#lBiX90~L)z09?qne; zWw#)s0+(?8f)qH|Zl`4RZ&RL4ual)ClUdg2Wfc^iPR-p6D|DeZgjRU0KElwgfL~GWUv0b>4$_=P z5ZHc`jZv9CP$bx?s)Pnu)yifD048ti^3tq})t=gTxRZP`fOpro zz!Wk3{n{c*@G@byMl9p|q5b}ENy2qDd~Fdc_<;Ur{4w-TOnX)9Z~aEUlK)tQ0MXoR z{EYfPsyEmER#N-x!hbB{4@IZX(qn$>vQv~oIip5a(|YVaZMj+WvhJI&%&=)~uW0Jx z9brt@Og>PW%O3q_Y3TnO{@=CXp{wj3X3tO0oTvK0@C24K+6E_zk6pO_Z{ugB AKL7v# literal 0 HcmV?d00001 diff --git a/content/エラーフレンドリーな評価環境の実装.md b/content/エラーフレンドリーな評価環境の実装.md new file mode 100644 index 00000000..10004533 --- /dev/null +++ b/content/エラーフレンドリーな評価環境の実装.md @@ -0,0 +1,62 @@ +--- +date: 2024-12-25 15:10 +--- +#programming-language #compiler-design + +例えば似た変数名の候補を返すとか、スコープ外にある変数の候補をサジェストしてくれるような評価環境を作りたい + +また、単に見つかった変数への参照を返すだけでなく、それがローカル、upvalue、global、externalなのかの区別も欲しい + +これも参照を引き回すのがだるいのでSlotmapとかで実装するのがいいかもしれない + +ネストされたletは1つずつ環境を作っていくが、ブロックとかで閉じたスコープを作れる + +```rust +fn test(arg1,arg2){ +let a = { + let hoge = 100 + hoge + 20 +}; +let b = 200 +let c = hoge //this should be an error but suggested by language server + b +} +``` + +ほかにも、let-tupleや複数引数のラムダなど、単に変数-値のペアのシングルリストではなく、レベルごとに複数のペアが混ざってるような形を取りうる。 + +上のコードでcを評価する直前の変数環境はこんな感じ + +![[img/スクリーンショット 2024-12-25 15.23.26.png]] + +- とりあえず親のリストへ辿る方向で探索する +- 見つからなかった(セマンティクス的にエラーになる)場合は親を兄弟含めて検索して、候補が見つかったら返す + - このときはついでに類似度検索で近いやつが否いかも探す + + +```rust +#[derive(Default)] +pub struct Env{ + parent: Option>, + siblings: Vec>, + local: Vec<(K,T)> +} + +impl Env{ + pub fn from_iter(parent:Rc,iter:impl Iterator)->Self{ + Self{ + parent, + local: HashMap::from_iter(iter) + ..Default::default() + } + } + pub fn is_global(&self)->bool{ + self.parent.is_none() + } + pub fn lookup(&self,name:K)->Result{ + + } +} +``` + +結局siblingを作るケースはblockでスコープ作る時だけか