From e24ceae5857c29f3dbda6ef2d0940e8a06ad3a26 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Thu, 15 Apr 2004 14:41:59 +0000
Subject: [PATCH] =?UTF-8?q?Choix=20de=20la=20m=C3=A9thode=20de=20cr=C3=A9a?=
 =?UTF-8?q?tion=20de=20vignette=20:=20*=20choisir=20gd1=20ou=20gd2=20*=20e?=
 =?UTF-8?q?ssayer=20imagemagick=20en=20mode=20ligne=20de=20commande=20*=20?=
 =?UTF-8?q?essayer=20imagick=20(module=20imagemagick=20pour=20php4)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitattributes               |   1 +
 IMG/test_image.jpg           | Bin 0 -> 24643 bytes
 ecrire/config-fonctions.php3 |  77 +++++++++++++---
 ecrire/inc_config.php3       |   3 +
 ecrire/inc_filtres.php3      | 127 ++++++--------------------
 ecrire/inc_logos.php3        | 132 ++++++++++++++++++++++++++-
 ecrire/inc_version.php3      |  10 ++-
 spip_image.php3              | 170 +++++++++++------------------------
 8 files changed, 286 insertions(+), 234 deletions(-)
 create mode 100644 IMG/test_image.jpg

diff --git a/.gitattributes b/.gitattributes
index 59667effc3..b3272cdf1f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -66,6 +66,7 @@ IMG/icones_barre/quote.png -text
 IMG/test.gif -text
 IMG/test.jpg -text
 IMG/test.png -text
+IMG/test_image.jpg -text
 NAVPICS/petit-logo-spip.gif -text
 NAVPICS/point.gif -text
 NAVPICS/rien.gif -text
