From cb6fc0d0ae966f2d245ed559af6f91f62ce2b850 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Fri, 29 Jan 2010 20:37:07 +0000 Subject: [PATCH] PEP 3147, PYC Repository Directories, Warsaw --- pep-3147-1.dia | Bin 0 -> 3141 bytes pep-3147-1.png | Bin 0 -> 55686 bytes pep-3147.txt | 379 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 379 insertions(+) create mode 100644 pep-3147-1.dia create mode 100644 pep-3147-1.png create mode 100644 pep-3147.txt diff --git a/pep-3147-1.dia b/pep-3147-1.dia new file mode 100644 index 0000000000000000000000000000000000000000..4b3cd41d4fe071ae3a8c1e30c96b57288ea6f0d8 GIT binary patch literal 3141 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 literal 0 HcmV?d00001 diff --git a/pep-3147-1.png b/pep-3147-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e382af08526b1da5babae4c43db72f4db84fd6f3 GIT binary patch literal 55686 zcmbTe2RN7g|2BS!w8#jV*)x$)$Vy~Z_9zibMgyfGqB~?~ODTIsvO*bU7EO^-5mF(E zC@MVXTle?(`yKz|IiCOVJl)5ge8zRX$7`Ig^L4(jP~%;?j4QcUQWV9gucvKFQM4`i zUw%0~UODh&l{iOAz|x1 z<3mFC3N$n8@~>6$ppnrudttPp*}_KIZ2fN+?yu*oJcQCajM=z)#HBs=4`^nw9XKA{ zIQKhK_LF%2Big52kvs9` zSiPX2AdQWU&4b5}6I8DB$jix{Pfq6QxqW2SvSrJr#{2mFeodWEPfzcB9uiWnzc1M+ zQP6w2MNA3j8WxuPOM5GiI=sl)`KrWeSw}}lR#c|qNY{;vp=-n)M>_Le-rcF_^u*U_ z!sS@->6eWcnMz!q3w?QAwk#+pXyfM1JH~r!pV#~QpZNTY=E$4dLAW!%C+uxrkrWqq zp|DU|L_|bDU432d?$jOH+H@bhl&7Yr8^Tal8$Hd;d?z5?lH;9E7q@H@B8!JDNaSV zcrr5u_QfGuT+>Rw_hb9eOzc$Ms9Wa$`v661-4qB=~$K6C$qDkQsrEp34HkY zao_@z`aLUqKT&THA)%cOjz+jyLgkS+n`dTc?>~FSj0JL*OnmlKV59gt$Gpq%j|&?)NKAKTb?fPcI-jIk_|D^TL4x2hy;!diwhJW$XVmw7_wW^@Tsj6CD+u930L+RsYRE-SVCF3Vp%MVzP5E0#;+fSaouYyVv*o z&T_Y|m0OO!ecz$!rk8Gf@5z(ZmB;#8`2GK!zkTG50bgi{-Zjsb#i=@vzAR$a+7C;T zZgw-+y_*R;g5Q7t7&C1Z#GIPQ{WILe0t1SQHhk@?zm%0FQuCw7-BdTjs_OWs)q8Fq z4&~Ue=RH<4US%~)jLPCjSQ7dw+`B!-d(~dOc~i!AqZ%I}QzPGCWo6BZ+ODmw7)Ta7 z?~2Zj9ZM*mA7An(olcGQu%G?$#bnm=Mut;s)biDA>AG<7qAsK8 z`qTl9+yRX(LP8zqewi*4z|WHt6B85#A57ps+go$y^Q)4~wo7}tw3bV-g?Syh>pg0z zv~{Z!X4;ifFraecGeymeRrZPO(!wZ$V|Pkx|6t@vU38 z7Vf*tAtNJ0{O{5_wdjH&e0zU?i1e z$+1Sv=(J#2YAXN9@!rVo7gyiMYj18JS>IjV=CjWNi@buWX}uhxckvd9B^G76m)6lx zhYufi`{29v)Ym5L>bIE*C%Er@Tpku(b!vQ_*7ofa!?~#gEs;EJW4o`Z1PSX#z3<32 zT)uqyy=cMh(O0jo5~O?k?wv{fIlru&oPn1`d#n6@Z_e4BYB%7ED5iAs3nwJxi=qPPU-F3X)#*@ zBU4+9d=_PI-`Y}|*HpYQTKPjynh+gUuUWI^^x3n6h^yA62UfuUpO+olO>Wbcu)b}q z&+q3x`1cZOM-=ah?c2AfC?BWC9#{EHOJS7DoSd9GZ&)!QOlElX{ACNAHeU$|>0Cp?MoeP9eSO_z_l_Mq@~n#29oS?OTKsUxYv@z6d{#5o z@!RL;!dY2a_ujtcO-xK|>xOqve0eR8K&U-iLC?r-u6*3)lhiQ|_(I!$5<&}{o8_CE z)E=%BrBUw1&0&c zB(6)!Tvx_L##%{mGJnji=tlQG)yBlT+;ecp+d4lU9UUF(633;1%%9&>%EDj+PLB2T zXI@g*I(JSTx#QO93C9R-#g&*%vFi1T3Psj6Yu3l77aq6RY)OL6pdnK&h| zX_M)Ii21r^|6R@gM-f}+tVy^mNUp6_!-jZ{^(cynit6)SH1PcNgwMAA9N&gL%Y`KshZk`#OQ-BZUHxHi!-@vAo>@n=VEe>(gA0uwP#20oSeYy^O1i*Y-T zUQ|@{{{8y|jJ&EoF5Ys9U)EdXTBYCblQX}5HNc9kitU=+i)+OebKt$dNrZRr-o1tP z_3NmOXC@D%Y(2GWK>N;EE5CnJXTBK?g@nIfQcS4BWYKCA4-YhjURHGHSh;fL#{KuG zKT|Juo9cGx1DkMeI1)vPp=@VwM#-?>+kRes}lU>gwv5r~dO7?%mTw z;*5WMb&J!z02-jCAVj#Ag*L)uRI$v9j!Ea%RS<*^KDxSv34!bKrh_Zt^r7|hzYIrQ z_KabrIMscXa&}z{JM{Frpnw2%{`~pqhX+h`g@uGxO!V)?y0LEccu(c*yc%3yu5dXy zxxbM~qv`B;?M0vI5rSs^%>C?pRplv+8(;YH<*@bMy~M;XZCCMIU8YjIXtS^2?(2lu8&yC)FO z2BwBz%nT*j3naCt7Z)=DwfN4@eu7t>?=%SwQQ-OuT`n~>X&>$>U$OP%mwR#IyB8r~ zck!haYsB8aJJqLy1cfcv&SG3N`#c{6s6UhKvdfv6S{LSjY7l&f(1IJA>YAO!Fkn=$ zem)iNk-+)6--AeL!T$lDD;96~{GX+(Zg~wE6k3-op`oE!%;;CLEt)Uy&L$`jf3CGG z!XqrAO5`H;fk&Un4dRT#jpbz}%a9y+td@k$7-_e<3g=nZ>zkacb3nCnHFMhHh zJ|%^h3J47iZPLe;3WEQyu8D8x~t;q zyGb@18yiI-fryfHZm#(M8R!4cHUG~OFNg=MrU*RypVN`b&dXa)8Qn{0om`Q&X8JfSkntv9$l&O~7~luPw#P%Zs95um5v81@R3HT2w$?UETj&T1@Ew zV0}{t2+a@L+6p@BW@l%mb^%11t1VjN=LFO`{o~`8P-X~j-FnydcVKX^pYQQH%bkBu(zr(#XTs&KjHXW;<%XzB~-^8AoHj4^n zj96KT#U0e+)3W$`TO+I`Qu(p!+jEGc6A#5x&5vV4V>uT+ZTR|iwX*{aL94QlzDV0f z`v;}WMmf3sbaQQO5tbsUmcPlT?cl>$(St|j{pWoX9pRBmDFlaPcpdlh(mHWs%Fw>7 zq~w08|NIIkr$O#rItYvJNp58s&gpQDTq|Syz!W)#J9H85njh6#eq!_`W0I`B%*3?V z&MN|Pax6d-tfIoe{C{hXj-8v58N%1fp6eeC=h)zg)F2eu{5O#>3(_IzWZ72ERCL=l z0t*`7J$WQFj#MB6fA1-iY-BlLH`pA$wu}vMVaMO9z{1+ZgoT%vHyQ=&)h)*w5cWs( zu!&{mZY|dKBNTC>Gl9$-6%~VGVpwM6Phy%UYT|+7LZr0QjrV_fRT2^v)iTtcBzN+Q zH5^}$FC6~T@pqBmh8a%WzpyO9e$|Q<4g_9B{ta$JlfII-Z{5-~GGdUiuVX+pn~12^ z;j$Ph%yayc1^`OaP@R8%TP^=2MY++7EY#m{XfR!1Y8x?x?4ZE6xL38YTIm5vN!{xW zJxd0>4!gRBMn^NBK69o76>3b&A~eiMl9Fj&wwgB}C}`=fRQ0(IQ`^GhpPne4{UI&A zVT0$)H;2Xhb1vS0>Yt>9fv@lGCROvdW4By|7UQT?dTDkQ=i&>01FLC)o1{z&8Q7J@ zvMGehyUDiJiOh26{Y4j+l5K9bjsoajvlthLm4dWrP`DnHT+PH}r7tP-qtxpU5N!fq zDpssuam7wpdrJ1!``4GUZBZpHQ_ z{{5!$&ZGgy#TTOfz7S#l?|}1pFaxP1jrkc`ASIxSKZ4$DLIq3m4L#+^yiLV1Z}S}B z&c@fTxeh%^IbT*LAH}aB158jrhe7l6^FRF0XV>DhQwCbgrS0o@8-p3Qqn4%w)~{cM ze>YAJwF?GDD+#hBSb0jWUcEXP%YAO9f0_Q`&e&ES-A8U0OIU+i^P@*)TB7*Eb;3Ee ziN!e#wI!g&#oquD*5xiNxr2j%99|MSm3`}gk`@Rk-5@~OVFDOq~^2y+1eQKGh09yG!`A~fCH zr0o3Xym_~tWB|nUbGREANO$`5>G!CATwdK0T+Oc@u};lLFZyzbolcy=-?fcQM{Z9t zT@%xRPd(4w%@076;lD5sr#a^;Ngn_NBc!6jO%NDik`t&9CGQb7*s$Tdrzj+HcU@}$N)=3MCz02t z%sCx^Bsg}>^LCg27^`9=Ml)OmT!z7N1Hc8PrweXA(i4aR#BxT7;2>a6T;X};G5arl z_57BWmIX{k+S#TOY@Az;@}ekTwrbU?z@VV}uV34YSSK`)!F67-+-LCE(I~4C6*T>+ zQ>RGD6v?gFfI{ZR6upX+)Jn2~1_mn$vL}|-+iMpT8k(ojV;&YxJT-p<39Io}^mMN& zc`n(tYZobe@0=V9yL|bwRQ>srCr^R^U?49bXg8v;7vGg)Y~m;+6}dUlG3|p&Yjcvt z_mhmUW<^*#9}-9y`}&QriUS7^-fwST1q;{?s?Wmf4`AuQ+v?-rCMUIEyuqva@IlLf zwYkg|{6{u4H{%w2GI%fj>v85`&6o8qf^#I-ShZG$jw-aRW(6a1zNDnY;HlH$!x3s{ ze-Oi^0)kepZNR6_oH-+<#>C?4|8IEc3jN8sW;kRS)4F?&jkH!bZO>O%E5q700*kt7 z9CLAzsHv%mPEHO***XZID|PjnScmr=)3DUFYu8=`jUhR%+zWCL`7}F9M>{LLd}N&y znWM+VfDQw{I&XeH;VKp3vGZ-yp*OZ`X)OVV5Oeu*NH8OhkcbG~vD#_N$ZM&3Jd$iH z2?w@q+cp)mf0upfzsueZlV&`6^eC7Do%(Zg%xl(|WoC0yU{b>`U*?<|?PkJlJdPi4 zgvGik(8g?@Jte8`Jre&U-Z3D_0+DtEFwr$15W@G{{bk?2f4^WW)4Gh`H{jN-jn;ei z7{s>1J{=q!W>7r=lJ|f5bdgDYCg7NJsMP0!+16`|@9ig{(_$dIQ+toZh7F8PEfM!Y z#q0;B{az)Y|hA7~$KuZ<;6-!7q3qu2%RC`eG3yIOUdrO40(__x$oo z4&|UBU%1|p61IA71pF8g!Y7)#32pG2{GbooN*I}$&`O677xvV7o*ONyWai-sm)UoR zr0ge8o+zD}%<3!&>0~wZ93}=^cIatCL&FjnKwwhRTG<<7LK!O^!mgtDOahPe$Ojot;d)88m?UCqen4o8nh)t>$72+qv3wV)iuQNx=zJOJLGJF-_r zty3%bQP!*7m0iU){_gJDj~_oSU$x3fQbxS@xRJKG@V_R?m|etF+!25AB8!E1;y?jO zjs++8SVWwWRE(kT0mb|F?ORexlf8WY{P`Y}Fq(U)=kd?a-NpO}rgU4jY&qOlw{OH+ zTQNA>TG8&LO@&r^v7Gp5_U=U-7xtaF$=U&zOYar&r8?(Hmo4dp}Z|0c$HEm{RS$nKc{qyj!J}{8p z3)jD9$1Q*k#n-Q2^^ApkHFh1dllCNd5oCbqUNLlH{_ zz+8kSB$l_dw6KcDC6<)PA-oYLoYK_PqLm9t$!v!=Xcmu(}Ch z+17qdO-*S?!GtTwGs$FTV`~D6Ge7sQU0xwvgU`>ek@4|t1RluA$w@aKyj5ALi~K{v z3wizPJ04_8*x~c_C2Tj6fEEWqHz3*GJ5Rgp{m@V|Ns1@fu;xu{E0=zJlzahwg>5oP zgCIV1t*to=3k$QNa#-+#nS&$vXP-a6S2Zs}TmwvR=3`>#lkeHD9zBXc&*B#EXd>8e zEwQ+X?b|hO+SN);+Y5F$BA&6LH_(dvO>|k=lP1dE+lTLO>GP%a^YhEkbY;U2-|vsN zyed7o3Z*#tkOQhOz1_Q$RJd6J{0%0u^yA{Qm87L{mq-#*STI^`u*>g1e-3$(yE_w% zI#7NRxJ@{r>5Bp^bdLlWPKcIQ{5$ajN+!Y}&Nx zeSiOX)SB?U6AXqW&W>=Qj-6O0MG*}Re!xI*>;cS6KzcUT`TaJ|-NlDR%0|t!zpu{E z`u1V2KxXoZ%E~Puud}0es03gX-s8P|{r&xIUSGz>9>Ykoh5)VIG`+kwfhUCF(7|kZ zmA&Wy3<8bB;#96!#sR)oc?d@FDlfr%B*r#3FMas%A;_@}EvAKhynK8KL#G$!=Sa}q z6V-ewie#I<2@P-$dCDzN2A~=E-o%* zJFYMGn3Nz{TQRPJ=Kv7>BO_tNK!;x}gWDfP$uT7K3+QhVPq}&XCK$@x z&Jw+Fwxj{{&?F5#pI%qP(pwNu$l@UvJC9Z(P?DVIfHsotqZH*e8h^gg{gkP-9zS+CcyKAGIrQjmsOtLor~tSJg0f5pyAE=?>DTlq$h+dn<0j3+qoYoUvUpW{ ztf!*n=sOh#ZiVGw^|7>!&8CGsq|_?s372zC`1Z|%SIvhF?FrzJ#&Xve6s5HstCfJGi;6q&O8^m`OP+NH;Jz=!qUp;oi#Ch>4`Vk+@-R z@cZ}s6E^f6AL*1-QdaH1fJHnmVH@47tE>A5`-^a<>EUt9 zpnU?I>ndH{R#yA)u&{rCUI~5l=Xm>*z!huuA34H!{PDWIgpY41CMHVpX)GK=|1MH<(&s8KaEG`{pytjfvBk#1IL zd-yPaPg}{QOH2ruVJLjJ&sJd5Nq-D94h=<6Gk7MX_kyA_MKTe8r0U89LztaSzQ?uDktXB-V)Em|0m#U?3ksn_SDwtF-gEUL@S`+SXGI zotYd+{5?kz_PZ~t7d(pA1)ULJ^o6_|vcdhqb!eUfrM zeOgA5R`a>pp|ywKRe1~>GnV*9G!t95@?fFRPtTkDX|V9Q zr(!)SNwXuZ3w;aoxiz9+4l0~cr5(}8(XWIX??OqgbncJRI(6R=ct{#9?b2JLT!-e8 z0pB>fm!ErUw<4xLFR)l|TXWh(c;Q0E+B2w&2b#l4*M_`Rd-jy=ofG;a)>-rlC2X_{ zk2b3yAD|0`j^^b~&o+@jO$P@-NW}IAHE2xIYk9Vq``(r(#XU@1z%U7?4!;`~dT`L6xtIqzsi6{^aLBbj|Egd_u z^o7>1H>|d|DPGunb@LHzP0aw1j>R4)POxFaIZ#7tEf;)QY%hD~)VQ7FZ*Y4nVIAm9 z7rpgI+hYI?1P+wG1BjxmTFXoJ-(MnktXI`yKGFOt@&t@UkP4A=Y6(GoA;tIf$&+1y zfq~0WHWCHMQ1{^AV9@#V+w%R_HBU}XHlfZ9gw-2MuvxTaZa|D$NR{{f zGnHqq--#Rs;95lqsjJsD{5Gv9l_)yo#+&cIB~(F&EaBEuHz5}a;gWX_!G0o<6`;fX zvj-}&<6nUGSEkJd|Tx? z@{{k9sGaMdBc0Xjl~A)-Y6t;plJOXmUq2Pe`MI@%jZ0t>tiWG1NLzfy@I)MFT(^ zZ40SOXlZqjux%n1E=h%Zo@p`A(+jEcU#Mf&3hDD-*r#yxZB^4e=r2bM4^>I{MJ9f7 zle$vQRVEV?w!KH@cfM;;2rubzL=mWn3^s7>R4)rf(pobaw6{pXHe9GSZ{OY9ltAy9 zPkb@guY-&$5WHd+7IbYZ^uQvq&F3Gqx3B*`odhf&`3f*Cv{><2 zudU5Xv^&L-r-cKVg|=?pOLi|WFOT*2vEG{Mrg=CJDzcvPk1XC~c*XcA$DnMk0#?nR+;(PW(tlo1<-V zNvTJ_mYi#c$k06cQ9|ZXEwPsUUrtV+)Lp0B{>r=tX8^hWhw3fw0ZBt z!#Lm&MVHABr0=46fu0eGc{LIec6|HLCw)UhvstQSNQHbm{jSG zIfp(y@>e%NW%tSNEyN{7)ir#kB!U^Z{@GKZFj^D_kO^0b|H*raXUk2~pS;~gd)FeK zS*V{FJp+d&-~u!pnmy1C1Y(uzseoPAR0L7rA%~JG9a58LP%BCK+mGbU)LG=mA1b6< zwv6zmJFjjIf*@z}(YGOJQ4P(%eEAY#!0c-u!eYXq_m{<__~##sNa+Cm0|a`0|G0DL zD&vvUPDbqA&{;IKv}F97`|&Od2S-kN+GLKM zLc4vaIEY!#z~CRWL8yCxnPBQbJ%}JL{OBnCd8{>x@5QT&-0JpGKgZr!<$KxI@V?qQ zUSqaXQn4>aSa&06#D|tl67Gd>YtOF5#Hlj=5{;0Yw+pk= zc@{D0HE(JdS`~(QLv#B=J741SLD#Qerv!FHa%cOd(GA~5FIUd3Q-VelMQ|v;6YJ2X}Yg@&=v!u?vRwF@s?YVR3gk)uR6O~8R zojWU!9UJ$mm1)vQI(rl>!0Z_kL(%%sc63DH&*u2L^dK=#(fN1MW7l7U#SDR$28ow^dN6Vekoy`CUu|d4 z7-o)~jWFa{U%xPacjLy5#`Au=ckX20u=lpP-8y@7a}h)d@w)k6?t+2L=!+8?m%XmF zs&Jx!(dkN(>5UD9LwF2eAb0ew5^0`8GctqZi~b4MVu3E^Uep4P_30r1guKrh@w z6CU^t!!_W$VQXY$MBol|TfF$@aRl7qzQVE zI0WKZ(v^v(&^4qBmff9fwKn0J^0~=YIe6^kQbFaPPU_M~sp;WjCef1LwfHh}7f6aK}<0_8Z?4 zB!{?)d0%J`iA-PO3hC4b>H%iB>y?u?Be>?u0ffnh?ry6Q&TOAwQ~9XHl26ZkOGl-; z7U_Ep%A*(+%OE~AA9LuBR#F)datSFbS9gx_tDY8cev*=J`*n1d=?RD7?l;b1?j7}q zF52bXx@D|z_?2;rig&@I!Rotr-Md&_F}<8pD3a>Fjk_Y$1_9;Ie1EE8|EjJ)zU7V< zLh_-AE)K{6%S}$4P$1uOGP%!r|i5RUB#HiwHZDB(sn39MsH@H^=%vf3|k~jRX$# zAS^Dv3{4ACG(vL}h}&jB;*#K_6xpe&s>%$01Eqrya1kjH(NtXZMonY;AK-$zjdxYy z!kD+wTIaBA%b2syXHiiLZV&F%EVz;$b~b8wXliQe*0H`iR{Ql568CVOXE{50K$Q(3 zO|xddIC@7lM}O28bEd5HrR;1+U)YMBT(*}XMvel!tuFd}bO=PLo zWzLKN{_8G3&o>i4G19pLy;f~>a)O!oqX2`Px^M0q>iyXF<;xes+oCMK2TTj%v+4JE z{Uz8LA<)2tghWQ_peBv4KCp=k+0>Bt6KW_i=<_`Iyw$S_VVBX8is4};!-s=HBbpP060oYO79^8Jv}^%j0L*11>IlLNO}K0 z0Lvu|OcNaEw%VKL1u{EPy#YTF^yH?&pRo5o(y8Z{9Z8q#zyX)X<6FU(o8=AwZU+G? zcA7|y^)=6+klKz;!~~RqL#B)|F)?7&w}Xp|h=^#bcwGPb_3M5_{8p6j3HD_b70rat zVPaw;q&;LUtq4FdXw)L!_TwX>iN~wFhE@WudVrXY^dC3|JP3yfMJl49R8D=3SZ{Sx zFU6pCDIMMZ<}mhHXT(gR54?S>kEs37!zp1itGIJ|LWq7fF9<*e(tt)i7HlN8zPk>2 zo&AcdjFeQtx3l8awo$mx%CR_zCI=q24Nd%66Wc!cy6jN4U9&kN8c_MBOY&&er>LHZ zZMJSiC$z(QJ&kmlyMLL+8#!i0U(tDZ~NEEqP+FJusKEwpe z<0{jp&$l#nx&Hk6jtGYr8E@%k^RZr^(GAjj%9nrt_;@?A4=R!Ds4TNAyWf{XI+I%1 z2hj!Na5Ak%5Nmw#Vv*n=g*RFN;0$(*SW8X(`4!aMTv@KT+P>m(ySaB{BPf>o(i85n zuzS+YfufgS6cX*Ks;UG~y#k0?SGaYp?|v;UCDo8^nDniM=UAtQ+c2@oRUCP(Oi{pC zmvBobs7bBse3d~ZJww%qTA$;tNB@$#nSoW*!rN2IkWP0NSk&p(Axc<%?ig(|6656N z&Hx@^?`efw(bLnj_k5b=Z%Wj)(a`3FB+M{%g8K8_+!?Al-#-(r$lzAA0*@OF^SgH0 zB$+OwqJMPU3XA^2<;-sWN1+uCZ@?E+ZjNOo@?1(_Rm8%D$N-gI~2hQ@fR{+AxX*Mpd+NFKo-#fZ)tbhM~dnn92DN>HH->ci()3?CS4Y- z<>|%}O<)?4{?T?J)oH$POyV7n{(m6ET}uTbL#6I25<)%TH(Xz|DcOjDXS2~C#K^WI zv*vD(n{rKW6qTNvJumuj$c%KyriV^JWkNskAhz8MiJ;ped1CU3jJZ$vtm zzWriB|J|Eh?k@}Pi&i9|6XM((PRus!E&3p5xgn7xQr>Ry? zPT=f=gnb#fK!mUUfq^B^3WJED1uF_a7bW^+G?bwyu&tiEqUiqYj<-9Ux&Z_c%3+xj zx&hSI&j69(2AQzEnXh-p4c-Z2s!D8|ye^Y?mVs z5XB$6oyKjc(afYo!?ubS%4W8;i8A|EzEAbHlHGSF5XAHeV1YeP^LII|kyw~1yjils z{D?1WKBKGu1LJeh^GG(ewuU2h!tk+6=+*BT(R0fzl*?^>?*-PY!VCjkF{FMCy*G!ff2*s z-95ERaK73g2V|}z_>zpYG|fNL-S!P=(W8!+c-oB$f9QwSaw6%LJN#x@Pgx-$Eu-tIHc+dtK&>_LcuQXh^y~?hI#Ym%|hbhx>?!T zkTp4xA*`?b`TaX76o=X@q!kp*L0j#Hmi6W%Rg322fe~+XHHnyjg^SDPt6#w;r@|;F zvyjP4Pe-_~YAsKQd}`GnQPR^S%{VpQyCeXdn$$!p({L1-ov^SljV9VI zd&&D!8oJxIoo~C8AJtjQxk_-SGEy=J*yS9Tp7MM`GlYbPpB=hQR+ZGzli$&dSmEwI z%9=EF>hrU0VC8F1ETCH-1}Fm2^bA&t6ws55H<=e|Z2T?c>U^dPzF6xKQ0#xeDLH62N*yhIPTkO zP{Pvq(}Xg;{gIso8iwP*H|)K+o0_e!!50&FQVZ5y)iU?<1)XSp#MMIXBYNNmZ{5DV z1FSQ&|51Pb_(t$-S&b}qqon}=|8k%KpTW^#c}{dp({m8{d3_$|CcWjkVcTB4+PW^ zUC(=PXCSZbLPdSxm_ORSi;0UjHZ%-mGj;yng4_$kNW)bLD+g-|MnXxvv)g7ga~vn6 z5Gv0)_)SfID9EpPac1_!W8mY0nC~uaujtw|)GgFDpD(zyTPPo*frJa^&(mx^{3-yV zmVDEo7>qNG5Hi0DW>D!el(CWe68_wBOvf#ie7dLzJC+`2asf^G@0ps`KVG6qiL zqM;ddBuMoRRv4gHUExR%8=!=e?+iJPu-@-2LYL#8nF$cxivOOPd30HB`x*XB)X(4< z|AE|SNF9#lKQw_V5w~XmDL9kxh8)DGUzn36{VF71LfjJ&?}_&MCPUYQ-MX^7ZvqxH zHa2Er(vhsao8Nmo#H$VL6Y)BP=b=fHs=%{@BDjVEq49 z{lVl7A)zHG-eOcZx;Cn*)pBoW1Q+L=%N z$`A+o&rPpI?=`*{c20v6Un(53b`j8I5U-hmaM}J$4It$jh!iewK5}Jp=TQ`crlvUQ zhdzfKIc)$MZt+wDS_%N>=qCMY*go=OybpSqlkqb>2sWPRoUpO8I{;8JYo(#OXzLc= zeLaGlenQ_K5+U2_<20J6nL?NGk`?jls|(H^USh$M zs%;8dy+8njCHN1i)SS;~J)(I7D6}%@;>E`2&shk-y11GT0*h7n6yDHwyTiM-?Dp*z z0ANIvPy|)5l?A4)uH85JK0ZxlLj0L8jT_LjL0Oq9vkV6L0n^%H_ov4G5wdyC83hel6%WXBMZ(g&r z4U^xr$vUheMdi}Y_g#Z&cUr}aD<;fdtH!IY)NJ z=q)8GdlY1JRR8d>B+5iUQE!F*{=KqhXpjt?w^f`lcgp8gIidIJ_3N&gGm74RQz)P$ z`f|~mnAo=0&8TaXvs=NNgo?hI4~>rKazKa}^ z2w@TS814{726sd;$hrCOWptGo*^`_og3Rd|IEf%Avc7X3J#$W#6B1s>kEiG6UIZKB z0K(g})n^;}BKsk$LMltQ+%W8a`>Cl>*G{t*v9xo8ad{c&O`7iq*H;CoOm+veN(UpL z`W;Hj9mf)qjeAg+Tyd^k|<@_Y&MSkQ$F7ch!Qj6#qOT+n$e!vHEy?tM{!HBs1W zLq6JWu<+B3pL{n6!40scmV^qNU)6kF|n;F^;uKYT*E8C_pU@b!WUi;6sdO}QFf z-OLEK``g6CeUQrl%UMx7o|>Rc``g|k@f~ClsrHZ$5>>cenG>Df!To}0Xz58yoCI}p zM1&QcZYk&e`vW3*wm3rP25RXZ___YCU!xGn@-tZi@B=MSCltiwJw*Cj0E|EtdVG-z z%~yG?c2ABF6CQ)BN*@~FntbSK}=gaB%#!5Oxt!L8m|%+&8AJP_^4^C z(1!1&Uc6jflHSq` zjTQ1%D2k7bT>@J`hiMJoQ#$=kfPD19flc|DF^Ml;yl8|H!X`?Qm(27iq+kUOP)8cu zwVj3MkQ&_6(-X6l!jI1{i+G?c%c_a@gKJ@id<|ZOugNRY%}~fWkiDlNVvy7G{kwsv zJv=?P85>7;mXvE58#AM{gjw1S^dHhzj2yC-CsG4K#>Qu#Mt&y7sDgg7p3qa-wedJ^ z0C6%M9i3*nu^!(}VQ2;M%ROkmV4tFi?Lx6D+e@6$`R2o}1{sMBUJUlNt@W`Oso#`E z3$GM80P6$u;4s({Ni3|u;s%jqELxvyJbn-z8`MYSJ){wGxcIO2g$!A5zXeJ9@Mgb! zT4t7wkoT1zdBXuFR~s2G<=Qo($*YFd5T(e)i_0KWLE|~{!ZIclB^FSJiLx#F z_E^uNV<5Gnj}x!LeLmYdsr*>qI<4jTPRudfsJvpXczAp3K*~cz@6pi|(gg%9dq%9? z#^7XV%xNPf{`K`nQzJJ+oWDh#-Z(QcSpB4go2<7GS+XJ$S|H&k`Xyq8B%<6Xu7gBz z&##di#T$|HaFE;S-$1pe+(pn^I>S`WKB}y=)H+JE#T2^nW~^Fg1ga^b90v8oNmyST z`-b?RuG&_{TcH9%Nzz1llq|oD1b0MV5^fP&4frDSY^|fZzzCL?vO&9eB^#oPR-mbT zK^!3j?J$7S6}|5JXgoc`88)1x#HN}`N=klycXtb7APop0UL_9-@e`XFr^0O#bc@$; zJ<=o&S4EW)RbSG7T~iK>0#QN3|8>pH+0d+vg7z%mNnc1tW;NhBd687*gz$SY(dJ_G zA1%NOGwe-5i zjFNFuWH~tkKjNY-Wo8@I8p)F@-HMHiR!MwGb~B@cC@Gf%%`P4t*?brWVAOHwcqvqH z2b`S^_=@)6M*~z8H!O?(!F&IWR5i&pac1ozO1Jgx69F`|)=?HAShSEf=*F`g2y_RU z!Ra<(DA5t`Ksm&#BpQf{i4i>?4u<_V#+Sh~-I~2@)vUuH^;U&tC>R4^vheXm67~@i zLM(GD^stb@vqHPL4OCZ5bo3%Mi9G{pm#D&F61iX5vIx=ipyWE}JrG^~>i&Y=UYCl> zKye6UBc!IrM@!Fe57g-f??S2BU!%oxI7~>4_4BjzDsX`)U=cqvxSPESxuGG#F-jaq zz?u9K_$cIVSgnm_W@f-t`@tBHmq5FjH6LZuT+ z*Y4RxJl#ZxTtx|nN>C$Czg`RtT|r1mKwF?~thp`D_4MPcCRVnwsfmspkUf;@M-Q^Z zTR}*_gx6{{nVbcVL&PK!rg)zJ>`%T#i@6#9Ki*|A8*VDFw~EVmw|26{^2W$}UGn&l z(fP||kF#XLo~V;QM@Lo#MsxZyNLqH4N9_+ z7rB>SmjpNp*Yctz9lck1h=Phb+KSC7jcs<^f8ho~R$E`6{aRT&b0jf#Zf>`eg+@?# z7NFh-6PtmyrZ*nZFo*8C;#LmhFRyxfMqcdJ=z=@5^Y9od*U=itQ34tgEt-;M`KF>{ z=nC#upUna_pPiN_02)=_)z#HmH%=rwJKGg37LJ8>fIyl05VzY69l-+g{Mgse102J> zQWVLB>dA#ZynmmD_+!oQ`|UhV^(r3!XawckK49;SiroMdose%lPEj^Pj{ODs_S8fx ze>isQ}+hPTK5O7;6!vzb48SC^kSzZ_9oh9NZc@M#&3-{EEVvM&;P8fvumN~I= zVWHB}Fq};!*0wa-TK?{G3O9CKhtZ(ya0 zqwn^RD2XN+2uf0+p096mr-b;+|anA5vBJK&#vV)3!|ZeBC*mA2~rjv zD2Lg3c?(gSsm;#}UQs<$iX-w~6{+CccY zxqEqdNPPG}%@>s?4B~Mu>jeY^woBed*MBPqmBxk%MvJI@eQ1q3egB5kXSA4vekK5X`K{KO=tL4#o^bR&^wkC6U%8z za3Y44XA(hkfaphT0@S>5+F2AD&TM!gfeBdvUX! z2lzGwNE3U*gGtOl28ilI8}Skyu}*M(ad9*c@(1jq7S0&vpsFC&p%dlEAg~tzu?xLq z8GUX!$G|I_kGOdWQPl}H%26R98@DD_u%TPJ56SH1r&Rx4#Hy7sJzhzxn<*j>ySlnQ zh)|PKwY(7Y4Tgn=nqa|qZdkNk&uwz_R2oA`MMW3#gtL!w4m>|>O_&@-9gKKAblH@F zk~oS`w_*!yiR?jRDO??m;Zd+Tv03Q24u^_gHx63K{^9G_n+T?on>KaanS*he7wu7m zm@UsBLFx(~ml0D(Pw6}@{OfYMFw#ICC66=&qa1LA)=6+NJ+!>z(32O*M^hv0(xq|_GV6r zejE+z1bo|IS7Y7LxAY|NGq<{LmB=u{9=QNUFAi*`tfb^ZE(xhVM4n_1vvYDrAR05p zqfbzlbb%^-6BUQzM876LU98ZUw=A|RLg9D=jn>#K z;JF8mC3%QHlM@p$mo8o6R&WsjFxm&)kBIs*R@6`dvLD>g28VglpqF!Jn#^6-R^b5K`31Ib(rK5+z8Ole7fnS5H|Eqo60Qc-;bMLa1du5R`t&*;U&XA*2A zZ&y~zhCHAsHqPGZCE40gup;N=zz=cWYTL^poJuoAWv=M;L61zMqi^kC&n<@wBEw1c z=SV{rwHx?taf>|T^I8n?Cc{HYejlnJ&6(w1G%ACYy>m;lo7U`BC0boc@Q*ln^XS%5 zR6SlNPg(=B`geL)oCF-TE7XDvR8~XG3lfKQ`~==qREOE$A%Msx<5N@p3m3Idx29ZElRQx-pb{~0Sq zJ%}wTDzYrJPA4bS#Kd-hAnZgHR5<#=a00eLA|-1mixZ`cr_l%vk8gQEwOya`l9p_I zP=Y5U5Yrn#;|7Is*lW!%l>`MOJpwc*e@Oj z>Om2nL}3Mn)dXrxqN)X1G=d{0FQ?J2>c%5oq+sC*vi5dRpP0daLPKe&gG-w^HKXvj z2fbMD5fSP`Gg4p$o_NIvRSNPbG5#22WN21xSyhHhc*=N&%k@cM@Odt zEd>Pz=7Hz6eM3>kpD_!s4`&%R?cVk4#>$xALaj%fftgJFfCE zQpWVJlKCjjhtVYVl$H&4(+AX$2ZPD0{+O6}xUuI8#tsWu>n%-DoMfgH6@P@yiK3## zhvoG;4#nf1rmz!CD9ir1z#KOnK44BhKv9~>JLKr2aT-r9Rs>sy!Qju*aHJV4jOjHC zehXNl^Y2An|6UXa>EcA1TU)QD&`|+@(m83V0M(Mp$|Mm{aq<6p?Lo}c@A#gco-6ne zMM+rWtIDzGQcdAy|9um3Gl>_A#%9mZxN++eike;At1|=r{et>ok&%kZEAZO(|1kjN zSTy7Gy&x|lZ&Aj#$ZCoR3T})2fDQD5S5ayE$!ziGAorquhl0BlLD~KgxsUq5^!GJ1 zQ$>bhg8yaQ_^UDD znE69}*a82dHN;K5SP#gsbJr3|bAHj95@D~2qo2_98%DLal%Jjo(9*=>lVVdp_U_%g z`1WN%00qRq4hYy%#%>2YxPWVPgKqQsN<}<717P=oTzIqNNjgf5(86d_W`bJ00o0C1 zxx6~^hBG)Fp^{(`;3W&x3Z3PyW@|c@P|;@>_f8a44NOrlmdNxKK{*5d8JnBOiwuLD zL4}(Q0PpO#>(>uh2;JLwJc8r^5rq=`gAgR5kM3#ZO+4ekF8Iisa@S0RO%7LeikiHD zAVo!QfHHW4^(_J2H+6WHT2KmR_z!F+x@c-|32HEyLO?Ru>$J09tHs;VS#%Zl_g@e) zprbVJlbKm!1^)w49^o`guB2JcfojH29JG{y(Bh(&kbH)gVe-xI)6*83nwl))ODKVb zMFVPubor~28}u$8G8kzoO`1i+v>kq3_UXt^iK8zIlkc1ub~F{jXfHZ4ASyOHmY~<^ z%9Th8K92C_EbYI>p?RBi%^FdC^p#*5#Ey6#i& zlP6z-d6;@6|5O5D1dkEuMpm(ZK<2!4aa-O)TW$hI7 z`QfT?Q*MoOH7L_oO2S*u=n~V%>Ae3qH(L%E@kqX{mT>MGMAu$C4z6}#{~!{2X$ z@VF!wL{1OG0v7FfK4 zuku};-(5musNs}5BGN&Y96DoTu)ESYoivB`D=OxET=WDUrpG=a2aFA&>PAfIGgj3c zbV)f#AT2d9ih2!GyH#3J0)wJdbTeP-~lsTCF^t0_u`Dj-3lsH|) z!PFa&1tzEPY92k(TVsPYdI5OdRpO*O_U^9LsdwI1F}!cyz1wH+KS!RPmxUg`1i-6d zqBK|#>=PF}gaPsR(A+7+)a!mfY}9_fJsz7yJP8hf=T4Lz{ob~|nC;9CYW6$UFOSr! z;o&a`5{9cieEhgbPacW@7l>AThO?9K+^ItJW&mMbb*|uyFe-YA3nHY?@SDfCzTj4| zSvYdBzHt(K?+rMT4m+c!I#+NyDgul9_wOTVJx9;K5ESAAz~^{Xj&L1$=SR=bCOhcl z6eq|7R21sS@P0GcOkDv}WoZ`A)ZY-ipqU{%W6DrEeULde2B3e6o^4x|h*$wR@ zFHg^h8?P`@nkHD|sz^Mm&JK@bm9FGM3~_^lX@^oDS~Z>ydV70!0U0VdHZ3o6I>^k) ziQ^b2^BtSRxSsf<)|4QHvm0by1)!{RMgce3Sy@e+@a1NW;y-v4$-yz`q|tDZ+iID! z?(};aQr@Gme7W9v0i3II>k=xS21}9*%Hr87*_!C#J2=RkhdtCuS+03>?z`Q6tpBBk z#>OrjPs0fE@#U3xa15aPG<>}M>C@dfn!0!$FI?x80=SbmNBai8d?|#iB{_b%<}PUV z@?lX>f~Hj1CdR+um$EEeoCVpsurO2L-4cp5-6=e32j4nf8=#pE+VEN8bxJJLk0-QQ+UFf8^q|yy@|vIp?|r|w~8`0Agso4 ze(v?QZ>J&j7Zat4UV{fcU59+87>`Yv0~PuL9ik6Vfu1Z>B?gV!h&-*8(3W_p&=s7w zBB+X+N{h!nJ%~j`?fmGnpgu7za}b|#YiJ%ALHtH6HIiS$4&WQArA|Z@&_V7e%YDz{ zgHUg8LMrV^Z=1$!zA$fHsb$M)6v+7Rt_ zQc}|E=Mn_68b(ID2D8_&x|@ z3gOt7`ED2^Qs_aKHqwzDP9Ecf^R-7_m+BzQZYJwVhh(Hv2tz~SNPI2VMh+at{sW5VF(#C1^En7JZ zLQsi6*vL?4H18PC*^G(}6)1U-Ghs|(<(}RqU!LUKn2G#p> zv)yXhot>RaUN3;7?J7Ok&d`ovO$Z^NMuS)^OOE*U(^~9O=FvdBgf4~(b@T^AuJ`p^tJY<-Ol7qIv`=lt`c4n9gP1)+Pi?|n6~ZTH#5vw&LCuw z3`Gc)MMFwfQCU=qN+FR*)(n8a0)NXN%H`3-!Kn^4E4yZM5c2*~RhK~>_&Bl$(oiOyvekeuixy23K6Dk6E7w3^n6PN7rK2=s~5gd`Ogxt<65deURFl znZP5&$rqGLw@IGw&Rt;Wo$6p5%2Cj_KaO4{v+QS|&n-^hB5Qd6g}$l5K1b2~N#L7k zX11Qb#Cq@W2Kjg1d}yLr-@&KfcM6MSXsdlxqwgtrso^x=ZUU@g~e~H;CRQh?i{6L3(3SR9mkkD|--scpL z7T(_Hc!q*|;{Ig)t&~GlimY2(%I9 z>@ox+Hb<;Y$?`VWb_^KcTl0Brf_~ExQl(=b6b0eJkImJ6Du0PQt)P2$g|q#d=JtZt z^&~u{Wldw`N>F0ZzTsmVDRi2E9O~Yt>@fUP7Tf;Uh12(z)uOBy!t(WsCZPi7(&t;v zoVi~j!}0g;{j#3|*k6BhCoOICTBn&S$mLJxecT!nvhS|1jY- zY=3*HK590?*d6_5ZjZWMQ)(Q*@;3m%5kxk|Va7ELKpG zwBVUQ6>}g1PGL7t`kukc!-A<2DzOjSX;f9b)u7V?p4E%I<6$U`m(d-QYP1WQ4!RN& zN?LHEEWgVL1BLh~djFnAMpJ?71$jNkR^UT$#@RO_Jm zJ#RP%6}MAI8Ds_Ew5&M2g)9`AK4s$gw@wlKCEbg(b^CepLcWv0cv1M9+~d;J7$SbG^)I-mqGPeBr=b!w)`_H~gG$-rMMWzm<*QDG_aB!BrzkS%UJVgWLB?f&j@MSW>KO^Pb5Uur(TpFk?)La!!f zvg47R(M<$upkl~ijuRj|frQDl_>lXj7o}8xF4qq$;f*HNePLL_>u*j&rwKTt(c`~m zp3Y=6Q)vsJY{Qn8@(;#z4%<0@YGseUW*PpQ(2n*3(1s?>rm9tG-yX>RW5I`7w#8hc zZG+E_)jKKG;WI1lEy)tdO4bvly`@&#@JBMIfrM#~Q$Fg&0obq;l*}arzx!^_y^Pm$ z##xmNi7Oee{JxVT8=9^AH~hR!7W-3n6)masRSkdYq~x#(z$b0BJ*kMnX?m2tKR)fk zF(BQ1tmLeY^_>*xxVG$e;T1OP{4WV${$3xBvemknQr=IldiR7RK5Y*2SN}HKyWq@{ zjY~`BMyK@@fKRK9603rZBAn6t$Z{hf%CkWe&zO`PdqV*MIh)cOP zxTpx+C+2$P9X6m6Ag$)!s6b0#0%2C|WnVT_4MhNaq^Q+$sAY$LdSI*FCJE)VG!v3L z+D`M;so;>$B{_I(=Z3#bNRljxj{oRF=5)%{cYd_3PrHo}*W4XgLILbkT2R~T!1?EL2 zDGD09LUPNB#bIDV-*az<$E%mm?EdAu{cveLv7yJ!M|uy=e2AWPb(?8*?ZE-}SAD!M zXdLR1aN=p6=bwL-Pu$tb`^_+s#Za@*0bNzwbcRD)O0$xwfp$l99CRgALQbjFGEq@c zLU-bMyBl?iED^?`mp#7JXn^aDPu~o+FG*8PS)s0g?WYF(KW;Q`==3si%_%1 zMkrP;W;Sd@All`CjzbS(x0x#Bv+7zWaPoFUCOxA6eDJQT>(;N=BNVzdRnX_|tY z%4sKhXc^I2>!fNzBDKV>S473PpXu}2D{8-dY?h+qPk$2uz_WJ42EN8nis_;=&-TO` zUGFo(qmJi-IWtZc?PKxF8H?IpI#=IM4AQ5?(BL} z9(~UxeSVULwBUdNd7Sfc^y(h(cc#q{1hKXPDGL|?3wrd}e!`Hqt7QkUAWPF*njQ1q zlp3rlVGs^mvWGM!0Crav2OaI)I-#99acd%{qA-qhgm!FZ;%mWv`Qg=%Zdn_hR0Ts3 z_YgbnHlp4_pm6Hg1T(XYcV?A@Y`gK6<4jFs_S_B(rRmkqS~CuB4J-(@RS~;<(kcQ^ zCaLBUAQyCS|8fwTho<5FqE!$T+n)U<;v1ssatHOcZ4ZLt8XUW@^8Eo=mRF}SCz#5p zrQP|4jQKCl$Qv6_HohI5$qp9l0JH+~9dNXf%mW9qc2&r#xwm%LT*!EpBSI0@mR-W` zyXEBF^puo8F5J}0U;HIzqp7N{iRt$3Es9QtQ_iOnu1?0 z{c}{dvh0D|b{t0a%kBIrC7%$>>v21dUOi8IbqG+My}j$%iqON8kMDVVd&&Yk^@9Wm z5@GyC)edW&?h(6E$+peFRFq-6&jfYd@wL8#^s`6%BRpFC#UZ56*$p$jBU<*KkqM-t z;zcr)=tcSF>Y>uPP>M(a`+#bApY5U{B%2H$I=|X~ zcAKH2#xGZBbp(bZmt9+WUwT+UTdIk12)%Z_Zr2{J%96gJKjx#EVbeG~P(7oh!yC2RZop$gTbaF~xQ~bZy0K(mB`f0cRf<2`B z2&jhaw`)I*J5|2C z9$uieYGFl;^pO6>_T4oZ%PsBKKYgnC^ty17qmOiVfWSA27($A*t^BAy>RD`-(JdlN zKkcY#7tTxP$d1$Q+kV@WD#Pd=tJEXk<{aSRNH3E3Y>$@!=~$mVr)Iq2xcq)_)N9@8 z?PJplm#jaWqg4`O=HC2(Rm86wHf|i)$@BRyBLZp5o#>Hom5l+_nD`4V$2^L!G%Ub+ z@3YSTgm^OmXr_IjKZS8SG=4e;E#GO8G|;}E8Xr18=g^iI))AR}u|aU+QLVCxJ729n zoTJ%(;$c|$8bK@BXY$xkFXfzBGCSHf<|1HdDvD3MqfP>3S$NgLjYGO?$wt|f&71AM{a@lb(8>dxnL!2@^QU7hWJI7gufNxym15^0Y_SP5Y~ z$}vc0GZ)$vKYk&t=HgY>*48aFuY{II{f=4(e~Uw7jyK-;`}V-VeY8OoHRr9M_|})7 ze>khf!GU{E2?IA>k1h`jhABd&(4bc!ad`osK<6|5w>|21+s5GtDBq!J$_*+3!PM4U zH<}$|dunNkRjhMRd(D@$0pV{K{iIM_7PnMsHEH<;U!d99j;8V2Mw@-2y#o2RLM2ML zEC&k#sj~}uY~}Y;fI>w>Xt~Q{z;@%D)0&IUgh*sTz=}>7I_%XwYJNh`E!b9Tk>XKM zwm0-VB|Pipp9QU%@st^JksSfcnl`fd*|US_k$0#?jT}?!gU{9&idReCn+G#XfLL8v0Y!KS3eEM* zghx{{@ZL36Tx=ZU8%Sf_0Hd}83Dvx=t(oxCkT-tt6%}E%pVO2dN(aq*Jbm%v2vs_S zniGSL2c$y+b4)L@y_^jR6#Z=G4-Fd%@uHL_^F1}e&ADQ7{CKQ>vLTv-u(_hh>Y<@A za;;N{TJ#+;krr7TcgkGU&*a_i$WdaQ>nY5BeC6C!B?f-F$h}1`D*X1$b z0HI)qTGt65Ufqv^uZ;p7)BKQeY*tMF@bVYbefIY$4 z0BkF${d;!qoGf>`C68C71wuejgsWw$E8k_C_nm_RkFKj##C>DkMbwkM=$0iC5qO^P z+^K=1==5Di_gYE}u;6Pf{am?-kFvo>))F<_wT)|9x?q;lUT3;rzOF*0m4kN^<9K>V zP1At`KWCt>WblH1b;4Iho1`O{E{oy_8t5xDg7{oaCf=*GXfX^aXK{zui|fr4QEDJ< zstaP5+DQPIbfV)pqwyx>IZ>)R!GYyyft8~I%JxH6oFJE%lQ!JyNbdehHL=iA zw^`U4y20(W8Ue-~1O$+1z$lr7M*yN(a9gGzsvrQ!sxUZK!p%c4 zvbh6kXEHK*gt ziKTsnf&f~wrlX+{kwvyst=B{hfEX_e^Wt_J*sFB|}0XFg2EQhAn z($pLUwD0*Oc(TY;ZkFF1t$vtMP>Db${;GSypVAQ&%jVHr{V(0rgG2Q-cY&<365}wi zLo!vuaVodCERnF7bxP6c&toKpm@#D0?qofMMGzOE2-1aZW^Ww^UyuISt8Y(JQ&Z2! ze|7H<5Zp8(pLF({M8bCES?^Z>Qyrn)7sg*Z&^awN^#~8Tx-2$JZ&z(og`b^#DF!`y zmAr0Jsn9a4S^4A{=fo>Tc6twiD9;)icFUvn^4^f(ou`zveHIh*XmUe~yPsi> zS?&`7YXvH7lM(Zk1B8I+pJKSJo?)BnlU;IQN1{UxzScN0OXM(QVinbqA<}ffLL;V|(A@ zg26HCGO86ZXb7VT3O|FnoK7YHEj8#@(aB(B$_EN+3TwZF!C9$v>eT0-sQYiyB5euW zC{Be7Sqg?udNwKK)X}x>$cHh&9{PoZ_EmjieZgnd)|N;<43G`v(}-=+0L?@E=w~Ns zh4R}C{}H4e6Q@rPhv({ITFr|A&kcmHBesk1oMb&?@eCwgqUui*I@;9o|6`9-_6znFqD zvR3&~;~(UD5%_AFV&DAF&*aZ74*Z*l)OZ^n(;BAmxc~f-@it{5uUq(E-|Sy6oY{l& zJdmNV>2-?Kg(7w7p;W2X-G44jekLyvl`3~FJ6l6!h@w%2q7p%*0J9qZ@2;#){LL%t zzLN6F2nYXMt$dL3D}B8RG|B&dWy-7lmwxuYTv^}qvz$|oH{l(E#-F>@U~^=7!2q0O zze-^{@?iP*RSNs!Y{ZCV#EmXjpbeE1S_)GU-F%aX$-Kt0m3UcdT%p|w3b@&~dY!MD;_tyj%ErLV8Z35g$pSu>?n!i7L^ZBS~QPmseWoXag|1 z{F&Z};*jCG=TzL#y*dWXEqeBLOtgkKh%t(fiLpe=qeA9|3Sk8JZsPU7|NeXM4pz0F zUfQi0F_&h>)O0Xa(|ozTcuM~*?>3^Cl}U$e0s2<$qB@7VH_fnEuQ`Vi$We%^*bLg- z+DRxYM6h%6{xNdzTqvLx8uEo2tFvkvQvE{x#l1THK<1BCZ=VHDL%h-`N)StHBKNh4X+ zucdYmk&n_EB3!VAw^VA(ux&#S($o6TbdQewF5E&kjP$sa(YN3)HB9NNZh}gPG-B>6=*xJ+`2UpjbVXbs3-vA;%0N*qRpcr4CTSAEpU(7p% zPq$#gQv9PtYe^Q$B@3zSDPD33;=|*xH7?x=`yQO%Wa9Ey}3= zbh}7nP;1jn-rlfGq?y9>QpDLBOKR}DNGix!C!7Z_%M-~aiB|ayd5hm(Uf{Z^0oKXT zF(X@!+#CDErE}nH`B>Rw;Xx?lCQ@|`@cFy~wj%S)_ip57UIpfhrUcBaoXb zaz%zegU|vu`HYZNVLXf`Ch`v7{3y%xg^YNzkO35d8UgI$qbVZa1q*-dEtwz<) zyBe0?7=eb_d#_q6-Xr}d22agow2*c<2M&E1>edpB_h4&gZ&CAQl?eA#T(my5%U|EL z07Vht4o83??gAifQIju|-h=naz^CB(nzmDA_MIwNWTDEI17>8)>@(<%moXs9Lp9|X zElUbkfoR&TwJf&d4g3t`%P6}YBBgYHGE63VWco6MMLV|1P_pP>r>=a`nx`-0(K1j< z4jp$@_Rr^5(3_gL9UYhXE!kxPd?0pW&E77v4b(uvHE#D{8>*O-4?baa_jE7|UbKD+ z1sC5Q&)*4%O>a`m?3Jo7eM@cHgH>s>?E2QI`xe&My)>nzWzgaQ#lN<+du-fdK(EOg z7jGJQby4QFUZc!!WoGB-W$91esA7I~P4L?FUW%339Y;s+FWP22a(KJE*PF(F?7O&F z(dVI$q54mqc7Hm5`_u2&)fO1#Rh(%F0m>A4DQJ`#eWL6tsB;nH!%>8SJt!0&lxZqX zSdGi}7S58UV-EBFh;z3pi2#mz#?_U99u{7z8PE0b)HL{`SKu8WYia^VfpGDExNwa7T^7SBU|~Tp$6&{4!Sy zwirfeo8xinY#Y8XQcV#~QEp4T<0*=sP@%Zfg2yuwW9!3oD$;&i?;F`jCXofF$(=jE z;I83&6y;y#z6>Rl3RXnjNN4Wi(O=%79`EoyCv^1a+}T(v>tikFNDIGhwlD_4Uqs^} zIg_obTn`qR+^*pm<*XD?f?a{+$FN{l+U4A^zCXd_oj?Zx?QSNJl_FdfbaIWgiHX>M z9c0b-=-PDz*q${trbvflBc7ZcIzh{W!rqYSW#oGySdra5&BuAjk<5{jK*2FBQI(z^im%V8tZ zsdJGe7nS-jMj~?M0cx7kW*tC#+zUE&>(K1%O7TAF_)*AZQ+~mcR}oy$2f(+P&Mo?&5X1YkqQ1XbR)g`d-6w0MiJW z5k>>rF^VHHdQEc82**~*9$zM1ByY9?jv5qL8>aW1Ws*I3-PB>rY@oTV?aYl?0(SDj8e#@A3X z2+&HU2T-2wjFp?nF(kGS>jnD}YD`M+*ob^JTH?!>FN->!?n_)M`jbA}t#zt?u%12R6k($ljiG#H?O$e-%A=Z|d9Av!4Gu^SmHr_@nZ zV0R>4d#v-LzG5%RP_Yb+h$N3^&r|K93?s=iRh%Dog2R_dDCG!7aByVaRIhQ=Vb&D* znH$&c6vh;%m1D5rkp~Y(VYC^aW+36+h?Y~ z0371QAd+diNr7uHO59h=F$v0N?$<~wHQ7;Y24x2cYE@gAHuMzIU*&AF?dcJS(nS#_ z6Iu|b0xt0=^*}MHT~#lup8gKRt^J_I`(fS=F>fRVoq!FHaMw1jJ*&bD247vIr$E*> zz=n@4f3Wh;(Sx~uiSP?|);R1S9QUWVV;J_z{rmUJTu+bo&9pYe5rJn|TwNqvV?C(R z!VWdwq0v;fkXV8jGUgtl)@Z-Anr=iXAfcqMgE;*g^@62DCa_EElQT`FF{2saNM^FCg)xk_Y>`#a&WU)k$&kd?rJ-B*9^ARg z4fMp4FDV2)i?@tE#c3{_atOYubA?h&07Y;k!P-I9w9#vU{5Ab<47e>bVzueW81`B;ht}dV}0zgKj1^V(&W6jLfBi z7lxCvT7=G`<3|Z{O__HMM(VD;Z#s6YGVQV{M0JcJOE$%>-MjhnT~e90LW4vJB#W|~ z8dxwbVV&x}{11HjUfdl)bGdBmxVbi@4s)ie?0&{VVO@;jwgI6omMLd-<2yCD!K+fH!Vl{?5^*3uGlHYw$J?;Re6E-W_NoZ z_W65cB163@ZnQK>vf1&(h~oSRdnP_a8WZdMck_{>MjiI8tuZq<7tOgC4gA^36V^~` zMvYdgze$^^zWy)TZkcva(Ydds|21RX)ZOyxsVg2ekiZ5+ZO>q<%rJRq-`OJF2FPV~ zmTyg0N)9OnV2Rnp>o*Twzo;&VW$o#ixX0_& zAWEdIR{r%TqZE|}kN-?Ytu8G!Qy>HvmGrk9xmbbQ`ym&~|B-MWdr z(@Fd2o)ZuF%b3)uQ>W@*p?tFlvGBJ%ijm^CdWnIkqrTik8B8MFQsWu0m!wh@X`WOF zl0XeBa*)cK_1s+K%XSeO{d{eW7wg!SiKIXu_4`t1p-kdz#X+L<<*elCCv_Bx>D#qZ zwFbt|%kP5JL>8MA69Dt&7n}5DY-=;rN1Yt6AvAx_>1&yl-#syL; ziS?++`+-hmZWGeHb?erV_zQbyQTHjoT`_RJw6`Kd#uPxN*@!RT`RQe@mxq(w0FU`U zHjU7dY{{Jr8_A#>s(QMWgL0A`O z8$3S>4JhMNV`QL1norTk6BqDvnaCl5jlF|z(?80L#Q5>?Ny`xuLG}T2#2UvEOG5%? z_;)DGGwX|y;lv0?<@r~bz`WoP|C@jQ4^o{)S%M&l`UPDqZXfp44smh9TN z)gEX6E}9%=CZpc~SsJDyQjif|p>j_?mbqIdhwwO=OmL63VCFK1$7{k45x$?~B+6$9 z`5RE7?pdSPe0kjN%o_EfT@@bwAl)t;9(9xpI6#^~nr6y_$U*CE*5i8DFz=GbLM>)6it-G!=$|EJyTG=0-n9TB|Wo!hgbxFkCx{ zLQGk->djo2AG1D~12GvGE658A*0!^v2NA-Z;3sRC{k=2j)C$>gB8KG~P^`)PDAjWg zVBmt-h+lrf{L_MSV08@G%BLHx*KM4HL*Eg}mCRsCZA6nHTGBFG54mRP8>sxQZM4#s z)Hd2k&W^K*Flok@X57i+g8F~hL?WE?Lo4JpX!CU$mqq6Vy(O5=ld!>2vJE{&PA=)&HJHJ@NNZeMsBSLVjOAjAX$mT91!8V$@t)eN zxR24Jp3B_$yLVu4@GSrK12Rt7YOmFZppr3xo4}=TI3`0)OlS_9ny#h9*QM6tI3jsq zBj}z?;^yWyHP!ztNJf)kVT zFl5{>ze@64CPxOHsoB~7=bxu*Pd#_%Lm~$1si3Nh)v!O$lw;$zK&(3?dFHCJC0lgr zsDt`u3_4}3IE^u4(C?f6z#s88dzZO)0JhWFDytAtOYEGQhbe- zLIHc6Ci7(96ue0)VYn2P3X!OE$=r?-Z+V6w}1dArwn zwV(X&1rHrJaKWG*YKqO`ekC$M!N{Z%g?>+Zm(goTTI!SDzeSKFv+r9kNiVg~`3`pM3f&2ZZ9JQ+Otv%Joc$b%n?%ERSV``HL z`F*^0_Ma0tbybDU)`|7jY$5|n-69jx65EMRjqiUyKE1=xno60{c)j8*2uG<*DZ02E z_&W107L-Vc^2kEDoM%{&i1_Ag#Hw1_3rJ9WEi)?4b0<)yFF30jhJc?QftzvRWfFT# zi=+2wO?=OOcKLXxwxW_qDgDd-!Ud+X>V%;N^>%>J52wY^Fok%rV$ZurR?ZLTIOyG; z_#gbbJP#;v$m%+DL@`YD*k^cT5?Bul|NYfw?TB>`G~CH$uEu+3sIHZ_gr_kLl%Vq! zao*K*`C}9_Setz5op+c?af15Nv?r(eI|<2vcsZ0qApTQi&Wy~H%Z#K!_3|gjCzn|> zdVrWU-n7MQVPIfIMT64o0#IKNogpYptw+_h&*ir!#Mip3t`*p%U}95lrpf80rGno}}27NQ32+NOI_$T#p0Ok4f10PiZ zMhYtoQ`wNb@mj9bDb79sb4*0{5iF;*z^$?r3Or@|p8x#rszX6dMW-U3e+N46^tkch znErsm9YmUngkN^DGh9eQ=F$i+e~=A#PIFbg@a4nKEkQvuIm41e z{Y^{CeZ#gKd>5JiRM#caWbY%eAF}#f_$m=Y6ESUgoDLC+%a`fNn0Q-X`rxM~O}1X1 zv4#I*K8KX<-c{%~8RA|N9kyl5UiN+om0N=Q@`&Sqs{7oDuhn%I}B$6Gph$oKk7%XJRIK-QhJ;5HdIU(R(Ui>B6HAsImk}bN?bBzE}`g?EM`H zwF;mM_`s`%g;o26f067+%6P(DI*;=OqxRN+we()yb^s#;qDMaFH57(S+~CHJ%^atG zf2o1lHtoZ3qDZ1kysxiNS>#e1`p83f#=L3L`xI>%-APxY zo$P-+lifY`4_SnZZUkA>1OPFB@dyX~Qa4Vj@&{+Q&*@?PWnC2k^ADi&2q2@hm-Pl0 zve_-D7-{7|!h%1i-biwZ7oWur0_nW0pgx}WNgeB{WoH<2TO1(h#KnbZp%}}W{~4i- zwSZu&^Qn@Ov zLVxa?JLd~@por0@W_|UzyLF{EoT~}TubJsuI^ji>i?LlF^_k`3@?hcW6<|>M_f7mw z9&GCn;8$xiY0@@JRF!g4`by7vJ|( zP#Nvy7C%^gVY$~--}?^`_{d9G!1J=&0gRoRiVK8r6TrzVaBB~b5AI=0oPy}&z?zRx znI$slA@%duKF4KrievSAn|3mM0G$Hd_iAon?|Wxh832TiFj)N!8Y{wo-lrOILwX5u zE#S<1(Sgz$u?^$Uer9g;$ir@<7hQ9K<_WQ_WE#lhR>gL#7x~HskvC*?M?RH$M?_s% zg&uLYn>q-q0VY=R@+QJbB1e_|fU0Rfb6I*f72wK@ z%<({V6FS2MWR|`CSa3Nq=Yu`E*L-q|IEI-q2c{Qu!V2&qc1G~m0OrOApcs}$JZ}j%;l4xR!h_L z(&_~r%I(cFSxVb#nVv-;`a3lgGHh9_oik2 z=%-d>H8(t5rg!0_#P(V|CBVA`mUBrF-e^CINL()DZK;hDh zJG=~!4~;LZYfqP@gw>KBDDaBBcAQH`g(H4#Qc8<$3)LCG&>{An%jglEnA~gA^%Ahf z3}B0P-yj*}#=SrvXl!ytT@*EWK}F@MiwDU!%^WN=Tw}xB_v%HBPZsNf_qHt zHf`fHN)s_5K6AdtyYB*Eh+=FOxgF(+?y_V-z!-LRNH|LMC$lk_$u3xNPkH$t|Dywb zW}gN|4^VVA>dVd^y?c+Nj!=s8(1D5BHR$E(S3ik*E?u2#?*Z$pR2_@W2@F9s3j`y} zBV>QV%r>^%lb(N*2`ocnGMhj8rUlTORs8tzj2TDn33Ly*EghCQ3trk;66bE{@CA1`bZq|i*S1tfQUZ=2%#_YF<_E%$$gI7DR&whUBLL3zo@`IIldIo@lMPIs;4 zT(|Lp9+lmeUBfyw`15A^#Z7XFsq1ttR0Zc0u#vPU7O9-q(c$`0 z2i2gy)Am@+n{D*@%?NQTmD(M!8HNG z5eQ;oX*?+^x6D=R_sU&82d_^*K2foG`}*ACDgLSvcSPiXvL^z>TGS6{?smvr4^Y~h zbsdWjgFsQp&A)qkQG_(SG`5oVgF4)c!XM`jsl4H#rO=0rqdn4w{90A_ zNY(bKrW}(Qp}Xf+#)^{~hBUZU%%wGFFy)tz6!?sxje*V*8xWbkLRo){2?MY}bG|_m zZ~m1%yiKpIg2@-{C)l9YYOpckp9vozm!?v52q6TV^Dm;So+%xyNF;dj`;bV;b-cie zDf`wfA=)?)+Ya1Qe7>11kqOIayI2!yq`FHtgh{V`pO%zL*xU|^&k>kMDD-($nPsjz z`Q*RWaI19~rx4Q2mOQE=BPlMkmnt^^FHaK83uLl+$6v#lt-+u2u5gQVL$s{leId|G zH3no4KP{srh_-)$W&Q5o7+^~xlFV`p@GN(QuOccnDBhITR{$*O<`DPE=nG!r`DL!W zKHVACwHrPWk@c{>Owh`9G`7HN86L@wscP(INo57sPU;`Dk6bW?p zUqp?cAG7&SVkD`vf-hgnjSvf3>K1nSbft=*xSvqcGzltj3BZ(M9VNq5!vAm_Qf$Pd zPC_gaNF<`O1jL?!x(}`4E#=i~DY*LPB4-sXBGP#24cV)QSlzS)Vet89m(u0nj!}Yp zRM0d8BOoW z5!S32dyx(CFl3Z{ilxaTp&L+ZxpA(;e@a0@m2$CeD84?z%Zu5JxKtFEl*sMrh42z3 zkiJ3tni&kDVkmcmEc%23heA{=-s|*YS44s_=jOgOqy-TUFqdG;tMd@o%<$0uoW-d8 zamujWh&&*$a@pkv*%5Vete;VHt~?|dGD1oz1bAHHhKUtYIMHRUNB^@DfemzbmE}L77kB_G}tqoB)dHm z`H!4Qi;DHM49$sLmZokp4rAoPI(~dO$F8XOAqi00G6ECK%Q9+CQO-s{Jv5Ipeu_vD z2&L5aGMh&dzM>44TJ`zn^{C8(*-gR;vO`3QOkp$t>RF$l{GVB0DSuSz(^`nq3Y2af zeniZ=CM}h*FHCLiQV}!|*t7;V)!0TTl>vzOL91OBn=pPD|h-`cP7;vzThmxsu}=nPyjSc4_KEmRS?vRCik*UDVim~hy)2=_!Ct0a?| zt&Vm$W2Gz^*sfZS^yeu1Q``T9?3EFhuG!MF~$>XP^3KA)>@4DQq^K43EdNeQ8YA7DD1D7 zxmLXrNys-*fN#+YgHLyzM^aXBA{IS9Y z8r&@uWJpxSM4?`k*3z@G4s4*s>a@enMLV21H*PLoFFW*Rt(Qy=$YO{ySR!X$(aOAl zQaz4RUFI~!>ryQA;QXXBR4%YPq7J_VDkDU=h-Mh!1#omdt9|A~K0!o;c4(gDBodN> z@bzCW9wY1Ze*vAmpqi9(o6x@F1<@6%5}qs2$5-VR1Lm@7#F#_^nxt@5RafPwlDt&9 z<7k2hRxXID9OGhG`}sWuf(5H_PAH(fI4nymj21wKN5ndVdw)xho38Lh1Gzqwfx`)i z;r4?4YjD7s^u~ON9Li1WhjxOe$p-tHzr~ISS3$DC-ege~DD>s#9|kg#GE+{55{WGZ znD{<6@c0b9FO@Q#ns{Z%-lOGIxg(stUjZ?Eeaz6tbASkg87)HF ztii9n;nrKFsMu$7rcUbxcdC=D@!SC<`F4806|1^aUK z+O^(Uo20iEqGb9HWOy=q#6Q&}M{6T*^xdQ8{54;LLJA-u`I^@Kfj*f0z?&P3{o%7OV4{v9#3T&MkpP06P_nGttjf#MnLA0o&X9)ku|s$Ge0r%b zC8eM}gxA+Arh)s56Yf->s#*M-!#skV_d@>M{?iq?PoJ6cE8F}Z)#E7Q?j*qCavsaQ z4@ROrr8ww4?YsjV6ZV*A#Lji}=rr%K&E;zw^0m{XeuW=~h#e&m2PGv~V~xjI(Y}(@ z#XTIYSTn&FsJpfOq`WqMK#Aqir*6kd{U`%L#G|=Pi|92iN?az$DYF|g@qqBe^F#h@ znX%{0svVnU(kQ(Hvq>Vnp-7Q4M?|H|aI$a@WOeu5!eD~BeA{xItSR3?#s#~H5c1XT z%cpOiu=qu+YySm1Y#+#Q*gPSSMEnE@(`i+?rQ`_iqqOYhg|#)4X-1@Op_-ZJVa+>* zq@~P=aY(%UE+Vi~@KXE033UQ5McyE>=UVn+>HQ@e#rad(Ul6Qrnj&rf#q#KS-R)N2 zoxV=FxSyLMmg4arMSxC-lo3sZMVSs3-%@F5P(z{;meB;4G=5|J=x;_QKfOuo_gC*W zSC?His(knz&%1A)7w&$6xpU)!p94Tk`%j4*4AIVyMGjR^&2tscB^dJF0A_;nR;?Jw zcSsIEC4SGECQ-9wZNz0D{u?NO%Bj8YJYWoJ4@J_vf@72tW)mjl0r_FEGfKJ@kCh)N zYAW!A6i+(wgW#8(5B914uf2HN&iZ{K8!j~W^>0)7JYpXxk$BfbYs*NxKpzA%3*r*u z@%@rF;aK>Cz;ds@RB!lDfk_y(oH@*d-}|iuWl_|e5FPs2vr()Um(i>+#jC~$O-{Q( z-$1PAf(M-bUTTg}Z7!=O_hv2jAl1nn5-Vm&Z*wyiaaJr>_;+W3jJC5XkIAYGgo)9RmP>hp zi-4_)gqd;nnx=@{n8N4pHV^%u-ay{TgY#kJzyIfJn12N|T42zYEl$c2+s?j(<$L13 zt|7BS-ISxp@0cx+clw_%TK?jH{LJLucF~het%y{0mH%^Kp4OI(hT z&?aKtkUuVyH3j1!W{UjAqhq*jH7I@sf{MFSw`*ArpOq1GlY~jo7_^)7z4NL^6&J}W zSef>U>XssA-4X$5SY#wufS6yBbvEIgF z+pW}rJ139V=+;e+@^DGxFOmzx!2rkZ84^0fzdn^2p{~8e4*vZw_rm|Q<;dn|9HdotNi?Bk-aAt- z02P8RWs`d~O-b|OCa59)JpWr^+vMcgjrqKL^kCDw)1n?h68HijEO0*wMd~2NiR1IA z++w5E@#kh2D)q5Vnp}-L4)SR%E?hsTdxuj{*-@zkX~-!PgmIbM;CBs{%)RH_^v;(5jphjR^{OF*q>Ac%oULPkXKOz>rGOkJv&m40(QxE$Xo_TB zl7zLuYg(HPnt7#k#2HMPh$jvnsZ&SGTfA#V8RW5_fKn}I1WU=tZ9`IG33tS-a*o4x z%fgK!I%5;Y=l%D2bnt{Mi3;hYnB}w7I&;%+or1j;T?DRwb`=|7#+0 zo-|jX95?esUY5C$ud#XdKl-w#zP0C$D<0niPgNAhLYJV>$}W?@yRt+iTAFndEk$v^ zf8YICnSf57_V#ykrySMWmwd6fo=fCf$LW*ihWuv77aAvf8oVN_kaP zZ5Dn9bu2T}sHAxX=-W;9p{pE zrZ-`*BV;u;(UssihyejML`5itAy894-e)3%b4pibn94j)!c-2~MoNDvkf8=d#}B3e<`PXNPMOqL9n?s? zUTK$vuaRTZ!0PXw?+$p1Be__Ko#NbKMo=oZ6>dW1Zck??E?a%3oj*!HFEvrM@5}pM z);7y(YTrKl?T?3+zy5g0dz9rZ;|6_aPQ78-VZav~`=_=K^m@f!Ioxfu`^mM(`wh6T z@TkkKnAC3lN+gN>O%0wq6R8`SB_|r`8cpgd;PwCi>KGt7>}Q^*to&<-`;y3 z&3#w)zN#!~+Ou0n;vV=IeTua^<=TQTsL`+AR)Cya$j9+=G=^YHaho*Yc5b`bqt76{ z8@a!p&WlD-xpNixB<+cf7-J~-tHQ+7(=)DmLa5&55azzWR3dv^3n8%u4R7sykjk|H zHjFab&iYib`p-W*2>#m3JC7*^=l93XX>s`Dd()A_tl2>yidbgt#KDBrPd_}pvbwrG zc<#}K0hDbC7YATxHJ^ihvbB2jkm^9DCc1K3uPelaE_MLU;N-zIufX=5@f-P2MB3|s z&$Y>%IfuWT6&}bcKj{0>Q8#3KCdXh7kLMknaT1}tP&M#eeEzrn|gP3cU{A06b zNspE=mow7A!N#CVSc9eyz1{Op4H(uhwM*_oRur0dS2Q7CsHpB*VjqR;N$|^H@ef{8 z#6X9r!G`V`ysRf_JCZXUQPkg{4T3?M@@N-$lJ&0;2m>GzE~P}24Sh|JkyF1}l4elw zKQ?Kyq;d+K>-<_y*&H!_dgpFi4_{oqy-)DV%vuic`dLkF9A9Ei-Z3?vdhzF~leHgr z8?D*_HwJ|B=Si>$Ew%mMaHxp6nEH1hkzS`(x9lM^7f{;R~_*ORSSB6RIsbcAQr`A7_{EzyJOX zt!pg92Vg2zvu?X>x6IlxU;~|#jOuRdJ8eAI$Z}{(t-9~fp+k3_7e@200!m2ip!GF1 zH!s2~EN-YXup)Obe$|{`gIbpagVFvnbZD47!E7Va@;L^mXi3A^W8iixaREqAPk-3< zLgkv2a~o6d-u!iP_wDQWm$RU!|EME-Av}3*cmejcu(lpKetdIif+3&Zq%ikvo!|WD zwr$f;a@syhlzWH76pu>1<*yu?rc7r>qjmMz-GhVS*n;7DAm@v9o}pq!4fZhW7)QFH za}7xbvH=|Vo|?&pP|t!61oXI{6B4vQ8+y3=*lw*@Y)-6%)~RJ+3(Sx;+<7gPw^>;f zpx-lT>dcuMn3;^-Iq=%l)!n*xU&3lqAP*Y>7R=;v2h`s65k@>t`uL!T69t7TT@4z^20D&^vF$RckB}w>5Zu1jFDMF*;qeM(|REV$p z>3?uQh(Y7lxPx0gDT9Gn?A zaor}K|Kmff@y`qEy@}pAMt=hPz0WIDtou;<>KLSZRS;5TXU7`6`&3wazPXjnG*8dL zFdX~B!xezeoqQ^tz#Mm}mCl~ObeBY({Z5un+K)AO5K$*LMNBr#{eh(GLK}R2qvaFZ zypN08@EKdCL>!jS;@=`SmOif=Ir368JGt(M2?s9PDt|We-j2r3bwB(6^@pLm)r|M| zVIF4__|ojOpY?jR`d^OLb~t?_zeU~WUp}PMCP4?p5;Sa=+K78WOv%P} zmHoNyyKa=Ev;REQ{NEmM++c%^%3rQCc&{HiwyOEvtop-}8zd*p?{a^L`*}_IkS<;3 zk6RN{_gAL}v`(%2+2h;RsvDF)Oux3{yUKeH2N_MizNFo^8&T{ss@|I9Uyk(Iyy{qa zuXBs{T(xl0u6w0^>9Ax)qSeaZyq68TS7BEBL#d8)@W0+H+IC6qvv>8+Z z9k{bu%AvX1$6uq#9I(rz?y1Z-wu$|_&!8zy`%F@0Gcm1p6KBn0)NjNSg`5rveHyY?hw6Mjj8;O+Q$5j!e}dT&nxWr-|K(7 z%gfRVXX-tfoIR;=$g#l#7si<8yPa`xYI@>p+>bs_uXwIJ+dOX9n7S)H_V|!ajr#N) zo3yA!k7ngO+_z?tsc9oF1*P<_WosL^f+K!1qK;D5nc9_kd ze=N3Z?wXDde?8H_wqeI(*G>COQT&vT9Q?%$a=P)00j-uyWf$=Z)6nw?g!%s=4NXPW9X1Gl5!?pYWE13HXH zN#t$TY!(84?)r^PUqthV zg9v$?nR+Aq#w-thth*yqV1Tu z^ZPXFJ|S?5_3A4#XK<*Iw(W`J-th*~^tEV_w{`pW(c~V$+^2}@p(*n7x4Z~ox({_J zW$qbQRg)h#Pb+zFpBpLT&m9dtgHm1kO(=iByC59LQw(vL-)J{1&~wkh`cjbG4r zWsofMPdI%?_PoBan=)X{cVQGl9ye-TvcWjyFPouU~V*y~F6(SlrGBvE)6I9hLX!g*6%dPLh{C_N<;c z@4I2$EM^pbj>hF#jf*I$vtebh4l8-Eufc)`%i6Z-+xOt=Wj3P*cJRG(ez)V$&&CwL zcM=w;GpOoTj<5c~*LUh< zOK(Rbmwv~asTyw&?~Gu01%j7dYNmD1?-FQ>Vg+)%UAy-Cbf8uJ;=JbK3R+`ryOXQC zO`UqFdB-smTVD=-r@QknH64Yoy1JOUI6hRqdjEJ04GqN&jCQ(rKU{cBJF?-r__ho- zy(uWH0To$sa*DqFr|QAo9SyVZ&3Kf5NK3&C$oNHzVz##WOA^YM5iY6?X?Jf3b7RP-FE0`Z)KD{&B*%_|q`o^xxht|w? z?p*PhXV7U*ScE7QENZsxRd_jl1}#;*DcEDE>-D+prt{&|jaJlLH~1|q)uQg=2YO=- zpjcXV=jIjD_G_szzI#}2Ar{}bzl`rNZCdrIxleMYS6I%p`1w)2dL50tL)d47z9!NB z76?lf-#2Xd;9VSng-ZJGxp6Itxu_3kENIfaxeHhMp$KLsyZp%HN|)KQ-*ZS<3l){s z$B*}A9ILygW@JYEy?YLTIAbj=er9562y%1;$~L{WM#S$F697e~LXM>)7QS{*a7uh) ze)eDswZWSMx2DKJVz;L$zs1~9L=Od6*xATZd?<9Ou(4;Gz^9*C_^3WJ%bQka zRCFISD8J@lSlF~+cZ!^DT3YLvV`;eI@40~~YYG~w2Gc8p z=gd5_XnBHL+UF!MyYt?InzYeQMtzsRrS2B~cKGncJ2PS|tgJ4=@HJ}QT;|gWbJ6zC zIDMpry7~l~<5j70_@hlcUYyDl5*)nd!iAvShYY ztKG)A=I_7Kd)ghxs)2Jax!2S%MgKyxK>55MXU{+Ta-gu8HE%ch-hdBhra23wGHTf? zc594%^oNTHiSEqjhK%h7(ld(PgPK~6Fv48hTjl`X%=N2D>)R6vWoc*d`d?$>%)Wlj&+MHF4lSb zKI_cv%Z;brON_IBHY8?I*J<7#9V63@X%GKegXQeo(bIpTl@)52A1G{K<&Z_aIsM}0 z$mRDI{Xiw62&d(Rs=QOc(EML0s}a6@sE-~p6kKZ1ywbaIy)a98L?;lRfHd+X9B0pd zHo+fVf;UB^(T>-9zHnB+@^SVbuj!9$*dXTZ-akY1T`l6SuiS6Gz5ULlfqpGh4sCI> zNpqjn%Ws>NvKkl@tyLJ1=)L^KP8$o0l9#s~_IC;VXwL$M+RQ21i3Q30m~p#`^>XW7v0`8xVdEc%Na{N2Y2e$>U==^x5O#`=Qn+&@@#8el9{O=Z zerEbcwa~jsXIJT$bsso?=DdUBKLjKnGyFe2U5h`IX&4=1qsgjV24&V(QcIX3Lc>oK zxwVp*7?LrYOD@$$#k48qvZO>BYHiV#Vn{@)!MYTZFwu;1OL9+9j6K7)-ybmV_j~94 zp65L0JyV`3p||3Do9|>G5a{P^zBGr4UjaR$K~fH`v&$eC z<^_K!1+{_#nv&w6`VH0BRfEu*fgXSP@3_SrdcYNiTfNLGfyy-hp38)`>6JdV!OQ0Q zyIT&I+Z%?RD;#{p&Z5%^CJ*Qc`OA`e=V$_ARF-q!X7Jn4o277Qb~;zC>{0@0|NGzAvK`6^Vp_Z0Es& zhCjl0l{OTuid#VBkSgF>zpSdp%Xx^e7tkc7BP*LV{{D&Zj#fxajPIvMNJh`dWM~;5 zJ&pV@yWn#DjAOf)T-{daq>y*~kkynJ3H();hzk}FhAHg+t{!&d%gIlzlsb9&j(zKb zGag)|KY5~mB*ABw!lbLDBtFY5|8|#*go@hODVr4EV;c(!uWQ_IbcBh(NU>wu9O`UJ z0*g6XLGrkVCIu+z20t2(J5O$DdTf8d%#47_|80Awjo$6I%SUL}b?9C7($ZQ=>rU=p zOY;=x8;73F*Oc|zb-LxkQ%?J-UwnKbRSYV*-d=rY7VG77zbh-(ec<92$MdhOufOX& zG?!8b`{1AR4sz8!&|pm=v>g0B?TBce!RG{WcU$NSbaQ5U^O>$=e}=HRAA>+W=Xc&6OI8$Fqgk7Syn| zPF{p23r|xNJmTVzfjFTfUT`}Zz_!+j<}nI`rH_j&>P5QQ$+CGr4A(Yn?^X9Be7;P5 zKE^g!?_ISBd{@^;!`Va7Xa+OA7ht)dvuiD5nW9jwi+2h{23oA3U}M75i4k616k3Gb(cXT?ffg{A*sqF*%6zsJS?M|H+f z&^dO}!EPNA0#JI|Y`U^gF+#S(bp&Bz{4UE5*XrlxitZy9j-ny|0;yDoaH>0itQdO= z1h=C%Cs<9hcBAyt<4x^uc|>A#Ow95JQG(jJY9(Y7;?`ckR7{9jk0=M0EnT%*o#E}R ziy?F(3kY$lIJLC+&Abkb6PoWiT_|V{dmQC89WD3RVXue;0T)ODL1_UniDuht5UPL* zs^TTO)nN7af-+M=4Km#x6yPDddTABH z@eXfJ?#K5pjAYst-LbX)d8ScaG$Rm^{ePSv_sX{$TCXm&|6RRt;|%!5MPzavv^dsQ zR%&f_d~@hV?99!@QKh0~DH=*NM<*w50&9NMyvY{hdT%9$@qRdxHlRz#HZxOeDdofr zWST#Aws;g-TE@9QOn!Q93F@q(u{z`Q@7UA@zXv`EHzF0HveBob?2q(#qp&0vW(@Y? zMLI*Qr31sK4+Wg|(-j`-Adq5XQ{kx)GgtBk7efO#f?|{n`ggd|M&|`^>R}r1lFUj% zt{KyF^-lSUpjUAeGdi7&8X#@c(PY7wJ}w5oHq%~5bqJJ|r@nk10I`Oe_tu*mv#d|K z`vluIt6$qDC&46#I{f7e6KRj|Ou#w42?&=PJE8$La5gj+26|>m*OqJcOdr8Gc`F5xuIdN7+bDu=JBkMcV<$O$_>Kcyc9Z&YoReT z6L_slO;dH4gLyec4qzgns}sR@{3!(F-;9U|i4FVX3Vyw6B;BXg8yj1#t+jHxedD%m zHe&C291YyvF+pG3+iT1o_IG-NJC#z}@)$(ekW$g;+l`Z1kY1aKhLw}(l}mxNUsvRl kwq$P09{O!RH8L~bvHqA;d>ADXcYp+IOM8nPbI%k10-rKqT>t<8 literal 0 HcmV?d00001 diff --git a/pep-3147.txt b/pep-3147.txt new file mode 100644 index 000000000..6ff642d32 --- /dev/null +++ b/pep-3147.txt @@ -0,0 +1,379 @@ +PEP: 3147 +Title: PYC Repository Directories +Version: $Revision$ +Last-Modified: $Date$ +Author: Barry Warsaw +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 2009-12-16 +Python-Version: 3.2 +Post-History: + + +Abstract +======== + +This PEP describes an extension to Python's import mechanism which +improves sharing of Python source code files among multiple installed +different versions of the Python interpreter. It does this by +allowing many different byte compilation files (.pyc files) to be +co-located with the Python source file (.py file). The extension +described here can also be used to support different Python +compilation caches, such as JIT output that may be produced by an +Unladen Swallow [1]_ enabled C Python. + + +Rationale +========= + +Linux distributions such as Ubuntu [2]_ and Debian [3]_ provide more +than one Python version at the same time to their users. For example, +Ubuntu 9.10 Karmic Koala can install Python 2.5, 2.6, and 3.1, with +Python 2.6 being the default. + +In order to ease the burden on operating system packagers for these +distributions, the distribution packages do not contain Python version +numbers [4]_; they are shared across all Python versions installed on +the system. Putting Python version numbers in the packages would be a +maintenance nightmare, since all the packages - *and their +dependencies* - would have to be updated every time a new Python +release was added or removed from the distribution. Because of the +sheer number of packages available, this amount of work is infeasible. + +For pure Python modules, sharing is possible because upstream +maintainers typically support multiple versions of Python in a source +compatible way. In practice though, it is well known that pyc files +are not compatible across Python major releases. A reading of +import.c [5]_ in the Python source code proves that within recent +memory, every new CPython major release has bumped the pyc magic +number. + +Even C extensions can be source compatible across multiple versions of +Python. Compiled extension modules are usually not compatible though, +and PEP 384 [6]_ has been proposed to address this by defining a +stable ABI for extension modules. + +Because the distributions cannot share pyc files, elaborate mechanisms +have been developed to put the resulting pyc files in non-shared +locations while the source code is still shared. Examples include the +symlink-based Debian regimes python-support [7]_ and python-central +[8]_. These approaches make for much more complicated, fragile, +inscrutable, and fragmented policies for delivering Python +applications to a wide range of users. Arguably more users get Python +from their operating system vendor than from upstream tarballs. Thus, +solving this pyc sharing problem for CPython is a high priority for +such vendors. + +This PEP proposes a solution to this problem. + + +Proposal +======== + +Python's import machinery is extended to search for byte code cache +files in a directory co-located with the source file, but with an +extension 'pyr'. The pyr directory contains individual files with the +cached byte compilation of the source code, identical to current pyc +and pyo files. The files inside the pyr directory retain their file +extensions, but the base name is replaced by the hexlified [10]_ magic +number of the Python version the byte code is compatible with. + +The file extension pyr was chosen because 'r' is a mnemonic for +'repository', and there appears to be no prior uses of the extension +[9]_. + +For example, a module `foo` with source code in `foo.py` and byte +compiled with Python 2.5, Python 2.6, Python 2.6 `-O`, Python 2.6 +`-U`, and Python 3.1 would have the following file system layout:: + + foo.py + foo.pyr/ + f2b30a0d.pyc # Python 2.5 + f2d10a0d.pyc # Python 2.6 + f2d10a0d.pyo # Python 2.6 -O + f2d20a0d.pyc # Python 2.6 -U + 0c4f0a0d.pyc # Python 3.1 + + +Python behavior +=============== + +When Python searches for a module to import (say `foo`), it may find +one of several situations. As per current Python rules, the term +"matching pyc" means that the magic number matches the current +interpreter's magic number, and the source file is not newer than the +`pyc` file. + +When Python finds a `foo.py` file for which no `foo.pyc` file or +`foo.pyr` directory exists, Python will by default load the `foo.py` +file and write a `foo.pyc` file next to the source file. This is +unchanged from current behavior. + +When the Python executable is given a `-R` flag, or the environment +variable `$PYTHONPYR` is set, then Python will create a `foo.pyr` +directory and write a `pyc` file to that directory with the hexlified +magic number as the base name. + +If during import, Python finds an existing `pyc` file but no `pyr` +directory, and the `$PYTHONPYR` environment variable is not set, then +the `pyc` file is loaded as normal and no `pyr` directory is created. + +If during import, Python finds a `pyr` directory with a matching `pyc` +file, *regardless of whether `$PYTHONPYR` is set or not*, then +`foo.pyr/.pyc` is loaded and import completes successfully. +Thus a matching `pyc` file inside a `pyr` directory always takes +precedence over a sibling `pyc` file. + +If during import, Python finds a `pyr` directory that does not contain +a matching `pyc` file, and no sibling `foo.pyc` file exists, Python +will load the source file and write a sibling `foo.pyc` file, unless +the `-R` flag is given in which case a `foo.pyr/.pyc` file will +be written. + +Here is a flowchart illustrating the rules. + +.. image:: pep-3147-1.png + :scale: 75 + + +Effects on non-conforming Python versions +========================================= + +Python implementations which don't know anything about `pyr` +directories will ignore them. This means that they will read and +write `pyc` files as usual. A conforming implementation will still +prefer any existing `foo.pyr/.pyc` file over an existing +sibling `pyc` file. + +The one possible conflicting state is where a sibling `pyc` file +exists, but its magic number does not match. + +In the default case, when Python finds a `pyc` file with a +non-matching magic number, it simply overwrites the `pyc` file with +the new byte code and magic number. In the absence of the `-R` flag, +this remains unchanged. When the `-R` flag was given, the +non-matching sibling `pyc` file is ignored - it is neither removed nor +overwritten - and a `foo.pyr/.pyc` file is written instead. + + +Implementation strategy +======================= + +This feature is targeted for Python 3.2, solving the problem for those +and all future versions. It may be back-ported to Python 2.7. +Vendors are free to backport the changes to earlier distributions as +they see fit. + + +Alternatives +============ + +PEP 304 +------- + +There is some overlap between the goals of this PEP and PEP 304 [12]_, +which has been withdrawn. However PEP 304 would allow a user to +create a shadow file system hierarchy in which to store `pyc` files. +This concept of a shadow hierarchy for `pyc` files could be used to +satisfy the aims of this PEP. Although the PEP 304 does not indicate +why it was withdrawn, shadow directories have a number of problems. +The location of the shadow `pyc` files would not be easily discovered +and would depend on the proper and consistent use of the +`$PYTHONBYTECODE` environment variable both by the system and by end +users. There are also global implications, meaning that while the +system might want to shadow `pyc` files, users might not want to, but +the PEP defines only an all-or-nothing approach. + +As an example of the problem, a common (though fragile) Python idiom +for locating data files is to do something like this:: + + from os import dirname, join + import foo.bar + data_file = join(dirname(foo.bar.__file__), 'my.dat') + +This would be problematic since `foo.bar.__file__` will give the +location of the `pyc` file in the shadow directory, and it may not be +possible to find the `my.dat` file relative to the source directory +from there. + +On the other hand, PEP 999 keeps all byte code artifacts co-located +with the source file. Some adjustment will have to be made for the +fact that the `pyc` file lives in a subdirectory. For example, in +current Python, when you import a module, its `__file__` attribute +points to its `pyc` file. A package's `__file__` points to the `pyc` +file for its `__init__.py`. E.g.:: + + >>> import foo + >>> foo.__file__ + 'foo.pyc' + # baz is a package + >>> import baz + >>> baz.__file__ + 'baz/__init__.pyc' + +The implementation of PEP 999 would have to ensure that the same +directory level is returned from `__file__` as it does without the +`pyr` directory, so that the common idiom above continues to work:: + + >>> import foo + >>> foo.__file__ + 'foo.pyr' + # baz is a package + >>> import baz + >>> baz.__file__ + 'baz/__init__.pyr' + +Note that some existing Python code only checks for `.py` and `.pyc` +file extensions (and possibly `.pyo`). These would have to be +extended to also check for `.pyr` extensions. + + +Fat byte compilation files +-------------------------- + +An earlier version of this PEP described "fat" Python byte code files. +These files would contain the equivalent of multiple `pyc` files in a +single `pyf` file, with a lookup table keyed off the appropriate magic +number. This was an extensible file format so that the first 5 +parallel Python implementations could be supported fairly efficiently, +but with extension lookup tables available to scale `pyf` byte code +objects as large as necessary. + +The fat byte compilation files were fairly complex, so the current +simplification of using directories was suggested. + + +Multiple file extensions +------------------------ + +The PEP author also considered an approach where multiple thin byte +compiled files lived in the same place, but used different file +extensions to designate the Python version. E.g. foo.pyc25, +foo.pyc26, foo.pyc31 etc. This was rejected because of the clutter +involved in writing so many different files. The multiple extension +approach makes it more difficult (and an ongoing task) to update any +tools that are dependent on the file extension. + + +Open questions +============== + +* Are there any concurrency issues added by this PEP, above those that + already exist? For example, what if two Python processes attempt to + write the same `.pyc` file? Is that any different than two + Python processes trying to write to the same `foo.pyc` file? + Current thinking is that there isn't since the exclusive open + mechanism currently used, will still be used to open `pyc` files + inside a `pyr` directory. + +* How do the imp [13]_ and importlib [14]_ modules need to be updated + to conform to the `pyr` directories? + +* What about `py` source files that are compatible with most but not + all installed Python versions. We might need a way to say "this py + file should be hidden from Python versions X.Y or earlier". There + are three options: + + - Use file system tricks to only share py files that are actually + sharable in all installed Python versions (e.g. different search + directories for Python X.Y and Python X.Z). + - Introduce Python syntax that is legal before __future__ imports + and is evaluated to determine if the py file is compatible, + raising an `ImportError('no module named foo')` if not. + - Add an optional metadata file co-located with the py file that + declares which Python versions it is compatible with. + + How does this requirement interact with PEP 382 namespace packages [15]_? + +* Are there any opportunities for also sharing extension modules + (.so/.dll files) in a `pyr` directory? + +* Would a moratorium on byte code changes, similar to the language + moratorium described in PEP 3003 [16]_ be a better approach to + pursue, and would that solve the problem for vendors? At the time + of this writing, PEP 3003 is silent on the issue. + + +Reference implementation +======================== + +TBD + + +References +========== + +.. [1] PEP 3146 + +.. [2] Ubuntu: + +.. [3] Debian: + +.. [4] Debian Python Policy: + http://www.debian.org/doc/packaging-manuals/python-policy/ + +.. [5] import.c: + http://svn.python.org/view/python/branches/py3k/Python/import.c?view=markup + +.. [6] PEP 384 + +.. [7] python-support: + http://wiki.debian.org/DebianPythonFAQ#Whatispython-support.3F + +.. [8] python-central: + http://wiki.debian.org/DebianPythonFAQ#Whatispython-central.3F + +.. [9] http://www.filesuffix.com/?m=search&e=pyr&submit=Search + +.. [10] binascii.hexlify(): + http://www.python.org/doc/current/library/binascii.html#binascii.hexlify + +.. [11] The marshal module: + http://www.python.org/doc/current/library/marshal.html + +.. [12] PEP 304: + +.. [13] imp: http://www.python.org/doc/current/library/imp.html + +.. [14] importlib: http://docs.python.org/3.1/library/importlib.html + +.. [15] PEP 382 + +.. [16] PEP 3003 + + +ACKNOWLEDGMENTS +=============== + +Barry Warsaw's original idea was for fat Python byte code files. +Martin von Loewis reviewed an early draft of the PEP and suggested the +simplification to store traditional `pyc` and `pyo` files in a +directory. Many other people reviewed early versions of this PEP and +provided useful feedback including: + +* David Malcolm +* Josselin Mouette +* Matthias Klose +* Michael Hudson +* Michael Vogt +* Piotr Ożarowski +* Scott Kitterman +* Toshio Kuratomi + + +Copyright +========= + +This document has been placed in the public domain. + + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: