From d801d1d8ccae3d8c9ea3d55c27ae16cd28212734 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 19 Mar 2020 16:15:04 +0100 Subject: [PATCH] Don't have exif bugging out on short strings * lisp/image/exif.el (exif--direct-ascii-value): New function (bug#40127). (exif--parse-directory): Use it to get the correct values for in-directory (i.e., shorter than 4 octets) strings. --- lisp/image/exif.el | 21 +++++++++++++++++++-- test/data/image/black-short.jpg | Bin 0 -> 31779 bytes test/lisp/image/exif-tests.el | 11 +++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 test/data/image/black-short.jpg diff --git a/lisp/image/exif.el b/lisp/image/exif.el index 642bc58321c..065456dc318 100644 --- a/lisp/image/exif.el +++ b/lisp/image/exif.el @@ -72,7 +72,8 @@ (283 y-resolution) (296 resolution-unit) (305 software) - (306 date-time)) + (306 date-time) + (315 artist)) "Alist of tag values and their names.") (defconst exif--orientation @@ -216,7 +217,10 @@ If the orientation isn't present in the data, return nil." (+ (1+ value) length))) ;; The value is stored directly ;; in the directory. - value) + (if (eq (car field-format) 'ascii) + (exif--direct-ascii-value + value (1- length) le) + value)) (car field-format) le))))) (let ((next (exif--read-number 4 le))) @@ -231,6 +235,19 @@ If the orientation isn't present in the data, return nil." ;; We've reached the end of the directories. dir)))) +(defun exif--direct-ascii-value (value bytes le) + "Make VALUE into a zero-terminated string. +VALUE is an integer representing BYTES characters." + (with-temp-buffer + (set-buffer-multibyte nil) + (if le + (dotimes (i bytes) + (insert (logand (lsh value (* i -8)) 255))) + (dotimes (i bytes) + (insert (logand (lsh value (* (- (1- bytes) i) -8)) 255)))) + (insert 0) + (buffer-string))) + (defun exif--process-value (value type le) "Do type-based post-processing of the value." (cl-case type diff --git a/test/data/image/black-short.jpg b/test/data/image/black-short.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02a5b0b72ef1bd455173c093aa0f3a4cb3a0cf69 GIT binary patch literal 31779 zcmex=@9rk%0k>r5IVk^b!UJ25BgJ4Fdy%22>3b0|SF0BNGEN z0|P^9E(3!RBNKxN0|UrP25Uwp29SIe0|SFF6U0mqKeL?$Y~~C`28N|a*cmP`Ffg28 zU|=XHVPHthFD-)T2DxAh)D=bshL%PnRz9iz6=INrUncQ zd<={XVhmzn`xqFQ8B!P+7}yy=0OVH&22K!@feTD>Gk|=+17`DrNj`=nAes>r0-zvc zU=UzzU|?Y26l7o!P-kG^=7-SJSt0ZW4hYRC1EJ%XAapkagg(s-p`S`aXprHAuqwl> zCP-LEF*7jCg|d^F85op0AYlgz5p^iL0p$D%?BMt_Ffuk^o&X8=EM^7<7AU)pnSp_E zB18=%6Eg$TM2Pv5Kx!s&f#YBnGXn$bB#8JTW(EfKNf5h0A;AGlJ{07(-H zoD2-iQ1%Tr1_o9rJE(+#L3|NJJtz$^EM^D0AC&GGp=^*jj7uPDKyGG&vO(g^P&P=M zWeLQ;UL_0+tWa?Y1_lN;C>x}P9m)pT#Q|l5#5s}JTu5w?94K{NU}s>E0fi9*0|T~H zi%kra2SIKGnE^_-;LOCxz)%4-Cm=B|u{b|3Gns*bVIl(~1H^|QmoYIwLKBqinW5q! zlh~nbkQ#mlMvycEgCPTh6jU4(YBEqZNR2#{&CS5Tpa5lq#1$FX88{Lc7z{)i7?hym zAXlm&u~iw^89=F`ikpE!4eA~P69Wr%BsCgPHpp$743L;+NMm5of{KI8)P{*OFfiyq z#X;(Ip=^*EJt!L_u8+hvKw=vrv5lZ?kX~a3NDk@ZW?(RZii6BCMPi#l+5i7DFqlKx zjEoEn7Em@QOe~>nkeOCcHpm=nB(@Ed4a%jqP&P=79TM9f$_AO^fW&r0Vmm|GAbVY) z>;iEH23IH>q}L6J?T*CuKw^7B*&uVgk;2&riS5h43Qi~UxEUDy7}y!K7#JAVaWgRZ zL-m5}3S?knP-0+UxWUc95X8X5z{kMA@Qa&)As8yo!Nb510u|TdVPFV_>IL~d0-82J zmc+r>3=E9%2sT3kjLpczkjTK!Fol7E!Gec@AsHqPs%04185|fG7|!r8Fr-1*JiH7H z=}@*0F9Smc10%R}0J%Anft|sFfq|iimw_P*Njw`WeubBTAqPo37b-5p$H0(>B%aT} z&H$Y7#ND6{sq}vjKnTMVwWPZ%aGXRNbCxvc&S7ZuR>ziAhGL_ z+|vMce+oYXLnD;EhM$3<3CjM$&%n?OW!nfaFtk9~EdmS-tx&(55ny0whnf${3!P9l zC?30@Y>*$jk=Q*@HYkntLfPN{Gcfc)*`kaL4E<1df@+ruQ1KczP^ktf)2f&m7$!m0 zfXttU#GVdS4-%h=#GVCZgWNWo0aCL22r@9tg|b5gL9H5y`5?XXq3S{G1q|#A3JeSk z8w42`7DCm>2r@7%LsGLCDxM<9z_6Twogsmlf#HH61H%d=H7k+WtC84ikl1S(m_bP& zWG%ybXjzma$iT1x8rK1b85lMqso#Xe-V9}f{I~^)y_Eq{i#G@|FlvxKGn5UAQx+(DJ0}AJE0hgtey~B= z%`*pHF9#Bv6NxR*04ay(2r@847@8WI7#bRx8W1kI(K=xzP|94S~@Rpfm(P{TC1hnFDGqfoNom z-2X9!_T)kGFg+kPsH6vB5F1;W$PB8uShjP*XjZ20jQ<$9nP4vWMSHc^^Lm!!LdYhDZDi3=jAj7&h@UHf-T%VEDt&z%Y-Wfnf#z47OGL z`I^W0L)B04zh=0>-^cQXKUQlSe-y(G{wRhS{EQ5<_!$|_@vE?1;%8#Gz@N#mhTnj5 z1HTZ%I{t%9SNP8}f8md0_{5*Wo50V&ki^fx0O}2;@iQ=F@G~%E@iQ>w@G~&v@iQg@G~&f@iQ+FY{EZ<-He}+!H%DSVI2!J|2Oe4Fl^z8)!N1r ztF?nCR%;hetk#GBj;_ZTGuRlIv)C9obJ!S|^Vk?Ti`W<#nAlhu_}Ew(IM^5%8Q2&Y zx!4#OdDs{jS=bmE1lSlE*w|PZmas7}7_m)e5Mi6lAj3A9L5%I$FCn&Pzogh!v&ykC z{L^A%WUyd+$)du>z;DMkg+-5zok4+(fmw;|1(N~Wd<`o$W~OCq3=C>)3=9oy3=BjjXJBYyV_-PM#=y|U#=tOvje%hi8v}y}I|IWm zHU@?cHU@?sw*UY8*ccclvHkx)i;aO{4jTi*8a4)o6>JO)GuZeU=CL*Kn6Wc3D6lgy zD6umzsIW6IsIiMMXt8TB=&@TdXs}OU&|#mzV8A|s!HAuK!G@iI!GxWG!Hu1PA&i}Y zA&Q-WA%dNO!G)cH!3jjOF|gLKG4R*1G4Ok_F|bO3)Uq+~d$8SS@nd6P3}9nnh+|`5 zhyeM6je*&TZ8duZ8v}C{+iG?(b_RwRHdEmgHU@?yHUYPHGgNS_V5s8Q%uvIzilL5UGeZf- zDuyzS%?u433=B;i3=AzC3=C}?3=AC{3=CZy3=BOS3=Dl73=F?G85kls7#N~B7#J)# z7#OTL7#QL>7#Qq07#OZ`FfiQUU|_h#!N72bgMr~52Lr&yvST=F9ux#OGVcEvb!m@*#g=H5v3(FpE7M6Y7EG!@XySc1mxW~@Gkif&h zki^5l02)JV;$dKD;bCBC<6&Uv;9+3s;$dLu;bCCt<6&T!z{9{WiHCt<3J(LrG#&Os z7H$UyHf{|D4sHnsE^Yw^9&R26K5hmE0d58cA#Mf+5pD(sF>VG132p`kDQ*S^8Eypz zIc@<41#TV&C2j@=70_rs_kVj0?*I02+!730+zzQa+-YHY+@UT8+$PFK+>8tnTr3Px zTnvmcTnvnHTnr2eTn!CLTn!B=ToMv#ToMu)Tnr3ZT+GZlTnr3(Tnr2cxEL7}xL6pJ zxEL5zxEL7JxVRWJxNb9OaVaq9aB(o`aWya)a4|3#as6j7;WA(_L;Y2^Ryy zKhV?z4+8@e4+8@W4+8@m4+8^eG?|Nsfq{pIfq{>QfkA+WfkB9efkA|afkBLifkA?Y zfkBFgfkB3cfkBRkfnf(17sDh=+l}golB_j0ZCIY{kRCV8;Ur ze^19Yh6SAe|1aYF|9=VR|NqN4|NmdX`Tzea&j0_{aQ^?lj`RQj4V?e~Z{qy_e+%dT z|JykK|KGv+|Nkz||Nr-J{{O#^^Z)+_P6mc1P6mb+P6mcHP6mb!P6mc9P6mbvoD2+; zI2jmvI2joFI2jnGa56AV<78l%!O6fdi<5z24krV{JaGDP33g*(;Q#+$hW|1X6aWAJ z68!)F%klsJ&%*!zKO6u5{~Y}P|8w#G|Ifq!|34r9|Nm0_|Njf{|Nk$<|Np-T|NsAD z{Qv)d`0p9a#Zbq`#PH#Nkh32HgBSw?lNbX7ix>j~n-~LwgV;g_CoykE7qJaOZeq9i zJj9ZU6~q`Al*ITMRK$cB)Wn1sG{nRhw8XR+bi}k6^u&xA48&3xKKys~6=GoEVq^Hn zsbWyT#lTCO7U-y{qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Auu>Yz$Mr@ped2fmBE39 zu|<)=L4koKgn_d`LBv9sfyF_ALBOF&qs>Kup@CDSku718rV{HCh9(B46C9ZwnHw0) z7=##{99=wv!#Eg>;J^kBikKJ}B-A9B7#O6~1(+BZWYpyt85rbs?lD|tP|(X`xW=fY z_v0S}v$7ro0|T?Fo&ZzYKQWbGOfCP!RfU++7%VEg7}XdpDpxW3GFVm2Vr=?vQ}KY| z8G}t_1_J}LZRMi>49pItJq#0=97~v(*#DVSh%n9lZ&4=2#K2%3dV`UH!79js>Ck`6 zfH=k@|1EqQ7=JRD`GD*)^FH&Bf!WIQ#J@>QR-OvXDu3-FJD95e*+yJpY+y)i>|tEN zkWfF3(U~EsT85Eev%sB-zOn!e8JLH&D|HrrW zF{LrcSXMAC_%COx!ov|X% znBA*Xm=63kZ&}6^{?DShhbi!%lJXPAtN#?0q?ii+DJq^}F!-;aSi>m7D6ja8fq_|G zVZwg~W_kIFe`grwM zcsdvTj%0Fo^7zHT?BN6oa}Vb@rpUiZJ{y=m{EPME<=_$I=HlQM;N)Q8;O1nn&S7J> zHM7@qwUbgYGvMKtkdo$O;S%Cj6=db*=VKG%;A7?I<`Am&6IJ9FH&9SEQsa`Bw&2hb zln~)D5SCPzRn#!I(BYGj5@loNke203$Yy8K*H`2e(UTR{Q5NEq5D?~OXWt@RZ1NOH5MtAqNIgHiou@2@gdSxK^AA5OQ3k$Z;`Aph04lW{*c#Les$p%_AHQj8h!i6h#CY z6gN3C35Y1PIWRG@FbJeJI4(+I;&js#a28=>WQlBJ5Ylo{ndHI7vFxA-V}k-mCPN03 z;xvbjgehDb3{^N9IGP$6444#{97H&$sIGayl+fg1z{12hA*I2=jYExzK|z4Ai9vuv ztdl{rfk8l!L4`q~iQ|wa14ENT1H%+Yb^#TJK95BX6P!C3I2=AWG-BWME)%X!CSoY~mGR6!Q>rU~qJG@&(l> zus!FXQ%^u_$Y~gmb5uYiNSq0L8Utu2Fh~VR7f2O|50U}V%%IJ#42%pc46F<+;61~j z(^U|sJFqdZp@@U_<}xsVPJ%!c2kpTHorJ={z|O!5H3xJO1gbd5R*)-Tt^wK00^g?$ zk^y0e9uNx|gG__*VfsOQ1RJJ;i6I~;IHZGN0z*GT6+5{6X_n;DifOkikah+=4B zsAtG!sA8DPFq2^&7|vyAWN2aNV(4PXVQ6RQV3^0SiD47N3Wfy?(;0dhmNHCXs9POSk5q=p^G7pp^RY~ zLnA{MLkGhYhUpAb80Io`Gn6w#GK4Z@Fw`<+GgL7&GE_1&F?2CxGI%lgG6XW@GE^{> zGn6tEG1M~TGITRoFeot?F*q~$GbAzOF{CmiF{Ci0GGsBZGq5wrGB`81F+?zggK;!N z5JNop>>3dU9R_;_M}`0fe+GAkK!ykgNAR9@9tJrEQwApnKZY=dFa{5XUYGfZZvVQ66JW?00q8XRux7#1^3U|7vCk)efQGQ(VkH4F z&Dl8&wEI6_6PK~ET9V3)Oo>by3=0$z92A;7nGzK^1bmp78J?vxW(YjWaFXE^!x4t#3>O%#GhAbY zz;uROhHQp3hCGHsh9WHbt<;;DA#fkVIfmm5dl*hITw^%PaG4PTQyFp@(izeiau|vj zav5|PxY6u?ss^#Wp7{{N35F94`xq`VTxPh%aDfp5GZ}KgCgd{|VYRxWAhH;&p9{_XPgJX!A@C@}QHIkD2N^ChTtu=z6Pz+Zp-{w-&!Ee|ho-+z6=wf# zhEojZ81^z8W4OU^8SefRu>V2&3mFO+bQyTj^joS{Fhk&OhBFL@8Fn$8Vz|n10q%ZK z$Y(L6G2}87Fyvtg|HmqA%n-Pb;WWcxh9eBe7_Ks$XSmJ?fuNYrWJqVoVJHB*AKm^w z6-ekeG4EwK$#8~Y55q}@vkYe$E;2$OC`V>7fMPKp9DY1#?zd2Z`5zQ}2N@19oME`h zaGl`_BLt>1WHV%d^K}tJ34<;JKbrnW%9YFzc!=RN!)XRkD4b-t$Z(z!0yClM7Zm@X z^owqPuQDX}bTc1dIL>f@;UL3#Q0is4$_RlV{pk#;4EYQN;Pi*C-(0z!83Ok+oM$-4 zaDd?=!#Rd4aQCM$fKmV`{S|}rAA0ynD%UYX;9iDP496MvFNJU zgD!&zn*Vc^YnUPMFvCfPqYV4Op??k~|7C*14-)?9`R|DGBxVTQ&v1(2EW-hY^9-jM z&cpo=O8Hp~8Q}Z_O26ptmqJQE#~F?>9Ar4faE;+ITtCS7Sq$k6c??BZ{hy~&#teab z!08VZ{}+(-CovQ-*blyX7o7gYX%@;`d| zNm7NCKl>R@FdSmo#c-YBI+FdM_|E{BA0=4xAGaDL_g6C?XE@1loZ&FTWrkBo@t?_% z#{lwwE<+JRDVFkQC%pVR#Bhe;D8n&^^9OMMg;dmB|1~{h;y_ zz5a{Wg5+U=Vz>g%$B^8A6&il&4229OSo6P>Rx39I9%b6hRL-=P=`PcL zrt?hAY!KMT*vFX2*uc1vv5j#Wqb@@}=#Vv}YW}F^8g2;O!E}nLo#`agMW%I3`N3=$>0hG$f)4^eGf6Y+F>5o=WtL*jW`4#2fx8$lGTvfT zVA5qe!}y0$m*F1h$Ri~Cn;MuH85BA=auxU(8yp-WK>b<~#{hvg24)5p20_LU1_cc! zP9_Ew#;pu&j%<@S8HAXan;8V!IRh9PGI|&qBtgwfCWZ}~46F)_hZGtdCNxZuU}9*< z5Sbv*$=1-o!QjNG;1VF?$kg2E*vO#JsHCC6z@Wjv;Ly?{lCVZ{0wY_dOG1l7151;D zLV}3G0R|>PM+OE?76t_l0R{mF0S%@D3=Bd#ObQMH3lvxmw6L)-GPJO89ARMKYv5r> z5Kv&_U}R+DU~ynz;9y{3WYAzs5M<;KY+~SGXlG#bVi29;AfUj&$f7Wzi=!=piKm5u z$%CPld4+&Q1|uUwizWg zg^7WKfrBZPiJ^gqNx*@}fq_GWQ-pzm!9~EOkzs{11A``GN&|xc!x0IQB!&Q|r6P(9 z3=B*XjZDG;43iw#5*id07+4q%s)}edaIzc{5NPON5NP0V;9z5F^*O-8!ol!}g@I{d z&<0j+2Ms=z35!@1nG_m0g%}!*STq=v88{Yl2uyJDVP)hAVBlzDn8M^R~F$NAMHibzH44#57 zn3$D1x)K?h7&w?*7#b9u1(pakurM?*O;~lnp`oEwfssK-g@KWYF@S-Eft`^tOJs#0 zCj%pc0f(YP0|STP2?YV=P7MatV@ys80t^N$42(=lU0f^*2ND`oKrP`G2R04?hXxe} zX-5VH2BQ@W3Q7)4$>IzQ4hIwzm>3d87#uj+I2u6F%+a99z%8c0#N41E(8wgfq{t-L zaFQblWC}~CKoavt2F311eRU>0C7 zaS$R28YcF zP7MMK3=Rzp0tJ&8m^l`3hy;K(Z7VP^va@g~1T=96I5M1QU~uqYkYG}1@?Z#JQeaxr zCN)igRf~Z`X%d46gNBHPh*JxP0HXr~gBODvn}!M}gN76nE5igvmJSAvfTAKLr$hk` zHU*Ie21OP|1`ZYl77ZRy(q?pE5Mwn_a^ni*)KCy}WbqJSQjlPG6jQu%K!AfGBjmvX z1|cmL4u%y13?d9H3=JF&T}&Aa%}tC948jZo92_kSA_@%)rX`4IIJF5JWMP=1D3qvh zfW?7@LzqE8Ludhq1897gWdjpyGxGughD9u#0!&OC3W_j08poh8Euzh6W~q1O^8t#|Q?71SS?X6>|j^0|ypH1||*xh9iuO zA{-2iJV^|olxD%e#FWg$z`&uT&Y@J!(9qGy(V@ZMz{Bk1D54Rd$e`H3u|TVZgF#VA zgMmXOfki=qfuT`^fnmWE1||izE=HC~3m6oZ8L~78XfPx)FtSMYFbEh4C@?ZKaBwJa zG&C?Yc?d9ga4@kjxUeu^NXT$d0S$aGFo-ZTD6~9eRS3{vND$b-z~;fp%)p>2pu@m0 zor}fcqy_^6LxMyiDBGGi2%KQia%*7HxWFjlaUj7#L#&B`K|qs1LqU;=kwKYBOGJ}F zL4G1B>Pq28RTeB`gXe2@MQRO+sD_3<4Yt2|^ktIGF?#)EGq= zTNDJDE-0{oN)ZMILk9^K#z~Bu9E8*zI7BiWIeZy7SXwz+6c{X~F>olbFa&T+YG9be zz|;cTk<2K-z{0`cA)z6VF~{LV<03BMPNswjZA=1U0xS*U8cYfn95T!eoS>uRcpMfe ziRdsSG&nIjHk@E%0&T-*WC&Wo;L;%A(2yX+aK(YiS%ra(QN)2kLV!Vtp@D(LQ9wX| zfk7?IgF(}10}}%SXZWTD0R|39P6I_2i3SzX7mW^VN-UmCT&%1D3=C`xO)Lxy9Rdw3 zN=zIEj0_xV9@jV+nXWKSVF*!RaA06u(80ps%m}J$1Qb{pnHU7cnnM_36or`_*be9j zJl@11q`;uSz#+iUpuoTopv}a^w2*;AfRRC|X)#L&3#dapL6o7*fyG5Yfk8omqk-9h z!GS@5K|+~y;FeorE z$|Nu_GidZM3NQ;a2na9<_%4{>5x~r#(7cAiW94)% zm<(4iF-&lBaA0B-VCZ6KNa0ZuV{2qEQ4nZgWpV-eB-2F!RC+V1h&VDZ1gJPL1U48b zfEo@Q4IP3SYytut3?3#*LJUj{2RJ4$Ffj-=urSPE0Obxh#s&$M1OX;7CRPR^hBk8+ zNhSpr1p!AfB@u-M42(Pt9t-+N)TXUP@9+#$jqe7 z5Fx;z4h9Vd4u&NP6B$^U84gSkVBk2=kig); z#>v9buE3ztz`^Jt#3-WS!yM4q!YC-fq`|_(!XUuSp}@evqR67)pujP~fq|VviAjW! zLx_=sp+SH_kwJh1e8hMYry~m|i=zU|fd&Tw1_q}Vh69caj4TW#3=EEp3=ImPHkbpa zfU1B4ixz`Mg96)vDUEC#4UI=Qq&S%rCMbf`ifM{CfU+Qmhk}X_2MdD$=MrZY2X}@B z1(8+}4i^^&M;3+<4kplPwG1qv>i3`k2dE&{;S}KrNM&JQa%5y{U|8h9#KSRxfq_As z!9!yOLzChnPKHdO;s%ci9xMzCG=w-5`~*PB)sxA=g`vf3!h;6Y!wi!g4H9`?GI4^( z!_Tl}G$^$wu&OXHDef>}U|?V|5a3)SB*F-4{jxZ0NNCU%P-GBv;1tMcNYKb&@L*t( z-~ydDV%DhH0#dHV!fB$=!oOV&Rye zDqty~$l<`n(8f5$k%3d3VL>93;symS4zbcj2~$9oG6#c;lEb8ifGih=1_l|>AdCb9 zM0p?8LgZ=94#Rtn!=2#3~VAM9O4`eI#V)}6bxh- zL>O8)8dw-Kf)rR?z^6Nfun(g zrBR!M$%BP~MY)B8MM1=afrCMC0>cE40GFl}3<^>l3ND}uaS{guGmD{vhY-Ug78Zud z3=#|)ootNYA;S(84km#H0cQq=X$%b+ED8>aEJ_Rx0?Z5!OdMRG^NTqrC^Rv$FtTyB zaHw-|I5e?M<4{rHa}ZSHxX9!Zz##!T6hYBN19U)-icV7^gTjQACWdCv(cB#_oJ*WR z?RO>yE{2vDER0MULJlkrOacN5$5J*jv?w$iMfH1#f6E1fvtgI zl7j#fg9B5hfG3OM1jRm$1{S6OfkGAy28IC52?}BwEDj6_EDS7)6B-$~nH^*plsH&8 zCTIyTGB`3iG-ygNuqd=R3NQ+Iv^X_zf@=6X2|^4E6B+~?3OX2@7zGlT90ej990lAa zFeGHKFfgz&vM5gTXkct`;9%au%HY)C*}%Z0VBi?g;KIP5*~Hku$iUHXsmX!`)VR!; zz{sG`#=xL3nU(z_OTsn{Hb;iU22G}d4(0`#4w@Ve0!m#BLMs~-S`-90Sr{fb3MjBK zF5?z(2w`MqWD?L~n#9q-(ZVo6LrG(TYa2&PW{XN!1E&fDgF%zS3{OxBW=K?G2xDMS zP+{1{AjZLA*pSGS+2GmW$iUOaAiyZVz#$>w$&}Hc>CQQggMl@Gvq@uw1n?yQLJJNaWMB|bb>Pt8+`uu3n}KnH$25gg5@L=M9GMslB#v=T03|tv zNj^*oO$rQ5OblvXTucHA4GA3#ESyXXN}PO+EgT)mEF3J7vpAIs3>0Q^uz4yuIC!%7 z3UD+qOz_|kVo~TwY-41*F+l-TdMprQoRqz$mGSqA(Gg{ zAdt}J(BR4BaLqx?k-RCsDMoM2#JIl$nm#^I&W$)v#0;K|}3!pR~q!7(JEB>^`+>V+*5$0+XW{M-xXIJA+6ggQ9{1 zLqdZ9TLwdN8wV)xnI!TUK{Ja@j0_8yG6YUFISMH>D6pt1JUFM>mcXFUaFn5giIc&B zK|zI+jYXhMfKiO0fuY5LnPG_n8|MbeCI==B1_tGcLQH&)3K?w*9qJ4Y3``7;lM)#i zCWEr7f&<5bl>(9z7!n$orx>`XbTR}b7&9<1vPm>?2rvt9xi|_KGSxjWJ+vNap34?bkS^+ zU=yCgAjAq90$AiQiIG90i3@bRiok+N;Gqs7K?V(Gj*upY2A&=kCdLLI0gVX_%s&J; zbOeM98916WCZ6C`VPIIq*r3tm!sN&Tif^5!1crnrMYcwUMGYKtT^J-9Ks^|a7SJh2 zjf@Tg2beUO7(_HU1P?2)xQGcfIJR)KI84rDP?*Hf#=yzRz{%jiXfYv~)uTg!p`c5H ziL*;dp+S>Lfr+JsL4<*esfnRUVUmCVlL)8*;lZG&#>vPrOGB7Z$bn%&2ZMtn8%G02 zf`bbOQ$m9y3uBiCgG&R4f`E|61kH(=L7)T38yFfUcp5QuaIz|DbTBzEFp4m+DTql- zQ($AXU|?mKkSM~yl)=EkP#~Zn$RVIOsiDPy$54?WNkBu0fkDftp&`MFaRLW}V1pn> zAsc5yBAY1a)Fq|_76-P9W&;I9F~Gkx0IEP3I~3Rw8w49Tni&)lS{PR5A0yISuCNQ)x zNN{i{FgUg`C@{2Tu&64{Vq|RdnBbt`$iV8t$(G2#0qP4);b3!|z#s-1b5p$FB%s3~ z0cyrEusVQlE1BTM#KaxKz`+pU&@!Ewfs?_8N2AF>FoZ!&l06L$DNkhP~iIFQqh+&cfD+7l^6C;y?P)3^x8$**v zg9noWgGS2%CPyI#CJhExp%?6oDw+(5OpHwzI6%uD8U+Lx9xzVwC|%Id(7?eYD4;Qm zkwKx|k-@QrnSrrEgN1>GgHur;g`t2gktvWxQYd30D;oooLo)*#GaKlZ6;BR@2@DLJ zt{famEDj8w49sny3tAdl6j&ITGME_`Ftj+RcrYX|a7^KpaB1=sQD9PFaOh)T@DN}S zU{GXQ!pF$$G{Iw%ql#neLlzB2g*F8-hQy>rq5F84{Q>SR|Nk z7&J0)gBJNP1TrzUIWs8;F-RmfWHKqV2{19pI0$jJfO>@q+nqpbks26UJQxy~7!ELq zF)UFOP+-##QfXsl;AsIZx=~>)bAo}8!UP5pi-v?ILzW~F z-cJfl4GbDg2`!)#ubdbdcqP~z8`cOoFbK3TsDnD>2_g>|IGPqTFgo!vB{C_rC@?vh zDF`G?U=UDfkYV5uaXg~Jq|nGA;0PYLa$sU)^PJQn;31G8#=xe+Gr6J3fyZG*f>OmA z%?1Y{1tEuq1Qtc60}P2AimU<#j;w;<7Oui34kiWx7Ep=rz;S?qL86_3fgyl_N2!6K z?FEAblY|5(gCmPTLxPwi1BaLb6C*Pthm(MV8>j{5(d4LWJ_q}5Xlg5oW?NOkU@Y&g2O?nftg7xf`Ma-0+WNd0263=hGp9W z2d$u_7$*p_C?zKW=LNdq5u}2Hff;&N zC>xHuMX!}0?iRgQf_k?oBNODdz-J{43`|h=OJ>yjL_xN|ZVH9b|8M-i&CtTYf&d&G zEZiI*z|XR;@QBE$5`HGdRHf`Rrb=&qGJ9iyAeB|h{<0np@ zx^(%<)oa&p+`RSh(c>pipFMx^^3}&rpTB(l_Wj4tUyKaQVBdfUkZ%|mko+Uaz{JSJ z!otkL4)PBpQ#nXdkcCyzkWI)jkUgfzg#gRfHk%UIUi~!=H==OkHduX^pHRJQ@p_rZuvvqF4bE1o?<{ zQDdtr6CX%5gT0gn!;%H8iyF9$9l+Wg-7*-?vVn|S)YvM*0rEeaNC4w&S0*k{5Frs> z3{e`=a6ZIRM^}bJU7#>r)Y$FHAal{7sf$e{Krv$h%c2JUD3Ad{T@0ET5)g;$BAmx0 z1k%R*|K|VO49=iyjzK98FJ@w5WMpDwWMqN?1d9n|2$E(LWiaIgX-HQ0W=KKK>I~vw z$3gN0lw@S$`hSE$S%8s&k(rr=8N5^jEX63OXy_RDfvIrfK_R2Wi~o->h=W}PmV^?F z3{1@bk1%M0GZiaHJ4`>LpyCHZ$H2meiH#E%9=!OGNl0m<5o$tyAZ2oI`m-J3x^i>B zs5kItPLsRmoFmS_yZ_gr3YIVB4qQi)v;Iu;R%s~gS={8MJVE5O&yRhaZXCxCsTEWffL+u9*++WHl?rC;|a zsCMn;H2Gd$E%eK$V*SQlX;bbyd$R=gl>M4;^#SYF2cc(}xn4w9FvjV!ly&cFObr)2 zy0=T&vX5aoXGH9s8*aIc`)>yS+Rw}%|A8la_3lp*R@M!ghi<65dTe1-j@;M4FjveW zt7h`4jCU7A_S-~rc2199A7J|D^^1M%yFVU~xRbqtXXT5>H}+rPFR1j*W#D^YbVz$q z3}ZRhL#?_6>_5+?Z&-g)W$6{pWT_99*WUeVZ278nfnn0;8A3slFQzkSF9;0xV+ixT zbYa=&BGzC3{FS{~Cos+|7N4G=v7dQ|@I7zq7px4MmN4d4RQCx-);oA#lw6;^k74)H z=MU;b3qL3e$Zme%aN=lTgT$#%99OtY1m)%(h&9zZwC+Ksew>}Rjo$Q~n!+>IS2V7F znXn=wH#>NG=go+cwuQG8jAYj}sNNI5`kg`J(3iaj(j7Vid+QjkKX%{FwDha==L0V} z|91Ax`RX>&Y|rbko27YQ)cvooS4h;H*U=z