From 2053827ae27813fc0525c5d994a4966086d63ace Mon Sep 17 00:00:00 2001 From: Andrew Coates <30809111+acoates-ms@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:57:53 -0700 Subject: [PATCH 1/3] Some fixes for rounded borders --- .../Fabric/Composition/BorderPrimitive.cpp | 119 ++++++++---------- .../Composition/CompositionContextHelper.cpp | 1 - 2 files changed, 53 insertions(+), 67 deletions(-) diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp b/vnext/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp index e4889778140..fd25ebce122 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp @@ -26,16 +26,18 @@ bool isColorMeaningful( void pixelRoundBorderRadii(facebook::react::BorderRadii &borderRadii, float scaleFactor) noexcept { // Always round radii down to avoid spikey circles borderRadii.topLeft = { - std::floor(borderRadii.topLeft.horizontal * scaleFactor), std::floor(borderRadii.topLeft.vertical * scaleFactor)}; + .vertical = std::floor(borderRadii.topLeft.vertical * scaleFactor), + .horizontal = std::floor(borderRadii.topLeft.horizontal * scaleFactor)}; borderRadii.topRight = { - std::floor(borderRadii.topRight.horizontal * scaleFactor), - std::floor(borderRadii.topRight.vertical * scaleFactor)}; + .vertical = std::floor(borderRadii.topRight.vertical * scaleFactor), + .horizontal = std::floor(borderRadii.topRight.horizontal * scaleFactor)}; borderRadii.bottomLeft = { - std::floor(borderRadii.bottomLeft.horizontal * scaleFactor), - std::floor(borderRadii.bottomLeft.vertical * scaleFactor)}; + .vertical = std::floor(borderRadii.bottomLeft.vertical * scaleFactor), + .horizontal = std::floor(borderRadii.bottomLeft.horizontal * scaleFactor)}; borderRadii.bottomRight = { - std::floor(borderRadii.bottomRight.horizontal * scaleFactor), - std::floor(borderRadii.bottomRight.vertical * scaleFactor)}; + .vertical = std::floor(borderRadii.bottomRight.vertical * scaleFactor), + .horizontal = std::floor(borderRadii.bottomRight.horizontal * scaleFactor), + }; } void scaleAndPixelRoundBorderWidths( @@ -268,30 +270,14 @@ RoundedPathParameters GenerateRoundedPathParameters( return result; } - float totalTopRadius = baseRadius.topLeft.horizontal + baseRadius.topRight.horizontal; - float totalRightRadius = baseRadius.topRight.vertical + baseRadius.bottomRight.vertical; - float totalBottomRadius = baseRadius.bottomRight.horizontal + baseRadius.bottomLeft.horizontal; - float totalLeftRadius = baseRadius.bottomLeft.vertical + baseRadius.topLeft.vertical; - - float maxHorizontalRadius = std::max(totalTopRadius, totalBottomRadius); - float maxVerticalRadius = std::max(totalLeftRadius, totalRightRadius); - - double totalWidth = inset.left + inset.right + pathSize.width; - double totalHeight = inset.top + inset.bottom + pathSize.height; - - float scaleHoriz = static_cast(maxHorizontalRadius / totalWidth); - float scaleVert = static_cast(maxVerticalRadius / totalHeight); - - float maxScale = std::max(1.0f, std::max(scaleHoriz, scaleVert)); - - result.topLeftRadiusX = std::max(0.0f, baseRadius.topLeft.horizontal / maxScale - inset.left); - result.topLeftRadiusY = std::max(0.0f, baseRadius.topLeft.vertical / maxScale - inset.top); - result.topRightRadiusX = std::max(0.0f, baseRadius.topRight.horizontal / maxScale - inset.right); - result.topRightRadiusY = std::max(0.0f, baseRadius.topRight.vertical / maxScale - inset.top); - result.bottomRightRadiusX = std::max(0.0f, baseRadius.bottomRight.horizontal / maxScale - inset.right); - result.bottomRightRadiusY = std::max(0.0f, baseRadius.bottomRight.vertical / maxScale - inset.bottom); - result.bottomLeftRadiusX = std::max(0.0f, baseRadius.bottomLeft.horizontal / maxScale - inset.left); - result.bottomLeftRadiusY = std::max(0.0f, baseRadius.bottomLeft.vertical / maxScale - inset.bottom); + result.topLeftRadiusX = std::max(0.0f, baseRadius.topLeft.horizontal - inset.left); + result.topLeftRadiusY = std::max(0.0f, baseRadius.topLeft.vertical - inset.top); + result.topRightRadiusX = std::max(0.0f, baseRadius.topRight.horizontal - inset.right); + result.topRightRadiusY = std::max(0.0f, baseRadius.topRight.vertical - inset.top); + result.bottomRightRadiusX = std::max(0.0f, baseRadius.bottomRight.horizontal - inset.right); + result.bottomRightRadiusY = std::max(0.0f, baseRadius.bottomRight.vertical - inset.bottom); + result.bottomLeftRadiusX = std::max(0.0f, baseRadius.bottomLeft.horizontal - inset.left); + result.bottomLeftRadiusY = std::max(0.0f, baseRadius.bottomLeft.vertical - inset.bottom); return result; } @@ -473,8 +459,8 @@ void SetBorderLayerProperties( /* else { - SetBorderLayerPropertiesCommon(theme, comContext, layer, shape, borderTexture, textureRect, - anchorPoint, anchorOffset, strokeWidth, borderColor, borderStyle); + SetBorderLayerPropertiesCommon(theme, compContext, layer, shape, borderTexture, textureRect, + anchorPoint, anchorOffset, size, relativeSizeAdjustment, strokeWidth, borderColor, borderStyle); } */ } @@ -516,11 +502,11 @@ void DrawAllBorderLayers( spTextures[0], // Target Layer, Source Texture, Target Texture {0, 0, - borderRadii.topLeft.vertical + borderWidths.left, - borderRadii.topLeft.horizontal + borderWidths.top}, // Texture Left, Top, Width, Height + borderRadii.topLeft.horizontal + borderWidths.left, + borderRadii.topLeft.vertical + borderWidths.top}, // Texture Left, Top, Width, Height {AnchorPosition::Left, AnchorPosition::Top}, // Layer Anchor Point {0, 0}, // Layer Anchor Offset - {borderRadii.topLeft.vertical + borderWidths.left, borderRadii.topLeft.horizontal + borderWidths.top}, // size + {borderRadii.topLeft.horizontal + borderWidths.left, borderRadii.topLeft.vertical + borderWidths.top}, // size {0.0f, 0.0f}, // relativeSize std::max(borderWidths.left, borderWidths.top), borderColors.left ? borderColors.left : borderColors.top, @@ -533,13 +519,13 @@ void DrawAllBorderLayers( spBorderLayers[1], shape, spTextures[1], - {borderRadii.topLeft.vertical + borderWidths.left, + {borderRadii.topLeft.horizontal + borderWidths.left, 0, - textureWidth - (borderRadii.topRight.vertical + borderWidths.right), + textureWidth - (borderRadii.topRight.horizontal + borderWidths.right), borderWidths.top}, {AnchorPosition::Left, AnchorPosition::Top}, - {borderRadii.topLeft.vertical + borderWidths.left, 0}, - {-(borderRadii.topLeft.vertical + borderWidths.left + borderRadii.topRight.vertical + borderWidths.right), + {borderRadii.topLeft.horizontal + borderWidths.left, 0}, + {-(borderRadii.topLeft.horizontal + borderWidths.left + borderRadii.topRight.horizontal + borderWidths.right), borderWidths.top}, // size {1.0f, 0.0f}, // relativeSize borderWidths.top, @@ -553,13 +539,13 @@ void DrawAllBorderLayers( spBorderLayers[2], shape, spTextures[2], - {textureWidth - (borderRadii.topRight.vertical + borderWidths.right), + {textureWidth - (borderRadii.topRight.horizontal + borderWidths.right), 0, textureWidth, - borderRadii.topRight.horizontal + borderWidths.top}, + borderRadii.topRight.vertical + borderWidths.top}, {AnchorPosition::Right, AnchorPosition::Top}, - {-(borderRadii.topRight.vertical + borderWidths.right), 0}, - {borderRadii.topRight.vertical + borderWidths.right, borderRadii.topRight.horizontal + borderWidths.top}, + {-(borderRadii.topRight.horizontal + borderWidths.right), 0}, + {borderRadii.topRight.horizontal + borderWidths.right, borderRadii.topRight.vertical + borderWidths.top}, {0.0f, 0.0f}, std::max(borderWidths.right, borderWidths.top), borderColors.right ? borderColors.right : borderColors.top, @@ -573,14 +559,14 @@ void DrawAllBorderLayers( shape, spTextures[3], {textureWidth - borderWidths.right, - borderWidths.top + borderRadii.topRight.horizontal, + borderWidths.top + borderRadii.topRight.vertical, textureWidth, - textureHeight - (borderWidths.bottom + borderRadii.bottomRight.horizontal)}, + textureHeight - (borderWidths.bottom + borderRadii.bottomRight.vertical)}, {AnchorPosition::Right, AnchorPosition::Top}, - {-borderWidths.right, borderWidths.top + borderRadii.topRight.horizontal}, + {-borderWidths.right, borderWidths.top + borderRadii.topRight.vertical}, {borderWidths.right, - -(borderWidths.top + borderRadii.topRight.horizontal + borderWidths.bottom + - borderRadii.bottomRight.horizontal)}, // size + -(borderWidths.top + borderRadii.topRight.vertical + borderWidths.bottom + + borderRadii.bottomRight.vertical)}, // size {0.0f, 1.0f}, borderWidths.right, borderColors.right, @@ -593,14 +579,14 @@ void DrawAllBorderLayers( spBorderLayers[4], shape, spTextures[4], - {textureWidth - (borderWidths.right + borderRadii.bottomRight.vertical), - textureHeight - (borderWidths.bottom + borderRadii.bottomRight.horizontal), + {textureWidth - (borderWidths.right + borderRadii.bottomRight.horizontal), + textureHeight - (borderWidths.bottom + borderRadii.bottomRight.vertical), textureWidth, textureHeight}, {AnchorPosition::Right, AnchorPosition::Bottom}, - {-(borderWidths.right + borderRadii.bottomRight.vertical), - -(borderWidths.bottom + borderRadii.bottomRight.horizontal)}, - {borderWidths.right + borderRadii.bottomRight.vertical, borderWidths.bottom + borderRadii.bottomRight.horizontal}, + {-(borderWidths.right + borderRadii.bottomRight.horizontal), + -(borderWidths.bottom + borderRadii.bottomRight.vertical)}, + {borderWidths.right + borderRadii.bottomRight.horizontal, borderWidths.bottom + borderRadii.bottomRight.vertical}, {0, 0}, std::max(borderWidths.right, borderWidths.bottom), borderColors.right ? borderColors.right : borderColors.bottom, @@ -613,13 +599,14 @@ void DrawAllBorderLayers( spBorderLayers[5], shape, spTextures[5], - {borderWidths.left + borderRadii.bottomLeft.vertical, + {borderWidths.left + borderRadii.bottomLeft.horizontal, textureHeight - borderWidths.bottom, - textureWidth - (borderWidths.right + borderRadii.bottomRight.vertical), + textureWidth - (borderWidths.right + borderRadii.bottomRight.horizontal), textureHeight}, {AnchorPosition::Left, AnchorPosition::Bottom}, - {borderWidths.left + borderRadii.bottomLeft.vertical, -borderWidths.bottom}, - {-(borderWidths.right + borderRadii.bottomLeft.vertical + borderWidths.left + borderRadii.bottomRight.vertical), + {borderWidths.left + borderRadii.bottomLeft.horizontal, -borderWidths.bottom}, + {-(borderWidths.right + borderRadii.bottomLeft.horizontal + borderWidths.left + + borderRadii.bottomRight.horizontal), borderWidths.bottom}, {1.0f, 0.0f}, borderWidths.bottom, @@ -634,12 +621,12 @@ void DrawAllBorderLayers( shape, spTextures[6], {0, - textureHeight - (borderWidths.bottom + borderRadii.bottomLeft.horizontal), - borderWidths.left + borderRadii.bottomLeft.vertical, + textureHeight - (borderWidths.bottom + borderRadii.bottomLeft.vertical), + borderWidths.left + borderRadii.bottomLeft.horizontal, textureHeight}, {AnchorPosition::Left, AnchorPosition::Bottom}, - {0, -(borderWidths.bottom + borderRadii.bottomLeft.horizontal)}, - {borderWidths.left + borderRadii.bottomLeft.vertical, borderWidths.bottom + borderRadii.bottomLeft.horizontal}, + {0, -(borderWidths.bottom + borderRadii.bottomLeft.vertical)}, + {borderWidths.left + borderRadii.bottomLeft.horizontal, borderWidths.bottom + borderRadii.bottomLeft.vertical}, {0, 0}, std::max(borderWidths.left, borderWidths.bottom), borderColors.left ? borderColors.left : borderColors.bottom, @@ -653,13 +640,13 @@ void DrawAllBorderLayers( shape, spTextures[7], {0, - borderWidths.top + borderRadii.topLeft.horizontal, + borderWidths.top + borderRadii.topLeft.vertical, borderWidths.left, - textureHeight - (borderWidths.bottom + borderRadii.bottomLeft.horizontal)}, + textureHeight - (borderWidths.bottom + borderRadii.bottomLeft.vertical)}, {AnchorPosition::Left, AnchorPosition::Top}, - {0, borderWidths.top + borderRadii.topLeft.horizontal}, + {0, borderWidths.top + borderRadii.topLeft.vertical}, {borderWidths.left, - -(borderWidths.top + borderRadii.topLeft.horizontal + borderWidths.bottom + borderRadii.bottomLeft.horizontal)}, + -(borderWidths.top + borderRadii.topLeft.vertical + borderWidths.bottom + borderRadii.bottomLeft.vertical)}, {0, 1}, borderWidths.left, borderColors.left, diff --git a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp index 276588594c6..46def20b57d 100644 --- a/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp +++ b/vnext/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp @@ -2208,7 +2208,6 @@ struct CompContext : winrt::implements< winrt::com_ptr m_d3dDevice; winrt::com_ptr m_d2dDevice; typename TTypeRedirects::CompositionGraphicsDevice m_compositionGraphicsDevice{nullptr}; - winrt::com_ptr m_d3dDeviceContext; }; winrt::Microsoft::ReactNative::Composition::Experimental::ISpriteVisual From a05d6f7c341f39c3bf96eaf31dbbcaf67854e6f1 Mon Sep 17 00:00:00 2001 From: Andrew Coates <30809111+acoates-ms@users.noreply.github.com> Date: Fri, 24 Apr 2026 14:58:14 -0700 Subject: [PATCH 2/3] Change files --- ...ative-windows-621a7e8e-3a57-4835-8f3c-bf3dce559da8.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 change/react-native-windows-621a7e8e-3a57-4835-8f3c-bf3dce559da8.json diff --git a/change/react-native-windows-621a7e8e-3a57-4835-8f3c-bf3dce559da8.json b/change/react-native-windows-621a7e8e-3a57-4835-8f3c-bf3dce559da8.json new file mode 100644 index 00000000000..cda5224c121 --- /dev/null +++ b/change/react-native-windows-621a7e8e-3a57-4835-8f3c-bf3dce559da8.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Some fixes for rounded borders", + "packageName": "react-native-windows", + "email": "30809111+acoates-ms@users.noreply.github.com", + "dependentChangeType": "patch" +} From 3f55489d7a5c5c6c7a835b51d08e0c290f8b0211 Mon Sep 17 00:00:00 2001 From: Andrew Coates <30809111+acoates-ms@users.noreply.github.com> Date: Sat, 25 Apr 2026 11:18:34 -0700 Subject: [PATCH 3/3] Image snaphots --- ...w-tests-views-can-have-outlines-2-snap.png | Bin 5460 -> 6128 bytes ...ave-rounded-borders-percentages-2-snap.png | Bin 7224 -> 8217 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/e2e-test-app-fabric/test/__image_snapshots__/view-component-test-test-ts-view-tests-views-can-have-outlines-2-snap.png b/packages/e2e-test-app-fabric/test/__image_snapshots__/view-component-test-test-ts-view-tests-views-can-have-outlines-2-snap.png index c88aa9e9aaaaed59bf9632d2c5ccdb5721459cdc..43f3d987dadd1552121337698ba346d85b97878f 100644 GIT binary patch literal 6128 zcmcIodpy(s_g^APl!TAuBT3|1$Xt?JZV8J@W}`l?^FLGIZdtv$3p~#oxR;C!WFn z^ze|*4O|~>&@b)`!UUBp-%Pch!ok;DWQA26P~(KDaGHBtymAAV7MpO;K`pjh`|dI6 zGcJXVm`nhBH}48(8Vu|`#<&bp*n4i*iH&E4gCb7`irr^i9_%_X!yLJJ_n=k+a|+-P zL!y4ndv1*_;fH<_uC>hl9)2EoSIO~FzZKbY!p(Kml*}vT=Gv=3)(!tBIjShHO4mwq z_1?M%**LY$)9Plh3LjB-An6f#KYLyWzGvLix8Q@cpT`@^83Ge0N(|Us}*D_g$s*PTcVywg>txe@}>+ zN*$_~<)4wErlZAU^hD}`swd)|MUH)~>-nVFrDtH>SYE=J zVOSX_--`P3_`P=b#kQ{qf}xK!?0~CZN2?{U9op&1;!6}pN;M&!M~^`>W9|ybq%A^q z_6q;QM2gULbcg7eb$lFzIFRFWEV9kmUSD!|{SYjVyJm3aMeUJYCHmPJr$$D{-IIM( zoXm?suMZk~IX=bDbnof;=(LECtb^=vidFWd6yVqT?aN29bf(^_TeA>TS+WxEB2isv zY}%sv&$?_r_DvEp4c-~<7xkf0bDs&DwrAyXX@mwz97&uK>2oz5Kk-F0I2uEX!w~a6 z!B08GDtWDB;+MY~FOHPy8Ce-g=iGgTT87vV*>V&FFQ1Am?oR9(2l zCwV>IkYD6J@7}8lCleQ(VK%&BfogxLc+P$SGk(hx5lZzVVaz4`{_bhSnY5xX4HCY& z{PX!4K?nZ|r09v1D4{Y69bM{{PsJL)DO7rKoFR=jFVXU*|HUk`+fr>=`Z-kr6MlF=VZA^hSLvu zXpmjS(&BxlH@#$b-`b0A9$#22uY4rH`!}j}XtJF+Wre4KCw(%XYd~|vg@dlAt#z_V zhvzst4h@Eh_e7sM&k25nKE|+1fikO$bZR;*#G3avB=TCMo`f&;Kx&9!qQ&yPxeDlb z3&G&9NA8Yu-QZmwAA>KrIzNzOg%OmB`+!nPx12eT2LyD{AF4ko4nNk=r`p!)XOFV1gy)T`d?AIWNYLa@;IU3a zr9}~)p}HTQ1wLCoQxON}mlC&5Oi&A1d?#?N4^X*0^S8D2$VsXA0hHI$k;U~If1)(u zU57NjqNT57<7h_o261RJ#bo zDuf+0@m%*Y@0JqGw%mcduzO#2qT=E8b&`<7>Dx%Si;KSyL1q~5q?mqA5(o5NsVKux7$ z<&`w!tH^^|QXr~h5N`uRVbu&%TMlC7dx3e0Em7X#+k`iX-#5Kb?nR&mv}7A~Q17!B_?vyg?tZn*@Xp|a|!Wt;pPDrSntT(fM0SFhJx5#I$3ICA`GEBDy6PCvJIzTH|A(f`o;?PFt?cM3SSlxgf0ho&BDTNjoG z^+o^WSVrtrdVvZb$5>_<0DQtR?|#KC?T*6A-S)RgSY786+#a157eUvPL-%-e)oWG9 zEYGvnaH<|wh8VBx`72xOq1?wfB0@*-=`$9rO!Tj?A8d(#SPUaox|}-Se{TddIL+La zlI(I6kOS{bv+AYO?SswSVGcv}HX`t*zRc4dPqaB|xRq9$+-fYZkux+gC1<{@cJ^x$ zkLkF+Jx*Lc8ZPFyTX_0ve{mH;Atn%s!#=aQPYL~R-C$yp3W>nNH;@ZK7aB;M5b(gN zO`jthCp9WAJf24n{iMGe_}bg#ETpPA%*a$2mu)uXRio0LtTahO7!Jc~llk7a5RmXD zx+&>i;~kczdi-h5w(==UpW%vP4`2=!@g9yK&!|EToX#Pw$1GT(u#Runomf5@jVHR` z-HcJ^x{eJ)rN^TtbR!<$o2_%UiMXC>$T{|E8*9Jf$#s|0V&=Rlr})OB`$o99WUB{h zh~^atY@_wfc{o>_~*V87BZ=W-p(VaK) zQEh9ACF8PmRnlD1p?nSk-kJO0Ty$~F9mh2p#x3Mc(v_w-yf`v?zk-A<#`~H*LbGjD zGK>OSe>#5C9z!{bIUM1fy-!Xco+|;0AzID5^x%6EFQeqS3E~y!bvtwS z*mKnY|FU$wx2O5&^rs7uK2&l|qpzeI?Xv0YpY|!6dfRA1v>MB+aiJSYH;bw9KQR1R z73~L$j2Phr+UlCC-#eRh6GM5w3QDUwZWCA(O7CG9OutDx-M}8}2so^=qKJe0xFD#U z@W!l|L(P=o2$N$}+D5X^8@@@HU zUi1C^iz4auK-h01`>X4U+X?h9to-E1Qoe;eukl-&bT*W`(!V|eRT_jWBfbhC&1|LU zWU$@XY@Yr9j?~t1^Y74(C+dpbhjnSK70^cf=>k&#oKoApNa<$vZ2878bf=oP@Z2)= zRi~bY5RrPXOq5^3q-I$m$z4XBNu}WbYL|sc%L8R}3|`E^GCCdB`k{v&B+ALtySLlw z|7EILl-lsLG{rV(998l^hEGV6)-w@wS^DGgL37K?#=oP|fBCmVC%*!ccV}q%uDG70 z5VxqdHYzg%cl&_9?`eFm(CfY;mO1`9qNY1~U-eIcrCx9nE7gZDIM*s(^{l zXzTar>2H4ARAhr-+!t49{94Lj_RP4@)2mIm(=5`WC!3RbP@TXCO-Lka*0RD%&osCr{z{W68*$&0@lupN`s_rWn79`{j zzFsv3R*f1?AyU^|7bIx^qGy&O25C)B($!88w$yfJ{6=lb9hVSgG(6RSRw=pxv5xHO z7Q}|(Nd>;+g?DNR-lTu*iJg8pNdq;x#3Hc(Ie5IEILQ8&WMQ&k9BtB;^mErYV&d*Q znz-VHBE5+EKA5U%ahTczSjiiMvwT}!j$d(>4?8^%r=uQ0+!VEn^kk24RFXWWW@++4 zj3>hgK|}QRnXPzS@Uz@oPu9zn)W%D;ijMa4*j#PGlFmceudPSp2HnwH52de!$6QL1 z2wai#AhW*WSf-k%6#k2dxL#ty75J_neNQ)#GFwIOYwug2o6BCU_C-5?GVsZ5ptT>w zcD_3K88U{OpN3|c-1tY9IvP6lCO|C~Q{ffG-ze4bEK<(qzuOLm`vMPe#qQTokXsks zfuN?NXZInn$!8_;U*yFN6Qhya$`zTzs@p})6HEylSL6heAuV8@VFxz5TV~NPna3ER z$wz`uox8bfYg3k*hbUgY=g`=uUQJC7pqLNbv z%G)Sw7r6GQ#APL;<*3uoZ8Kzg!~1Uf2ZNp~ik>3N9rWRxcDME)Xf7~};(mU~tz12z z5?^u0sqFRFkSd^81jVXz|5Ic<*4ZXd|1>Y{kchZ?&(yvxsti=Iy%-;pEP}NsWLep2XV zJ(L9(2c;+~UK?iGn%cw_t1(>kUWUG=NE2d>^?QN-Tl69sly=U=IkzQ?3$u=KZEZU{ z1(!~J*oTz>3azwp6W^%uO_MOPiT=o-yD{PP!O0NuJq0TvG!0#^AM2H}dAM@r^438s zzFF7Wojqhi$t|T~t7WQ%Wg@YXZV!E246DXJmxQja7W1(J>~7oKblK*Y;0*dk#b~uz zAXLLa z*C4gUClc`!oJZ9ov+A_vL@ibH`9`lS7-!q9c{Q~6rE`ZAl`Q={el>5N|B-hQgDrtb zy$g-SBSV2hQ0T)-Iq@H(t8RosHiAZV)(g~#?*&~?-3i&~`7RE5R#Vj7AOB*l+~Z*f z`mrbq`|}oPnrd@1AQ<#Y@o+a;?t1^y498-tUiIF}l^OY(fGSYD+d&yu^mEb)jFt8p1aEt=!Xp6AlL^>Ia{&589)b|HmSzzdCW)cYc9UppQ z+Wwk7rNimKXViO3z)#zN8>oyk*9(~(EZs=hT-zI+&LAh4fr^1psrcI)nVFqY7$xxG((PpC%6~vb zW`r-y9)-4V(Lonn@6YvC_Yj1vmtQ7QIu0*Y=cH{;w|1w2xTUx4y&#{YAYb1@tsfqA8L3<}A9enE=BNX^cfgLik5?5$DY@^%!wbY7 zn7vABip)i(xt=PO+aSFwoyf-Iee@L~vlcg7s>upPb|)sDAzesk zDPUa4M01xQ*Jbh_;M7o^p_|K;`wQlk)_G7tXtf{Oa%O@F=rEboJGYAzaJ><}wzFOZ zZ?0G4okbXhdjR)h!fZjBzx6)VBDaX%S?>BX?8gfF|6%X^KP&Aos0HsE*lK=n! literal 5460 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 literal 7224 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 K?pCT;hx{M4N0Ctg