From 0e6b4fb118fb8e78e6a173539fd9d9e76ff91a16 Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Wed, 11 Oct 2023 12:02:10 +0700 Subject: [PATCH] [layouts] Fix line height setting not respected for HTML-enabled label items --- .../textrenderer/qgstextformat.sip.in | 14 +++++++ src/core/layout/qgslayout.cpp | 6 +++ src/core/layout/qgslayoutitemlabel.cpp | 7 +--- src/core/textrenderer/qgstextformat.cpp | 37 ++++++++++++++++++ src/core/textrenderer/qgstextformat.h | 11 ++++++ tests/src/core/testqgslayoutlabel.cpp | 29 ++++++++++++++ ...ected_composerlabel_converttohtml_mask.png | Bin 0 -> 18936 bytes ...ted_composerlabel_renderhtmllineheight.png | Bin 0 -> 19284 bytes ...omposerlabel_renderhtmllineheight_mask.png | Bin 0 -> 24852 bytes 9 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 tests/testdata/control_images/composer_label/expected_composerlabel_converttohtml/expected_composerlabel_converttohtml_mask.png create mode 100644 tests/testdata/control_images/composer_label/expected_composerlabel_renderhtmllineheight/expected_composerlabel_renderhtmllineheight.png create mode 100644 tests/testdata/control_images/composer_label/expected_composerlabel_renderhtmllineheight/expected_composerlabel_renderhtmllineheight_mask.png diff --git a/python/core/auto_generated/textrenderer/qgstextformat.sip.in b/python/core/auto_generated/textrenderer/qgstextformat.sip.in index 884909cfd4c..3b0923d9142 100644 --- a/python/core/auto_generated/textrenderer/qgstextformat.sip.in +++ b/python/core/auto_generated/textrenderer/qgstextformat.sip.in @@ -729,6 +729,20 @@ Returns a pixmap preview for a text ``format``. :param screen: can be used to specify the destination screen properties for the icon. This allows the icon to be generated using the correct DPI and device pixel ratio for the target screen (since QGIS 3.32) .. versionadded:: 3.10 +%End + + QString asCSS( double pointToPixelMultiplier = 1.0 ) const; +%Docstring +Returns a CSS string representing the specified text format as closely as possible. + +:param pointToPixelMultiplier: scaling factor to apply to convert point sizes to pixel font sizes. + The CSS returned by this function will always use pixels for font sizes, so this parameter + should be set to a suitable value to convert point sizes to pixels (e.g., taking into account + destination DPI) + +:return: partial CSS string, e.g., "line-height: 120%;" + +.. versionadded:: 3.34 %End }; diff --git a/src/core/layout/qgslayout.cpp b/src/core/layout/qgslayout.cpp index 276e903c22d..eea290e087d 100644 --- a/src/core/layout/qgslayout.cpp +++ b/src/core/layout/qgslayout.cpp @@ -1124,6 +1124,12 @@ QList< QgsLayoutItem * > QgsLayout::addItemsFromXml( const QDomElement &parentEl { if ( label->mode() == QgsLayoutItemLabel::ModeHtml ) { + QgsTextFormat textFormat = label->textFormat(); + if ( textFormat.lineHeightUnit() == Qgis::RenderUnit::Percentage ) + { + textFormat.setLineHeight( textFormat.lineHeight() + 0.22 ); + label->setTextFormat( textFormat ); + } QgsLayoutMultiFrame *html = QgsLayoutItemHtml::createFromLabel( label ); addMultiFrame( html ); if ( item->isGroupMember() ) diff --git a/src/core/layout/qgslayoutitemlabel.cpp b/src/core/layout/qgslayoutitemlabel.cpp index 8130ea47f49..fa6707621cf 100644 --- a/src/core/layout/qgslayoutitemlabel.cpp +++ b/src/core/layout/qgslayoutitemlabel.cpp @@ -641,12 +641,9 @@ double QgsLayoutItemLabel::htmlUnitsToLayoutUnits() QString QgsLayoutItemLabel::createStylesheet() const { QString stylesheet; + stylesheet += QStringLiteral( "body { margin: %1 %2;" ).arg( std::max( mMarginY * mHtmlUnitsToLayoutUnits, 0.0 ) ).arg( std::max( mMarginX * mHtmlUnitsToLayoutUnits, 0.0 ) ); - - QFont f = createDefaultFont(); - stylesheet += QgsFontUtils::asCSS( f, 0.352778 * mHtmlUnitsToLayoutUnits ); - - stylesheet += QStringLiteral( "color: rgba(%1,%2,%3,%4);" ).arg( mFormat.color().red() ).arg( mFormat.color().green() ).arg( mFormat.color().blue() ).arg( QString::number( mFormat.color().alphaF(), 'f', 4 ) ); + stylesheet += mFormat.asCSS( 0.352778 * mHtmlUnitsToLayoutUnits ); stylesheet += QStringLiteral( "text-align: %1; }" ).arg( mHAlignment == Qt::AlignLeft ? QStringLiteral( "left" ) : mHAlignment == Qt::AlignRight ? QStringLiteral( "right" ) : mHAlignment == Qt::AlignHCenter ? QStringLiteral( "center" ) : QStringLiteral( "justify" ) ); return stylesheet; diff --git a/src/core/textrenderer/qgstextformat.cpp b/src/core/textrenderer/qgstextformat.cpp index 27c675aa089..76c80afae23 100644 --- a/src/core/textrenderer/qgstextformat.cpp +++ b/src/core/textrenderer/qgstextformat.cpp @@ -1225,3 +1225,40 @@ QPixmap QgsTextFormat::textFormatPreviewPixmap( const QgsTextFormat &format, QSi painter.end(); return pixmap; } + +QString QgsTextFormat::asCSS( double pointToPixelMultiplier ) const +{ + QString css; + + switch ( lineHeightUnit() ) + { + case Qgis::RenderUnit::Percentage: + css += QStringLiteral( "line-height: %1%;" ).arg( lineHeight() * 100 ); + break; + case Qgis::RenderUnit::Pixels: + css += QStringLiteral( "line-height: %1px;" ).arg( lineHeight() ); + break; + case Qgis::RenderUnit::Points: + // While the Qt documentation states pt unit type is supported, it's ignored, convert to px + css += QStringLiteral( "line-height: %1px;" ).arg( lineHeight() * pointToPixelMultiplier ); + break; + case Qgis::RenderUnit::Millimeters: + // While the Qt documentation states cm unit type is supported, it's ignored, convert to px + css += QStringLiteral( "line-height: %1px;" ).arg( lineHeight() * 2.83464567 * pointToPixelMultiplier ); + break; + case Qgis::RenderUnit::MetersInMapUnits: + case Qgis::RenderUnit::MapUnits: + case Qgis::RenderUnit::Inches: + case Qgis::RenderUnit::Unknown: + break; + } + css += QStringLiteral( "color: rgba(%1,%2,%3,%4);" ).arg( color().red() ).arg( color().green() ).arg( color().blue() ).arg( QString::number( color().alphaF(), 'f', 4 ) ); + QFont f = toQFont(); + if ( sizeUnit() == Qgis::RenderUnit::Millimeters ) + { + f.setPointSizeF( size() / 0.352778 ); + } + css += QgsFontUtils::asCSS( toQFont(), pointToPixelMultiplier ); + + return css; +} diff --git a/src/core/textrenderer/qgstextformat.h b/src/core/textrenderer/qgstextformat.h index 4d699e77180..206da2ebbcb 100644 --- a/src/core/textrenderer/qgstextformat.h +++ b/src/core/textrenderer/qgstextformat.h @@ -657,6 +657,17 @@ class CORE_EXPORT QgsTextFormat */ static QPixmap textFormatPreviewPixmap( const QgsTextFormat &format, QSize size, const QString &previewText = QString(), int padding = 0, const QgsScreenProperties &screen = QgsScreenProperties() ); + /** + * Returns a CSS string representing the specified text format as closely as possible. + * \param pointToPixelMultiplier scaling factor to apply to convert point sizes to pixel font sizes. + * The CSS returned by this function will always use pixels for font sizes, so this parameter + * should be set to a suitable value to convert point sizes to pixels (e.g., taking into account + * destination DPI) + * \returns partial CSS string, e.g., "line-height: 120%;" + * \since QGIS 3.34 + */ + QString asCSS( double pointToPixelMultiplier = 1.0 ) const; + private: QgsTextBufferSettings mBufferSettings; diff --git a/tests/src/core/testqgslayoutlabel.cpp b/tests/src/core/testqgslayoutlabel.cpp index e0e9ad35626..b19af70977c 100644 --- a/tests/src/core/testqgslayoutlabel.cpp +++ b/tests/src/core/testqgslayoutlabel.cpp @@ -55,6 +55,7 @@ class TestQgsLayoutLabel : public QgsTest void marginMethods(); //tests getting/setting margins void render(); void renderAsHtml(); + void renderAsHtmlLineHeight(); #ifdef WITH_QTWEBKIT void convertToHtml(); void renderAsHtmlRelative(); @@ -313,6 +314,34 @@ void TestQgsLayoutLabel::renderAsHtml() QVERIFY( layoutCheck( QStringLiteral( "composerlabel_renderhtml" ), &l, 0, 10 ) ); } +void TestQgsLayoutLabel::renderAsHtmlLineHeight() +{ + QgsLayout l( QgsProject::instance() ); + l.initializeDefaults(); + + QgsLayoutItemLabel *label = new QgsLayoutItemLabel( &l ); + label->setMargin( 1 ); + l.addLayoutItem( label ); + + label->setText( QStringLiteral( "test html
with line height." ) ); + + QgsTextFormat format; + format.setFont( QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) ) ); + format.setSize( 48 ); + format.setSizeUnit( Qgis::RenderUnit::Points ); + format.setColor( QColor( 200, 40, 60 ) ); + format.setLineHeight( 2.0 ); + format.setLineHeightUnit( Qgis::RenderUnit::Percentage ); + label->setTextFormat( format ); + + label->setPos( 70, 70 ); + label->adjustSizeToText(); + label->setMode( QgsLayoutItemLabel::ModeHtml ); + label->update(); + + QVERIFY( layoutCheck( QStringLiteral( "composerlabel_renderhtmllineheight" ), &l, 0, 10 ) ); +} + #ifdef WITH_QTWEBKIT void TestQgsLayoutLabel::convertToHtml() { diff --git a/tests/testdata/control_images/composer_label/expected_composerlabel_converttohtml/expected_composerlabel_converttohtml_mask.png b/tests/testdata/control_images/composer_label/expected_composerlabel_converttohtml/expected_composerlabel_converttohtml_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..bb177bbb2aa9f411bbaf372fcf873d64e205df2e GIT binary patch literal 18936 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 JiPBfy{|mqV$m9S3 literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/composer_label/expected_composerlabel_renderhtmllineheight/expected_composerlabel_renderhtmllineheight.png b/tests/testdata/control_images/composer_label/expected_composerlabel_renderhtmllineheight/expected_composerlabel_renderhtmllineheight.png new file mode 100644 index 0000000000000000000000000000000000000000..a55ca67ab3079e48a9ecb253117c90464988287d GIT binary patch literal 19284 zcmeHvbySq?8|EkqD&=R;rF2Vo7<6|GB`Mv_Frp$#NO!4pOE&`|Al=|lBP}@+0}Mm# z!*Ao9-97vFp561!8O~5M@B2P;$8}%V^~^_2bp_%(RCgc{2(gml3vCGGh9v}oM|JBu z_|3C0-%apv+fC8P69OUWy!yJ<<63A9fiOUnUOd(H%h;ax51NxZ@7Y6}^|GYT #e zZop87pK0FQy7l4qNpKk@P(@)51tmnYS6_*iq%SbzxrbbpnAC?=KrI?wR9E~Q8a2w8<_PuotCI?~B- zLE7Q}#6uXAzI3m-sie24O|=*mQ4*~jzM5z*(_VN_PX_tTKsJBvHer3;^qfaQ%ixMc zutTp$uB~L)>zRkg1V@ufRFPun(u`r6)T%v-+ze%9YN$2mPnAK7O?p^&^~;Fdrwd9w z4>K^K6GXN*_6_uUu0K`6i|^V_5fb{(MY#Q7Vt838tJy{?H!dheqcmtiLY(O++=tj0 z7W4UG!=yIeRL5qit$&ByT}TSS|IIENydpbmuG14n&FMATeSAtC*7TjD2_k&Rll{s+ zB#^k=47I+r^sjOzvFg#1jP_yY;ry%Jxuw`J%sL+APbgTD-jN(FwEm=7vaXbWV7>lN zYQqepqx~^(hSu6cEH+wBc#si1zT1$vMO3Q@*{z?(DTAri`FXZaHi@3NCfV|X?-(^F zwhqv7w61x1KA}tyixozeYqIp3*>*jw}teA7sa zDP9EV?HT}ROr5g)N|R>frXqsrUK9r|T0zpE!~|5yE}q_i1ck#NLKrCVhd9)<_-_jd zhC(0qh={EXDGpl5v#4LghcJbMi?|(u#cSjEuNT2t5I3e0?u=y@Z?m`7PIf66poPf( zXjE!1{JIq~BYwFn^-n$P*y1NIukPzl9Y6Iar8^G}D)I7qt7ey`5?pRY7Y@@GE^JjS zP}}<|z}gC@D+u1^9|~5_yY&A2_HbpU`$29LyDBdyUjY*Te3voC7n(;Fp+uFka}-&0 zAJN*wJ*V`P{Ris4L@T{n}b?H0`qZ{;dcB&c+Tlf!B<+)bY>MxZA>uEljNn z+q9xzlp@Q)lQR_tYS*l(w;#>TOx3zK!+q6$?2LNNrzKnU_YbDYa9WL>Fx}C5muCEo zcyM2sopYW9Lc#q(>GjM7N^0gnNs#Oo2XE2o#UM-i_OQWGm7Eptc~i%=7jv0q6>U34 z)s>!u-EI+1{)s}Yv$fkFwyl!Lg7%m^yI&9WP2}(mH>vHoR&1UehlR|X%k%IVaixy4 zh}mkOFU-3S+1+*Gah*b#XqnlAhpVYF#2Qklqa$1u6k0Y;Z~W3a=IyiAC6^-f;cJY^)WsM{*4k zhG%*2^V+=GhFPun7Zq_CBVJdF{z1MmjlZ(bJL89i&UX@1%#8z2;g4x|>!wl8f#>t* z2yEvs6@=L#hL=7lTFIs842^5E%zUCa|z~HzlmA8Xo< zd}a{~>3;o~P`m7fb>~(L#`k!^ry?j`?{i)G(Qa7U z{Z^hr4i0^8b#68MM+>=Be(`Qr+yNc%?V{3-73HmSq!n?$!By1cJYK@s%wOPR`q3^2 z6=t{a&US?_aZANN@<#VQH&>bDj#s0>5wgtLE9B>OmdANhcI;PW8uC%l5|*mCyS{dx zIt~mOX?LaS=VzPtxfw;qIu|#y%SQyu?6mLH*G!&mPw!j?4F7(0t~Z%zaOQSYji_Iv zGVYqL^-pi3%N_qO!GRHZEmhSNA*Rt5VP9&Yb6|1;9 zc`3q1xp9}w#h!3dq;FPqZIEaiS-;c5nSOB;z85)Bb}@?Z3Z{VzYe&nsLOJhm4t{7@ z{hsJJS+zENM@ZNe@z?k*<;G_z83d~)bo%_VS=bd7bSe^Qm+JzOAuxE4`nj4FA3Eud ze|)Kb_5CIZ$Zt1U)$8&!aLfX?`9+f5PJYJ*57}&B4@^h~(etx2;M@xC4v+curo1!8 zL%Js^oBCHXe5=ub?brlUaPiS@xosC!%S!g7=8XRl%rRL(%Jjkk$)TV&UMhy1Gi>ri7(t+`cMdbT%|h#(NR zSD@@Ns^oUI9&A!4^!#Qj-asNmB+tLLs1<%`+zsg=IBpALS`}2`dQjXFLA{k~=xgb%^Y30*f0(@O?2x#~qJPG7bZc<{sQeBe1bg zbWuLeb2BH05#Y=j8vQxe)r!)bl*cYg-0tJWI6no3JKaeZ(|b6w||u3`*mEiC<( z{4RJ?gejwEV8ecGAo9a3ql}jFP}vRCJAN?9OgjVIJ?FI2 z^6e{Ad=>P1aM?Aj7wU7^yK3WA(Z&;7kvXmPm+I1C`d$}CmpcfVwFeKqNVezcF@D6t z!bm4Ma|waV!}!a<$hh)AVV9EDgOKv5s-@ramKUNuo{6S#z2UoKRr_UA@C%i(k5+3F z?x;r9;G6+Uod87cRv%^c+fttOU;S-a@EN5IX1TQ92bj~ei__?tW_sm9w@}Z~mZgZ{ zLF_=RZL{gPH+ai8)AjxI2rs`Db6`Q0N1)yjXswZer02V>xrJe{v6hh^s#KsV)eq7< zkB3Kj1z2+rtl1x5a^U_jpSNZoW0$Sk=(jKSDwtq2eka4BcJNB{yEwY2_qgnv{Ife< zVo51O|MwC)XWIveafDF zQmMZ{!5qvH)Y}5yRMnwSPg`ks^pq#h0lHYr1hvkb6=bfb){in5@Dhl(KZ`+Al*JX|($J>TZk{=7xw3CW*nSzPMk9kO*w6U6;QhMdhfQXvijxR#lSU z)OTAeGCHuCjCxM2MvE@p#03nH#{`|bx?86?--egOiCJx)(3>aw?(cmx6OCh6x$f03 z?Xxk!3TL&>z2qw>cxYZal)+MRif1srt?nR~+EK&=LOTC)u{?`%W4xYhSirAB3DNN7 zd+Bn3i2q}89^v?c4px$`gAw!8e_E*Wqgmu`QR`!hI@N8uTLGov{hoT za9_G@{i$unK9r~=@(8L`uYwG~kyT4c?KZPO&(2+2Be9#5SMMzf`e3D(*C6->zWO!W zE?NkKwB@}gj~ir67+rrGOCqM9)n15_4<(BHIrB5kFc`Fjep2z6EMKkHzw`_?79C%sTEJP66Ey>X!svK2f38P4^vMSvMFn3 zCxs59l#o4Ku|IM(HUd8Tz`=cZy0j7b2{~@6Lf(|b<24{{eH=)EOwsk&!1f7C>oGgx z-c?;pRbwayVlr;6pjuh;ix~_6ChG5JJ@G|r&2?LIh;BXT#RUkG6}!eA|5G4uPHLt% z@8hUmC$+G~2Z0EJH|yEESqbfc<~q@OPSJye^J5u@mKkr2SfBd9Nr&U&$+UcyV^4kmr9efQ$2~{bllrfvg&Y}1ihqNjE$xG=FsamZHjj8X}9s{Xg=v3+ZCq|TtLt|IR}jGeR2F^x=eq)<^5pXE)04l`wZ zcfaq&;cT@-_du;vY)go1L2+MbNXm*)_0xs+N0%SG=0_H|A&}Gm9EE+4@gsgAO8f@P z_>b)KZ=fZ>hO^bwbLUOnk(k&E(sEk4gy{JxCxbOzJkDL++Wp83e}~WSq5PB#YosS7 z#jDOHDr7&Y*<=bM+3zRXP!n&r#GPNq!)-p^RhJ`GqUE>=5mmhl*3fP+NpDG=FTTsf z19{W)a?g4cYiGnSfWPpv@XJO!eKwt+Os6_5sid-%XMt8?m6+d7T_;Oog*NS!cwt8Z z^GbEJy@|usa}lzu`#%q>;yQCB86gZ}32u=0*}V?6qSY%3 zgN7L-o@rkXQ{DT{tg`(x zKbx%Ex>ZDkyvzB+3T7f-5%#HE%=1(?{sMJDyTd>y7ZIBmz1lF%z84Pa)i&zsO!iM+ z*g(K=KzdbAe(ig#@D&ANC#{Ag1Z2dhYd0ubAd`8g$^s28 z=a!kS^;+zhw*2DuIiSLBJ|A?l1DBEn-zPIx+HUYxkFdm8WNv#KUZ0cz$>jZ(DqG(% z1q1ejj~;Q#sTu=Ehml3$w?x`wa>6>LC;Q|HsN*3JZO~or*;W}QIDZX>KZDuQSL-f( zKF=g2QlHO_yy`+$%A+^!hOx7ZSB=z_#wAJbgMM)C=meQ6TEz$e*EvI|*{3S{)o=;N zx_&eL;y>2ukMStPnu{tz(6`1S6Be_iO!tK~ z(Yr`oZWeF3?o@oN_^OQco1ym%X!(8;tjRKy&BT90{#09+VuP}#HQ(WO2&09XKSa+ zZ6==mrhOa^Fz@n(&tW$G8BU?tDqlitv_sn3tdVKpI$o#uMI7Bnzk1H8Ms`-Enq4V@ z*@x*333)fanwr_%ae%E34hc~wE^lGaB8CT)Zy=M$`jwq;`s*j_Y+*B;gf-5iEFpM{vqrRp z@0o~I$*QgDPLqGn8gZipawrX3$O(@<1>Hy&>pszvn-2x}){FA*-0xd; z26Q;fwcejHn0HMC*%XH^p3;F{y{qJ4%4WCecT<7>SF9rT$Lfz9X&5ZA8Qh@+BOhVU zjMfgN$H}Fv)iYmZ8`5d&u~6{5PYNMcm)Y#Hn988>d@q&cw1KFplyfJPWb3i*A6BC; zNx7v>UZ|OwvQqMk*}S!=NZJ`s%eh-~-2u}6=rx?>$?5xG`|U<2)$5SLf8t*=MIrW@`_v?QpQN+S2V3nb^$-UScQRcPvR*}M z6*A>uD7^Zm?TrsU{scA^DmDFE75b{ll#x)ttGMJEJ*(GDZq%79{HwP+#uyIM`P3Lb znYbD6xk?{fUcwny4T`q~1f+Ew7>YjDbJ2%SN~|5$*duVO@6wag$H(zo4<7Vie*YNn zf*4g)@eG)mKwUg`R_)LvW!G9LOH3gnZP-`R!Es{ML$kEwlE1xq4`vMaFiw@CuqhRrX01_z+dOH4(##ak12HEZvr@7cXgJxm$ z2dE*JJ>aYd{kBEgGAFO{9g`@MSev_Cm7FY2KG=`l<`e6oWv}Sg2NQ-7;kw_H)3!!RacWsAPGkzrm4EG;(+vpM?kYjS(K*wgE+Ep<6Rmf*nmJ7b_k= z$&u}*)b_>?<~ zI2}+-Ii`E0sX_%vP`h^ScO!d}#nx1PdD61yeAh>LDqQVqD?E}bEDb*A3s3x_ad@>U zQjj`$f-({Fvm{cRAa6lL2SDa%DUpUTW@deu zy}xt#D$RCipvKxZML+;h)?YY$O1Bn$d~5ot4+tznUekR{5#Z-arCcLw7GlNS{Uv`B zuu^wHYJl4f5CB)VYya&>K#YLf-MavXKp?V!OuKsg_mBTB!vD9CFttbrdHra5f1kQi z({PMoJ%!ocDneU0E9)6xa!T|;18|;tBcP#%^uvFwi~6%-3MQ(`W#`QpKLqe1tMWc+#eaR6v``;;iU3_-(ecb|g zcU%$lF1{*MfEF1{k(34^;}d?6($7%~v*-w~pINu_Woj%NEaNJQ^Vjkp#^I9{Sk?Ss zGGBGUR&=Gsb4M$+g>(3m)}2XOYIE%1=IQZ-YUA+Z4d%R3e&lxBnf(u~H7Y4Z_jn{8 z2w!pd_g#(DRj;=Lp%vWzdxBs6_qnXN6@)^3QLVFQoKjiyeo>VU}J z0fX&xR1JX({qCdoyX#;51unf%Zqe62Sk3wJg5N=8m9LakaJ%u}YSyBC0Hq1k)(y9<(Ly1S*|c~d_Vr$YM4PX+{KQ>lIt&en1%pP3 zi4lrY*Rjrjz{n-U+rt;wWYzs(P?E`96QIr3S&qlfwDa_~xz+tkKWo-je|c1cf^T$S z2c=1U?v8r;d8@5&J_P2yn4je47$!7pPpuQ9ubUzU+gGIaENmNvR&wg1D2iRfL!V8} z(SSn$_6cZD&kwC`K8XYhoO8>~@H1mxg=I5h0V zSbN+~nh(l34j+i)Q}f4wG!^2t+jNDG9we5l%^F|q1#Fd|f$r(f^CZ1`ZIGkwPYJdl z>j~QzX2a=`)8TqaM-l%i*N*|PxTLx_E!#Qd>p`|g3+&lKNGCjm_Z=_@aC4#@{IP@O zQP5@KZ>#I8nfu7G5+1+~lAielFpXUtaR4n6ybQMFSlKv@E2;Emb#=6H2E4oXXy09F zPGx`EpdKVMyCm-L-6_$;uIt5Y-_$hf_HG3lSB}ie!ZlhEws|QZRVt)$WnUOAz&d%K zW1`|*B6v?705)Y7yw~_DxgJyNYit(WS?!}Uhd(v9-4Y+o+j_cGv&6Sw9srBv!&B(l zZP{hDP2aX3taZ}b5K3mlU5jC}yl0_!+E8f<<+Qwzg%h7m2KKkXL$}4Wr_-~{DP8Qh z(C4>Bf(@jJ0hMnKR#2Hr^=y^c-Tb%|b#KE>g(uSMFj$&oN~8}xnGAFh^BIQLT+uHi zxbOg2t*^|);Wo-9%4@#are~KrSPQr-;tkFOJ!f*SEeIw)rgg#gxbzR}9F9yqLO&`i z{5#&AnbnFoHSL!%OU6({cstKEIWA9~_GD*PEfpMnT;0E>=vR*}1=M7n$iid}ALC9Z zw=>X~ko)`T8wgm#N^u0?u%ykqu)HH*{mHo?gN9m^%yL>jz`a!2{*~A+1C@%_+?BBk z)=WvO3)%4l&MkVlJ{<+gSdJD57Xb2(WlmmnP-cUbv&5bJ_zr5F@ddQM@m1E|f@Q}@ zNZ4i2@7My28$#?6*{!;^Q=hF8R|)c=)Rv`uz)0;*H`i_7nwU@)AC_3H?pFA^VpiL9 znlAwq_&DKMA73!Z)}Jk7;y8gmJJ}USU$SqtU4r-tiz&0X`&i_4n>^B>tlf)(R zGcgG25GfoJ@%6xC75=z<`%FihOP|ffZ)f!VhjEsHMn$Kizxh{>uYilHa}ufvv#kO(hs|2ZZ?YRs zYkH1{4;H{X4JtW5HW$cFtfN49`I_OZ{N=^j$Zl=pFz92T?-_F~YCIpW0qg24x|h+4 zXqvW=zlWxE#P)2Zt2bMqq~MB6c6@9=i-xwH4T2dl#yU4klDf`CY%31XPt=$Csm|u`wFcCfJ^PYI@kB9Yr*XMdyY7E~L%3&Gu zIX7ghP%g)pF-&{CXN!}kRod_Kqc0_2v&#GW%Sm@7p1jDRYQ54XS0Bm{3Dq)r={1yD z^)RCdMe13+5-U88fg0lo!|c2(-{jPU*6*B^%r2Z9LvWN{d~l0(JsAgoqdErRa?qjX zE`Q&@ZTeN=F^JrTgBf~-8JmMnhss|e3RyG$gO_qr3)e954Zqv)W)XYNST9X;t!%_; zw>favczlqbG~l9`!R}C}n=77t8st6mL{-3L9z4GuWBG%ry>L5+te^U@-sv2U=CF*D zROo%4U~A!*lMIxGz7kiUGbou*W3VOg00j>elD>GZL>~>3HGnDZM=hXz2f2Oin_Ldf z=t~!T79N6;DZatLyi)e_W}t}BnNrd9%mokDUK3u1)O#zGHwXCEq?xAJ9WP=u)b=M_msILrdBYbdCv1 z;+tD8J|Y69Tq)-sT~m|-MMC$AglM5rdJDLqQ&`XhW@s{;fE}oEiUkFzAp_SK^Ic<~ zcP$-k4-al~RGhu!8bOyo$s3xa28zxw1BtzEgja)aFs=umT%v38VwZrngh)#I)OS)B zhF)9QFZ;0|v5WS*jPKYHu*U_TwR=9<+MTv3B!Uu)3G7;}Sb%z;53(CG zyO9yT$IpVM zT^@y3sWsHL?ibU`H4~L>@EZ*Pj01hy)@!L%KZP;vcO{-686uj5bn%j=+_H&nav`Ae z?>mv_k6;ui^NVEef0^qJ0@o28Fk&%`H+uM8M&d%?_4XJ0wEV6&kNiV^Jbi@i?qfh7 zWdcO>mY)LB8LI3nd)-8V*9E3l*Y&;H$0}f>$lY9I3}H9eJvU4{d+d#_Q&x(V+KDl9 zCr?IZxeWS%3P)T{;|Z@3Hk^(z6CcqI4CC;8Kfmem9y&ub#8HE&<`~;eBDXCyb%%db zuS_1Wt^~S~@?x@v=RmrRdbNET8DXfDqws{xQ7Q25#1ZCXm8WHwr(g?kk&(ia1Gb>e z)7_zlPq+l{WdqxW{8+oWUMsr3N_lUdpGAYM?PLx(+5Eq8dAp%Pk`i4fWiH6Ebh+5mC-0OenK@=w%S_!79o=GXFBP8ifD202*?wiAc%|rWaT&8_v4ljoib3JuM0}$EGB%7!-42RkV?D&|V|5|I;5H6FSL}k&}T4Ote(V zTwmUtf5T;4PeNvbiBCrZ+H}EDoTs%k_iz*RE%Dl=K6-44waio#0bMqrPgd$FKCB@S zF4hiwWeslMHQJIrzgJ3;D&GN?LaD!o%jS{#jWj0ZjL{TLH!Fr8 z+S_EdHxQQfz;I(<35TRlvSaH$naZ4`wq&y(pADojN-SYDO_d=;5|;O3ULU$!jrS`v zC5}rvE>)xnP{g-L6n~|w=t2e-MV_(uS@TH{;9l~z)-)ItJ}KaQroI-*{#?As1_&(6 zvE~KQ)Pa8=#&>1F2DGQgLK6)xex8pSV^={i-!wlx8zFX`=*k1IKrhXn&NWSCsQPIUvDEw3Ea zoW%9*;oWzyU$!qWG4So*&Xe7_Xp>8NPCO{@sNG|kMcg{vh?XYT_Rs=$Q8I=6FBb~j zj_OB|3h0g0SQ37uQ~d79$KK+TG1f*rIEkLU)g9Zjy)2-$GgM2##%N{q$dZp;P)HPX zaZTR_xx2q=z^+lu-MV%Uh(5Vbfy!{+?68uVD~~)bXFEMLSPFjSUyv1Z*%iN%-1F?^ zdEO*rEb#*R`t+jgm%(1B-7ITD?`#6>*rTLhO!2Mu zHw`X;?j9@QG0IFS2KM}px+Pl-rraMtBj)Y*rslg$-IIk}ZI4D(mP{9#D^Gvq=8*2C zBnan!{>vF&uxX}ZbQ&Jegzx$yC%rYu_T*P+g!v( z>)LTxxMI@vJOfiE-jVebF+HSGP4@7(d8>i@oo~Gf$DzaQxM{(`wDe3q`4yXLoVf8MpcqyFI!uynlW?|M)y8 zYd87aHxqE$bDf3JcOZc&3Qrzg3E@A=J00QSt5V0#Bw#Y7JJT2r zKz1`t$6@y?BuTHy-_cFcwK+We%RuiT9?+P?rCX<^zx^R}37%DHp~#2(Vm~R<*m}xZ z&)H+~Vu1dGS3_9km;uPHzTrM=ooT-b99A-MmI_c2j$}kLHzKOu2i`kWWE$h)j4QG? zUMsc74;0`R5^+lvC@9j%o*z|hYhrtE54S{3_N1+Y_fcsY5Tj9j=)CUfU9sE|F3_3u)zEMe}WV#u}{>< zsypP~!{o%ZPyPEME?AKTP*`w6Ys-X%Yuy{k>UrsJ{}fSTD;?gt|Gf4(HWK92K%-w< z5a+YujB#J$tbBXW4x1gvyE0if8Yz|hE#tPHh#Kl^JN;&`jC;ybGWnD0iB3R($9b3z zov}8&C(Fs|PNblUw2u#k)PR>JQP)mnMo)28lh{w|%|Pq#pH&2otc3QaN!%2H1@LyY zwXHRG3Zwmqr$C&YT1LjQ$r;M)!Li#w`JjYlNc$yE@}%pxHEW4T*p^s8>bR49v0rLD ztW;*su!^RS_#sub(tFCFHj!Bcg>9N}WNu20rd|EJV1yC>`yk=oIGaBoLUZAz5c!*+ z&qO-e8@ZuBU6v;REC`b*!3m3|d|Db}*@#t~?%qku-xxKV>n+s48Tq`kmHu)0fK!C_ zyq?m0i^_`0(*f^;QW1*1K;bcao0SH>jK*6;RQxXd8w=+637w~vL?gLEaV8mmc5XjNiODXga`>8WKg!b? z%4SvhK(|crsDKGe&-q#_1i&`_sjjx{I31(!vrZZ! zanFfRJigzW#DB&m=B26v0chsL(Si7g>=)ePMq>1G1?}$`dDZK2FRP3*Bgnn3{6oZm zZ*Vx@=JMc9<-M@WNLiV0ks>4VE>Ch+Rpw={OHO2Z^2*{5Wf3VKW+7XGe9%Dntu2EO z05B;Rf9H!RRXtS6JOk|AfmAH>{7*t%y7Dp=>O3fi)axHodcc^#;KFANG2HGMtKgfmUz- zV_Ix`qg#2)Q#aH#xL$^H2JFi1Vi9=@GLfQoJ&wuzZ@$7~;2|&RvV@^FF;W5DKRlqp zW(~Dv2Gw9zOCTRhOpc}S>eJKKs%Xl3NJ1b6EJ`x_b%^ueJ&_?Lq@R54woSw;=hSy@ zXVdh0yTRTG%E{m)+Wxfd*ya(1%GOW%91KuZ7Y@@ z3o+^cq#5n;myM7+DarP^&8F!&fzHcD|%?+-)zd-3tl(!bk*}r~QBI>;W^! zdBxJm<^3B(S4v(Ik}F#?9E%4tkAz;6+}%*}0Cs%jempjq&%Q5Z<-!8<)BNo112^te z*WQ7c+7S$(=aidb>gh;C!0dWpPd)+gq=!@_k5~^qv+KxyUpin^HJac+6f>1M!{+mv z+;!QIDv&bdXNfYn;4V6y-!_VM0dQ_y+wSSXOcAQ14QR8hKe&$ZSDt@2R#F?#v`Y zpk)0cKQK5bA47oI+>tI#-`{01i z5LSF7j;X@$dU_!lOLsBf@f8T-iYcub4&~h3MuUxWuWW?&dPrGl@iVhn3)6 zLx9%6%)dHl`Q`6_7^p=VsHwVRu*(4bEs=UUOTwK1_kk=jhZydXh|urNt|wht<_q!C zbw87`?S^WOgG3w`O5-@&_+D4 z0>6Ny{E@o;eZrNaU=TQ!5CIj40N0A?<*cs}&l8#ZwE{3*foRQbl4JA&6c7x6_yUbv z+*ZBz;Tkm4sM6xe*eKov7?Sk>wp6M9+z%(x=KOazR(*J6Cy`2v zrrNFs(W;E(+T1&poJ_MVq+@vf6qwuanF5htSvvXHce`_40EZUYlM4=z7~uw}-@UVj zhuGH*;Rtv2>HM9tilTlIf@9iO;H=mw#{Ss2i{~%E1G|_}T0A-vjImb*fxo{4xJ{^W zWfhY$r^z8+mi@!yR-=l6*FDjUCKpAl+n4k7VSx`IOBSy8o-o{Y*6`>mc{QyT_Zi=B zyu-2zd1n}FxrvS#?Q_cV!bJ@+J|I|YXITF(1{4v&xg3hZt1T|#{MdV$NnAaL3cGb{ z)}%`@?=xYR{^9*e*Pnbyxk04(>~ck=N)tGa$qJhIo$8s6UJ!@JsqiZDa#AKitpxcC z3e*CBADIz^KC%Z$|H&S?NQzV4BAwzsz%k=+#N$R?3-xO7FFrj3MPX)ggL^U;_!UchlaMYL1x_ zM(d}$AG6(g(p;-(+RP7tA+r1Oq-o5N*ZyLb6YP|tcX*}#^}eG^o#*HoU>Lv#gp4wV zJUcz#ezDy`|I47_<<@AZd0;azopoRDFaxehRc_#p1try4n#Mb7J#i~JAjwnUm$D4Ju}|BtoQ9Hbx(GO^u(Kd9W;gNl*s)< zbE8B%S$$J;j`jhK3GQCT&FMF7*A2{HlaSEfaR2AUKdd+9YJQJsJJY5KDxn8VP0owe zgp^6*hwWO|KcU=?!_e~wi1h(F!YLV?$NH4nrLc6+TCY{KjL&eTE9|t(%gVE2S`7E2 z%~x@^)K#_oTyTCa!^LT+JHDA4Dt0jP@nHC3_4#oN)mgd*AI(kv+pqm+&N0)OnAvem zRA$s{#M=&wh9*H1TB5MG%g=oU&#ju9$IEs$PP>Q7qL6-)6y-d`VQ&{VfB$&pj(xIC z-?+a96 zg_<^jz^%t=+k*$X<99e^h63-LWMkKswp2Q;?92lFcfNbV;q2?_Dzi9d7WIi4EC>X9VD#=mdHDM8xL)avW(W@oE+_M9XsiK2-=(bGrj zlPAs5LI%SAbB^X?Kt}#QpKi?6_UuPjj+kdxA7b+FKmO0}=D*AHZ&3ViDgJLz{2LVi e_k$uBuP59{fL6%|?8AjXl;qT3ls~h0^IrfZD0HsTnUWQ@5>t^rwTkHG-?>g(8WUal(GBWer?f1Ld{p@>ZPOI`P+pvs6 zq3|60`>+Ou^7ADMg=@pFOYtYw-Cqmv)KH$ycfy;mL#aeU!_nsQH~uxsO1zf z$acMNcs5dU!SfmY#mMw&$KGXI{`u#A(e8OfH!6c($^jy<~h)-eBf=QP@JF8$JxFjXy&$jHcC)4layz6fbWS4))&u4!#;&25n| zqAP~%*45})C1fZsFMp}}sZ1_||2Ip@O`7t-6@Tuy%d=6o{?J#7*4eY&9=yADwrzMM z=EoGI(P$!CK_UJdWOh!oezcgU1v~Hcj%sOXVIDkL_i-u3X<$teg*!PdO>#JIgpP;j z{#vIhBGmuKeN7V+6UFf=>2%xf3jHC~fDP*g8q*}l6Pm)`ypad4`N7?`!L#A#n|tJ+ zG|co357!92*V5K5sfkpmR1}>mHa@>sLKG?MM=7-})juijF%K2MWRW;clPgaL9H#gUm?`#*Q zdSgaxb(PRbKSeGIH!nkn%R5pdaV-|PuBBxIS!=7-H%+fEemFQ9I)MKmBO{}3WF#^< zIjOFxxrRZr4ocCZl{BR28CQmgbAMS8a7bN8M`zf;+czO8$q%E#VEx+K+OQK!pNqu$ zOifKW&31=+-&oZ3xjgiUmJ z*WoD-?Ikyr07AVYoI38+H8;<48!_J4n=Af!%azO8#~RFx#d_&5*6q?RdZebTYvx~= zhP~J}MWq$r+x|?zz`!7{kdBRej%H;rF*$j}+}u2iN*!(sxH8m|E#tykr9@Zl(eR`=h~Sn zPBZOB>owJi$7@xh2A0~?C#XxAR6Le*XFpICE_at!bRO#xkiK#Ecg*h;s;jG8wQ5zkoOR%rBpp>edRBIJF&5!cZ%t(S zg?G1errTVX|Kg6>lX9P%kaKtMt_aTk5S(q^SmN9p8OnOX85QBAmrBXX$(1tN7p9nO zrYDDOJ(ru9ni?1;ZCY|QK9VmuI2el(crN?e*+FKm^!fAWV=(y`?W*ZkN297J6&1&u z>R2PwXUm^gZ6erD8Ww3uI&9Kg|{ zHKW#?DeF-j-EJ34EKb!Esm=5sUXn#P@g1cq3pUXyfz$C=<2KI1bSbG9Cqj1La~;mz z9wM%%ofCyqv9ITeaYs&Ppx<)I{6AkMB{_OaPq%w=g!zAK&9&6B3>15x8lsCE9c=Clt+yUi+pw8UL`rxpgkJ<842ZMM=VkYSZ4?wHWj z+?-o#u7CON2|VHO^i?C3jaZ#r)@7Sm1r0kL>kzCIopgw zJw3zzd|E-ARarP+nH(D%`@{M4lRy8+oA`7hQzP;5L}u(`jpJgIsxn<%XO1TxOe7P~ zyfsw+;aP3%l`ichAI(2Gs~WdsOV-+H5~^=|Y%1P!E}nbu%M%j0 zTQPOpHtO4*a;VwgD|n_5JHEPYw#ISgoW1;g>T$8S$MS>M%DA6D*5F1`kt0W@%GEsfD17^8&9XuVGD|o&vR#e+*V9DhN-^`g#>U1|xwY;R3S(uP zxh+>%d$JhQvuqT(gJJGxUrg~)(JJ_siKqq&hPlsoiikX3Z}j0VPvvP9_QY;cvQC4U zQEZEbPoMVe=ye?{-_AK$_9*_mo?a%l2Xp8bDe`6=`(6YekDK}Et-MyQ-OXB8F9))x|{l}XV+#NxU?`GYVl$6rlX2+QBWbjgs!_0FTm&=y~4Ft5l z?;jZGToW~On0fsJ&mC&sr}tjVjr;2py$nBp{CM9rC8D9B;o!zylphUyyRP2XIL?#R zHvVjS&|dtWZ9^1iHp&z$ncE`l$h7g|%%xUn9=Rg6S4JkdTZ-mW_9icn+rCb{0FHeQ@rR9$u zj~4PKW1RS`7KEz5|7m#m=E@ATz92vj#o>bKHfG*lHa6!8w;y*z{KKu@TrIS89BK(R zH~;R#p;gw1#Ye2Rw6s*;87$f{8Ky!S8cJ?yN3mb$Y;Tlg)}58bmdu=V3-`iNy6_5o z)ly5xq<8cydNiv54!e*u{d{WnZob}SF3JkogDcLI)hBAk78I~~=?#sI{Nuf~wXLPt zGa;_5{Cr)_HYb^1S%G1s1-Yb*>L@tDrbv)-_4*Dm9^ ziSIVmGL1!8NkLxanXewKevFDWoF}>M)YGieQ8pczpnF66V=>K+_sb>yRYlzQlDc)S z(1R_)+=M1v`s3S&&c4{7!0{Rd$)iESLaSD(DNSlAPJBE>unt=|Ha>p)w$l+aFViIT zbN-aIYH0kF5hy# z-99M(Ngt=$SEbk5?A^P!s47gF^VM9kU_xWJ!JEB0?O1x7_rGoL60Uq>KTxr{KR{SX zo}9iCl#W=foyDZKo2syMcN^x<+?-2ENbp%NeT95VES;{LvD+^`%0u2`>`~O(mXJ4P zrr$0ss{x>i+O%}X3$2|6-(SAyI|X2KWVmrKrFG)_=jAEC*)7cWsu~#?={vUCThAGK zdV220*!U#$1<131R#QjjV4Bxt}ZTZH(IsR z3?uVKFynl0hLf~YS~?pC`ulCu?v1gonVWY$ikiP{!OW5BsfpZ3o@sYwOmy@gJyl_A z)~#DN%CxIpH!Rn|@e0O93$k|W+*pTA7pEbHMHL7&@^E&W&TFr3)p;;&KJ(*S?(Nf* zoB4O=XLrOs-g(|M!sh5OwN%jVq(gsVe2
  • (n4KFLPpIV$ja}2?~?Go-i#to2Np4 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