diff --git a/IMG/test_image.jpg b/IMG/test_image.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a6916fb5cb2e087a769e1615cf2a75b082b8e9c4
GIT binary patch
literal 24643
zcmbTdWl$Vn)W$iugy8Nl6J(I!J_G^`FgU~DNpP4!f)gMlc#y$;aMvNhEhM-*gG&f5
z0TT2NvCX@?_11pe-P_e4x=vNs@80Uu{oM1M{=58l3qTEnYC{2dcz6J<e+S_29{`1_
zr>C2vo~^el`QJ4_B!H2MhK`1kk&c#*g^7`sM+V5l$;tEdu>`-2zJ{@po`x>W)b=&f
z)Y|VEOxG>V-7hpU9vyGul3kkhuK0CKd=wrN3kwei&l4c<NtA`IMb!W2@pk~P1OUJz
z`Um+xod5U0!zUmlA|@dvBY%JgAo#yx{~P{)1gQb|cmxFagakxHgoOWY6Y?(xAfzFp
z<q=mUrZci7;q{`I2ump@1wL))WiX!o4wAI<4ksgLWMXDveZ<EvAPAO{mXVc{S5Q;e
zfNE-K!{8<eQ!{f5OM3@LCubKV%E#BwKj2khP()-@^t+hYxYV@tjLfX;985`RS$Rce
zRdr2cQ*%peTYE=mU;n`1(D2CU*xWpBVR31BW%cX!&hFm+!Qs*IkBiHz>zmvE?(S*+
zA>$Jg5)hL74>BHpz`v7#hLDIyoS0VCh{V>5j#na#l>TW-aYHW|P}2B2gPr#*IU`8w
z>!Tn4L;Zh3|G#4n|NjO3zs&!O{I>@{LyFgn_n82X7l2QLM?i!3cNIWEfcNi$fClgc
z(BNYaso-Lp|2e*Pf>_??bGyVWy)$$)ZiI4ZvU9%4NUE76*G<B2d^ff0u`n_AVPw`!
zI8XlE<UO28AE5<RLJYoC>t!j+D7D`k@ic&GFKdJ-MYR)j339;>ccM4t=ox!~X^6V!
z^QN`hu$(C!x+x-6&vGZRVV?A$xY(c5sx7t`JRRDr77QvXDXBp|qgC52UT$`Ao*$af
zKgR9y9i5iwBG)bw&F@V=XSury8%n7N{a&;$2m#})Xa$}LbGal<dp<?STrM`Te@tx}
zKA8<7|ALbmcTU)#1|{^`n!iUa9@~PxLD;(C3DG8*{BKOIt}Eg_$By4;5%{lWnAs5}
z#N$2vU=c&IPe4L1f<M3*@R-HnVdxGQ>`}qf*iTTT(T~3Xyo#}!&@G=OX|V(cW39Vv
z<IhI)4oR*BTby94oQ<OBHMvCLWRmLZ>U2$Z{kh>z!!E;u;l=7F50*felg2oQkfXz#
zryEB(8=(rA)^-Fz;uFgThUzh|xk69k-@X3PyHqfn6Rih@tHyUUPiYL&*CGOx7p%2(
z>;K!$o0m!WA^<#rF_9EBTMG+pv0p3UguV5&4qDXZrFfDO)M(N|T~&Sidc<<Hr1b^R
zXojH0^6q9Yfem2h6-iv|r#_*48N)ZG#N|za!h09{TtHvmx)D2q)WF;Q+D^U)uaAoY
zq?tmXIyC~A39Ukz`MfyyhD#CZq;hA_UfwWyew|mikENGjlz))lFwA=yHNfS-qg$_R
z7!-t?Q<NuA!V47$?6G;*aiT4i(tn#|nXf*SK5|>uV`Lo42|0da8I~wtOcqnv_3#*1
ze)GDXszutUymtzqv{0D<vgVq~A2PjMFrmR%RA}4w%2)9x*#hT^YE^CB*@rz#zhmWf
z94&%qCLO|B4f_{cctiS;LsVG7hol?e=6D>UF^X)z*l)l5VNRo<=1#fTE+_cgY&82#
z6`jkJ)+8!NgnH|GP>?f25uCOZr`59>1aGf<Dt7|&f`2pKXfpa}m1tHUSme)pG%3KM
z#EJT*@M`GJ+~%g*zo)2v;=@r~zytbI`W)?VinvSkrM9ShDfeTMk(<iTlhn!!x$FMm
zXmVFmt^y+d7AIa0&yFF~?@|Uc^fg?)m8kvZxq@*G-sp)IbJ`{R`BM@Gz$Cp!Bv)SR
z4QM}gTLA5tPZ&q!py315qt1j1=CRJSNCtYBMcktF=Z^)u@o2JB!lAXzbUh?-Ie!7O
z6)I09t9#@|CZ(7&WoZS4RaW128H2p;Qs^Y2j;-p!Y&3ROwb^Ax{1hZC%<OY&;;Aw!
zH7fFQHMh1J{W3S%_R*-!RUnxr1@jYY!}&wSOyLSG50#%CTlc1QKOPM{Vk6{yH*>#8
zUsIvh{1<Rt^PqOE%gUen^Z0Do=@r&iLSx<!=%+CF=4VDbe4b>p4z&yFdvr*`FeQ}E
z{ocsb2BTews+A0o-wHwPcSeo7GZFIi49nGwM2qw$O%_ykTg5%uBofI~vN16e<C3Sx
z4?MAWzUKjdTd-%(&whbg{mKO~Xe+1kh}oOo<j1N^^6FEmUtgDwsJET6H_69j>UyPE
zNN~C$N_#l3v%o2WFWv}gec<xQZ5(ccwSGt_&P}omr>M1O>7BGTqtj<1c=<2Et|>@V
zC;`v$Y7QkQ%|EA2b&h-!gAA(m)q~9k<>>pi;4F==DpJxk!nd28@**%cED*4HFF}eL
zEmJT*SW9XTV<*PGi!;dEu4oftBe9`WAUH9W)L$evS-*2ux?HVA8J}{(u8)VX)4}Xs
z!d|U+<_^hn#EpFN{-e_!RXRqD&4>QgIq&A`g^1;jgK?&bj;+kh<l@(rRLMUksZ0rF
z-=0tk0u!86yKiY$Q{9?OQU-u5$IGR~dZ}tLxFN}idy|I2q3sR=ECOT1MUV+0vQGFi
zuJVgko<YV=H&OFqYBs441LBL-oJ=u_rSay9(1@PN0(?gmU)6exxm<kQu4&)pvTPRr
zh==KXcWd*fMJsG(p`HF?uqMn+qiQ7M$twLYEQ~B%_ns4V32tA{3kP#X(Q^dF6?@T8
zWnj&8f1{e?5sW&Lt*r_enGfft7Q}&7&tz`puyh?j748dt@GElYioC6%gMBw(>#Abt
zImRez*+43DGRJ#(kHOHx4R7+f`2;FH(X#k3%Cid*AmPw3j2}rdg4bRRtApuqYDmc2
z=V%#)gP}R*zv@X(&D_VOx^h`OP)!0~rt!<74MpilLf<Nc5L@}OR5@@-KWl%Ql;^n~
zSG6NzXk@v%aFEJPj98{Bf4ON#|6mD1(qc%{tmpu5l}|kUjasIA;g;a}Op~Y+PrHrR
zp9c@bjkj1o>^50B@`X3*i71I7xP5M~tsRQlVgRdx#Um`UoD`oaj!hG~vz(usmH>I5
zriv|V_v|iA$}pE{YYg)$tMC^=j`RHIG9J@18U}L19l)dc16=yKHE=x9T|^+O$Qtu5
z7b<kJo4kFUw9)`HCpr`J(XOUUmMpDVBC#LK)K1UgpGpEStux-<;Eu)jx|F@GNf;ud
z6`aPZ3S)tc{4A%Yzjt|eWi=ktM`Vx?E@ob(o&e9n25ko9_~q-vN6s72?#%q4TPe(k
ziJ!NCz`$O9`6}S0V~oJKT{$D|x>Os57wxAnK3BEL!+S;Kp9M;e@F+>u&6sV#O)6M1
zCpWJlq_b6_(rC(28>D&)F(e*NL>5{x+v{HDGlartg^U<XFtIS8Cf93;*&~KfW^C;M
zAH>8Ax^ZyC>6jQS$d+f?wt_GKgXJH!MU=S$Q_%M1Of0!kG=Bjtx`SF@+c^4J_Aw+3
zPYFjnzy`U5ZI(9hM8Sg!LGhFVz31@;*#rEqVw0*sTL}7}+b#9dTnci@kMBPalfXEJ
z5J@QU<So3_TG-eZiHN*^VkD}+;&mO>)8_rQ)~p)$m#7S0SSw|<%fxV$Qd~4!>Mg~D
z{^FtFQtLUXu-Hh@c1>U1gbdm)UZiJUJTw3ku6^NOw0m2P&Yd+BwPLOqh>^ut_Bfa^
zc`V+obqc)nxRvG6a2YFdzXnR{kC{)-^8y-D1|erm<Ef@fzLpidP<S)Vq-g=9pSQd@
zcQSteSa422z{@C@(J0}A|BaN~&XHC>ayxHW=(?6r-GsBEvNg?~;YnDPctLd5!{p8M
zL0p66yD0<dN9gstm-8(uUnCBgt90DmZt1aJn5lLMxH;v3zuP?ANQtK_v3Zdl6IC>^
zk_Ci-n;Z%{uq^O2lQK5zgK}3!9d)@A<AKm*tBVTz&!`5E1W=fXLjices?EfXaz<S1
zR(qcv@9?3HSLY&?V6sr!q$6zSjfVc$56@uJf<*1ag{~de>_0Gd!;jO92h6Dh2jP}v
zj0aVv-0Zi+m3~A%Cx}kj7N<C8P3oU|aUXt;iJNecD$O^qp^4F)rR56#<D6iBLDV~o
z9BGSLvR8en6G4Fd(Av47R#`!iF|lr<WGci5VH;cdR#cj>KytPD6kF7sYU~N)9)*lf
z!x&;%0>B&V!_==e(FdE=&&H-@)8F`^-C2&VYo8!ZQnllW2=-VQ7<p23sPe=|m7D7&
zm_6!6k{)J|C<e0zf!9+_qCmUv%O5XSf}cxm=0^wCL{j9@)+yY_5o-7eS&jb7`(spO
zTiR%bNJ|J~%e9VYE6oJ9os%+{wTGKxL4yyV4SC2%#A8QHMDuX!A0NJrOudk^ezGtP
z&mX1j2J7wj8a!4)$alXQb4d<SZc@k%*r=O?N-TsVXpA+kh})TDv1JTYUh=YiC$2Be
zAmcI7r#bDP?SFWTiwd?T<!mmuwbg!MaR{?$n==m2(&AdfUXeOm-5kjL&*oH}4%idk
zQu79S(8E-thLmY(CxE?fmt&Fv$_*7a*-l&JWwb8!-zLfUsp(n};0D3H+rYnBJ;^%c
z%~q&ppgltHs``P3*s4|9W@Z(6mZZ`YOQJrY>U#)sPSC<L$eE@3!Cj!qFfh$BM#HUs
z-DckU2P^_Vm#0j8F%B#7PR=+`Ipb5q>M+41X_DQo{b;=(r91=oV=rz)z%;-)j`cw<
z*UN;@F?dH>O@orQh7IS5887rDtVV(Hepv);g=a}YE%pKheo@rk-rwXHa`EOEwANmc
z6l7%2KimcH@JBIJ)+u>*T3O)%8~SA{Tg<Fpo!YGiCVNi>8ylVBTS>eVSQld{@37(F
zfj;muw5ZS-3%;tQ9loGR)KGjVDddH2l^Yop^to{)X{fa3x2$cynsmt+82|p9;&hb>
za(tgxbs%5IW7+vScixp#Lw#FnNK0M`4zFKrlCasYDa>fnra<1kz_@<4HP#*{SS<w>
zD9qETrzr2Pt(zEMS0g;V73N^I=z?ZGCdR3^d`4*(1ubPeN{P`8L9Dputf?3tH-_Ix
z?T6wZL$iO&&KVRp<4B03<<q3+d&sgcd_eLY%O<4F`#{F4Ek(c4d>~RGn!ntlE7wlS
z27o#fV!56FIM*aT=}bfzst-Btmr;diSEc(+TGHX7qCwo$A%g~Vp)zf-(4>OO1e36W
zPt9vI{z}@!W_buRW@(Rc0`CLvh2W_EJkw{eLv0reX0h6f*X!F&JW!?REuY2aox5aK
zP&i-nd_Ta5#ZdDWRo)4?-U)O_2xWY002|5t{an_3rk36IFCgFd4SSood0@ggY^~`O
z&ic|{$H8nis?|o@X?k-QZjvtjG547kF!fVOy{oKM1M3zzFYUx4{MUwViJe5Li|uBX
zNcOn@>PTDi&{h;laiyy)<Hd@|WVIUahjqp6hHKD@m~ttm?3;heiD^d9jGk)Qhk{j&
zsc-bk(M^`=;)rP<qlOx7{vvWbJFhjYZm}oq>b9b1O`FgYIlQ->i<jt)y7&ti;VQg4
zve@#lwdBud=`N$km)Z)MQTYqlw0^@|mbul-+Zne17|L6XyzrPud_KtC`7Vug|G4Pn
z4@&9;KaV(kTE0I{kXI0bY@_LA*8uYAWIhRHkj>7WJ`2}I!`(SV98=1ZCPc-k%AK^W
z-6SHj6umCpk2RE6MSc`M-d7nA;Kx|?K445`lDCm;_pPv6ndTUKU2ZW1MV-}2JcwcP
z_y6&$<}t72@u%zA`t-MZA4~T+0OuBM;w8I;Yt37`eq}&T9VbI8#mv$p(|W?(H_$r+
zBZN$zQ?(dF@H`t<CsFPsF6II^Gc2$}fK_@O>PJ6l+eHX3a{_HS;4LkNinQRC1UVYN
z0;e~g{{>jK|9O_q{2XF{HEhdN6f;kfuv75240p|Ob{lz1o=e*0q}$ZoF~T(!U)?XC
zpl|SlwM>*#4kI@;vtbZq@>U3WzL+2S=`8d60XnP?*GkKB8rLQ&#Hxv8Z(_%^l~3<Z
zw|qMBL`oOU<5KsP4Hyc>)a=?sw@>0m^TpHFjTmKOOq}XgM)!0f|JC&5?Pn>W5fE)z
zCxa|$m_}`;ci>GCU8ZHU27!ECCWaC5hdl_cwZ$4t!G)stFou9b?LN&<N-xu)_tO(`
zed79kA2xp>#$EU>68hX%-z6LH6)|&J`tLshr$WLigfMvu?+7AROKnr)+#@4wV>=J9
z`s0&MSB_`K@|uKx^lLdEH}#28fms~j^eU~L7GvsR^^w&T29^hL>ULy=f9SV~Luy8a
zI*5%`da6sgMgBcCCuFr?l1y+xj~=pJ7yq`FsdbuVoU(-|m#E!1nDy}5e9lVj1ijr9
zBwm^YU0rxzi6^D|(Sbc~kULgLQ$K4Y7xZ029u?Ijz#EFkFTHS>mE4l&fB5#bWX8>P
zz0sThYBSB8=6nQLY|6-M4;h7BFCss_GR&iF$?PCIL_SK{P5$`Kr(v9Kef~a97k}GF
zVX*6*_f+|s5^p=Aw`c|*0u}En$dHPS9FbQJFG<kJ6ZnNnjx{6Pp<j}#6j-H_W@E>w
z$SWVo)gDF9It(L;oYH<lYGGdzSYH^384l@`Q}imaOzn+uUi-5=0J*1j4gJeCscP~~
z`vy2>RyDga(hs`+dBWIU)k{FUrgIzdH3@4fkt(LS1J`NzSZzRhK%r@GaA6xKBf3`j
zpDSOT4zGF&kWP;C#bQhI5z&C{vw%o;pOHF?RF$fg-<yH=xXjef2@5M%PN={KetX!B
z_8S~qp|G!U5JE9N8a_%<_Fb!1rtQViF+caavk=$k*EWo)EVH^cK7%f$o^oAvFGac@
z93c|D3N17D7@iHC{R#my{M^Ky+9rAAqbRX(El)v_;=o<fytGNu2bKmaa|a=-dw`NN
z^Zj=J1pneEq9I_8N~ge{?Gk4awDCF_iwXY5F-1V-8Ikzi9Fc^~W<<wTMI?>rzUUXf
zkl=Yvy~(t>LU9(FqCTp{5+Hsy<qiiDuir}#A~^EVxm!%(fin|hXj&!#ah3HDo{}*#
zi&(z3ZNme6y8Fz_{M)!?c0z`oxE9-dxt@YgVUY1BCkX}0zUKBig9>Z6JgTn{SLj!T
zf`z0eC(<Xd<+ik`HkP0L5f<aY#U<&rgBqM_DXaCc?3#p&R%B=*7}6mv$Z-rA3?iq_
z{>o`!X{Lte-j7*M!I)$Zi-GVV0%o98p}-yE$zMtZuDaD1Dcw+1Mx#!kAi*9~X|cS&
zjuc+?Kpz@Y%)R>qQT_t;aZ7;&-dl6=m;+4B(pW+1W%TY_@WLp(6`U6vku0RH{opU4
zj<;^WFqHWZ0`ciL>?0M{3Y7cXYWELui}5vP9q26{Hy-eXHF3ML?XDO&S7Dhb9KPkA
z1?=X{6!{bzKzGS%cTY|&p`U<p#iT?-Q6$qaH5xA*E`F&VS>!dyr{eL1)gk6DASe;{
zUQ2*^*ZvlQOmzgPyyA!w+Q%q69bm;N55r5VL2}#0718oWg>t8(Sh<ebeXdjTVt^y)
zY8o{gO7-m|?Cc>Q>3heYT`|+2rR#{-)~R;TNdv3{&__d?9rdyNTItEfIX_1Ku+K=;
zsRPH^C?YNe?&o-$R6)swU;0)Af@cGNR>nCVVx#Zj4r$+(V&$H6rR}~By2mZ+rmUTo
zQ>fI?q*B=%4%3PBa&vUOfuESZ#aZj5#cU{B`%afrH;J1<H>kWe4E{5@W{tO(eiy5*
z2Uvy5b74W4(T@4u<{VFR8?l=Eo)z8-ZxZR8ltE*L*fYCC89e5;F*5!|jD?jGZitxd
zx|U4X09D;|TjP_qjzEki|0)ZH+sIhDdCcaI_!nBHx-8=*2i{abPag<}srF7Wd#TWN
zkBSA_zxP4le5N5sQ$tYEexgKAB0Y9m`x5m144*}J=Ax~Kh#?T{{zd^)4J1t*kROJh
z7?(GR-mKTDd_&cfP6d`MK8VqB8r@FbisK?-mWuOP&BlKWDnQ;1a<lA|1NkT=p<D87
z6r?AZFR_D@*${J2*Zc<&DVFz2J<5G=u61{cW{Cz~@zpl5Z<%7hJ<^uWP)M0ee>P@=
zXdi|(IeX6PML!XuU@d8sBMh3sUWR}%JZy87?CcS9)vye^F)t}as!dCaG@x|q%)EDW
zFe}vZb^N5Pd=2%0qSb0y6k(G9glteO&OC96eY=|U$Q0BP!)s&T4gV|`wfq<0U%1Z#
zH08&dE^xUCo)13i2<GYZ4LhB%*!8W{jv7V1ugs7I6!i@0S>?Q*jnlJ8Er{Y{>tJ}U
z-YZ=+OK2TX<58zg@Nbuy|8I%%k-ggNTvK)9oL}d%Q{CB^oth1vvI1G~u@*99@O6YY
z*%N_DZ8wAbJRj{?$_{o+m^meBEfWFO4B_-ubrJ-B1fPN+8%5<yr3L@VDK8a<T!_zN
zGC=anW(9XZ)yliCCRzuE^gff&=C~EFg7kf6loiEOWN7H-RYh)`3(?Em6a7SS+)RAf
zTwyYar5WA|K6W*KHDsAHyt<0=i|m6_OPLtP)jd@r|3nu8`FWJkV?saas?>;=bdv1!
zYk2|0RSfGas@w0az6EP#{HIh8`Dw&&m)havcxjU<!@QePu(jYav%Z|2{cFqSx2Bq5
z*?IER3RqlS^37iWOJBn&Y{v_v?a<zOA^CHFgX*=3;V3UHRP}jD!EAbdnc7s~AgFGI
zi3iFS&3TpEQ3o8a<?yXQNLJ{-`F>S*W9_Yg_^)uBXGquBQ$ykm5UG_n^rf68gxMtF
zTAk4oGB{R)|MbG3sQOWMd@SKBa!RnPeCpiTncjc?&uSDg<;*<ZK?QnN@~2ge)-X!7
zKk4&+{GOG{xY0M)Qom=l3HYq4iS_9VD`D>@onN;pUFuQcj32}7L{_F6HYm_QPvqld
zHP7)x(ve#RGsVE_%J$%5)(<SIp_*R0<h#4Ll)RfV-?a$6DK;zx*#|tOKlF*JW!7|)
zitP66xX>vt{Wt@WTT!TBWZqm6#7i$~Duw--MeXgdbcPSp1WFIQ3##B#l7%$|Fo6~o
zC2pa>`qh`HCa{lD<g+ib3^fjkVHiP%*-n3Ka-Ru>;vyCFWUhYYS$fF(TdE_NPSw1y
z0p~+g+eBCGCC?p_xf-oJT!jom=~5dLECNL(Cs@hL_KqGDRiN&EDw&^Ps*z%G2D#-5
z$6M<RTz%aF$BKuFdc9`$y$?*?_P&rQF~SS`N?HsvePmyoum+#z;fs+T=`VrioXps=
zQjEa$2IZO_+luc(f6sY??Ju0!P5m2Ojq`R2!0DyL&5lOsxM~FlFFkRIMtM^Zdob=p
zy97Q2B^lZsdsQOK7CI!PAIVscD(T`G!*qy^5uBK;g`<pg1FP+x^dS@5`I2c#c|*B)
zcTI=@EJ~QBZtE>h6iXHXZ#K2~vfPQm)Go<og|ojJWd_JKiW}pm7AQqCmq+|i>bs8$
zo^70pcfZseS>=#KUw&u~mF-+J_bM<S{?URj-^Zb~(^7{U-x<gSi-&1qw$0y}>J`PQ
z36bX0YmdNtZl!%*G0td_{P2lOMec-en|v*8Mh}&81x~{eS;PbO05mP+p^j8E+F`u)
zYZg14C->Xl65s%5(iUQ$9DrZDZX?EDT!wT#d(Iz3MpE&RmqAnDSKlwLmqCd`DrVyz
zlAC1+fYjq(N^cnWGOcL7T{yWo{zM1e2jgbipU&uw73^brrpciD=3RdQui!vs-(afy
zfuEH)!|SJ(E+h4)AG7)?>R%~m&}=ssIkqQ_r2kspD!6|7%93BaZ40%1UMf-jfPQ_i
zx-u;cw(`$(;pv^Uh+rD$@m3vV`yieuu&&js1lQh94s}c<5*2$@KEx!yA0<!X)mud5
zKTTXrus>4iT+ke!zjCTeLehI%Npjaz&^+{1UxQp31<2xTj=WTpQEu-0BJ&nzif{f0
zx~`Cz(M|Ut-tc!%Zykg3La=W8#s2c}o`;aUP=ewEA5KXV5WoNGde=Lw!!#$G+^!Lm
zH%90(&mPl+bbmC^MQ`LxunuE@x)w!)!d^EIy^XDf!pwj!rp!;n^*1YO$GL)DH|C6k
zUaRLDR9CFE<#4WtY)T%x%EW`Uxh$hfYtLCG)n{k2F#>n$n9dK-8>^Yu$AJ|RHgI6d
zHi+P&prqDQxG+m6ZGADMm{0wn+aeIR%1qCmIa0DHg54kMLO{KP=O3Xz%5{zXi2KAg
z87X%xC!HqMXBGgtM<ghOGzNOSLghS!=ztuyaB$6G2FEnw?458h%*iB<p@Y8X=?E37
zO(NhN(L?yUA2Tb#DvFn_IajUIk4R6yv+|l$72v**FMH<=?XTCgjPKT}L3C`f+Sjut
zlM<WTFP3El4r=C^tZa5v5WN(7lA!1zS51Ek3idMEJsqVV0OqmdbWs|L(TX?+!%!j!
z$&{kaezxGTSHzJnnFoKW6S1bSrY@$VBwA9dMoaP4eu)pAy0TF_?q1h<DxHYm*MVGt
z^zpaF#Zg{StbB4N_W^LT_@70B0CSc(GYBs-(F}vok;1Pw(ne}&EFg_T7xr|5J!Ll{
z5Ln~GMO1M0pjp~M8-*gGD%vhnc?T2D(<uXsDECnF_{l7LU`d--qc6|Fc4Xn&JBYMs
z>||amrZ4pFB-oRgC=66cGEzSZZ==o=@`fY`zYrAv{OFbPb|yYB16%e_{-i5M$1j8G
z>!trV(hc|iGcX%!DQZKAsc6Zulg$HSV^_8(I+M-4$$JLi5Y2L0(*^w7j2x(Wj9r~r
z|8<o=&0_0WkyTY>!_KR^97GZa>9LU3cn<qzRLl#4aw&Gs^g2O=<W-FXbvyTs)Wki!
zK<RQbDk%jT&emL@GWdkuw{m9=GjKoG-D5BmMQA90V!$B?=tm!P^KN01tIl;-HKcl}
z)<6E3loF?4g9to;nQ_|~*)DH3XIrl(MlD4kJa~JhDKkNFHvMM>4^h?w%pR7bhvTi`
z$O`e7jWqB6@Kvl&?vIGLPd^z5sY$%!<{y`vW_ZJ(BP1!5*M;7%durX-%W5?sF**Df
z@Vquhmne<JNsh}hq(<_rGwWP-gEPE@PH4hmcnqt?;>jNJ52QY1P)1&TZ{*vnirU5}
z@<JBP;vl_}+L4x`rwX+HYOz~zUEQL|54(O0>}|Aq7Y#deb+8OWzPSaLOz9;Ladq`r
zVnuk&qo8?{(3Nu&?QV*27rZ|_i<lmS5ZQna;LV9?WDSWyUlVF#R<R_#p;em$T-HGn
zH#>wX`|&TqSePc-EggFHGnZmLgK%v^m}1^i5B^MP+07)#p!%=(^vh*DA2uH1GbBm<
zmrKHtAY&Av3!en&bqRZ|zVn*`oazw<!4+5mcoUH~QcKKIH@z$z334_C$gmgP@*#rH
z#9ozE5S{Q)tAW;QzSH~hb*>pbFdvpEc|XQR&?=NM|E;_|T00HTe#pnl|5FgS|0SJ-
zZ>s*6C<@1CmN$!mi*g`E^FLRK2}jzsun*lIQF}KvmjxLXQu_t}t+kElTNT2JJt@2!
zX|2ZP_T%wFh}VYTvrPzlHfNg<l=EARV2BC(yeM=nRg-1cM6#TL?^&8yHTH#D#Fsdo
zg}aR38tU(eGY>yi<d3W#i5<Q|x&63naC~$BYYe5ORj^)sCU-wCvb=-*Id0s_x;bH}
zvDf<R%?~--6C-GVVATCvvMVWZnXIQ8e*vbyHMISx3AGBnI*73-HS0Q&J(s-doje+y
zKo1V3!*`1%_WPpeJI|Se;u>6KoqC^dmzp=O!lCN1Ltl*|n&WWYZ5L}3`u3<PjA#JC
z#bR4$$Ed(cjQ-6ecnbqq&0qmtP!bW+{_5DpIePo7Mm^P2%JY;jvhyV2a2X0Ldh8u2
zb(StJPEuUX%^6+dq}UBMAxw19qGh1tXDEMJA*p$weNn~2at?R75jZ)RzSTr+tR`^Y
zL4nWXkTM>rmQ6G!axbzR)c!RL*k>~F(aQnPa7>BwTBp=Jig-rLtFU?DI#NSd+4}vo
z#4N^RcDg}RmCKP7#r)7KZ0rJPqltvWmCr%^lUcan;FbKU@Qcv~M*6J+xo?8?u@7sC
zw=mJmO1Fw-@`Fqi^P4eCXIS%inPU6M%TcL%F@027*iJUL65ZXxsM%s!af3K?HHbA8
zu@!{y$z=0Ztz-tJvd3ocRF%8p5%wVD@i@RI>SM|t|C~UR9N|a`^t?Yh71?8#mFfwO
zrJ+w1A9S~B$XpY-&5A2_sWF&bzN((veKfU+f7MeRl%PnP5@Dp<6}DYB@;PPKMBOCa
zaHZ8|L8>1p)mS+>Y{{0+*<waxP*r6?D$gJr1an9<q3t=%bKf~ZjI1u$vLSaJf{e$i
zxrM2e)2&JA=e7z^666KQp8fn#W73{!;ylvxMNCMQQG3{l3RN0&71=%((o{A5{2HJ#
z6iNK~-CD2?n;4Df1lh?mH%AzLzIYEquNqIZq2ZRV^7X8ht7(dryR-Z9QR3A(E;vQ_
z1o<{lsdC>alH|@zQAjG45n`U|s)NYR-a!i}_IPiM*8E^|oZqnKYR+VaG^o(x<uXs-
zYSXs?eZ90#BlN=BdU@|(_m%y;p-`-KDmqLY@aD;6AeUIFkVgN&H-EzrpvyfK)`eN>
zMB~5Oj-<^%v&qXSgRP=2_Af~`P&&;tBOFk$(a%Hj0s~Z5spzd43oluz(8<XCyqm)&
z*7fo8O`OUu?YpWYqh}Sv7W2R*`Wt_dpJUsd&H5o`5$Adv4Y!XsAW!<R4NQh)W^C!U
z@31C77Wl1!0SY@y<L~&NW6TgkdSlyrRTI&#Vq+^@|LOyC`4qX#(MP}3?iYF(O)ea`
z56)Vg3WdO)ogMK4!-T(@8zKqhi7VP8hXzS&N+ife<ZiGZr)27sejPmMn}NTiuQ3so
zP`xT1R?{Lb*-F#eK>oo+(&C7sLz$CZpFWWI5IFa}`yEzhb;bUL#ETx*)`__xmUhHp
zbKCN!n2xD|J>MH7C6I%$t~u$=Px_45phC;hr}Li{<eu-h3NyXBn2+KJId(WLey{H&
zUrO4Z0G&OxSXz2+Z42MS#;>H3dd=*V`_O(~ee~;9wGqyGDPhH4H#;Xc*i%#f+*Gt=
zbX|e9n8zH)d(AOuIe+$gP+VuaxMB&88H9i0TYpDfX!BWdWIe^yIi6(_{-^}>KB#Pz
zWB+Adq1xb!3>L4hT8agi(-hxJ@h6Jxc<|U?I1LXLCi+~dy?NuZju+YfwTy5f8LBs=
zRr}U)HQ2p_hT`KGDQ9aL(i%8F-+Q508`Cp6X-mT=tm%9RtB`|zxuPocj>nVL>cFbq
z*zAKRQHp6^T)u{>@8oN~h_Q7ojCkEzRd#E5Mp4d*Da0Wopi$|YuNB$OMYL4vx-2Lp
ziLppA6~99lM~(Hmqf6FWp~lxmPW7^zRh8&#`mppeqrAlQRWs0c1(QH&f9h|SP-N)k
zB+EfJK*?`P^14j?J1kBGx98?tq=wMqzNuwAVamPSS-v;niQO{pl=3JmU=0<~5hB$x
z_$W8sVv;WGS)qK%iBk8J^FTVqCJa4^Lb~yMP_cGEllzXddQwdu88>gs{g}UBaH)9F
zQrAdPrIdtXSi@iVzVQ;Z(|Ibbg*MXzWnv<4rs4?2KT$&EYdiDvKeifY#L5bcaQhCr
zNT$!PNv8j~NHG-&ytD(RHVeC?*4FG`=<m#W3UYd@oW3uMun!#`{AYzZ`eZR9aY0&d
zYeuWX)gfJ4xycOk;2(cO)lgPY4wF@DVY6@e067ueG{!bB=_!!WCHh$J7vqJy_ju}=
zWQ;`Cfp*-&mOfurtI`gs9)2mV2;1)u4LsEi%?PRNh90hpPPo@$-Mt$AoWJ!l6)ghn
zz1i^wD~<$krvxRoNT-*)(tW)2pPu41d#STs%8opH;-_mnG7?e)lCwgX+YbhhytpW>
zDY702RdEUIK9Q<a3WT;EZ2rOfrzMM5%0rbIh<y=l{OT_tGyWdeCMGiR#?EuQg0>Zn
zNj|nuW<j=BbHHdxhpWm60#q>zd5hHeTD3E4bvpaw|B?Gr3k&V*EPbdH2c0MXCMk!W
ztCfiDnc2x$9lRm2H449!8T^+pNtmx6J_mHvdTQi>JryyJ9&ylkC0yI}Q?VJ^1TCzY
znaB2yd;^m`GjuZ;SP+VjAnhy6k0xoct6#yUS$@;5efBbK6yEVUX5lFzji<8HsrE}Q
zVhiQN^J5eXNJ89xy4(ewd&sv9orgaii!=YO35(J&_y{%fk4S7LEJ=Ob|F|IA_L4mM
zt3+AcYq$pQDS$8N=lsVOmrtg}z)VYt^oKk-)P?Enp{M}cn>=ThDh{-p7MEDH2>nMV
zO(5U`*&wqbc>zJ?9fe^&d73cna%LF+tHAIOp)2_$XK-`e4BF;HJ&8q&>7h!t!#~J%
z{RLV4f3!*cNE_Y8sBB6Iq}-q>_4w4d^JDFsw=r{B8V?tO=iy$-siY)}b!x21+6N4#
zGYSlUF7o`bLS(Xod$LAzMLB?&E#s$uEX<CehcsT%f@s;tmLEK~#11voc)!Y(SrnWY
zitVR3{%cO7NB>L&45CyDMZeL7>Df2$VDYq*1rGQbkXRLFZwWz}WCj&GPr*PEX8G!0
z;dLxll~~9pvvq~JPU_4bJNsT}xTvh+0lR-KrA5iJk97Zh?s$)LvSeBP1&F$-ZYupX
zUvv4h&l%3@=CH1?-NnfIDl*$V{}M~|RAClyuEcb?=eoC=YC`*3nvH_B9lg|)Z5>~j
z4Cs+Fl-q9M{-pWAH&HC14M`AY-pQwQFmC@~e(}BaQ|>~VPewSg;`F#ipWdzcmu9ZO
z#D5OX(A0UvtqJB4r+cJ#0J}-|B)8;~Bh@5L{5*LJYCm|p30`B0?5+Moi=S-*2HM1{
zSsl%KdZH(jF~9<qVX0H-vK|Zby{SfX#p*dpaecImg(2$#v$l5=rj<{g!X0OlR<Sg8
zg=(o;W!|M5QV7`s^TgWr9D`qUj_V)#>T*Z~agx@kOJj#g2;>=*L|Q%sakf0dJ$JL<
z3PeheO)h=rl0X95BVpaazg=ZaR)=T)MAsp2@m|;$X0-EGc15s<^%lE)oA}}#m+Gnc
z<$1xiKiTJmSKr1>#EgEdn~cCd__ADcwn)T&d?6wH+_Elye;9XDb$Yr;w7Da)f|`?A
z=u1^StZb2Rw({z@OTOYvPkZ^)n%)oS^MN>duj_HS86r4qC+ZAI^L+2J0D?N^$Cvx>
zT57!mk(~armW@785y&1;OF2#+Xms&=x?Fy2joV~z(oD|KBB_gYIz;FB_fZZzbQ9N~
zZlfs9eLJhqhk}n%>iM?3mJ!wB$d@f|7iHn588Lb9OSrpIyn#tkTv*c+ozc-V<e1_D
z1fTpq2~An%@K|ah({A|4SSJ$w_y?z+7=YxT!=T9By*%?aIAT^4`@A6?#!4IH{m{8c
zI5M%`6TIvH7vSvHwAZ=dD^|5IyrC9W&_ZwTCd~Y+vgP@5V}Cn)+G3R!+u2`$@0{*v
zs>Xhd3PcfpgP(H_XDNxBe;r9F$9a{~I7;n!=<*0PX3Q^*+I)HCq*oqu6z3LeY&Bq(
zcYSIyv=Ort*>s*(4oRl?PGl*7?^I>2%fu5XEyL}wP9bmtU$$cUeL}ED)orqq+#!GR
zbVG+3jE#a+FFQp|=yYei`Fdo+Ox+do5UeL0DR6Xd%E(|JJzDvp71WSSFMa?S)cxgU
zNUAQ(DJs5NH~P-7zqs0QF#GAocLnFUvep)4cErVYrpzdT5~hV9-O~qciq165XC?Eb
z;!WP*+~KQ7QD>#FQ|$Uzm9{*KN~#PpGsPuCX`w7Z^R3S7^WuBn-BhRs>Iaky&nB1n
zidQI*9wwaeLxN{J6ijDZP9@yYz30YHM&j}*^3qPVNI7t)Jwx*tp9yA}GwuEGyq(Pw
z7aiEJ9Q_PUqMnSZsk*A!`yE5=ONWIDDa$#^Va$uW{m6xtN~>s#XfYFej+%t*HTzdz
zzS-4UjVGn?vusx<F#TFGUV9rKVcbKoI+ou%sW2y<sw>|YmWq0oGFUZD;od?1<4cRv
zB(Ni0j<O)SZt^dHbCmnIj5Qpw=BcTInoyf)agc%}B#+PLH@^46;O0D(MtUZlhJTJz
zQ<-ed`;O|Gu}LDBW-zrn`NFfYKyLK@hrL)V|L}LZ!I#jr%%ZL~3&RN0g$Z~=tN`AH
z+{2OT68F)9-^YRk+~Q9*pGT)Mt@eMx3i&{X)gL)~vsHbpZhO4pkx}f<-5%i@vL%?t
zoypsMA6JPwr|2ih+lrg^MGCB}r*6}A0en^~+Tv~49j8$rcD1&6_daLHZ2Pu6Wy*P|
zla?6~w};bq)KQo3hrNXrv%mD?JK*Q6$N&a@2~LYJv)BEVf)1Yf0-iy>FeT0BMf;wc
zQjWV^CSeK~xMLb>IwZtXKI0i@T-$71Jq1kYh~Fh0nLMuC+%)D&_mhTP4`+U|yf|H2
zEoyAr+_XQiyRNyk<#!y56|tw*Jdk5~;>%hsnd1n`yT{!&oyk4V2h@y-L5{Qh9X&#c
z4H%?glHcT|S>tm4Xoa3FC^lIHS4B<TA)DAW&xYw6(CGW`f*`g^#JA?n8y+NEl5s;M
z;njY=a8&q?63*_4_&8^Njjq=uiBws=fwQ=_KUe$uzn36r<j4eL_-^mS%v5)PplV8C
zM(@nDy#-k+T$cZFJI7XLQM_Sm;mW4<8{UceH<=D#Ju0&-7ewhZDLLf`A<}gJ*V&+b
z7p0)FoxIv1RcArMpJK8blf4`^Y56Yug8?t5()AQ_>>-qMlV=cN(Amb*_SgW{CQQz*
zRZ3_)IRTmtQHMvwb<^26#7)PBk53|5?BXbB9~6YwF^|^os3l&Vuw@kbI@r%uiBWN{
z3p&Q0s$_WMm3<@2SW@=zNd(W!fYaS`n9vI=G=1+Jdmw@hGTIb-h%mzyX3ho0K)WRu
zE^!8Yo)j~8k)dTrIXARDedN<Jv9-2jl-3vIG%Ae!40K(M!za6D5XN_0CngE9nALjj
zt%;v$%-a@7HZ^;{7$hmB8asNf58e@>i*L66t~g)*MDpLHNO39cK5+FiVt<wjBBVC+
z6iVb*5PUazoCicHx1I25!Bw?nf|>Q%xIc)zyv>!MFlff;FMw7jDS#oHbX{_;>H*TP
z1(x?uQ0TBFU5$)Fejx0~)x0pTZOEW<+y~OaW#gUUZiUL%k5cyDVHFMWwl@_+7dUe5
z5Vuu7`3;QRqt{};Lhcw$4ei<~AgGP$vzI%`Z<#Eein%~>bSoLIgQebmwjh|sGayiU
z>WE2^8EQb1@{E?f-qk+k(DB&+XVxn&vAWP@H_mIE9#b~ypzY?-#lT?bSfM`7&DfUU
z%sPPnDpYEq=q~96O2mDQ^Pu{w(t5qTG0<?U<J?@w!o{EO&aH3Xw?!|;hv(eHKDIpM
zf>TdHK&SPNQoGg*Y8_e{mw8$u0$m+ZPx5CVCc!>aH@6@Cb!5c&Xt**6s}yaz`q@9#
zdLkCK^9((mmS0*_RqsR%HTdDr0Bjs&v7a&3O}v$KE(jv;{!Q|o$2RuNS$?-b`>HlT
zLfGq0yYIbaiiu?pz5RqoMN?&3@F~fOcJRdLp%}+$0j^t5fSKK|{Dq}E<|)MdzbqfT
zWjMe4l-Cu5<eOvK-~w<b`tw{~aEfez?aA;g6eW=KCHY$F=!@I)Q{9)T>yLdVxeIMa
zy?P7_69jUyWxT==^VQ1fUkB9h7bG7swD+y=F4Q8G{T`-*tByvhd9rM{(Wy_s{xf3+
zaBJ><z$>7T#XK}<A>M*z+i}SM;-O_5x?x;kxVU;bbK=DQGE`x)bFE83@Zi-*4P28w
zpg7%@%5t_V%dy#bXuZ~bq;><}A<JLLoz#5?(py*gvJjXIMsgHpJ^Iwba!|6UtE==i
z(SY-+^fm_Jm9m;)&lMPr`k1?DeC(y;Dg1zWMgD8IhI6MBJbBn(aUUynp>X;zF2P-g
zB4TN=nt=E6`z!XjNu_yci9x4=;g9UHXX8C(0g~dRVnmG8tv^n!Qzl)e#vipo#D`np
z>!fl=T9p%H2Vdy#V^UYfE~sD@W^aWhLQv9*)VqF12IwqBGpt%WLj`oy7Oon``L89A
zFK?Kg#wZHUf!k9<jJG4FB8dRq23(Dd$`mz#8(XO}p8*s5>g0%36v+cx`?<A#HKYbg
z&3|Nfjxent<soGM<bz-|G)FtktH_R#k}P4K_V|_s2IToxY=t0WIzJvR5&UkjfVPOJ
z25XmG4}tR*hd{zZ^?TGj+*<+F9TX&3l~PRJW%M*efTgOAui^QBV++AP;h%87mC^`f
zk47rE2O@)UR=&Q28;sY|6J-2;@)aXW<GybGy|oktei4sb5RL9P6ZuP+sD`otfoccP
z`-dze_htrV8zK|j5hKS!`PpvyR!v@}zBvilKmGadtuzj8jTQ3sj5}V6oxbQ)z+?u#
zTBU@z@|~SO>5BYGXC(MV9U<rUpsT2`BjP+j+EO5J^H<vXd`XPJ`tRSt3)#ia@*X7R
zP8*43>3;ThF&$S7e)Q1pD1fkQT2D>dl*64_)F0ncCZIfQr!uc&H6Ma3B4qy~l~TWH
z@B&u;)@Kp)OV8ymAmgDBYUHIT#dM3o*uUR+oXH0Y+#=Fu5W#W;t@}Sq>a}*xx!PMK
z{AX!`yBfQ31Nho^xs@$&)hRuphD_`G`P{uN#A|S$PEITiH!HeN@S*A**20)Kw8^i^
zY0h7r>2cQD%G-Q#Vy2DiqRc0jZ~VhUgfvSU(9!`cqAQ~KzJqiXJ5k)*IUW+<_H%gd
zVh`f9a+Hf(!t<~X2W;RO8!ElOjwigxk|v6%EFDHy7#O;YQ^GJaI_9`tpX(Bh1kDLz
zBE`JP6R%DSQ47@}4J2<Gr)0RCbdJ->O<l<;XG;y~Wws!pEN@tPJB7Vh!7HiJ(p9-p
z&J6Eks!hI4tkFcj2+hA5ZBO_{TX<Psl4UY^EFx96Y8ndxO|%2?%WI>zn?l9(#JnHe
zFo0s)=O1mk<7b2&nvw`J2b`E?WVsB18(*WDw|<(Ou#VN8%y%1lsQE}KlKR(pwZ|uP
z5XYZ**OlXOV-gTyL`^+4R;2Cp6y!b(=D4c6%e<cm|K#s%ZI-TD1EH@-TKIU)JP&IW
z{YsbwdDd<lU>{D|a?$8GH$1ipXE&O;u(YU4Hqfu`Nji6MHJ9rBys3tHTu?!Cjf7?;
zDw?O_1)t=Q`4xTKfandRsskO(G6n8fR{`uIKm;k{<5OA{FmXOZTve1|%3=y|9l7p6
zMnID{e<RWP-p7==#?~zL6$5H>#U$D*>s(We*0Lt1^@_jS`9;HMLT7|!G^8OM;$z|<
zrVWIhX7ZN{giD%m^c6CXBij7DP31zT8EVU1%3CMB#Y&SayFIeJ*56mGOj#=oSZMW1
z-ASEP?QQIdzc8Bg-6FCU00bKnF$(IH5--4_p-<({gp`*9Ws_KrQiZUNBvmy5GK*1R
zsnV1|G`&@O4JFk+#8&c7gwP!DtJ)jWT4GKWiqJO*+t%1nc;tim&8qdOIq}5DUF-LY
zdfkcfK8i`*9TI=e*ng&M)`IMmoU^`t$`BUz{}$%GvHlkT>maJk?8?o&mX;Mg7Kmde
zQ{3GxSg_5px5j9L%$I~w=te2*^p@ZdCDcQ$B7JO`U4*nN5aOavE)j$apd-yH{1{}K
zn$f+CfyykPKXzQq)coGDXsCt#1uW+2=<!!eqvQs3&XBJKVwIgBV)4!F_E?k7!nb3U
zd-Nx<4Hy5!HSg}3RO<0aNOFx#!cg+Vp@>V)^zY(5>=-tgxJC}zvzNAd9m$ez97MVU
zYLvk@HLjT+!LvjGK7wPrDT({JzH5d8N|+oKf@OrJvcu+v;O4i=vw=+URxTgJw1{b$
zoOKX+&FA3jO3r=ZRIv)x_ASJ$7xSG7T@tFCc{~Jl3~dm!8`nS|iw|i+hy}|DWULBN
zs4@0!F>^#x){)_v9k0gJmbgLG$|H^uX^PZZ{FGL<R+NxyekxJgIc1BsM1t{da!?Qz
zENmv04Du6)<vk^2wVCLRR^c{opEdouDb{5GIjZJKkC=(eNFFJ|REs&t!Q+rb@#_V8
z(6iccBP4$gBbAX}jt@q4Oy$uR83n=W)4k<=$=RBc@JED{(e->^6#W&hZYl<pPd&rJ
zCXL6(Z(lJKd*b&ET-7Y9E2ONmYH1+F`n~4{qBV)L)mX$7$U9JB+9FHz1E8pnpXB*N
z!By-##nZ4>{sb{B&Tr7viP%^Z3&MZG&r+NDUn+GsZbw>=$>&VkW94;6sbahRTsG@!
zR8f)vdFkVSy9>bMC;~#i`o23!JmzWC!Sl(lit~2}>0;fwIcB-F%-bqc=%x7Yof(sf
zyw8}sm#BiN6{Vi#Tb8PpNG37D1b<P7k^AlZo6ye!#(FZRyE<q=lD!ktx^Iv2O(KB{
zG22nZy$Rm)P$2i|$*^VOLsr*!BhOOqTVAdn{ZJjfTf;4U0_?;sihrPYYwikGq1-rA
zY<W>38HOnDAXiveN688|QKpBhn#*De`uiR3$xHl@<Mwivxfu?A64qc!J!6cc9Y+uI
z5oY9>p22hF7T%9pB)bQ{OJ__ayqz`VG`*H+cT>s8Hz0a6R!Z%UFNP2QeSqZbBX|G&
z_>IzjMA}s*_ZQ&Q^u^vam0N3wnmk9;Fg$*A_^XAtwd8kYL<ytK7ZG<>|3#?5CgZcA
zr)+8Z8mkf;C{3aK{xri;ZVlm~Sc5XX(g&zMq&mv{`kN5gg4OI+>S$j=+2E^wxYEPn
zH2C-0G{G0@Ixm@3(?+G*Xx*$Sn-ycSe%DkDmU(pWMZT})y_ux|biuO|<6&=9+q!uZ
zuhv9q=qV^L7{Wh%RXfj4r&W#DKWA_b{+u+tp7Bn3zHK0(OVz1h#CkgjjZd32XC{C|
zxm=k_hIh4(zguAj{2Iz}>v$A%bdS>?(w0E2ySAus!QqW$ij8C=!;nceG(m*1b>Ze4
zhUd^#{KRXdizC0?D_pzWDeTR@{1nnXr7ua%lm<BUVyWC1N*e%beb5GA;B2l#ulr*k
zxC-(odGn92wLoVSIO@u13}^WQ!wmTHcuj50cN4E|aeUr^RSxUG_1e6vvNcxDi?BY?
zkYj50gr6}lQMS%KgaDM5#5$|#hs~&Lu8AbB0fmL&^g(@wMGf)yV+sp7BK-nyIv|3@
z>*Gz{X>Jg<xE8TdDFf%0Hhv1h<wxE@^S0iJux|ZzpUr5rA75#l-i6rdYWcB{b!>gk
zLa|48HMchzU~8_E@3Mfk+{#bRt_L23N5KAF0g=6H($@R+m@rjJ={HJ3r%U`va8XeT
zC@UCHlIPPFHYq-wjz@4}pnXBfRL&VeEy=_7j{e&J5|5;Kgnl@AEDnE%M829qUw$V}
z=0Uz=#@yyg_?!QjZDDpSN7jQGC#zG9JRo18<t1|#$5=;ww4`N8922X9k7K&Ky?z8N
z#Vd<|p_qA6SByxJPY0}4u{N|ecK+71HWVO6OvGaYmd!EihEQ9irV>Ff0N}E=m~P9a
zdOw#eZaMzdG)K^j_I7|@ors#z!8m#^=`E}}pjul7p^UgbH!-W<MpEw1$@8bB8J+E?
zWRoN969q|)tpcQ-R?p1!W%EB}7^V^<N3_`sT!O;gSx>6J0|0a?K0NFC`_dVm1zD7p
zq@E!H+9C-EoijIH%KEqDX>V<N>IOb~q>`sp3d>19gy|kdZe>Pwh$2X;Yb3^|0uNS0
zu{>MsLAW11Bpu~ts*@w{*&SN<s|!?_hl7044QR?1y;%Q0&HqOLD<9P0C4E_&&{E9p
zjO5g-gkO4$5Q77)0OZiwagT8rbCceb43Gs#QwzBMRQQw+nAEmgb{@N8jI(-G7h@yt
zIp(IhlX2QQ3W)|!wNzELW-Z;=dJGC>!|||wH1=QxSHWiJXiDzoN%E@>fil_bD$5<J
zO-78djCZK!m^TBZ7HyexB#5Ltnxd1LFe+d-9Mco#x%K9?F_f-djR-{*cTcqYMcSbs
zC^<C1LB|~`HNTq3xqyJp#!qS@$!kNh0V0nB3aTp-{^}juf$z{(5?$QgOa#-&;GTuJ
zt3U_3RqQwvNr-&OJh7P-3ZXxZLT3tsA~Jhb$u3$w$UbEQ2B;DYg~E_4CdwUf8PQy*
z2hdcudqa)g_^6)YoQ#2wN)gx02b^Y-6Ets%TgvGh3=j=dSsjPU=K%B-1==^-9AuC^
zX)FVznLQ6`pk=W<gy5ajySElzp4A+nt7U1)&(1~-CJ2Un?e?mv#DcF(ynSkng9e09
zv#8z)>}o}D#3(e3zGOS8kV3(;`qAo3EgK}19ft?fsbHjq4+VIwAKom!WMq9RjOzaY
zXl7-`?rA0jQUf3WQo$A&hUiB%V%0|S52Y)pMj(1s5)s0Rq>s8PDO?ah>S|DTM5&&8
z)GCT4A)7d)79_N^GD(BN<2kOMNWipcyQ5Y;xm6<_8jD-zwZ3-2c--ND>?)HQIuQFa
zRpz_eNhboU&3Fp#RX8IfHGz40^0@%uRouM|dyQomA$cOQu63E@;du9|VYdt#iK96o
zMFP1rGsz_5%yQZFH4(^>m#;L~+hmG+gHlLF=3~Zrq}Ygy0BP!n%g?Pb&h9{`qmY0Q
zO$-K+*FCAA^XpGySmURyG;Ifp1S21t8L1RtW}^U;nttxWfD{azW||Jup7k=u+c%yE
ztwMQXM@m;1rb10PN>GDLz!VTqC#5l_X-9gSM&X0)O7~%h$Z=VW!=U1nF+6mo%C|K3
zjI>>!q5NsP!tgowsF!dYo+%i7yN601qg4_gzr9G4Dt&4M!30uco_bQSdsbTeN{+nJ
z8?5juqb(?2^m3s(jGqOLO)hcmQ3hlg?Mht^IqOcu^RiF@H7XS>1_f0uj+BVle3M0l
z<jG$Q%m-SH6D{*`nr`o(ik*&B4)n<yLX7P-4ZeQUkUDcxu-b>cMQm{)H2Mg;9K^B6
z;QCTYYcr-o5;Iq{R=4|BCj*nlYhvklNc|Ea>E4y>1_XA$W-8=ojFC+;7^U+zpPQv>
z&hRuP6y$-ytb~`#nQ}LtoYGy!OKv0~o<Z03se}zN3W|B?F;3p@;JDg53cVDm1EhpA
z0oV%3h|QYHNSUK`+QXlys>#cMSb(RR(7(KEsdxEhFfsU56^OGPy-iT;S(nQbG0APq
z#%c(@Q_W5z{q_j#Dz>AAAr#?{r7&fcV8?2anvPaG7<a13yD;RCK&jXUUzePW=8z#0
zRWJa@<`rGYW5q}#1b{gvi6SU)M>K-$k_8?~6)Y$=an_)X!pDQxH0MARoy2`8Pq=g;
zOM;+$+4|DYaFRv=BsOWcNDad>E)et{l@F5g41j2|7025X=Kd72xoz0#j<nGkiAx$_
zaf+a@u<k8^&0G*E89#XORjpVV4;5|OYL9w}HUlm4zbhVxij~1dE;;UTPz>apRf~5G
z@)~0xH-bbe3srZGACUh5og?N8xfMomc^=eB9tygB$NehM2-fWy?ieHMQRM9+tljNR
zk*_|rSd-HgLK>(z%}BsG<FzW0x1O{i8?ozB0kC7GD}`9b2PgEXnWT)BCX~MH57wQ4
zLI(r5rpUMe0a8f6DI={Q&e{Nnq3cSyE-_AJ9qGx1IPXQqODmHaqWV+~6E9kL`E%<|
ze6SfNmck*%I+{)S7{y7P4Y<uIj1UOm_os1@#~G2Z2U@hL3_Lbn{XHpH5JSJabgKKe
z9G;Z!1;X*3v5ZqBjSOYu<p)veRm6nwITbyjK50YuUy49LxC4q(cB$ioO>jf79RZ|l
zk?TMJ%MLi8<$8Ci0<PiorpiGcn4_qK$s=hr2(!|WG55OFh{E+8QE)4cxIL&~NT<2O
zk=l`)0|I~<k1dB8se|NVqhrVvy#)br(jSohDY3Tb@CFE^eq+XZ)74i49Mfz97b?J$
zjCZb*(EYX#GFi67qn~=_S;D?C#Y%1^iU1M1o|IbPXxuWFb%_4!JbTnu!X~_pax>JE
z+MtD<<I5gskvxUm!{%z60lO!ccR7yTcNOY;RE!-yRs$e#0H|~~^5QuA&&M^TcDDBL
zJky+zI{KQPTj+qtxMd%B=QSO@zTxI`fz4HtSGZN$Hj?C#?N{Ks2F<Mi`Nuh-D-5jD
ze)~SXDzu2rJ4)Px&{eyL#8F1%edeg7nKAMV{b*t#cueWEWlnlkh@tY-gVb?RB+a-M
z{OMiE8CJ~*q=b=3kZtQy$tRk)Dl^>DM=WIJk2s}KxEdHTCyfXg7$TBz%@_xYMr<0A
z;|4GRsS+ZPt8FYmUi3+O7#mP<Its5MdB5t;<DOQb+qPY<F@wmewZN6+E(v4Lpr$AU
z0Zekc$zGJZ!r&frRbV8+1LZh1W(>;+406lGK%^crDI%Q3KdSflskOw5@yDLELP=T+
zmjL7g#c0JmWMnYgSyv6_Ts!tBiXyv|ERt@J$<()6nh6GWFv7Q5f)a{G@sU>~Q~&^Z
zVa6(iLw5^A$1F`&$?4X#E&-m<ALEOI^r{XS2;8J*njXR&`q7^Bb?-_kip1DiKnL%N
zh#}v|AP%&gj#oT)snS5>k@(UWG$R>D2kTKZavm{Kl`Ib4X`j502a!dCLM^2m4MX5C
z!KqB#e((mQUnRXkrUN+ZnhR&QLB&Y1uNZJ?9T<JlpQRyKV)655nwbG|0PohLNSV$X
zij>F^cE{JDG*~Pb56I)?993hIdQ!G}5=}}}c|d{9F_FZr*A;5me)n<cqM}7+=qgvl
zap6zQdeRYIOoGSPnsj?lCXtB)nrS#3XPN+Ol@F24BOLO2QiU1$s8ib%$6?Wp%onh!
zUkY%%)Mzo^tvv=aNr;gkX+{M{JS`6nIj6-dFMLzpLn094C)Sq1Vu=O7Jt{x}9MZ5I
z_@!N~(wGiQcASJtc(!Op);ao8LQ0bA;A6IW)5MJ<5OOI>;bOG$Gfl@pDbox>gT88K
z-l_o{9`wl<DHuI-RS`016!~C&H4Lt1Vsnw4RMIz>Zr-@!t3-By52XN&cqdpPkDh6h
zy~d#^dCn1j>eYJyuW-AG+C6Ih-0HvTg-*c6%3_8LkPCMAthAlQ#_(`W6B1i2b5ZU6
z;*rxdB9Xamvh+g~kF<s-H3qA0meTD;-JX=yftu7vqlGxAn%YCg{EtFvL87AlqEcg3
z$I_;2d0<s7z-q9oEOG(31|0~ZV9d%SZ2R`5acn&;yvtI<?{%upF;ohxgWT4vafFL%
zw&nG#n}jPd3+qBDKI5WQlyZKxBN#^;xfL3yiy1s0T6-)(w>C3OgFZGY;iGIY=QSnT
znI-d2R~bKAjZ@~UF)1-Ru*qIQs@SEeOKBaculM;CZ_CK}c@-RpH;nZ)R}ldOa<nc>
zVASG0qdk48{zu(m$fa@Et+!@#N_kw4)hQXvW4$^!+4us0u?INzr$$@M&p86DycmFx
zK45t?k;2_^ngE{B)>(E)cyWVOR%sV8NCN@KBau=nl#m{r{#7O2z9%fb90s6dE94aU
zm6X#q#r!gU6=DlUm*qty(KVTf{KIMYrUM!PBfxb8(^lE`{HzH2(w5Fuy86-NxKc+x
zn4kpmU;Cs{`^8-6KE|CBNE-y2ka>rw4W85i24g4YTodU`3zy@iT~&<m@s(leNMVVa
z_iz6I0W_{V6#TaKrBo_&oDuI+$rCBYDln&iAkz^jeBiexqi}{y4)o<l+!q~bc7<YF
zf++yTj~ww*#RllhAIgoY%be1eXwzu~&=w+)zAy&SO-PF)5_(gSq-W%OzJ`>MyKnNK
zEI?u;1D+~GP*VhQDb9=s9Vk%S2*)%9kk>#!z%<20878NXaZQJV>qABX3VF|Z0ilYj
zITY78KK_*H5P$;prC6EBJ;z!FVW<lM#VZVEp2by7Mt)__BBWLzbtDRONWhcrQl`<6
zdeetNfz43L!ZOlx#wyje=^UznSX2yHoYb+MjIOx^bu^x!hupU23yc9s5VOVrqUeX)
zBAz-LRC27W2SH9c38GtzX(WeYp(i=2!5By*WydwKZ+4Fu>JPm-REl1>&#f+D5?a~B
zupU4sy;d-Q<aMbdVY_a6Q6r!u3^VCVaIuSaHcU_);-gmD;C3}~<wMHOew7q(BcnTY
zT4-jzm6_n0+zgf(2i}nB@@0gF0eaON8D&NuOr==ykymc6Zd3Pe`D54Kl!jY_ONF7_
zSo<1>P`681kiR7GDy_}z(ZnMRK-<^ei(6}p@}#>JUb!_ZxM*Lq*(Ipjc@>>L(Qx@4
z>B0WXJdr6R4l_~6rIY47_00$@4iSbLqkXDIPDiapKGsl6jyT0ul1#V*?v9l}k!3BI
zum_5s+<x$6XB}#6?;W|NMJbXLo;do`DQH%BOj5DO8R<(RBW*YUXY#A87D!dM42}q-
zF-PSBptGK&_MjO?cvwHnjlQ)dx((i24Dp(nq?0cME;y>LB#K-H$?Sb-0#gKPa#tXp
zlzD5x186j|EP+-=;2sawn;JBXiJXFIh-8bpB2<DmRH!iq#$Hcx+KZsE>_uLzb5p^}
zVD+R7tqcX*1nxMgnN`&s=Lz!DVUeS`9r?!|m8T7mdxl2OmdAZDmF!reFlEM1%5mD6
zc`R=mMm}c(wl8f~NLOnV2sp)IyeyBsvU%(4PSz576@JLg8GK_MYPuE@e3>VvD^BiD
zEtW8F7w>&)1p@|9qmzM1Wnxu;2baxA@v?0w$JUh*S&t)krAr#_C3{c^hDT<@a1Ag5
z$1PT-hkB^!qml1TbX1L4a(k@<u>%8<x1gyLDx-2_ntW`8a=0Yb+eqSTz3s{(@+cO?
zJ>WLe2P2&3qnJl7cx?9~wkM4*(VjHe$Z$QyWwJ>CD<b2bpmnEi!G7gv;zu}HN&1SM
zspxQV+*EBU5rKevniS>mt-6Mon?jX5bCsxBiX4^W-ly2v;PdZIAi2j{L%AN^=OCJP
zN{le4DQpq6gHKf_lRyxIoR#O=oFqL+A4*nLUO?;Krngls^W%}$lLC<-9A~9YhiqgM
zjl-=hh?}xUd{brs4TyQ7!fxXXB#yl)rvY$!_Nkg@PBsI_T8N=_%Ja`OY6BJ`es1*j
zkDL=zXKG;MG}1U6fKROeFxzLI)QK3*C?;fYmyuG$3!Iea+JT3Zuks9ZsFh57N$ZNV
z@r4_kDr!G0NS<&zlyKA`uxC_Us?<X1w_pQKb{WF-rXr2ojyCtHu@)!8h|H|`TBYVV
zkiJPZEc5xP@|-B>DUprCC#_N{!mj+B_vWoy!6U}t3S>Yj8RXW4C~z^~wFEX(SRD>H
z8Sm*+aWj=*0RtKJt1g>!oZt>>oQ|o7QO;=sAe4+0bp-UyZ)psvV#m{|tQ(L^2JGC_
z$#ThU<*7Jsw3^Uwal~(DC%MjQIgyl%@+w%6$q~uh=|g317B?9Nk{!{TaGy4NR1&E9
zNCvd;E%p*um8y!l;~5oTUW7T6lv9J-(xuwr*$|Ql<oZ>cds7kI3v<@3t*#{bM#XW-
zqUAD_aK@{N2>_1Nq@<983C4Ii>MGRsg^m@5)jxWf9hpgfL6s*spb8M-GNp+i<25lb
zh>GndL&#%O$7W=e+zo^b;P<E&A{>_)$3Q9ERv3sR3?wHf?h2S#ylAWuhZ!_m!EkOB
z!eIg7y(>x^rfCEcrdXV1dQuZJzRC9t+!K-oM6D9cV+wsTD^~U><Yoo%>YpI=thl9u
z%2!!=Vf<ZlL%7qpkij9jV4HLA+O@43O_B@-DZn80tXK18m86L54tmz!mjlCXi4Iwg
zb4>$!3nR%Y?P918Vb-Z!e2m40QAahX`*EHJYR<d?Rin;x%TsJf$CZh4=a5fIvz17Z
zlx`!nK^Y2gM&q89Yca@n#CE#%4N@|+u$V}805kJ}Ovd&Bav1fkDb_h5+R9o?U>{1S
zZyx={jtCS0D#*K0)Z(L<2Eg67HDD>&p~>A=tu(cncgV*X;}jvbXQj9<st)7W3f;7{
ziYN$V%aN0sSgozB{&CmT)1<mw4W_J(%5bcZL{yArvrx|FLP1}Y^%X76%9DU|RlLH~
zhEsbe#z@aSsx?)N{J5*^036jh6@1XFI47^A4UHrw12@u?pPS`gF;!%5E>Z(<JJi`D
z47tWRsUC#8vBNF_rUxalkSSwPBaED8t~IP_87!pn*AxL-IGxd(0OFxp2LZZ&Dz^-q
zPRR0e&||Gvo)0aK^&yGwC;>dR86c7mH5fqLf(iGlR<Nm7X6FNni6h_0UIhXcNb!x_
zWK<ZDN6IoP@+6X!P`OY!6q8%Le4yGp(r&?_NEamTTvTPb+S$nIS7eMo+&MU>N2Xm%
z9ztLq^z;+ZrrA&rO!TKmB$42&4}W@*;CNeOhAcg5ED}z5p$!(UAMFs}5u8<fSmun7
z4p8+J(SR||eW*y;-*Xb9r2{6G+Z}K{53NM8ZRCuD=~jsgYRbftI#pfHioA>-)Br3o
zrz4R|8pbk6`cZ@TSG_m`CfJY+j`W%uWvd|wQnIOLJr8P_?tuKOk<@0PM_`^=8)VH`
z*j7!_z9Sto-hvuK8Kp2t@A4}S7uK_iGY*{Qt=`TVwkv1(3WhzzgPuh&*lAqb?LAhb
zw<P6A$g728DA**oO0SiP7=IRe(gsX`gN)*c0<_zv+(&XLu|Vz%bCXKNk+JPaNf#za
z<v2|3#Zb7@<V5o$!*j?LYSv#YWx4gKp6VC*vK0DLKwphsNn|8pbN6aBmPqFjl`ozE
z^r_)l&CJ1@5d-r2)Q*xFfkL1t?mE-3?p5>FHuB^HzGz-xS9NT9dQ;@n!^rX(2xj!{
zR^yB$VM*PAjGpvzu;w$B!(42Q#s>r5t^JjDG6U4-H6lWa#O)dNrAZP(LNGY%iW0b-
zh-5NC(S=rIJRA;`{{XWL0uCRp>YH!`E_w8&t5HI`AeP-^JBj(RilcF(#_D{scN3m#
zPz(%bG>lGo#@uzGp(bMg0B6YzU3&HvEV_)*B1Iera2&DeRw0q6ordhhndjD}oEZkl
z@Hpg=+MzoaVhHY;&@SJY^Pb%*gpTf8Jd;~d?O4}-(c3khERZehMv8Y1zL}tCf(<TW
zo^v<^jN+h6d83$0%0P30?_1>=qY1bHj@1q8fQt|Vc_66zQzNNLXuP2Pcp3Utc;*qI
zK2aIq8dsg?x{xxM)bK?}@@}_|5;3&n9<?TgX=9kO7I1c-&Zma*OIci#y)%NJ)KzKX
zX1E1p%7*DuM<V%>A&nUB>Sz-439g<-F64oq$Wx8R<j4naV^waQyuhjk)5a=Ne8}R1
z_(9D!$8<u|{M>`Og}HTKyNYzaP@fFDu~L|o(;#v=qT{g&+?M%DlE$P+_hsa4VDV8&
zmcfi*;~Aw`pJ?QqbBYO&i)AFTl8c<4{*`SkB#t-91XNH-a2(;t9l)&^*5cwl!9w=Q
z?@=bjdlj_nUpDECfEACmYFw$E8s0ybKY6jxe~mKQ2_bUKcWxZwt&X(gCQB<@SwUtC
zu5*rAs~c3h`&@w)LaKe!+|~VB;IerUo`>iE01C`_%PO$yMk<}U6qixfr}q-6BXW+E
zF&HYR8K+ytwVRWc?NdPl7j~O+<Z(dV*>_D)w&bdAIqU0DUM154*i=EzDtInnhS4x{
z*e`QcFWzZb0^4H)l^@o#acq)1G>k|kkm4{igX>pYR<{EP8NUoxXUv2H)3~G{5O)qS
z#wx7(k3rWnNqYYPbSi<+b*lSR$Pk<n%}r=oBr+h#9glj7>AcBz00GZxt5{(_l)FL>
z0p!$otQz5rJf{Q!QMzml9Fk8;Ack3(1fXFQxs(UtPg-=N_lhx`RHoFUW%HVmt+y~`
z$zn6~pf(%wsO3N=n5xRyg%0D=tR<9*hn`RuuRUqcbP`RFryzam2_CVSV+}9OA?;9J
zMJJT9O2ZA%15$2eV8r$7nq<)L!OnT&kkcczgi62x+o`9xG05r{Bva=`fnwTuW6fAw
z31k9M&PGV2gxQ$njBW*U%|j~}lm+f<MrfL4I8xhsk=nDRQyv)xFlZ5>_K6`y8!!*8
zS7|)SFnXGLP4>HTTw%whHrf_q3n9mIKn{QzBr&PRJ!*Hhh6dYtAV7LB92!9qL`xw#
zH0dT65Qt@6_&FHsQ_M4<Rlz>|(<P9m0;y&_sme}BBY{iCee0vpfslp@cbxN@R*)`9
z;}qs0RG&((D$LWP3<LwGtxU88G*2XmWK||I2GNdcx0N(aD?yYjMgi|ur&-oC5S0f!
z@l}l2bG@0^bpUWG4Hb!^k%WdxKsgu~?Ndo2v`ph8ZAE8?CBWmi(ybgEgU_uRlPg@R
zC6t1I<&PujRj-Vy%M!|V?fHkTT0}B9xC~T*jAE(XK_>AtbGZIglYK)%B=c}1w#Xx}
zs|gj;xQ=3WpW+>=dpL^z^bVs2uGOV+xf!z~q-=b`=#?3gFEL%$iC3xh6@KKZ#A5>`
z!K$zUEvfT>%zSZ4s}3wnO_Cy?FqwhpC#5=jWXnwK%=zG+)tVKf4La``I5@4Se7WtH
z%ReqV(z9ZE5VfVS0k?7wT=k`s$(BR%<RbMI9n{lBvL7jaZsM736tc=&1rxu$B%Q;|
z&xu;%_$+@e4<Prb_9<y3<Q$sWOJ62^%s>aB_o?N!h{LpipmUs6Sa(N0Tr#NH_j}Xu
zOQ}@ABDAfv=$cPAcI50mY5J5PMxI)K7C55XTvyb_n%UFm!Q|E5I?><eZWMQ^+S20S
zsAdYQS}PvN!Y5&h61X;F%WE7_I1jo`)e#FFxXWexky>)w6DU;~1a+xC#S6u?)`h)+
zwPOtq$l1G|hPCW(8ekL2AgIPiO3R)!^BN^=D!u?Up{4GLOl&dFUs_EAS{gj(ryjKu
zTq|?a2OQMLp%qD?RFOkAcXpxau`5w-k$3M332wEX$PmepdgNlXVT?&DG29ez0jEV2
zIXrSte)TA{?5t9T7{q>bo0UZ<SuY=j{o4J~c&qZjlNHZJ>?&{qi~)+;F(t^U1(K@%
z^91?|SuA69Wyu+<R8`p%b2e=;pOurRw_1Iso)8l@81w_RU!-h>I2kmW3z=8&5jrKb
zeMilXf}@X3NRY{KpQT)i<VBQZInN|icP`I5XNAbZ)=iou(GY?)jLR$~f{vcmRI*13
zm=4x%zSXHS<=6rM2y>qGis4MSi;#K>lSF9S*cs3}%auI<t6yd@VPOl8Q`V|!k1R7A
zc^C!jgIa7h<;N!-D(#_^o4J=Zojb^0NdqY76-~AYMi)68`&Ij$M7R;f@)jKKrh(*q
zvLX;iC%sEzw{nAdhFp>I3Yr9IB@ctQ^s70yb;t4c0*9UO5;WQreswPFyA`ipOse2#
zZ)&`ktv#_=<79kb6Vj+D-y3IdC%<ZZvn)_;$>ed07KoRqusqhv`w+N1H6)P5a#<9W
z01`>4BE6p45gP3|>$;Y~Qb}<$khtrdW}96@L}yyav6l>b^s5VS4;zRc)S8rV$1Y%C
z%6ej}1YsW|uSz#U>P&Y&STO)r){g>}XFW$1LdgNP!!Bv#P&SN2XC(C<sc0LW2>ZsX
zkNEgMTChIxs^k7X57x9~lgs|CzLc%o>q#&Aw)#@HZ>=@}dK!g(^uJ1&^fe0o>3)?6
zV%mSHU!_Pt*0<19cAx53=~55%t@IU3V0(i7%52~2$JU&`a+^2$vGt%q2l|mxii!{Q
zBBc~W8Cm*2)}V{-P4ubXqy1_KzU1FZm$_(r{{Y8>eJXoD`1VhwK>q;o;NMD~&;C7=
z=~W%cV=jNzFVNJ{f2$u#hUfia{S8eQ`myw;z9GMaiue6mf7eB+C;tFa{{TZ#-v0or
zPx|P!B>w>FU+8JQnJ9xz{{W9wsptEH{ozn)zwzp|JpTZ2f4nJ2;Rm>}_xjW6k@x!3
z>BC@SPu>*jY5T&RO>V&E??2=IZ};l_U+TqBy#D}?`M=+*@qeool#4WB{{U7hoWJYE
zT!;Nws&fATuM|Cmw=Jjoufn4KHK|kmSK(2A8q*pqr+=+2B6s@I*2snwQAIHY6j4AK
zZ~p)vPxYz4<>`Kv3;zJe)BS31`FdZabG^;p!=?L;^{mLh<N1EIr!U-Zt!73403XZs
zqzhuj$NYp_@U1rg099F+AMz1z!nE7{Rau)buD{oQBCK8i0Lwq6SGxZIUHFQzcmDt^
z{*^3juD|P-=~iFwel=Nt*Dunnzux?57Pd2&t9?x^*Zi{jQZH8enp>~=W%QtyMK|!&
zw*LU?&(fls_-b2!^=Ii%p*=`u`>8~q>ev11Ci|&GpX%5B>K4N;+W!ElKT6C00G6%w
StxI3^C+S&#^3}eyfdAQjd2Mz8

literal 0
HcmV?d00001

diff --git a/ecrire/config-fonctions.php3 b/ecrire/config-fonctions.php3
index 6aaa077f4c..ccdaf43d4c 100644
--- a/ecrire/config-fonctions.php3
+++ b/ecrire/config-fonctions.php3
@@ -19,7 +19,7 @@ if ($connect_statut != '0minirezo' OR !$connect_toutes_rubriques) {
 }
 
 init_config();
-if ($changer_config == 'oui') {
+if ($changer_config == 'oui' OR $image_process) {
 	appliquer_modifs_config();
 }
 
@@ -32,12 +32,30 @@ echo "<input type='hidden' name='changer_config' value='oui'>";
 //
 // Activer/desactiver la creation automatique de vignettes
 //
-if ($flag_gd) {
+
+
+
+function afficher_choix_vignette($process) {
+	global $taille_preview;
+
+	if ($process == lire_meta('image_process'))
+		$border = 2;
+	else
+		$border=0;
+
+	echo "<td><div align='center' valign='bottom' width='".($taille_preview+5)."'><a href='config-fonctions.php3?image_process=$process'><img src='../spip_image.php3?test_vignette=$process' border='$border' /></a><br />";
+	if ($border) echo "<b>$process</b>";
+	else echo "$process";
+	echo "</div></td>\n";
+}
+
+if ($flag_gd OR $flag_imagick OR $convert_command) {
 	debut_cadre_relief("image-24.gif");
 
 	$gd_formats = lire_meta("gd_formats");
 	$creer_preview = lire_meta("creer_preview");
 	$taille_preview = lire_meta("taille_preview");
+	if ($taille_preview < 10) $taille_preview = 120;
 
 	echo "<TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3 WIDTH=\"100%\">";
 	echo "<TR><TD BGCOLOR='$couleur_foncee'>";
@@ -47,25 +65,56 @@ if ($flag_gd) {
 	echo "</TD></TR>";
 
 	echo "<TR><TD ALIGN='$spip_lang_left' class='verdana2'>";
-	if ($gd_formats) {
+	if (($flag_gd AND $gd_formats) OR $flag_imagick OR $convert_command) {
 		afficher_choix('creer_preview', $creer_preview,
 			array('oui' => _T('item_choix_generation_miniature'),
 				'non' => _T('item_choix_non_generation_miniature')));
 		echo "<p>";
-	}
 
-	echo "<div style='border: 1px dashed #404040; margin: 6px; padding: 6px;'>";
-	if ($gd_formats)
-		echo _T('info_format_image', array('gd_formats' => $gd_formats))."<p>";
+		if ($creer_preview == "oui") {
+			echo "<div style='border: 1px dashed #404040; margin: 6px; padding: 6px;'><table width='99%' align='center'><tr>";
+
+			// Tester les formats
+			if ($flag_gd) {
+				$nb_process ++;
+				afficher_choix_vignette($p = 'gd1');
+
+				if ($flag_ImageCreateTrueColor) {
+					afficher_choix_vignette($p = 'gd2');
+					$nb_process ++;
+				}
+			}
+
+			if ($flag_imagick) {
+				afficher_choix_vignette($p = 'imagick');
+				$nb_process ++;
+			}
+
+			if ($convert_command) {
+				afficher_choix_vignette($p = 'convert');
+				$nb_process ++;
+			}
+
+			echo "</tr></table>\n";
+
+			if ($nb_process>1) {
+				echo "<div>"._L("Veuillez s&eacute;lectionner la meilleure m&eacute;thode de fabrication des vignettes en cliquant sur l'image correspondante");
+			} else if ($nb == 1 AND $process == '') {
+				ecrire_meta('image_process', $p);
+				ecrire_metas();
+			}
+
+			echo "<div>";
+
+			if ($gd_formats AND (lire_meta('image_process')=='gd1' OR lire_meta('image_process')=='gd2'))
+				echo '<div>'._T('info_format_image', array('gd_formats' => $gd_formats)).'</div>';
 
-	// Tester les formats acceptes par GD
-	echo "<a href='../spip_image.php3?test_formats=oui&redirect=config-fonctions.php3'>"._T('lien_test_format_image')."</a>";
-	echo "</div>";
+			echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"._T('info_taille_maximale_vignette');
+			echo " &nbsp;&nbsp;<INPUT TYPE='text' NAME='taille_preview' VALUE='$taille_preview' class='fondl' size=5>";
+			echo " "._T('info_pixels');
 
-	if ($creer_preview == "oui") {
-		echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"._T('info_taille_maximale_vignette');
-		echo " &nbsp;&nbsp;<INPUT TYPE='text' NAME='taille_preview' VALUE='$taille_preview' class='fondl' size=5>";
-		echo " "._T('info_pixels');
+			echo "</div>";
+		}
 	}
 
 	echo "</TD></TR>\n";
diff --git a/ecrire/inc_config.php3 b/ecrire/inc_config.php3
index c98b076218..da770b97e1 100644
--- a/ecrire/inc_config.php3
+++ b/ecrire/inc_config.php3
@@ -59,6 +59,8 @@ function init_config() {
 
 		'creer_htpasswd' => 'non',
 
+		'image_process' => '',
+
 		'langue_site' => $lang,
 
 		'multi_articles' => 'non',
@@ -225,6 +227,7 @@ function appliquer_modifs_config() {
 		'jours_neuf',
 		'forum_prive_admin',
 
+		'image_process',
 		'activer_moteur',
 		'activer_statistiques',
 
diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3
index 122d728286..66a19bc55b 100644
--- a/ecrire/inc_filtres.php3
+++ b/ecrire/inc_filtres.php3
@@ -523,52 +523,35 @@ function exposer ($id, $identique='on', $different='') {
 // Reduire la taille d'un logo
 //
 
-function reduire_image($img, $taille = 120) {
-
-	if (strlen($img) > 0) {
-		// recuperer le nom du fichier
-		if (eregi("src=\'([^']+)\'", $img, $regs)) $logo = $regs[1];
-		if (eregi("align=\'([^']+)\'", $img, $regs)) $align = $regs[1];
-		if (eregi("name=\'([^']+)\'", $img, $regs)) $name = $regs[1];
-		if (eregi("hspace=\'([^']+)\'", $img, $regs)) $espace = $regs[1];
-
-		if (file_exists($logo)) {
-			$logo = substr($logo, 4, strlen($logo));
-			// recuperer nom de l'image et sa terminaison
-			$nom = substr($logo, 0, strpos($logo, "."));
-			$format = substr($logo, strlen($logo)-3, strlen($logo));
-		
-			// test de recalcul en fonction des dates des fichiers
-			// pour verifier si mise a jour plus recente du logo
-			if (file_exists("IMG/$taille-$nom.$format")) {
-				if (filemtime("IMG/$taille-$nom.$format") > filemtime("IMG/$logo")) {
-					return "<img src='IMG/$taille-$nom.$format' name='$name' border='0' align='$align' alt='' hspace='$espace' vspace='$espace' class='spip_logos' />";
-					$recalculer = false;
-				}
-				else {
-					$recalculer = true;
-				}
-			} else {
-				$recalculer = true;
-			}
-		
-			$gd_formats = lire_meta("gd_formats");
-			if ($recalculer AND ereg($format, $gd_formats)) {
-				// Recuperer l'image d'origine
-				if ($format == "jpg") {
-					$srcImage = ImageCreateFromJPEG("IMG/$logo");
-				}
-				else if ($format == "gif"){
-					$srcImage = ImageCreateFromGIF("IMG/$logo");
-				}
-				else if ($format == "png"){
-					$srcImage = ImageCreateFromPNG("IMG/$logo");
-				}
-				if (!$srcImage) return;
-
+function reduire_image($img, $taille = 120, $taille_y=0) {
+	include_ecrire('inc_logos.php3');
+
+	if (!$taille_y)
+		$taille_y = $taille;
+
+	if (!$img) return;
+
+	// recuperer le nom du fichier
+	if (eregi("src=\'([^']+)\'", $img, $regs)) $logo = $regs[1];
+	if (eregi("align=\'([^']+)\'", $img, $regs)) $align = $regs[1];
+	if (eregi("name=\'([^']+)\'", $img, $regs)) $name = $regs[1];
+	if (eregi("hspace=\'([^']+)\'", $img, $regs)) $espace = $regs[1];
+
+	if (@file_exists($logo) AND eregi("(IMG/.*)\.(jpg|gif|png)$", $logo, $regs)) {
+		$nom = $regs[1];
+		$format = $regs[2];
+		$destination = $logo.'-'.$taille.'x'.$taille_y;
+		if ($preview = creer_vignette($nom, $taille, $taille_y, $format, $destination)) {
+			$vignette = $preview['fichier'];
+			$width = $preview['width'];
+			$height = $preview['height'];
+			return "<img src='$vignette' name='$name' border='0' align='$align' alt='' hspace='$espace' vspace='$espace' width='$width' height='$height' class='spip_logos' />";
+		} else {
+			$taille_origine = @getimagesize("IMG/$logo");
+			if ($taille_origine) {
 				// Calculer le ratio
-				$srcWidth = ImageSX($srcImage);
-				$srcHeight = ImageSY($srcImage);
+				$srcWidth = $taille_origine[0];
+				$srcHeight = $taille_origine[1];
 			
 				if ($srcWidth > $taille OR $srcHeight > $taille) {
 					$ratioWidth = $srcWidth/$taille;
@@ -586,59 +569,7 @@ function reduire_image($img, $taille = 120) {
 					$destWidth = $srcWidth;
 					$destHeight = $srcHeight;
 				}
-				
-				// Initialisation de l'image destination
-				if ($GLOBALS['flag_ImageCreateTrueColor'] AND $destFormat != "gif")
-					$destImage = ImageCreateTrueColor($destWidth, $destHeight);
-				if (!$destImage)
-					$destImage = ImageCreate($destWidth, $destHeight);
-				// Recopie de l'image d'origine avec adaptation de la taille
-				$ok = false;
-				if ($GLOBALS['flag_ImageCopyResampled'])
-					$ok = ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
-				if (!$ok)
-					$ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
-			
-				// Sauvegarde de l'image destination
-				$destination = "IMG/$taille-$nom.$format";
-				if ($format == "jpg") {
-					ImageJPEG($destImage, $destination, 70);
-				}
-				else if ($format == "gif") {
-					ImageGIF($destImage, $destination);
-				}
-				else if ($format == "png") {
-					ImagePNG($destImage, $destination);
-				}
-				ImageDestroy($srcImage);
-				ImageDestroy($destImage);
-
-				return "<img src='$destination' name='$name' border='0' align='$align' alt='' hspace='$espace' vspace='$espace' class='spip_logos' />";
-			} else {
-				$taille_origine = @getimagesize("IMG/$logo");
-				if ($taille_origine) {
-					// Calculer le ratio
-					$srcWidth = $taille_origine[0];
-					$srcHeight = $taille_origine[1];
-				
-					if ($srcWidth > $taille OR $srcHeight > $taille) {
-						$ratioWidth = $srcWidth/$taille;
-						$ratioHeight = $srcHeight/$taille;
-					
-						if ($ratioWidth < $ratioHeight) {
-							$destWidth = floor($srcWidth/$ratioHeight);
-							$destHeight = $taille;
-						}
-						else {
-							$destWidth = $taille;
-							$destHeight = floor($srcHeight/$ratioWidth);
-						}
-					} else {
-						$destWidth = $srcWidth;
-						$destHeight = $srcHeight;
-					}
-					return "<img src='IMG/$logo' name='$name' width='$destWidth' height='$destHeight' border='0' align='$align' alt='' hspace='$espace' vspace='$espace' class='spip_logos' />";
-				}
+				return "<img src='$logo' name='$name' width='$destWidth' height='$destHeight' border='0' align='$align' alt='' hspace='$espace' vspace='$espace' class='spip_logos' />";
 			}
 		}
 	}
diff --git a/ecrire/inc_logos.php3 b/ecrire/inc_logos.php3
index a3b4eb6dad..aae6492942 100644
--- a/ecrire/inc_logos.php3
+++ b/ecrire/inc_logos.php3
@@ -6,9 +6,6 @@ if (defined("_ECRIRE_INC_LOGOS")) return;
 define("_ECRIRE_INC_LOGOS", "1");
 
 
-include_ecrire ("inc_admin.php3");
-
-
 function get_image($racine) {
 	if (@file_exists("../IMG/$racine.gif")) {
 		$fichier = "$racine.gif";
@@ -172,4 +169,133 @@ function afficher_logo($racine, $titre) {
 }
 
 
+//
+// Creation automatique d'une vignette
+//
+
+function creer_vignette($image, $newWidth, $newHeight, $format, $destination, $process='AUTO', $force=false) {
+	global $convert_command;
+
+	if ($process == 'AUTO')
+		$process = lire_meta('image_process');
+
+	// liste des formats qu'on sait lire
+	$formats_lecture = array('jpg','png','gif');
+
+	// si le doc n'est pas une image, refuser
+	if (!eregi(",$format,", ",".join(',', $formats_lecture).","))
+		return;
+
+	// chercher un cache
+	while (list(,$fmt) = each ($formats_lecture))
+		if (@file_exists($destination.'.'.$fmt)) {
+			$vignette = $destination.'.'.$fmt;
+			@unlink($vignette);
+		}
+
+	// utiliser le cache ?
+	if ($force OR !$vignette OR (@filemtime($vignette) < @filemtime($image))) {
+
+		// Calculer le ratio
+		if (!$srcsize = @getimagesize($image)) return;
+		$srcWidth = $srcsize[0];
+		$srcHeight = $srcsize[1];
+		$ratioWidth = $srcWidth/$newWidth;
+		$ratioHeight = $srcHeight/$newHeight;
+
+		if ($ratioWidth < $ratioHeight) {
+			$destWidth = $srcWidth/$ratioHeight;
+			$destHeight = $newHeight;
+		}
+		else {
+			$destWidth = $newWidth;
+			$destHeight = $srcHeight/$ratioWidth;
+		}
+
+		// imagemagick en ligne de commande
+		if ($process == 'convert') {
+			$vignette = $destination.".jpg";
+			$commande = "$convert_command -size ${newWidth}x${newHeight} $image -geometry ${newWidth}x${newHeight} +profile \"*\" $vignette";
+			shell_exec($commande);
+		}
+		else
+		 // imagick (php4-imagemagick)
+		 if ($process == 'imagick') {
+			$vignette = "$destination.jpg";
+
+			$handle = imagick_create();
+			$handle AND imagick_read($handle, $srcImage)
+			AND imagick_resize($handle, $destWidth, $destHeight, IMAGICK_FILTER_UNKNOWN, 0)
+			AND $ok = imagick_write($handle, $vignette);
+
+			if (!$ok) {
+				echo imagick_failedreason( $handle ) ;
+				echo imagick_faileddescription( $handle ) ;
+				return;
+			}
+		} else
+		// gd ou gd2
+		if ($process == 'gd1' OR $process == 'gd2') {
+
+			// Recuperer l'image d'origine
+			if ($format == "jpg") {
+				$srcImage = @ImageCreateFromJPEG($image);
+			}
+			else if ($format == "gif"){
+				$srcImage = @ImageCreateFromGIF($image);
+			}
+			else if ($format == "png"){
+				$srcImage = @ImageCreateFromPNG($image);
+			}
+			if (!$srcImage) return;
+
+			// Choisir le format destination
+			// - on sauve de preference en JPEG (meilleure compression)
+			// - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire
+			$gd_formats = lire_meta("gd_formats");
+			if (ereg("jpg", $gd_formats))
+				$destFormat = "jpg";
+			else if ($format == "gif" AND ereg("gif", $gd_formats) AND $GLOBALS['flag_ImageGif'])
+				$destFormat = "gif";
+			else if (ereg("png", $gd_formats))
+				$destFormat = "png";
+			if (!$destFormat) return;
+
+			// Initialisation de l'image destination
+			if ($process == 'gd2' AND $destFormat != "gif")
+				$destImage = ImageCreateTrueColor($destWidth, $destHeight);
+			if (!$destImage)
+				$destImage = ImageCreate($destWidth, $destHeight);
+
+			// Recopie de l'image d'origine avec adaptation de la taille
+			$ok = false;
+			if (($process == 'gd2') AND function_exists('flag_ImageCopyResampled'))
+				$ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
+			if (!$ok)
+				$ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
+
+			// Sauvegarde de l'image destination
+			$vignette = "$destination.$destFormat";
+			$format = $destFormat;
+			if ($destFormat == "jpg")
+				ImageJPEG($destImage, $vignette, 70);
+			else if ($destFormat == "gif")
+				ImageGIF($destImage, $vignette);
+			else if ($destFormat == "png")
+				ImagePNG($destImage, $vignette);
+
+			ImageDestroy($srcImage);
+			ImageDestroy($destImage);
+		}
+	}
+
+	$size = @getimagesize($vignette);
+	$retour['width'] = $size[0];
+	$retour['height'] = $size[1];
+	$retour['fichier'] = $vignette;
+	$retour['format'] = $format;
+
+	return $retour;
+}
+
 ?>
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index f178a06703..f6147a036e 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -106,6 +106,11 @@ $dossier_squelettes = "";
 // navigateur l'accepte (valable pour apache 1.3 seulement) ?
 $auto_compress = true;
 
+// creation des vignettes avec image magick en ligne de commande : mettre
+// le chemin complet '/bin/convert' (Linux) ou '/sw/bin/convert' (fink/Mac OS X)
+// Note : preferer GD2 ou le module php imagick s'ils sont disponibles
+$convert_command = 'convert';
+
 // faut-il loger les infos de debug dans data/spip.log ?  (peu utilise)
 $debug = false;
 
@@ -208,11 +213,12 @@ $flag_sapi_name = function_exists("php_sapi_name");
 $flag_utf8_decode = function_exists("utf8_decode");
 $flag_ldap = function_exists("ldap_connect");
 $flag_flock = function_exists("flock");
-$flag_ImageCreateTrueColor = function_exists("ImageCreateTrueColor") && function_exists("gd_info");
-$flag_ImageCopyResampled = function_exists("ImageCopyResampled") && function_exists("gd_info");
+$flag_ImageCreateTrueColor = function_exists("ImageCreateTrueColor");
+$flag_ImageCopyResampled = function_exists("ImageCopyResampled");
 $flag_ImageGif = function_exists("ImageGif");
 $flag_ImageJpeg = function_exists("ImageJpeg");
 $flag_ImagePng = function_exists("ImagePng");
+$flag_imagick = function_exists("imagick_create");	// http://pear.sourceforge.net/en/packages.imagick.php
 $flag_multibyte = function_exists("mb_encode_mimeheader");
 $flag_iconv = function_exists("iconv");
 $flag_strtotime = function_exists("strtotime");
diff --git a/spip_image.php3 b/spip_image.php3
index d162da0c32..58c7080957 100644
--- a/spip_image.php3
+++ b/spip_image.php3
@@ -8,116 +8,48 @@ include_ecrire("inc_meta.php3");
 include_ecrire("inc_admin.php3");
 include_local("inc-cache.php3");
 
+$taille_preview = lire_meta("taille_preview");
+if ($taille_preview < 10) $taille_preview = 120;
 
-// verifier les formats acceptes par GD
 
-if ($test_formats == "oui") {
-	$gd_formats = Array();
-	if (function_exists('ImageCreateFromJPEG')) {
-		$srcImage = @ImageCreateFromJPEG("IMG/test.jpg");
-		if ($srcImage) {
-			$gd_formats[] = "jpg";
-			ImageDestroy( $srcImage );
+if ($test_vignette) {
+// verifier les formats acceptes par GD
+	if ($test_vignette == "gd1") {
+		$gd_formats = Array();
+		if (function_exists('ImageCreateFromJPEG')) {
+			$srcImage = @ImageCreateFromJPEG("IMG/test.jpg");
+			if ($srcImage) {
+				$gd_formats[] = "jpg";
+				ImageDestroy( $srcImage );
+			}
 		}
-	}
-	if (function_exists('ImageCreateFromGIF')) {
-		$srcImage = @ImageCreateFromGIF("IMG/test.gif");
-		if ($srcImage) {
-			$gd_formats[] = "gif";
-			ImageDestroy( $srcImage );
+		if (function_exists('ImageCreateFromGIF')) {
+			$srcImage = @ImageCreateFromGIF("IMG/test.gif");
+			if ($srcImage) {
+				$gd_formats[] = "gif";
+				ImageDestroy( $srcImage );
+			}
 		}
-	}
-	if (function_exists('ImageCreateFromPNG')) {
-		$srcImage = @ImageCreateFromPNG("IMG/test.png");
-		if ($srcImage) {
-			$gd_formats[] = "png";
-			ImageDestroy( $srcImage );
+		if (function_exists('ImageCreateFromPNG')) {
+			$srcImage = @ImageCreateFromPNG("IMG/test.png");
+			if ($srcImage) {
+				$gd_formats[] = "png";
+				ImageDestroy( $srcImage );
+			}
 		}
-	}
-
-	if ($gd_formats) $gd_formats = join($gd_formats, ",");
-	ecrire_meta("gd_formats", $gd_formats);
-	ecrire_metas();
-}
-
-
-//
-// Creation automatique d'une vignette
-//
-
-function creer_vignette($image, $newWidth, $newHeight, $format) {
-	// Recuperer l'image d'origine
-	if ($format == "jpg") {
-		$srcImage = @ImageCreateFromJPEG($image);
-	}
-	else if ($format == "gif"){
-		$srcImage = @ImageCreateFromGIF($image);
-	}
-	else if ($format == "png"){
-		$srcImage = @ImageCreateFromPNG($image);
-	}
-	if (!$srcImage) return;
-
-	// Calculer le ratio
-	$srcWidth = ImageSX($srcImage);
-	$srcHeight = ImageSY($srcImage);
 
-	$ratioWidth = $srcWidth/$newWidth;
-	$ratioHeight = $srcHeight/$newHeight;
-
-	if ($ratioWidth < $ratioHeight) {
-		$destWidth = $srcWidth/$ratioHeight;
-		$destHeight = $newHeight;
-	}
-	else {
-		$destWidth = $newWidth;
-		$destHeight = $srcHeight/$ratioWidth;
+		if ($gd_formats) $gd_formats = join(",", $gd_formats);
+		ecrire_meta("gd_formats", $gd_formats);
+		ecrire_metas();
 	}
 
-	// Choisir le format destination
-	// - on sauve de preference en JPEG (meilleure compression)
-	// - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire
-	$gd_formats = lire_meta("gd_formats");
-	if (ereg("jpg", $gd_formats))
-		$destFormat = "jpg";
-	else if ($format == "gif" AND ereg("gif", $gd_formats) AND $GLOBALS['flag_ImageGif'])
-		$destFormat = "gif";
-	else if (ereg("png", $gd_formats))
-		$destFormat = "png";
-	if (!$destFormat) return;
-
-	// Initialisation de l'image destination
-	if ($GLOBALS['flag_ImageCreateTrueColor'] AND $destFormat != "gif")
-		$destImage = ImageCreateTrueColor($destWidth, $destHeight);
-	if (!$destImage)
-		$destImage = ImageCreate($destWidth, $destHeight);
-
-	// Recopie de l'image d'origine avec adaptation de la taille
-	$ok = false;
-	if ($GLOBALS['flag_ImageCopyResampled'])
-		$ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
-	if (!$ok)
-		$ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
-
-	// Sauvegarde de l'image destination
-	$destination = ereg_replace('\.(.*)$','-s',$image).'.'.$destFormat;
-	if ($destFormat == "jpg") {
-		ImageJPEG($destImage, $destination, 70);
-	}
-	else if ($destFormat == "gif") {
-		ImageGIF($destImage, $destination);
+	// et maintenant envoyer la vignette de tests
+	if (ereg("^(gd1|gd2|imagick|convert)$", $test_vignette)) {
+		include_ecrire('inc_logos.php3');
+		if ($preview = creer_vignette('IMG/test_image.jpg', $taille_preview, $taille_preview, 'jpg', "IMG/test_$test_vignette", $test_vignette, true))
+			@header('Location: IMG/test_'.$test_vignette.'.'.$preview['format']);
 	}
-	else if ($destFormat == "png") {
-		ImagePNG($destImage, $destination);
-	}
-	ImageDestroy($srcImage);
-	ImageDestroy($destImage);
-
-	$retour['width'] = $destWidth;
-	$retour['height'] = $destHeight;
-	$retour['fichier'] = $destination;
-	$retour['format'] = $format;
-	return $retour;
+	exit;
 }
 
 
@@ -232,6 +164,8 @@ function ajout_image($source, $dest) {
 function ajout_doc($orig, $source, $dest, $mode, $id_document, $doc_vignette='', $titre_vignette='', $descriptif_vignette='', $titre_automatique=true) {
 	global $hash_id_auteur, $hash, $id_article, $type;
 
+	$flag_immagick = true;
+
 	//
 	// Securite
 	//
@@ -293,27 +227,29 @@ function ajout_doc($orig, $source, $dest, $mode, $id_document, $doc_vignette='',
 	//
 	$creer_preview = lire_meta("creer_preview");
 	$taille_preview = lire_meta("taille_preview");
-	$gd_formats = lire_meta("gd_formats");
 
 	$format_img = strtolower(substr($dest_path, strrpos($dest_path,".")+1, strlen($dest_path)));
 	if ($format_img == "jpeg") $format_img == "jpg";
 	if ($taille_preview < 10) $taille_preview = 120;
 
-	if ($mode == 'document' AND $format_img AND ereg($format_img, $gd_formats) AND $creer_preview == 'oui') {
-		$preview = creer_vignette($dest_path, $taille_preview, $taille_preview, $format_img);
-		$hauteur_prev = $preview['height'];
-		$largeur_prev = $preview['width'];
-		$fichier_prev = $preview['fichier'];
-		$format_prev = $preview['format'];
-		if ($format_prev == "jpg") $format_prev = 1;
-		else if ($format_prev == "png") $format_prev = 2;
-		else if ($format_prev == "gif") $format_prev = 3;
-
-		$query = "INSERT INTO spip_documents (id_type, titre, largeur, hauteur, fichier, date) VALUES ('$format_prev', '', '$largeur_prev', '$hauteur_prev', '$fichier_prev', NOW())";
-		spip_query($query);
-		$id_preview = spip_insert_id();
-		$query = "UPDATE spip_documents SET id_vignette = '$id_preview' WHERE id_document = $id_document";
-		spip_query($query);
+	if ($mode == 'document' AND $creer_preview == 'oui') {
+		include_ecrire('inc_logos.php3');
+		$destination_vignette = ereg_replace("\.$format_img$", "-s", $dest_path);
+		if ($preview = creer_vignette($dest_path, $taille_preview, $taille_preview, $format_img, $destination_vignette)) {
+			$hauteur_prev = $preview['height'];
+			$largeur_prev = $preview['width'];
+			$fichier_prev = $preview['fichier'];
+			$format_prev = $preview['format'];
+			if ($format_prev == "jpg") $format_prev = 1;
+			else if ($format_prev == "png") $format_prev = 2;
+			else if ($format_prev == "gif") $format_prev = 3;
+
+			$query = "INSERT INTO spip_documents (id_type, titre, largeur, hauteur, fichier, date) VALUES ('$format_prev', '', '$largeur_prev', '$hauteur_prev', '$fichier_prev', NOW())";
+			spip_query($query);
+			$id_preview = spip_insert_id();
+			$query = "UPDATE spip_documents SET id_vignette = '$id_preview' WHERE id_document = $id_document";
+			spip_query($query);
+		}
 	}
 
 	//
-- 
GitLab