From 269860c571fa270ac5a2a25f52f0b24fa52d7ba1 Mon Sep 17 00:00:00 2001 From: Peng Guanwen Date: Mon, 29 Jan 2024 18:46:41 +0800 Subject: [PATCH] Do not parse special spaces to Space Token (#3267) --- crates/typst-syntax/src/lexer.rs | 13 +++++++++++-- tests/ref/text/space.png | Bin 8097 -> 12663 bytes tests/typ/layout/par-justify-cjk.typ | 2 +- tests/typ/meta/numbering.typ | 2 +- tests/typ/text/space.typ | 11 +++++++++++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/crates/typst-syntax/src/lexer.rs b/crates/typst-syntax/src/lexer.rs index 4800c8def..a9ffb216a 100644 --- a/crates/typst-syntax/src/lexer.rs +++ b/crates/typst-syntax/src/lexer.rs @@ -90,7 +90,7 @@ impl Lexer<'_> { self.error = None; let start = self.s.cursor(); match self.s.eat() { - Some(c) if c.is_whitespace() => self.whitespace(start, c), + Some(c) if is_space(c, self.mode) => self.whitespace(start, c), Some('/') if self.s.eat_if('/') => self.line_comment(), Some('/') if self.s.eat_if('*') => self.block_comment(), Some('*') if self.s.eat_if('/') => { @@ -108,7 +108,7 @@ impl Lexer<'_> { } fn whitespace(&mut self, start: usize, c: char) -> SyntaxKind { - let more = self.s.eat_while(char::is_whitespace); + let more = self.s.eat_while(|c| is_space(c, self.mode)); let newlines = match c { ' ' if more.is_empty() => 0, _ => count_newlines(self.s.from(start)), @@ -628,6 +628,15 @@ fn keyword(ident: &str) -> Option { }) } +/// Whether a character will become a Space token in Typst +#[inline] +fn is_space(character: char, mode: LexMode) -> bool { + match mode { + LexMode::Markup => matches!(character, ' ' | '\t') || is_newline(character), + _ => character.is_whitespace(), + } +} + /// Whether a character is interpreted as a newline by Typst. #[inline] pub fn is_newline(character: char) -> bool { diff --git a/tests/ref/text/space.png b/tests/ref/text/space.png index d2b9a5aab1b961630dcbbb183e496ab0c16d5f2c..bae0e0a83357706ea5347e85f3d028f7c5c6573c 100644 GIT binary patch literal 12663 zcmZ{L1yEeg()MAo#lkKQ!AWok1oy?=H4vNxcY+fZSb|F+xLa@w5}aiTA%qZ|;2MHk zaQ}0^_kREVuAQ3d>6)6VnbXtr^wWLnL}_U#65vwd0sugutR$xc0B9HhfI$uZGXNMY zwnYE{ucWe^w4U$m?t-D4{^a%Hk-*NQ5QsmXI-0#sm=^>S8p%j6UmQuoHWm{dO`;6X zheG7Hbc!)#4wRBBSjS{x#+wWXFb>1sqsy+2Yza17i(kQ~S(ddM0k61QR`_i9ayDl8 zu343n9{sIdb-%I138e@Bw}!gMwQM(k3Yd2ty=-`S;C;*eSq_2aKm$-~PwKWz=TA5v zL*l)kOrZf|G}Ul7iBWMxZZQ6k9~~fWf>utOM->4v&Fb|xBSRF$2gk~SGto-SKSDCI z?*lCR2-4pq8Zclfh}5(}z9vv^AFKy|=0`O3v0z|${Yd6Z=*`e+?Zub%wGP}|V>cX- zqt|=IhsRLmBnnHEOpSt+Y-fe@EIR_+J8v_42a%i-xZGTmsD`lUQzi@Q!4*C1_;hNCj=7${Q?M5|)y*jnDqg6o)4o zuP1Ai50<6I(JW?{EoHIK=$iPyJwg-@o6ldcUK()-Kmb}qSx38T&Rqd2z-LI>w{~6t z@E7X++8_c$waaT}h1RK5qrtzZ7+vyX)A#&%(g#6Yy{H#GcmsoH+F;4Vt~u9vD7I9X z38Al~Qyr=yPO>k*!GsG$C5S`PygHy@oCn>uOz*ygLBV?N*?wd)jYV+`U`IX0=eIeV zZ+P?%_%T8rTyX%eX~HV?6s>`&>%b^B@YcAe!2RpJi7Bbo?PaaKbdomKI`4)(iZI}Q zFORf??Lnm}L#1H^C!vU&s)GFt%fEVn%vAFYf57+qgKKQ+I>|dXyyelPw{)-D_&o5Q>_h1R`*aHxg1$xA$R~=-Ps6Zpi=J}o=c;z;L5*!jBQaKAxVE|t) z{jOb$3<_O7O}(!aA*?qGa-fpgd-v&(idPeY`~Hz)<3c~900bUc%c4O|XZy{4Iyv2) zTEldMP@fL2IQO-}-TpH@3=0I=_>zJF$WFe%mzfrQLL9=tP650r=TM+0slr_jbQYQz z2(OHI(Q*C^9Q+XO77*qAZN4k$8D2t5I@hAZcXc4r;Xs00eE;{?=%713!1A&M9+iNX zeMmF+851Mc95ESkAhmt8g<_>Fd6D;TSIMCCe0T1n7-l$AqcizvqTph2u99G zT%R9ESoLPxfz{IPDt5IPOr>0H*_69|TA(}Od-?4C(`6hzdmz2^rB#y-X2_)2 zw&mD{x;J{`eHo;kUrPW6T*Lu$kR2dA`U2#2>$)=|W)$&Cq8&kw-tt=;l)`hM)XH!pX9Ke{wND2h;VaT>PdR?DCc*f##NQgv z!}pkk^TpNg~-zcNzd5Q}y~=;<9c>#n4I2Qyhb%^%FP1 zF73(4zS!rwHlcyd!Ylkr)gUTzHH>NAkKe#qOwVhA<4PH+sgEno@DEp*x(S`*wESL` z(}>eBc)hghc?0`o%kS4e1;*SiiywwvSPJx>uu%j>H4`|$rVgDj)KsJhisX@qEY2M% zN*aQ0)})D(7W{bZD`0-JO2g9_xd0_HAMk_tATXEd2xCrf2;uIz-U_Vx1d*)If8rW! zOt`^=TxGfF3t%gB@basWAn5-37jkT;@h9eelg9cish_G#6g(dHzp}8)HKI4Ve_?{K zKXsh2<00QPE}9YtBo8ZB4BIV-sPt3mDol#L=RwXWd78cBuA~N7xvu}$)_+<2kNmQ@ zcioa==Zdh$#KT5|Jg>KlqD3~Hxt_Y3wc3&xBv+DgY1NF2)xMdf2yvdZ76W`dUC>`2 z=b+CAb&fDs(fX2Uz}FoLi-4>o0%>nOPhO80C6;Olf33*P8ZmH&* ztT%hm^x}tNbWFv5r80hf)<2x+iLGTJJ;BMlDJuR;Wk zB4vljKz?VIcIAyE9iO~>yLdoSI+guj<09}V)^)tiU@+gNDm07VdGlOj zjdlac9%MFn7MI1{%!}%t#D0&A!cDpVyj@Xx?wr)_e;YE{@`h0Pq4tk1Fx$E)$nCy_ z=)9i&2-i(hs7Jr>2Q%{7P#1Xo#2qlI^0z)+NVYFD9Bc484X0J}v^f$mL zwRL_j5@aT9yMwpJq$pdpT{-v+`peG=wN1V!agrSe)u=c#dZpcM$?)!(WKqKs^y#d& zzR2vt2QJjJNl4}SBn~Iy!{F7nq>ZyJpZ=9pJ7cjgX-`F0{E!DVmgwChlUuzyQ>a}b zAsQ^O%fLq3SF6f^s-_0bO`4#Y3&oqD033F%xnaquTV!0}7~Y-(^ZJ9%F-ZL3eH>%~ z3a?&e@E8QEyh%e_&QdrJ>C?B`i$N}ml12>ePFnF96dbUh-Wm8B)&5oh1bsVCX0lh* z8S8mLoX3|JM3kn4-G{Ch&hVmp0JfbHl!Zc0f%AUih}&MVE_BaLJG8B!Fs$M!ViI}C zjSO`+s;0SnPKL%xXrLd=l4*+m0l6(rh0f=abc9smb>_ooe6FW7!kcSdNX=X9pqstu zyD+R1b?ldc;$`>lCQK)_P=6;wm(x9S)vw*d>lF?j{E+Us>xT4eYyEXF{2KkYvvQLF z%JD5s;uZFHf$*-cROOZT=v(VCrD!~&V5c}YP<}P21spc14wMC9T^Kl{D{+uJqr#6& zG2vn|#kSaRt_2>7kY+P&SUb7`lapQ#WGkW^yaDLM7>4H45y(;$)_`D5c7UWIcG(@0 z2T?z@rW9R@?q+sAeGGlWP-P$mxV;ysp}M}fcLvK4li~q5C4o#K@0#b_o3tiTV1!in zKtWqA2yUGcqXy2{HSySR(xu@W z_p8_x@>sde_wgXNmmTa~ua|tn+ln(HATuKY!a%WIuth_rBdrWfDPTztICR2%6o4=I zpy!!{U&?GM=1QBHH8tw%+ebgQ{*bcqyCS_c2vuIVOY52`xKC`t^Jhkm6BR1z1B+%3 z?o{{7Kw?@R zZzH0lL-01RHF8M~PlxA8z;LQp9l0~#BQoxF2G4Esht3w`zvP-R2{bQ=q7 z9HFPP64nr+Xn8cR^Y~Y?U|sb%X`>NZIG01nLsZZtiUOls9VjMoiq_9uQ-|+uE6PHw zn9G=ePXZG$x~5oJ`aO7CK89&qDK21{ZbHe;4kF?E*B|#ynE{>})pJ78ZYkec-v7u; zmKSm6+x+={|C(eif_x5`XEsp|Q!OXDy-srtnx#OzWA~?W;WF$=oGAN*t_w-Uobq=&=jjv0eP2g0p>eW_%NgLT4M^c z;8k{{=My!3Q@Hx2qGd4RL2btv4~Fo)!H{v&XJhQ*-H}g%0*;rLKD**4PplQUZu15t zR}!Y)hSu?E2&#TCBmTFz`d5HW{GUWAskoFmSa5LnA7JyZj5+jBN^W{T4Ii22+A&i# z({9=wg9g7i8p`@%FXEvX4FwZShyuce6{T+V(&ckNz+h}3n0&ipNew1E+i8RiDETyk zP^WUsEt&u@An;lctzd&r)^lEWvMs|Z^|Gux?VggN{Olp3uK5B1hwuA) z{Bjr8W%r?2i@jp*;FUaaPpPzFgjBRa3%dld|8I)rIndx0%?n2F!dm`7n-S%v9|Z25 zNB|N^tb7nzlH_RlHLld3DhvSy-w0VJ^a7-Ik-C!m z!^upCC%9rvRMiowYA}o9lQPpySVKenXFXY%A1ex&Fpxx zxQf>~g^!3gWfrf|Ll?q$Z9vyxq{$0f@vkR=KRJ;XLOiTMD{ah!g3SrAml3(kZy@EO zr~rS0nzK0yhMF(#K$+h6s7kp7utl3S-TdKDFl2d!{vlJ9uX=D0ZA*7!$9^Ln{1!b$ z@$ik`0!IyY%Un#mF_y{4U&;5nnn~b>X?iW^0c{Y>8B}a_@ zp^lci19_hFU3(uF=uvfwI@Ba=T9u-|%*%B6CIHk7kF+*F7v^uZff(hSaERPaM}<4f z);*Tdf+1USV4tROLe@6Wd29ob2zTq()70`W*|NH~M4ZezV#hvc{(rvyZ_4GR-rwsn zNqL$nGk?#e{%zWy@s;4%Ll`7|FS*?9yjtcm=K5o`nBZql#7TvNWQMwS!-~hi8+!!? zr`rx4-KQo620#z{H&%oJd6)NdrXqb!2-%h@GsANyg_hja_>po_W`K)(u4RDzf41fM`wK?#fGxedrkrQ_b@FVajnJr1*ss4(BOG>W#rK}Q~xMTV4Nbsxz9&l3$HM8=h^HAM6q2K{UUwgJbO>+Zxr=C7{kO4n20 zWup*DiqH{;Zl6=g@{NgKP;?w-%N%=mf@WoW&Y~GdQRD7^gW|s|@>k_5>E|uZQ?Y*o z;lJav_%OKK@S7}!0Y@%pPQ{w(Ogz}cMBh0XrZ67upcqeW7Ea}gm7m+M{^1>!!Jjb9 zx7R9rQR8qI_}cS}S?qaSS)uBeq+Ys6r`nGo@eYl%?HBUCwtJotuuz`@y?NtwVp?I@ zsWt|;r8RK&3M>A5_0l184wn7{uw(c(WxLIJ$-YD z$N?g*Dpm#!#eKjp999?IH0fn9*W$JEvF0l_a`2YhZ*-eAzAv$3(K6w0@t0-NqI25S zEZ&qY9ml!_DwU3syFVz~-CSt*VbQPkx!(nM@3;b@>!9!cYM{@4W*FP+^Mv0OL=Mm% zP8j>fLsNfrWL)@_@7!F6^j{utoL3AFFMWlTiCce;)x^d3cuD_l(gfb*&#P6-j~w1U zJWg=qTVif0u|+}%moqa}6ynpmE(+zo4rD}P@ygh*bt)G4qVa%e>W|M~m-!DLzs)lc70o&kaoERnk*@dxp1aCHcg z=ej@myxm~c(tQ{*T}QR3>$5C1IoZk}@epO%Kgd!K8H>J{aGEGvPxN#Fi|Ln*E32L6 zZ-6ZwQl7WQ2%QY(717A?AOEhtMECl(r|V9}uV3=Rnn0`dm`nnfvm)L0Yf0gy2YC+q zTwtYMxsJ?6=Z9LmMREC$BOkQ(Wn5*P9`9*KfDdwq_ee4V(>UdO8nVnKaF-J|@aLmF zL4#nrm+RPHD8pnjRloGNvEB|_nc+XQ17GenuNo! zWAS-gPuQPIGz12$bj$cA9T6Y`eHO$~u$9cfWAKY=7Hfq#rof@tv-X(J&~0>`&&+G! zhl<5;yetJf6XU(}v^Mr}Z~%MO#-JIcKE3WcbM0&3`l$pr?vGOcb z%96A|aA?mt`Q%9N!=M9yG!G;mq44N-H{h}&IFW5A2n42w1OHzfZiIGy_+8Y+C&a?V zq$X*;nj8P>7Z)9W5Own>)hi-%J1T}J(n%gdVfim!?|}K<-uCG>L#^<<-v`9>Qb+8c zv^?m->EtHHDDkzGRx)Mi1<%xXKaw~$tBZk@#~fYkn^r27XEnr(jFaFCF0|2QSgCmC z{bTjNX*ZoUswMrk-ilmIv82wOeDh{atnL%ssOz6W<4F_HITvzE!&O4%qJ`AyFz zV>^BuGKOXQ^#iR{KLVMzEEp(zO$cHxSC(F_)|9_Ed@(~_t5V4JdD2Tw@y3|^{>mQ$ z2s8fO*EasJAXgmfvKHRncP~}K{&^FBSp<1pF8Am8bX@L){pXzi=dk`ote8V+ZPddO zckFo+Mog28ENE9O3@=xQKSMuzPHfdsD3-NyR?ohCXvw{othYrY80RLmmAz!X`aMfw z`gOBk*Xct}CWLNLlHQs>KGQ|TV`bNQ-gYpPyKMJNdsZSV3W!~MQnV=@t<)=rhy&vm zJR)M>tP`tDA(hvD;}uDyTK7Ol%gTI$3%5;9COj8~dql6IBu68Y1lA@Dv3zTf@r>%V z&9CkSKl5MH17SSF_bu(>JW|sk8NK+@C6~$C@+}>oD+6(2pMN`7$zqD;;o%t(!cr?) zauY39wO`PLghCMX7z|)(u*~1o!(hbwS-w}LjQQ2k5W3+n$c*4`=Djr}Zfld%JL(PQ@XwMN=lTi*ZKz(1>-E0Zd0CGT`p2y3UB z!v1Ne|7T*I9>j$?sVkV!qJ#0R+Ab}o-Px_pswi-+yL7ONy{YtGQXCIC;5+st0BuBf zpJh!EttCeK$6C>){SZ_h*f|&NolN6*Uipes3rf`o39^9Kuj;vM-a)^H(ZAK`)rf`Ktcd! zhLeT4B&-ix^!p%fW<>ULp;&`dT3!pPhe5j1O&@!K5h_a`JA{YP4olC3g1tkQFBu@z zpp}oR^s&B}puARHZf2B|cFo(k%W^1e^62Sl^Ul4ZQy- z{|(b~do=!MDtB0lz7r5mL|^1&48Sdq?o&pKGzuiHbH3z<8^jR~D}$Cb#L#V$Fp)7@ zES%qfWkYEOdTnet;jEBbgD`-n&jynaK))cm#2DEk11V@DO)JoOYPxYhJ;}m2q@Re< zcnV5amLjluO9}h<>!A}TQ=(K7p`Ml)ki0MO@|hETFguQ2u?euNoe+i?@lLOQRL+`9 z`O;BH+t<>sIaRbRF7`x6nX#{cHza&rxz+L6aeHz>W1mr5jC?*@M)+>>1Njeanv>AR z`rXY%h+xo@$pjT4Ky-&v*EXEf^V zCUmEzw~(T33nt|S6xR0aCgF~3POVaOecbr^j+Dci%~X*km&ba7#toKi-ANgth~>?X z53X$af=^Egra^fI;~fo4AH1k36!J3Yt`~@zFYUtgMKoH}$xN2*crBIKT7Uga>ibFT z*S~a=t@_haM@340@k;YGY=DsC@kYm&fJt-vQ;EMj#s72&sl9nyExjL0$Rj>-C~slC zg>qF7m9>!eXc@1OwV_ial{$Z>MVvNCyOpdSiFHr3m9#EKz>{f+bYD#*YiK?R8w$05 zJ`kK{iVVFnVq6Ja-2J}TD%P-+(Qv-F6vM>y1^g5h5L;&#xqzh23HH)JTFgPj+Iz4) zbP&_sBx^+jXiZWCJxKGwS3(h75jW;&hH^gm`%&^g>%j6{XunhXkg69yzku1-W+~JL zNb{JOZVFl~M~*x_o+C2J3DxS|SWLGTMV`o%kD9Y3E0LEAC!?pyR_J#@@Xw-qMR-9% zYV8(0bF5^rZt-??TYuUH|=&%u!DCUGeHOpQ_-liz!A(=7AzWhNY-S z7hw=XlciupcCRv{#GF&+~*H;khj z-salL10>_VxlE_no|7gq`QIDDehRnfzuN1ZwQGGyezSP3Yal6Rmz{SyzJk}Ufp{DI_c?NdQ_&xx3>fr02YXw6 zndpX+T`HN&aujA)%o(5hj$-2;>wKxQAppoClWi<*_;TYQy>3ztQE_ z-+n3#=eCA8tYDSZK2rFl3rDez1A*>d4gAu)lbNWXF~N zsK$WS#-l+=^}{kNmUP0@LqR8q?8FsV77K)bgR_hncmX#G*kM?x>_dB`Kyl@$qL)E6 z?7G(?)N(Q)l<=oU+J$%hhMy4L`I$^c(l7RyDzm?D@Q(0-hnpQ5A7CRA>siA2#^ zb$Kv{spje7t@Y6w30|5b-ok|yj1hBWI6z)INb4n;{Ts~?q}gc~dv5!YU!(W>!v~tt zHw5_HH1~pxyOo65ow+1pDr{7WnM3Po-mVkX`o!cZ1u5!7IY4ZAxW<^hy39%g@<$e2 z_vJaSuy%_N=viI+%-sz53>}b(bpeeu(Aa;)l&Qc9jG34Q!7O;st=OvWsOkHhuI3^~ zTxkJ!reGY{@PhF0mr9t`!5cR5J_#Qp|Clbc3nwwymcZr$$D!CW5%(f5DOBp7hud5MY?ln6em!BYHo^;Kb?aAyMujHqsl=Y;KDYN4m7oo@33GnGWAJfwDRRl=i=7k}p?WuC!;GKH z+xPAJMw8(kWU>hDePpz75Mr9hJoxSir}0KztmqX}g3w3?{%ej>?L8D zi+;Y45iH&(!p|krgfcENzca?Qd;I*>C^to-yv&vxW6pqT@QLkrIDLRk|H?ozfWX+f z5Y z?Xr-1Jk2N}vb$Qko@La@=c2Gt5oU22B#_h%^oOJc9B zjZBVv9x3?ZQHr(LvQgNcS>hBx~@H2*oG0-T6K?l0VlkK!3ALHt1GH$!B*JT_A&ts+BGKV@aokf2EqJ z#4pUGRX;R+wKKX}31-tm>c+434gY}V8$%`x>U&K^t#aS;90QdQ0*G+rxIm|>Dh3-3VsEFBT?zPGBtI^+&ptVXeqO^YO%GNwm(CT~#jz|-6YAJ2=0_nd@m z`gujzG=A3j!VO)GCORh`7VzeLax`S&?qWM*;&mCumuoka@vUCKPMs#hl<~O>YQFRN zvPgFJm&{uENMXg=@^=Xli!1;|TU2hsXy%V6?Q+7i46R*nFgJWtBe0+8{5Tq0V42?m z=2@Zm77YiP1jroOU;@`PQ^xt47CWMgll4=PVFhx_Ib*ol5ZdP!f?3Sbg;|28a)7~2a9JS$9n0_=tep3lJa+3R5~)!L)8`Z1I#S_S0h1v28#wBC|2cyEq!;q?bf?H_N$yT`y6mQNn>@1Y7i z9^~Kk*xX^$_Na>dsUACPtd-Uh^wNL&!iq@qEz6!uQPlo6CrYbfQ}2OSc2DV6Vl||I zIe5`CX$rqmeX$Wi6H>n6*X6n48xF3>edtn1T6F>H&jKD%p9*Ki=H|I?+#lMoHT#fk zb?EqotkZgYX2q`l@2ueq*yD-M-z%y6>)d%XHW-xB3W?DF)~%2-`En_4eBxXzov4nV zqEkZ%=#IO2u~q8;@2xgz z!o!|kYBD*!dkdU7cjXQ^+M8aX$3tqS3r`K_N~tC^3j4szPNOg~J>~GA7etZVix?D( zDn%8%2|q^5zhP6ayd9(CI?%8ov2I55&U_=iW0sixgJ#wc@aG@|e|?3KO0ND$wR}c6 zG)xTOW&{_8GYQ2#hbyGkT|Yq@`+ad$P=>Hh6}%c8iU%T&^DoCOU+};#o{Mep?RnBo zw|#k>)Q(3MK*>nm>@$rm=R!$FB)af0ho_%G*9X$^YvY~PhI>DtGnJ4YfCE45^NyDW zSl)A=1O!8|TG0+Wl>oJ?di@!EFYZtcHdQ+_NF-!!)L38R$iZnWkF|13=snpti0iW~= zZ(*h%8HA(Sk@wMhd7|#m)!jE}tZU+@Uh z!gD#(D3cAvyb`UE|Mc!6VJKJpp|rE^fw*VhAHT`sFt`Hy^l{2mo+cFg3DiM-&{|mh zJH{)~32;AwMz$T^gR%SU4~egp*!j^eY$!gx{)H+0+&agD@Xmm{Xsse>gQaRDgJ;-w zofjZu{Q*nJxu zM1m|L5DhaZ&_5Tdt1S&to}8o}CdW8S2@MTBOI2fNjm4YxW*oxr!$#^n14VVqO8AW3 zl(dA!=$uLN-%?PMnCpnLeq63g4>MCWKm0=4=U@MDqPktC)2dvY^%*Vd+t+a9YEdki zAaV@hLmKkpaYa1sc$GDYs1Wf;o3`KB#QPPPN`H;&4lUYt?|OfQ>oNB*)zHOnUmV=$H~;cn5`J|JH_Yy@43{CF+Kj%eqvZeOxfZYfKg|*dvw%>iHz%hlGw7tnCNEZgAe%ln)R(`% zbAD{ByIeW2cSFN4r|_W3;;U@0|2 zaC^x@z)AD;B(3%4ULIeMDu1J1!bE=ASf5t}-?yXR%NK*vbaScoQbz#p*dLD#2+ubR z1p#v;6>sb z!_Iy^i}=1^H4aqpYaaM;WXabNGuQ?B<;GG8p;K*)yA5q}#+DQ6<>D(IBSK%e=FgRG zJ}1_g1#>B-4KY3Pl5zZ{f@Jq0^1c*UuD+;Kqz?TlzUEu3hMg_nvX3}jO_NnDP*Ghy zt8GDhlK+v zd-5zLFZzR|qWg1Sd}7YBh|BQYurm_{dv+;lYxU+HoJWl6#DZ*EZpb!CLHTK-b21p_dzv#5t!%DtA_TinyE zEW%t5q^&vforPLT)P7~!(+mHKz9MJBK;6ROL4D{TkQa7s<^fu)3Fu==-WI(cZ1O3O zBBgt8X|;CXFK`oFi5IC}1&4(o*&9WqKq!Cl$J4|9xYJ9@kUF zI*?VktUrPxUk7ijk^BXDCDObK#M6Y~qOoJ391{Ljq>nEl( z&D*a*hQ@E%WS*yRA>SEM|1Lop7tLi8T`#{i!iQHVJi&)%6F{xTnAC_yDVcm9_wv;9 zaiN&{-eP{WZ-k1IC^lBCKe+c{e3Z(02Pp0Brih@*6p&3SZY;yno1@S&F`_B*I4q^@ zd5#SJ9uzIJdwOyVCu|~A z-U(aro9^!#<`diX250E8$GW#)V`~Qm(V0zGl22646hZ|%sLkl{+7tF&af!}(_vx}m z(;w}fPi@e}@KUH3?z4=N{BZ}PZg&L^q(GUb-^UG>9`nWZPdU#uJB#2hOZjBs!m(9T z!_gmAD>I^Zw_>**thByh>Uk(3bPwHL+1i43`88~O7CX8R+w4SguJ>LkR>;GDz?_# z;*lM=_GV+6J#b(^rdqt6k?`N>v>^x6BbC7aXW5yDORpP{17?$-JExArhl|D4RKIs! zx%EZY$tDc>D8{HmrEbM>1?ou0?*}}V)09L0xcM}uD$it|P3iR^tgzd1hrysa})pLgJDQp={Y`L(-Eng-}6WJ z=(!l->@7n>Lk2Uo76iyDQF~~|qzRxT(vqvD>0s3f-!Ufw{QK4(QYB7mz@gmfyqdQd zdRaNreE@_^*JDoT(UiwvFObM!zI#J9t%!k%G7Iia*d4|a`%f3W#USv_na zv6CG9RQC}z7P-E}@pN+OI$-;@+H%;B5D`X+ou?sO1Z1!A6uNy&EEE88&?6{S2(nDd z)3=2b4{y>_6e4yTKiKruKPQdab68vD`CsOH}fy|jGJe)a< zJlgH{a0oIU#ViPJQ5S0;9+TcE5shfN4IRrC zQXBE_EFKL(e$(1lq*OC@hI0`7r5tHc z#RmPvtoEnhbicq-l)e8-Aq;SYOw7h9Ol4jtfX}8z3uBsnYA*=6gWb_I9 z!5$qye}?a+L=CeET7b|QLI7->0Fe(uFIh~00Ar%(p+gm90Jk-;W6cKmdl6_HTda4w z28Ke!_&K<~(c)#Y&=%Xs^Fi9WO_`BsvgeLtfv=Bklq$aC#?6x{036evU*N=d<}2dE zH%MG33-d(Ef_Q-@)5bjM$K5<E_!}2y@ruq&_Eoq|$pgVjv%vi4RME?^53%EnG+yOank2 z8BE>e0zCC?K4tVdbh&y}ndq@NHA&o9`*AToS5Bxj*(kwr?Gi&Fl6ry^;GI+D;Kd%( zS6x9>TrmYBAF}>yk74WlE=Kab9xDw`X`9~26ao-c)ePm9uyiuuxqQg+Zp4Fpu8h}x zbvQZ>cZ_Vw*t9Ef&3Zmd((0TP@OYd+#o~GA7}NT;aL-R*=344OwQYYd{**YV3t51j zKZ&fuc&^jVFsGywXiR>$dfZ)V>46-3=1UfZv@z$Wb#T1(MfnfH z`E|8zBbAA%&>fNL%p{zzk~{h#dXM&ce@H@#uzOnaiBTnZzGX0NBiJ@8YyG(_fY7%P z%^gkv5XIq=hqFCmHP(5v+XhZf6u|wht3AoZt|b|FJgy2jZcJ+N#F6N-0cYdaZyWn} zuYPg1CcCIiqL8FC5xblajsoqf+IX}=@>h*Hc^3vebfHlH>NVEI#}n`T1=_|s6?Zd% z9mD2!jhE^b6fWMR?iyf>nOUPOqCGL!a^4fD-<;XCi&8hUm8%j3ZWy7-(A1 zg)dTV0@8jz=YgC^SuQJK6_w*rzquB`-8 zumVgdLs{U3&xUi^(aZbn_~?9)k_JFngM9>4JZmw$(I%kslNI1QlD&o1lHSOOX_ci7lhA`Y0-&# zTaCdg#?BV{f7|68$ex76+cie-U6D048(OI+B@eAyTBQN~$o*{WLs@GtvKTtweU}4|y3#s<3WAZeew6 zcV1-?EL}LkL3r6S_@vv>FNK3kdRF=%2X@hS>dt8^gEN2l>ZPYce?Wn+I!|&J0SF=z zty`%>ID0I*ZZZN8J(m7%xMGcTt{HS{9lNviBt2b7UxIa_|wRO{op$ z4|c>6BfdRqX1zGAFM3jjWs>Uvkm57e@4vpPGMF4SR8k4MUY;wnHkyZzFgn-6Iu$xE z`>Rn#AM^J+%3DcN);o`Y(0AnfU##QmE8UyIs5oo*tTigXiovTtZOF4ddiW9M_}N6o z<{CXT#aV%b%N!YPTYX>buHhd$jS-a=xx`vV!>()Qwusff_KMKE?l?801@vT; z&8tK?FF%ZX#pUVaf}li zfpkFK9aAs9wq52J5E=tNcl)6hCkV*SI0-O-7+@c>K0Sud=X%QS;diNDCHBm8y`)zS z@;4z3$II4*Jy~koqL~MpGf(Ibca$wjf!PM3+dWy9Co<}b#_Iu+c*QGJi;6EqeEJf7 zn@(f#?#0pBvkFC@fW zNUC)S5Q6MK9UNb(`wP<{XaY$(4vBbsO`lB86Y*PEXp^}{h0)EiaRRnrd<20lud&U= z*mY)f>Lvk@^syUaXM3g;Tqp)FY9Z5><$kAJ=0hW2g|Q2;pLEqdxY|tMN{`P+<29rY2AUJFo!2aQJ9MR>7kdlCUA| zU=b%}u3i&>M@6s5W~#LaM-zWR-zIFsC{~Vd6#Th1E2P_#uODh}-Ct_YVJYi>q*?bg z?)gh`mOIuJVb}`CkT_NYTxd4{1xEODJtDtnQoC`-2NH zF=KIo{ELr(*eanVC;^hZ+9ca;)Q{Mpq|0-H`K zPUsmd<@|_LX;_!|VCq$eWZ#kIY(7H0n1i~lh)w`+0HnD~NqS|rQplro7vVUc)dzGi z(>&nU{X_eHkGezXpn)xV%c)=21~Xw^K{b?XmMZ<=H!}Y-EP4^;45VY4A@LX&4N~9QR&~*Q9-B z`+NgTc*hx7aLlkGgg)D+C$ekwb{TMR4WvT~ZhhUQja%TrysXKqUHxTU<_SW)+H_Hd zh@HRouCC13e)?|jYxHhz$wB+ey$UB9egfq*G2fE4VBk5-)97_FlV_8*RU92eVG*wC9k#9YkwdOVM>a=94R(!DwzPiy`EI zz;D~2#y2I1!Zv%=PWq+B_t#a=OoO~zWey|}9#{FmZKWvxGK)O7HR}W_t;kr2qYh&T zxqo?Kt^BJ@U_kUE&#Nui3Q1V}@LSfS6sr;18?k!$1C^bR8OF`W81CtSr9QaL)XHR^ z)rvy2f0LXL8An^eOqTTidyggySW%3%Jc(;$i)^_jv5GoLiI6Y^R^|gGv%^}qs5zZzH ztD`vFJHI_yxVNJ3EWg;5V*;0cr6Qo+RwhXGH{tkqQ-t*2c-g}4J*o5epX|>D?-vvD z)s+zk5W~Ua$G#V~dsv;qjI}lFbp8CSF%O)>+aWUV8*jC+GW?_Zb-)8PHEX$Gmx_I| zayI`LuLnk3eFXre$EWUUN{k`x6W6r0_A#KO^&q?jj1%^ehes>`X3F%)bRSc$%Wt4i z73*i)iXu<~TT@B|*~AQOT)4|xu!AaMBfxuG26Oy0Y2}GGlE&QYCnx&RLdzjT%$ZkN=ASqJ zL6wn!eVzRxZE%c}yD|=Z!K&V~pEM|Q?HxFA%|lHVKfZroA*bphc%w!0 z@5T6EX>YSptCQ7QOVGE`JIq`W=h~^WoL2mlJ@a`c>-yE!%*+X?D&HTgqSqBAaf!qL z$tR+@(r&qtc$+)Y@UZk_)l4TQc3=T!gTL^4AL$8bx>V^dg1z*k#f3+mi}h8G@fa;M zf^Ih8=&!Lr=bO(6WDV#RL5lcttJ#GvJo-s76;tf_KE$T#-HlWGWI+1S4drGw)-2Fh za_^Mky;6D0H)#X?!0J!!OU`zsW~P_Q4l&M`Wi6TdMyRm7XwN~;zJkNy=HK6?BY4_d zV8>^3ouEy;m>M{W<}*?DA83HSlm&Ngte{ zis}vVhXBH-NE_{?9aRj(%c``3Pv@3I__f$rPigC_(~0t>)$Ye zifo?7tr)1BgdjJy(n&Ku@u4>59mP+Ig5L94)p5OJ>2epxy|}XBe=_UJ7G@-)&a9J1 zn1b>anWMT9`UIADeHhPDoiAYP&DvV3A2QXXvLCBzP3sGiww5dSemtzWwbj_8rn%vi z7Z{;0>W9BWGgBm5;Wt2pct0(h90mE{_x^Uh-rdV=M#7vzsYK$V<^w*RoXFtlr{d-O;3@XlR}-v$Ra-s3eEk)P7#$0KelQFAml(P2 zO0q{y%5-w6PIq*4l`S?3giw3pQ8cV+^#^RGEm0Ln$FRzH-V^%B?|^r91TU;tdlFob zNM${7DNgGrg|{KpM~y~5VP1x?wl_ZjMDJNKKe+se!>5t2LzT#;MQ z5r~hrzF`CS4pv0$(Zt+tq!r{=(<^4b&QshqNaZYP^U_}57dF=X47@ zk~&L?&a{|&OCEidzUu%AY#)|8Kdd1DMleD;x|ql~M#vTLSGIo$0{+a;Arzru|G{>) zk{9t`QZj$cH1c7D!GWqAa*9nrUS7PYy0Vm-DzM8F#P}M&ib^<4J`NAa_|{u6 znjM}d)d0?48M|UvlNnLpzRKUJv%KcKFCZ^&xD)#s2?nH#pOkbh%}u9QIke* zB;79E62Y5GdWJMrR!XtXE=upxm$qR-eQ=UgRdP6;PYxpoaaW*=zz-%NN+XLaBd0d9 ze&@?Sh<<|j?y_1fgb)E`x=!pkjOiBSjm$;aUZny;wHE6Ku9?Oc&WP3pY->7umIVZ7 z#X-_j1I(hiY&PV!jRIb;CGufhvze0ihIm>*uD5CU^jKRnc=bx7JrY7d0GAHXffXXI zFj2gWJcb=}K12=+02*dKn^!E5pJKm6kTJ`*hgUv1#Lc&$>1RVw$`w{E!RJjD;#!j6 zyGNqH;!{50T>-Eo)M$N9mDnFbWWBSG7L*6{r^Qt} zk5t(-*w--YBqqnsC-(;ngt1h_5U+DIIWHK7?kWp;NrFda%2&ZO{&s5Sw+xTjp-EG3 z?mwW~Y5Q`}E>%XE!;KV(cx9H+u;)v_y2QT0;hN>Ah>h89HS$q^Fme@mc{e4vlfFn> z+yuy~TDjfA*~p|YBV?+&ga5Ho>V~Faksen2 zdU??X)`O#!8gaqZOT`=+cBuUP?hlk@>R^}YH)-a6eib6Dq}(tTGuR{GS^DeRIf6YW zUCLgXYt?V|-9bkvpP1x0YrAa1zV**9`6rStql(XhefqF)`o#|}1hJFPKplrRo{6tIdI>Hi4e;XUbdtTaNwUEs7E|v)(#ZNCFi{7~x z|2innH)ZZuoO|#7yqSaG6XsXe%4DU#2E+fFWc@wox;U?z^9N4(hGzeki~Vy``7t#6Vcd8<{v+nM>BGF0#Y86Z_Dc+$ZubF3mbmbn%9}KKMZiKMz4V z5oZWBj5!H(q_!VX2d*sMPa90g{K;H?gMndDPt(k-J1e*H7hmK*urU(*%)=q`FpTY^ z>V=!Qk;a}}nztRQ`S!~?urPA~Jw943oNS4+?(T~Amn5M!PSu@ctRRn;8Ir^IO*325 zqzas|^)1+rgp3P$?urMc{Wz{~@J_!|UQfCdn*;*#voooWDvphQO3kZdE_@fvQG5mg zkzopN4jo8z^PT_O=KP1@#@PR$x23`GE9oSEUf93Y7Zt-jMo?*xhDwz-uG!tHUC33t zGYXqr!B#3U*dlD6UmCviBxn89o-65N55a12B2pdv@qiM%vm}62|Gvz?%*_07=FUAN zV>&4SUiBkT|KAgXmr?PqMa}KXm!}1WRA;VrYmUH|D8Yc#%rMT5jtr?QPOO2H#OMUodplGa6E16+$>y(PUXy{Z$H z%8o`U?!9`&QFbL>2}#L&b~9t0=_QpXPS5BZCdGV2zYIyJWe(hbH8!>JM9w1fk?l4X z!!Y@S2D=0uuQd1+$WW_h)zr!2RP2ZAOu1;spir3^Y(q`#-o@AN-;}@+b4{}N9AxN* zsp|zR(iJrib$`JT$IOTR*8FZq8Z%2Rv;VDpY>G@u`9^Th+ixa=gv|90zeK{kZ{_V# zPV&6NjU`myb*;~cwL8Xc@}%=JC^{Ujn9N%ZNL5vPPS08o#ESHH`hF7pwt0mt-dH%R zcwl6Tw!ZFp=a)jm5Sf|0V@>McjYC@qJ+xjYJU&lZQ(%;X`ys@7?E!>Z5*$!20lvkI zOr)iNdlnKwZ-vL-d9SQF%F#41{@Y!hW7_6oTR7Bl?zueyE4c&17@NXqfmr&k-V@p?Mpw#Hu6sM*RslIRQ6lyBY|C&wSR zU#jy9&@I6Y>=XM3N-PCau8!TK=+gHXUo%(STW*Rw>`r-V-vigabAMCyrh_kTCo)ktQexTH9UJ}Pw|k;qbf^UAUnj)McdDj1`)221f|OtS z9wzK&%{}mCzw3NByt_^FP5#rh(aq+he;}{n}mi^w%(7_6APEL+i zvo#cvO;Hsn2VNICoSi*FD|Z*9beuyP3elMcU3>B_|EUzMkUU_!4u7mb((<&&M8E-| zacBF|;>bp&-QJl_J~u;3gBcFl