From 5ec09deb7fb7254aea1820e400f99695ebd0af27 Mon Sep 17 00:00:00 2001 From: Julien Cabieces Date: Thu, 6 Jun 2024 14:14:27 +0200 Subject: [PATCH] fix(SelectiveMasking): install masks for QgsTemplatedLineSymbolLayer Fixes #57564 --- src/core/symbology/qgslinesymbollayer.cpp | 5 ++-- tests/src/python/test_selective_masking.py | 27 ++++++++++++++++++ .../layout_export_markerline_masked.png | Bin 0 -> 13717 bytes 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/testdata/control_images/selective_masking/layout_export_markerline_masked/layout_export_markerline_masked.png diff --git a/src/core/symbology/qgslinesymbollayer.cpp b/src/core/symbology/qgslinesymbollayer.cpp index 2e2ef43eae38..2bf7f3b0af7e 100644 --- a/src/core/symbology/qgslinesymbollayer.cpp +++ b/src/core/symbology/qgslinesymbollayer.cpp @@ -1536,8 +1536,10 @@ bool QgsTemplatedLineSymbolLayerBase::canCauseArtifactsBetweenAdjacentTiles() co || ( mPlacements & Qgis::MarkerLinePlacement::SegmentCenter ); } -void QgsTemplatedLineSymbolLayerBase::startFeatureRender( const QgsFeature &, QgsRenderContext & ) +void QgsTemplatedLineSymbolLayerBase::startFeatureRender( const QgsFeature &, QgsRenderContext &context ) { + installMasks( context, true ); + mRenderingFeature = true; mHasRenderedFirstPart = false; } @@ -4100,4 +4102,3 @@ Qgis::RenderUnit QgsFilledLineSymbolLayer::outputUnit() const } return Qgis::RenderUnit::Unknown; } - diff --git a/tests/src/python/test_selective_masking.py b/tests/src/python/test_selective_masking.py index 0531dca8cc55..97f97c0d02e3 100644 --- a/tests/src/python/test_selective_masking.py +++ b/tests/src/python/test_selective_masking.py @@ -26,13 +26,16 @@ QgsLayoutItemMap, QgsLayoutItemPage, QgsLayoutSize, + QgsLineSymbol, QgsMapRendererCache, QgsMapRendererCustomPainterJob, QgsMapRendererParallelJob, QgsMapRendererSequentialJob, QgsMapSettings, + QgsMarkerLineSymbolLayer, QgsMarkerSymbol, QgsMaskMarkerSymbolLayer, + QgsNullSymbolRenderer, QgsOuterGlowEffect, QgsPalLayerSettings, QgsPathResolver, @@ -1349,6 +1352,30 @@ def test_layout_export_svg_marker_masking(self): # no rasters self.check_layout_export("layout_export_svg_marker_masking", 0, [self.points_layer, self.lines_layer]) + def test_markerline_masked(self): + """ + Test a layout export where a QgsMarkerLineSymbolLayer is masked + """ + + sl = QgsMarkerLineSymbolLayer(True, 7) + circle_symbol = QgsMarkerSymbol.createSimple({'size': '3'}) + sl.setSubSymbol(circle_symbol) + + self.lines_layer.setRenderer(QgsSingleSymbolRenderer(QgsLineSymbol([sl]))) + self.polys_layer.setRenderer(QgsNullSymbolRenderer()) + + label_settings = self.polys_layer.labeling().settings() + fmt = label_settings.format() + # enable a mask + fmt.mask().setEnabled(True) + fmt.mask().setSize(4.0) + # and mask other symbol layers underneath + fmt.mask().setMaskedSymbolLayers([QgsSymbolLayerReference(self.lines_layer.id(), sl.id())]) + label_settings.setFormat(fmt) + self.polys_layer.labeling().setSettings(label_settings) + + self.check_layout_export("layout_export_markerline_masked", 0, [self.polys_layer, self.lines_layer]) + if __name__ == '__main__': start_app() diff --git a/tests/testdata/control_images/selective_masking/layout_export_markerline_masked/layout_export_markerline_masked.png b/tests/testdata/control_images/selective_masking/layout_export_markerline_masked/layout_export_markerline_masked.png new file mode 100644 index 0000000000000000000000000000000000000000..fc57d6cac9ff9489fd28d799a5d4e695383712f1 GIT binary patch literal 13717 zcmc(GbyQVPyzeFi1QDbKBm@CTrQ^^b($d}CA>AlQD4?LEfPjE>cPb(xap+FzK5*zb zyy5p-_ujYOyMNsG*K;kFdYHZUoY^zq`P4+cP?5vOrNo6G2w(oWj5-9NzkndLNE~$V z3ED0BKJeFV*XMdKA&8UV<_FCuSKJGN=pcC+Nll;6JF|hdR5q`~5nUy*TiI{e&{FhL z37IL+UlQ~7U-^kz7|{1weKr>vc=K^v-dI1er9Cf+g&LK^$nKWARJlz%IXg9(_d=oJ z#bj}v9A%^vQBfK`o6z#{xdVfdvEZ``1@*!sS2Huw?FSh~*C+}dwabU1JjmXQ6Y1;c zJ90d6#xN66IE;%!QBe^Sg4*{oTpMpX?j^B+21(G-AwWk734I`l5C;baK{%M0G!TS| zj!po+CR!*q1cipQV?ZGiID9BiMa8$GN8s8g1^ZKGwu}Gg^~$@8qaCfdU+~~a^#;eT zsBAU)ct^o|P(9(5E^+mL^B~>GxM%65=ukU1CXH@qMkpgi1v>QcKRQ$Xo>4yW*go4A z8#?^Y&k{XjV7z;f1Ua~(Kf1T$R23S)3&r-jCu<$?SI~T%N^^abtTQNbz!-yVkbzYWX(coYfU!LaW#^#tgQM`xP(szO{p z^i!cC7TozkwTm`V1K|;u4d&SvMXA#1I~)`u{^Sj)(u( zvaL2)D#^oB3aq3Dd)K=jqL7EhP;C+Or=H6KjZ&vIdIY4~Ztb(cN7gyy{;IH$6kFgn zSZ9PU$T+e%KlR`e6w`R!EK(amd zVo*Z~G_;QT(?xRCH->T*>zrp<$=?2oWr+S;YSeU>S`cxGghxo7=D6O|(sG%p-#=T+ zG->vEn$)uqSkDq&)_m}1cecr*BAImbHP)%EW;|oQ!+w44n{~xk3`9|weNCVHtkX*$ zD|VW@d3b1&$g-gxsuyUAWqNNG3^r%gwxn%%q@p~R1f7F|GDZu?$;pvt0j!_6_f<-Z zjfK;Vb#+a(q|4qu%TWx|JvZT{tXXRqX&Y2ls1zm?d?*;&b%{Gc(d9Pj=;h`%xSGEa z-)>-NIC2yyMTn_wS65%3+-EHm%d@}B7yq1bb#*mab99)U02cewY{6^*w?4J75G>5o z{iWc2^5A=MU2@N!Z40^7=s%#Qo@w?)j*NU1wecX((z-Z5U%w!bRlD4-fH_2DcX{eI`pLk3`dK`q7-h}wX@KB%BTDJr5T-zal`nF& z&ueuCchug~)RZno32W`|x0cmIyCj9&y!`yW`BU~!3S7;ISGj6BE|!*-p!KaS0ZDu& z#hj5lm^AfC*(}F~C`u|?+P$r<1dQ@<-CXs1n4u^>)%@YTW@K!4wT2d7LO0GUQ=i@s zPe<+fXyRh!UCO@S?m&c z3x0lnN*S7pA_5+I3GFsCW**~xD|T{E_NfEp3Bw+Ucomh)AZ|Vgzt$`N@D?P--#C}{&qxMIL z#SXE0Zp!2!L^pG0vZ|k6VoYxO@w2_zChxWWbo|0BmOnKP8#tVArBb zpm`)u1V;w&778GnR(Nde`PGf z2xWLh=A+-Q=O&+;nK@oli__(%UEE==y3hxQZ$*cC2=^^da;OEHZ>c)D<0plO-)eFA zI@$IkRz#M{z0oUfq%H727Y;KHdcv`x#iU~*>W^(_k-hZ73exv{?Rj$E?D8_>m2b^O zc(F=4d~Jg#V^IT(YNX9OM$!BuQ++y1bf@|LYG0bDsHnD!)q5qT4Fhp$Y3U5AaRENQ zT<>$VB7gnp?11Zw`FwWv=xj#$J9UEV8ykE_UiTO7WDy#sl) z1NrH-#kptQUPmlcO4MCX^`aX?b=moag%vaoF3*r-S{T%!VEdZ}U9oFy0|nDs+Um|Q zSy6RxS*G7%UlW+D9kEEcIGWu1AN+S`gy6F|;lIGLaKH3JNm;`#>>I;^r@M&@*Nfu+~d8Y zs?=;2UbYNZY5`u}pT{HkKh2+}p6!(ezWh#sNz>l=W6^cE$Gk@0b5YwjT#BA1Zn}9K zp2}(5{9I$ZH-(3vOZ9xWX^)>{X{5iy6o45Ch6n;$XZ>G~6j9@!Mg7N6EkR?*CEDxc zyooI72=>Buuyp-wcL&d1UcRG~UO?lm^gr3nvoiEl?zQCZihYp7-fLf$dBhSeRV5(H z`l-^a_>VpB7U7+&Rx}dR||X5^XIl&%!tDWOK4O zgj!m(FrW6za;CZ$0tK3^JJWTlfuI*|^jy7=l!qLD9)KOR0_pPw$S%TDT>iPP>3$G#v^P%l+c6}cd z*p^k*Nme=t!~?FcPK*wYW>C{GKX38V)1^44IX|g*##HlK4(8gt<6|#u_+5VKh0rcd z)=vq{s_LB29H~THkg$N$Cn-upZRk^n7#A;BK(BZ^GlI_TiX70tNG^ohd@J-jKeRiy zjxia8voVL+zLgUhigxdC#1HXHj=-LK!pB$Ri?sfl&Z)h9Bpnx|{-wukx50%D(Y{lC zO9l%I>lHs!C*#}Wb2J1eSj?%l26Zk|xL)Ur1i_Kj7~dk=F;1kWQU<4{^jSzgm);6_ zyMRYmPts9MjA;fY%2eCQ-hA1~V&iIKg941E&Ue=+2JCQ|BwwC_n~nJIwb-!lU`qOI z)nHwcjxq5?Nhm&%f8co)gQX5ApkLXw)2GFa1?EW+agdJnd}4Sk6hU@Sc6 zf-am=&5w(dwF)%ZMO*JrwPH7Na{&}@I-{a?8XL=;l!zJ`Qol$!oU~akL;d-#aE5_S zFe9r*@+U)BZY;usswG80P>@AFUQ`5g(2+0V>L+c1rg`v*cW{8YZ{b9yzW!JDhGRuk zIJy0GqVpVMP@9_52MMf&AtR?_SD_1!3zpWl#?}L?m#ZQr|8l^raW)4HZ zu1mzP&*D^Jk{LePV#}MNWI+!eV3Ko6qa%ehNOm-`^{zJbP-nAEj1$5Bv1!T4w))Qq zF{jU0s$(pT`qNY7&SDq`E~41}T;IbS8an7Y%5ml^S$5xEjL(g@HhG+}RulXp(9_<9 z`SgyEoYv@v4Zr^~BuO41m(KC`D>d>@(zv7wJDT!ob?O?)?r*oqbx%>vea>ptT2N<*PaANn zs#C`#aJ2ePms{;@iv~&OBauRl&AmNitCNmu({G;z<6Z%yq(dX;De+U=k4nlPP(cZ6CuT`ZaO5SG%ae=Ekx^OA zPlX-@Kans%=pE9=_1BAn|8{dmE}R_>tEQK}x~IQ7m;_&O4-5=sU0E}XOEUJ0%1f3r zv9UNUEhW{so2=VPzGVGLp=3*aPrAlfAY;w0?AI2;XrY_?>3FSy*_p-2saC0`PsSPn z^_KvyTz9?m={74ZX>s3EgxN6nj@Ok|QK28${QUbnKPz(Y4P;64b^^X(BRkVb2uEI@ z#06I)FiU3%3tueA4qBE?AB;}?Y+Od+!n9VJ8n;oKhkaDtm(6I)g+dV6vG)&Yww!;% z{)DEE+JCYZj$SKZrC+`d+%h0DVgpMBm6!DPqryA?*>~0%W$3C7Tn3(pd?tUD-i%V+ z4l6zKI@vX%vX{aUa{C)5%3P_UstTW(q3&|~xRPRH%tE4&tIqo<;?0|Y`QKH?=vpFg zdz_O-{MvLMyqHhV>pEjW6wkQ2_k}V8vbqLm*r9NT&)XMh9*mv#9#z-WkiM10=83D+ z;h~Fx0RnIsz1ZLL!QWZ;oEcF)_;4&Er}cvXpX|)}{(-=s7?R!>T1QRuSEZvi70Qf6 zPv83%d%5mxYyecBx4f|MCG$jH=cCKj8N4>VCy$tqkKcN>0zW|fSaCsb{{De3gKFZL zCazr<^~x`cT=niD`{t85f0XUqD8+A>B%!Vq%~h;-S?hVBi3tB$>|LX+i2F>Rdf2R= z2|ZIg)yOYyGP7Gy6T1!b7w)1>?|+r`R07BMc+$o$+Nj?3d!w)>D``twiT|s)-XiUy z;(y-R$F;r{cYyR(;W*Bwa%E}#vrPd+KF0-`Ga`ub3x20584X7tpNZ^NE-ft+-xX4} z*ljEoD=?wL$l+fLbI^ViG_I+!H z2P&ZfMK!!Kl#iQR-E?Xs(W;@WEY5vTPxY&lq;xVnNpacch8Q1R)@hg3k%w&BhHfvV=^*<#Qc;u*C(=4NX&Uthrit`UsQG5pI2XjqjVPulmw zLgA-Rp9%`vp5oBtTG0gN)asYi*4C~feR+yt*9+L<^*;L#ugKp5@;)_{s*)c^Eo44O zcE6JS`Y(CgX;SbRxoTMFzzXqi1U2|~JKywxV{M`+SiHT(77xF%IXMh8aROJyd)w=`i#B$q8T0((k77wm z?$grFH+nkA$;mM#JSM^QYZA878=E_^LPeSRAr`r}&`l`g}&B5)PQCf=m& z%~22O;8h|ZS9+vmWQ>hgbSJVzYbzbStkTF=+4uuX2u!Qc?Y&CD7F)_`?=XpN3zNz+ zb!8>h0}aPt9EOyj(JJb@Z&MnItUQ%{u8klwX(( ziF@`)zVfgGx2UG325`jbvAPtM{H|ZW(9{082@K}Qgv6l-^dvnk?WLAR+>#($ZRF6< z@9dsPub9fezp*BVM02(tUoa!yKMNv_k`cSu=J^v-g-?u`rOTcn?D=P?$|w9PWqfRm zpNB`9hiAw>O6FlEJQ#qitE;R2F&XkYPwU3&@sj;yvh#Rn!kA}Cg8f6Gs>we6VHM0G zLPBy^T{DPE9|q+Mfj&kN4o(ylYyS- z#Z=DwpY`CIp{X_bhSy^JrSZY~K0h1xNa9Q^2V*@Hf`hNGE>7+n3cY<(%+Xqxy`p zG+B+Byqvte5`*jmFtS;8r)nJb=33yQC!ec|aBYz*%En5|%$XiY3DS(UN3!%}#TxpV z`-eg+9qkP7#N@+@KX`?W8vJHKNT_|}YCZistSa8(f5J&Glej|aK>RkF0=$zC&jDp& zCj+D;E!_^yQHzz-Y4&qo(Kp*Y5qcQ|ul%Ma5$d~5uCvrU~JM?`%$V2QT0{xxzBYA3f>%uzGevcC%BjBBJU@}DL23DdnC1x?m##)%>J zQNgp#y$Ih&oAwmebDLC&IL&g0zi6zu(BR0Sv67#?iCIYG&%g)l&_exDV#l#z|ER@# z-&gHye>Ta{LhIs5P11Yk9`~+AMYZsvLCu}n#sZ4yWwk6dAA9bNVN^I)t?Dp$%%>?? z84D{v>AMf1zws?gh{7XRnq49zh2sfS0WFh&TWI`G2<5KqB zzqEG2*O-!mj;l?{IN(E|C>trah@#l#`(=0McW8P{JUkB9n?sKt_I$j3LJ`ZO_ZZ@G z|1JvCTWxC8&7HL%#TlX?>oB2&xh*BEopojCKa^~2>NdIN^F7w9v`c99)>DgQPnfRj zZt=JDN_-b5?)8uyYi={&1r<^nkP7|su^Yfeid$oNB4So1G(Pe@%P!;GE>N~j3s8}9 zYgiedRpxgN*w#tnZfGxteD6hQ*?)4XH`2`DI3BS7kyNL8 zr8voQnikp&wr zRcprzWXNZ=x9wx;v88BVS~m2_wJ5y)o=4NQzgR9Vh6Py*HdH5jdhgxQ#F~lQDJlMh zZF3;>_!BVbB9FE(M^mG!9rhMgq01hg69lwww?oAi+ncv_v8{))5$Ac|)gz!cJ?+VN zR2|G4B>Da&=aB2;fM$(jQ(B+u`Hxzk&I-PtB#Q8J*e<6u{-w}|ysU2hv1%<+JRc8! zBq}OQ6ONbLGrBV4M;kYlZp8k|h40uXwR971SV|!F4E5us#7gd?*ZXwwE|n(J4TuKC9wIqSkY>Z zAH0Zi<9ic8A(4+iwH?vicB6j1XQQE!N7G7H;zAsVn(IWuxT4>*VR4ANI=-_?4T zI6!sJ!?CvG5a4TvJ!$M9+yVe(fGVgYMylS>n<=i^pV{U4iJmMp!mecD+xdk5p>z?s zrUnUrmtKU|-u+;0njZlf>j(O3x$5QoK^5_nYN^&(pUnOW>2_`28g)E9#B%B)aIp~9 zt)mgcQl5OePra1?y)OXKJ+ixewh)CGDr+Z)cxtNPyp|#R zH`4=ag%G}NJ$|(2A46~q=k>~L3;kF8XHkm{H3gb?2nC+@gx*2?U+S8lcA| z8(bPMb*H>qkmT?Eh6b(9)QF|cb?!M3dP2}Zaud30mHGY!R(FJFe|y)HA&L+V0j!L? z4~EHluz zzjihxqWgVEiN~}Fq_Cnef5lxf4Ujn~|Jqd0 zA>;FhZ_l2|(>Vufe}=(>hx zEuODj>5)&70v;c{8gFtBpDo#s2|cm?`KR1{e`7=Jw(qQ6lpCwcKl~CmQ^CC;=Rsbo z$o%YB5?oMh-&;$z&gi$ehW<29)COiX1QlzsHnR|k8rAevcwY%e$*>oa+yo~k)U<%8 zLh;~Thg^<2lXSfN*yuyx3_(!uH`e(%=OB7|V5*;R-hMilc=zUG_VVXVlwy=t8NRyu zcOXc~BGoI5u)uJv@!12QdqW{L70OL=d3h7G3IF6W#?%XR-ERC@jmOz6+SJWYXF5P5 zKHciY!GrIUP6V&~LC;O4vP{n&JGv}qg@Y%s=}k2oh~3J0MgztbGW|#_FyYwlgZ_nF zi}lmwq@JSc;Owl?#YvuWnpE+c5jynbr?-dhY_oxO!TVZ%5fvF6$%T7T);2cS*w{{D zkGtIbkGBEdNl#CQ!;rnlJJa{VAVLspEwg&-qBALHCkKx{u+O>Q)Tl>-6i9xy2b0|R)5=$3~p1kKzHUBd=)7)!ggn(f+0nT(q~~XM^5KbMr#zCfab>knrra~&Tz3h@G_le8~HNf zCx?g0;*?MboDM-vh#L;LY;|5TS;Q3jSQ4j^e#>04@xBjr3O2-~H~YJ)O*~;SMZ3$aKhk^*)W`54YHS&;wsZKm{svM=ri~ zL=YIL-G^{M$vJhMkkE(&$so$yO7zu5UnO=jK(T>ZfTC|OEPcUZYE1(re+?&tBjbW9 zQ8F$1yp8mmyg0BuK=lUGe9KynrvN#Trf;5wOtm@MeKK4I7GA3Mk1pV@%L9(G;o;}w zlUx~4qu=7b0+>u&ZjF9iHcKVDgG01&qlf&(;wGP!jM_Vyhhgt`cXwl`1b&%U03kBG z!z|6gfyybo0W28#_}#e{U`qgdx1>k-!*fEZf5E@EcOAas*FTk)Cf7$MnZc-rW0mg8 z&pj*lZKIo2!Ph7bgIbUt_}fEFsPjzU;wF<76Eq8iYwxA_IX-@VenG*BYTbt)D5$8a zvcx`WY6UKaldrpM++@Wwhav%%lJ4lXevU;u$&@TOk}mpab-;klsE@F$>Vcm%RXcV>Hj(lay!lpZWGth_twM6ypa;ar@Y z`X}sT(r4-dVv*gWFL|lEz_m!Yt()7^v_AJd9UsaE4?LG2pnWU2mf(Nfy(uxbGTUyT zuRr98rktzZ%T^9j1MoF`E^Lbsug|-sN@{kTLqw?vK&}PzK*@sJnQ0jI+S`7|aDPqN9=0cf8cd!hOz?`!UXs-@kDZa_+w<(O%m3VM=f- zME}U0@{SINZ0Fp6d*Z24S^LDq#8`;|zS7Fqr($Ar5a8(;{680yD8YtZ`zT~&l#oKg6Dq! zj)a%WH5fXB_(3JRh|!0xZ-rCi<2FGeCX`@?yNRg&W84+x)M?+hq^T!EhZEcwAm=~4 zcV{Y!ANGIKE&@ffRG-_!*7jQvQQ9a-6y)dSja_~sYw^-%O6q9=B4us*-4GgZB`^jy z@TwYP*7%K#j5zJqthn!A>^XzdT6}h>nknXFGi6t9DO69)6mt#?7$VsZ2aRBE`5&&U z6%|#d(&31BZPSHq&$k61xd2^=zUKg_K=^Tcpby=a?tXq#lLZ6eQj#ufS+$W-zm&Mv z_m{eKierGUm0QPMbL5OeZ#@?a7B{@Nm%^VtL`xU{@RgAJP2ga>!RG&VJ;L|z z{Ecfj7^)g7ID0%@RJL89`6qjYe|2qbBO*)xP-VlY(}}M`(UpUpeckVTs_BWa@YEM2 zP*rO&L+2h@4E)BR8VO!b{b=b)w|AhtFla*7$Ms7W59XA`^#-rLSWd^F3sGsX^^_R& zHO0{bNHs%k4F#I^K|!sOR=vSoSteUw#{OcKt6a&Iy2-yAI*bEihFW6r&Y;B`GEbA> zD^Ko}YBSo`mfR`uwa0jwFyEn}KLf`MnOl@1lf0D77~Hicyu%f^OHSt0T^0vO%xb+#Bb4aQ@*A%QQy_@;%>V}T@W_NcY79pxeAUn?$=Kv2YeqdK{*xy~v$cQWCS; zxHsaNxKz($)357+2tLmb9=agh5+)^}7L?G~M#9DGzM(?^F}5ezmRx#mQ>(U{GSie;Seohe_@ z>AJC1%%v)ZmYEK|*@OH*R<#K9=NRr++bAo0*efm+a9WFg#2S$UfOf7N5zXKiuvT0+R8c_MGc8s#AdN+$CAfL82o;DvD z@(W;3+vv%LWWf+-Iz&LOF1xT%xRw6zz{5egRr12)_xM!&6Ru=(i9618AD&}w8e#3Z zkDJ`}NiQq}cGZp1k zy5b*1^(1j=B=YjeRH+vXoIH%qK26BH#2n5;&am3-jY z41*545>z8Dzi6@!dh>w%!uW*Vx`6O+>nbnjKNye%1_w;M-gOZ@a1l%&N|7F}pnbel z^C+1g8P)!$h%9^?GzjF@d@~9Q8+VKD8}pz4?R=};<4Wy~y7aZ^8plhs#klD`Jg3cH z4(Dv{q}65{1eOL4ZGsTrv1?;~Rr|iwfe^x&8FdB!q|Z!R>*~fQqFC}pw*jP?*gsO& z8tqRXMr+3=^qJ#-`czWfP?iw0gQxX+NgS19cc14f*KfArWmg6f1&_)C(-98=!Vtz#zaHl$mc{5-hE?&qdQIGv>S0WixE_=mv3wkS;nz zbD<_HsF4Fn;_l0lDT|D}-S*SGFSWEbbpBvL1K{@Zi7NmmZ}>%)_N!X(J5HD$J>~`T zuVPIGT3`kkR832ZMAnE+FfKNBivROZEM}F@u8p|Rf+!9wPED((tgK9zeMmfPsh;+7 z0eeiVV6~{MwQ`X?S6zO582jc4%`$2qfiKsBgeNOukz;1rr2z6Yw5(@)xh^LTT0#rr zU^L%brL6h3*fB?&0|0wgwKq|bW0wL#&mnltPiA!vlcslP4e(1UMrOtnP(YjV7xVcM4!s zT}y5}B`F@lftw?b-*_^Fg>{&zk=Q8!v{F7>&z#Uru{C%L`erjcW>wB4t7fT}k)D2q z=pfK@^0JVfvNHyL=pO~#S1;Jf@b`LOfKcwnaQ;SJ-7Ux#3bi5qCyDgpIsy2#3TXvi zz~Fh@4xgCV?y4j) zbypzpxd4wCOV2JT;rOJW)-MXc5FoMznwt^gmsxXp#<}W3z6X}WItC7Mo5I`>=KbBp zvrw;%I^G@LeAUb`tsqOwuQfG%DN1Cxw`A2Q$vHnM*uXP(*4Mw>FG*0yo%7q`F#3cR z5&}vPvT|}8gu;5cXr3`p-_0MkYY`Z=kFoftr~uC1;-o#r6=ILXuNW>}$H&Afott~!vr zAs;1U?(FRB=-7)=4wlM#QK7pm*uRP#Gi-40yadNAaOf~Iy1owEaclyr`ngb=k;u&+ zZwy$Q)2*A(0?#`60hS~o$faDi>;=LfUDN~C6d*<$*X1O_(B(E>X5#&16|H@1;Kxfo zNy2Axa%*dAE+E_saAwlibO26loSpkKT9wsE-gZ75x(oG6;K4mH|FL!ea|Xb7qcF?> zpxzzS)dkk^*U`>?vv1IXMSY~8DoG~@E_r)-fd{T-2G1Gj9KT@U1%XF?{^Ofa-5IZ| z+?y=)5EI{xsZCkxuARxM{NuKo$F>!^jva6CKRo|QtAn)UF6iU5siXiYX8`Q)Q&Jvu zy~Thy2P>{7C_@hbEu>?71KnC)0jVEk(zBZ$a2VuRp zHBup$sK7wYDjaZ7aZvBUHacHzM=W(0oHzLA#0@xtlJ^Mue>r;d?{zma)&J