From 77299ce6a56a845e1a54908bd0a9a1a4639dd34d Mon Sep 17 00:00:00 2001 From: anon Date: Wed, 17 Jun 2026 13:32:33 +0200 Subject: [PATCH 1/2] fix(labels): separate per-render categorical legends with distinct palettes (#364) Stacking multiple categorical `render_labels` calls produced a single merged legend (scanpy's bare `ax.legend()` auto-collected every labeled artist and dropped the previous legend) and reused the same default palette, so the overlaid layers were indistinguishable. - Each categorical render now gets its own legend; 2nd+ legends are built with explicit handles and laid out left-to-right along the top margin in a post-render pass (`_layout_panel_legends_rightward`), robust to tall legends and `constrained_layout` reflow. Only legends this code owns (tagged `_sdata_column`) are touched, so fill/outline and channel legends keep their placement. - Later categorical label renders offset into the palette to skip colors already used on the panel (`_next_palette_colors`), keeping layers distinct. - A legend is titled by its column only when 2+ legends share an axis (to tell them apart); a lone legend stays untitled. - Shared helpers `_legend_ncol`, `_categorical_legend_handles`, and `_default_categorical_palette` remove duplicated logic. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/spatialdata_plot/pl/_color.py | 34 +++++-- src/spatialdata_plot/pl/basic.py | 85 +++++++++++++--- src/spatialdata_plot/pl/render.py | 6 +- src/spatialdata_plot/pl/utils.py | 95 +++++++++++++++--- ..._queried_shapes_elements_by_annotation.png | Bin 40216 -> 12640 bytes ...olor_two_shapes_elements_by_annotation.png | Bin 42246 -> 14434 bytes tests/pl/test_render_labels.py | 74 ++++++++++++++ 7 files changed, 252 insertions(+), 42 deletions(-) diff --git a/src/spatialdata_plot/pl/_color.py b/src/spatialdata_plot/pl/_color.py index b3e3425a..f45d1fd9 100644 --- a/src/spatialdata_plot/pl/_color.py +++ b/src/spatialdata_plot/pl/_color.py @@ -1160,6 +1160,29 @@ def _modify_categorical_color_mapping( return modified_mapping +def _default_categorical_palette(n: int) -> list[str]: + """Return the scanpy default categorical palette sized for ``n`` categories (grey beyond 103).""" + if n <= 20: + return list(default_20) + if n <= 28: + return list(default_28) + if n <= len(default_102): + return list(default_102) + logger.info("input has more than 103 categories. Uniform 'grey' color will be used for all categories.") + return ["grey"] * n + + +def _next_palette_colors(used_colors: set[str], n: int) -> list[str]: + """Pick ``n`` default-palette colors skipping ``used_colors`` (keeps a 2nd categorical render distinct, #364). + + Falls back to the full palette if too few unused colors remain. + """ + used_norm = {to_hex(to_rgba(c)) for c in used_colors} + pool = _default_categorical_palette(n + len(used_norm)) + unused = [c for c in pool if to_hex(to_rgba(c)) not in used_norm] + return (unused if len(unused) >= n else pool)[:n] + + def _get_default_categorial_color_mapping( color_source_vector: ArrayLike | pd.Series[CategoricalDtype], cmap_params: CmapParams | None = None, @@ -1179,17 +1202,8 @@ def _get_default_categorial_color_mapping( else: palette = None - # Fall back to default palettes if needed if palette is None: - if len_cat <= 20: - palette = default_20 - elif len_cat <= 28: - palette = default_28 - elif len_cat <= len(default_102): # 103 colors - palette = default_102 - else: - palette = ["grey"] * len_cat - logger.info("input has more than 103 categories. Uniform 'grey' color will be used for all categories.") + palette = _default_categorical_palette(len_cat) return dict(zip(color_source_vector.categories, palette[:len_cat], strict=True)) diff --git a/src/spatialdata_plot/pl/basic.py b/src/spatialdata_plot/pl/basic.py index 3001a317..3a24e668 100644 --- a/src/spatialdata_plot/pl/basic.py +++ b/src/spatialdata_plot/pl/basic.py @@ -20,8 +20,9 @@ from geopandas import GeoDataFrame from matplotlib.axes import Axes from matplotlib.backend_bases import RendererBase -from matplotlib.colors import Colormap, LogNorm, Normalize +from matplotlib.colors import Colormap, LogNorm, Normalize, to_hex, to_rgba from matplotlib.figure import Figure +from matplotlib.legend import Legend from mpl_toolkits.axes_grid1.inset_locator import inset_axes from spatialdata._utils import _deprecation_alias from spatialdata.transformations.operations import get_transformation @@ -31,6 +32,7 @@ from spatialdata_plot._logging import _log_context, logger from spatialdata_plot.pl._color import ( _maybe_set_colors, + _next_palette_colors, _prepare_cmap_norm, _set_outline, ) @@ -1584,6 +1586,11 @@ def show( _draw_scalebar(ax, scalebar_params_obj, panel_idx=i) + if fig_params.fig is not None: + for panel_ax in fig_params.axs if fig_params.axs is not None else [fig_params.ax]: + if isinstance(panel_ax, Axes): + _layout_panel_legends_rightward(panel_ax, fig_params.fig) + _layout_pending_colorbars(pending_colorbars, fig_params, colorbar_params) if fig_params.fig is not None and save is not None: @@ -1870,6 +1877,42 @@ def _draw_colorbar( trackers_axes[location] = pad_axes + (bbox_axes.width if vertical else bbox_axes.height) +def _layout_panel_legends_rightward(ax: Axes, fig: Figure, gap: float = 0.01) -> None: + """Lay the per-render categorical legends (#364) left-to-right along the top of the right margin. + + Only legends this code created (tagged ``_sdata_column``) are touched, so fill/outline and + channel legends keep their own placement. Layout is in figure-fraction so the axis shrink that + spreading them triggers under ``constrained_layout`` can't rescale the measured widths into overlap. + """ + legends = [c for c in ax.get_children() if isinstance(c, Legend) and hasattr(c, "_sdata_column")] + if len(legends) < 2: + return + # 2+ legends share the axis: title each by its column so they can be told apart (an explicit + # title set earlier stays as-is). + for leg in legends: + if not leg.get_title().get_text(): + leg.set_title(leg._sdata_column) + # Let constrained_layout settle the axes, then freeze it: otherwise it shrinks the axes to + # "make room" for the margin legends (squashing the plot, leaving a gap). Frozen, the legends + # still count for `bbox_inches="tight"` on save. Reached only for panels with 2+ legends. + fig.canvas.draw() + fig.set_layout_engine("none") + invf = fig.transFigure.inverted() + ax_bb = ax.get_window_extent().transformed(invf) + left, top = ax_bb.x1 + gap, ax_bb.y1 + # Anchor all at one point and settle, so widths are measured in a single consistent layout state. + for leg in legends: + leg.set_bbox_to_anchor((left, top), transform=fig.transFigure) + if hasattr(leg, "set_loc"): + leg.set_loc("upper left") + fig.canvas.draw() + widths = [leg.get_window_extent().transformed(invf).width for leg in legends] + x = left + for leg, w in zip(legends, widths, strict=True): + leg.set_bbox_to_anchor((x, top), transform=fig.transFigure) + x += w + gap + + def _layout_pending_colorbars( pending_colorbars: list[tuple[Axes, list[ColorbarSpec]]], fig_params: FigParams, @@ -1944,19 +1987,32 @@ def _should_rasterize( return scale is None or (isinstance(scale, str) and scale != "full" and (dpi is not None or figsize is not None)) -def _maybe_set_label_colors(sdata: sd.SpatialData, render_params: LabelsRenderParams) -> None: - """Materialize a categorical palette on the table annotating a labels element, if applicable.""" +def _maybe_set_label_colors( + sdata: sd.SpatialData, + render_params: LabelsRenderParams, + used_colors: set[str] | None = None, +) -> None: + """Materialize a categorical palette on the table annotating a labels element, if applicable. + + ``used_colors`` accumulates the colors already taken by earlier categorical label renders on + the same panel. When a column's colors are auto-generated (no user palette, not already in + ``.uns``), they are shifted to skip ``used_colors`` so stacked legends stay distinct (#364). + """ table = render_params.table_name - if table is None or render_params.col_for_color is None: + col = render_params.col_for_color + if table is None or col is None: return - colors = sc.get.obs_df(sdata[table], [render_params.col_for_color]) - if isinstance(colors[render_params.col_for_color].dtype, pd.CategoricalDtype): - _maybe_set_colors( - source=sdata[table], - target=sdata[table], - key=render_params.col_for_color, - palette=render_params.palette, - ) + colors = sc.get.obs_df(sdata[table], [col]) + if not isinstance(colors[col].dtype, pd.CategoricalDtype): + return + adata = sdata[table] + color_key = f"{col}_colors" + if render_params.palette is None and used_colors and color_key not in adata.uns: + adata.uns[color_key] = _next_palette_colors(used_colors, len(colors[col].cat.categories)) + else: + _maybe_set_colors(source=adata, target=adata, key=col, palette=render_params.palette) + if used_colors is not None and color_key in adata.uns: + used_colors.update(to_hex(to_rgba(c)) for c in adata.uns[color_key]) def _render_panel( @@ -1985,6 +2041,9 @@ def _render_panel( """ wants = dict.fromkeys(("images", "labels", "points", "shapes"), False) wanted_elements: list[str] = [] + # Colors already taken by categorical label renders on this panel, so later renders can + # avoid reusing them and their stacked legends stay distinct (#364). + used_label_colors: set[str] = set() for cmd, params in render_cmds: # Skip render entries that belong to a different color panel. Entries with no @@ -2033,7 +2092,7 @@ def _render_panel( cast("ImageRenderParams | LabelsRenderParams", element_params), dpi, figsize ) if cmd == "render_labels": - _maybe_set_label_colors(sdata, cast(LabelsRenderParams, element_params)) + _maybe_set_label_colors(sdata, cast(LabelsRenderParams, element_params), used_label_colors) _RENDERERS[cmd](**kwargs) # Panel finalization depends only on per-panel values, so run it once after the loop. diff --git a/src/spatialdata_plot/pl/render.py b/src/spatialdata_plot/pl/render.py index 1ab4825a..d8a31a6b 100644 --- a/src/spatialdata_plot/pl/render.py +++ b/src/spatialdata_plot/pl/render.py @@ -81,6 +81,7 @@ _decorate_axs, _fast_extent, _join_table_for_element, + _legend_ncol, _mpl_ax_contains_elements, _multiscale_to_spatial_image, _pixel_to_coord, @@ -548,7 +549,7 @@ def _add_outline_legend( loc=loc, bbox_to_anchor=anchor, fontsize=legend_params.legend_fontsize, - ncol=(1 if len(outline_handles) <= 14 else 2 if len(outline_handles) <= 30 else 3), + ncol=_legend_ncol(len(outline_handles)), ) @@ -697,8 +698,7 @@ def _render_shapes( nan_count = int(pd.isna(cv).sum()) if nan_count: logger.warning( - f"Found {nan_count} NaN values in color data. " - "These observations will be colored with the 'na_color'." + f"Found {nan_count} NaN values in color data. These observations will be colored with the 'na_color'." ) color_spec = color_spec.evolve(color_vector=cv) diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 323d6c3e..164509f2 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -26,6 +26,7 @@ ) from matplotlib.figure import Figure from matplotlib.gridspec import GridSpec +from matplotlib.legend import Legend from matplotlib_scalebar.scalebar import ScaleBar from pandas.api.types import CategoricalDtype, is_numeric_dtype from pandas.core.arrays.categorical import Categorical @@ -405,6 +406,49 @@ def _build_alignment_dtype_hint( return "" +def _legend_ncol(n: int) -> int: + """Column count for a categorical legend with ``n`` entries.""" + return 1 if n <= 14 else 2 if n <= 30 else 3 + + +def _categorical_legend_handles(ax: Axes, color_map: Mapping[Any, Any], na_hex: str | None = None) -> list[Any]: + """Empty-scatter handles (colored dots) for a categorical legend, with an optional NA entry.""" + handles = [ax.scatter([], [], c=color, label=str(cat)) for cat, color in color_map.items()] + if na_hex is not None: + handles.append(ax.scatter([], [], c=na_hex, label="NA")) + return handles + + +def _stack_categorical_legend( + ax: Axes, + color_mapping: Mapping[Any, Any], + *, + na_hex: str | None, + title: str | None, + column: str | None, + legend_fontsize: int | float | _FontSize | None, +) -> None: + """Build the 2nd+ categorical legend on a shared axes without dropping existing ones (#364). + + Placement is finalized later by ``_layout_panel_legends_rightward``; the anchor here is provisional. + """ + handles = _categorical_legend_handles(ax, color_mapping, na_hex) + if (cur := ax.get_legend()) is not None: + ax.add_artist(cur) # only the current legend would be dropped by ax.legend() below + # Auto-title (by column) is applied in `_layout_panel_legends_rightward`, where the legend + # count is known, so a lone legend stays untitled; an explicit `title` still wins here. + new_leg = ax.legend( + handles=handles, + title=title, + frameon=False, + loc="upper left", + bbox_to_anchor=(1.02, 1.0), + fontsize=legend_fontsize, + ncol=_legend_ncol(len(handles)), + ) + new_leg._sdata_column = column # type: ignore[attr-defined] + + def _decorate_axs( ax: Axes, cax: PatchCollection, @@ -449,22 +493,41 @@ def _decorate_axs( } ) color_mapping = group_to_color_matching.drop_duplicates("cats").set_index("cats")["color"].to_dict() - _add_categorical_legend( - ax, - pd.Categorical(values=color_source_vector, categories=clusters), - palette=color_mapping, - legend_loc=legend_loc, - legend_fontweight=legend_fontweight, - legend_fontsize=legend_fontsize, - legend_fontoutline=path_effect, - na_color=[na_color.get_hex()], - na_in_legend=na_in_legend, - multi_panel=fig_params.axs is not None, - ) - # scanpy's helper doesn't accept a title; set it post-hoc so the user can - # disambiguate fill vs outline when both legends are drawn. - if legend_title is not None and (legend := ax.get_legend()) is not None: - legend.set_title(legend_title) + color_mapping = {k: v for k, v in color_mapping.items() if not pd.isnull(k)} # NA handled separately + # A lone categorical legend goes through scanpy unchanged. A 2nd categorical render would + # otherwise make scanpy's bare `ax.legend()` merge every labeled artist into one legend and + # drop the first (#364), so route 2nd+ legends through a helper that keeps them separate. + if legend_loc in (None, "none"): + pass + elif any(getattr(c, "_sdata_column", None) is not None for c in ax.get_children() if isinstance(c, Legend)): + na_hex = na_color.get_hex() if (na_in_legend and pd.isnull(color_source_vector).any()) else None + _stack_categorical_legend( + ax, + color_mapping, + na_hex=na_hex, + title=legend_title, + column=value_to_plot, + legend_fontsize=legend_fontsize, + ) + else: + _add_categorical_legend( + ax, + pd.Categorical(values=color_source_vector, categories=clusters), + palette=color_mapping, + legend_loc=legend_loc, + legend_fontweight=legend_fontweight, + legend_fontsize=legend_fontsize, + legend_fontoutline=path_effect, + na_color=[na_color.get_hex()], + na_in_legend=na_in_legend, + multi_panel=fig_params.axs is not None, + ) + # Tag with the column; the column auto-title is applied only when 2+ legends share + # the axis (see `_layout_panel_legends_rightward`). An explicit title wins now. + if (legend := ax.get_legend()) is not None: + legend._sdata_column = value_to_plot # type: ignore[attr-defined] + if legend_title is not None: + legend.set_title(legend_title) elif colorbar and colorbar_requests is not None and cax is not None: colorbar_requests.append( ColorbarSpec( diff --git a/tests/_images/Shapes_can_color_two_queried_shapes_elements_by_annotation.png b/tests/_images/Shapes_can_color_two_queried_shapes_elements_by_annotation.png index 77d147620a0bec5da4abb3aafaab291309d55d8b..e7114687e812ba2879d5a110000733ea8d71f9fc 100644 GIT binary patch literal 12640 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 V$B<{>e@>7n$*Vptk~4Ype*o>C*E;|J literal 40216 zcmdRVg;!MX_w@iHC5;k-GzcG3>24|M?(XjH8l+oVkdW@7LAs=KNa+UY9Qa+o?_crG zg0+U2b?<$i^PIEKK6^(gDM(?Wze5LsK$tSp5-K1NLIUv3go+6K#$?VV6$Hv&myr-v z^U6NX@$@6zIe)RtwH&=xt=6dDp}PGVi^;WWMC!wehJ#8e>?0=DNkbW%6o!KuEP_f2 zmKJ+G7i7)VZ}b)Ov}5@Y{%|TZ@$~FfSZ_B9wUbK&-+pGLUOhPx^lf^Cd0Xseh*E{T zVNfaD$F5l;6Zs0fbxTb#Dw0ktSWm#K0Din8Q3*+hCYzj$335FCz+@h42k02*fOYYJo`_b*QxGhvl z2z`s_pe28&%|r?5Ak04W4Z|B??P~cYW|c)jL9SH+qJ68mOY*i!fn|nCtShmr9xfsi z#dmbcnRvyEQFXQ^wTr8s>-tJce{LVU9#_u-?lvM>(vQ|(o|~*Q#ZViIrc;XK(sNx# z7`lzv1O?&km*dOL&ZdJM)|oex;@FsE0*iZ>Id0Q3NAs0(o&Cv*Lf%j3gOp1YZQHv4^Znl7drv)meSMcm$M*AqUToo~`aJk?FbbJgy~Wt? z40iGS1eKzl(eymOi(%l8f7hRHn!bMhnykQgkmI=~1H=_voIwQ#H_?T+Qn#t9x%sXj znx)QOR~ELkpxj!R_PG;bBUf&Hcp==x?;) zQwXFmrKqSV!q{%HMiiB@NUz=NBbCtIpU@HEqHWgU*-};3mhGhCVmhjaKcUz-&g0p< zkuUhtQ@1kOS_~ffRaFkaO6}!%<`!E^Y~Mak2;Qy~&Irl~kQvq(b<2FnNl8uZCo+w} zB;h*#`6JHfcGWX^nG{$Jb93{<@U4MZl22wsJ>jqImyv^jm1C@GE@)_&-EnDIJyjIC zH(PCWkCNDABe(k+AT@H3TYy=_#L3B-eVLt23R2=L3RuUalu%VwRaVArn4pdN`SYjM z`DXvHJ^Jg{$%>RF#>U3#>Zw~iwOYq1stSoJ27&Nv;JUoLyiKbfx~{IS)1qlq{cHaY zDOZYsxrK!+gRYK_nnucl|3obBUO-n@e!i$|shvBegt)jk8_^esnb}#IFr^SliRJvsN#BN#PzDDIZeKv)ypT!KgpoPVF4uAT`;v~E^ zpCjf)YS$6Am|D}p&f7I#8zBfJU&*RFvdF>O$>cK$!Xh zTLBIgHFt6z=afeRRWCgDl0Q2Q#=Wn%oG@s1+R%0Ea6c?9L8o+R-au~TmY-=iI0N>J zBk=jj`*JtOdp9GqSlg?OEGdrxJZ3M|oqT`WQ~sK7=~%8@uH=)P6Zm z@MdvFQCNSb!E?>q^3She8^_q#*g;a)-!a7OEI{1hEAUX_MYTUa9C>?tOK@0Ce(!>x zI5KKhWefQ~n5XM|T#j+alM8pYv}o^4E<^3L(=NtJq-#l}OF3~E_Yyg3rQP(r zX4P|_Q;#NOB@^=VQdPwVnVFf@g-3#5hyNgTRaLtx)2~sS9uqan3%Y6?c?jK z#GnGYN;Be(qb@q0@tit+)WZQi{7pQy-lZr&e?`Zw1Vi(O{e?xoUx?oy&8rE45ShML zjPLz2((}J^wBf{PPL;?ee>tz~=zlT%VPQMus5lp#$Nh}8bi5vXgJF;%ZUgcq+F(3rW>UKnPF&=k1!}Bt2xGR zQYh0Rt5;S%`@WfMVrG)y!1z&IyjxaY^)TibV5*&FOcWVN)M2`0ztmt2e04qTu+A04 z8r&yI%O>DKCfUA?zRI+)UwQ*KQT7`vXK+tRmXFmPZOonuD${k(}mhk1R>fEm;0bDn#@HoN*g&LGrt3Aa8}PYr_1-P4f9 z$ky6Q-P)=+W}QC6fPTS%Y{vmNuALz=o^MD4&e_08-`w0>BO9UwHWe2GS&&T85qmp< zO}@Upy}e1QmNf$FeVNO-Pqcw+E-fCK4J)eWH-{*dq?BJoTcjYWJbyBuy_})Fyy#Xw zT=Zcj2q_9@<=8gtOdkuk5F+_Q1$D(S1A&r)tYqLbP6$mct=!#KmfuonXb#`Gu;8B$ygW7ST=S04+ZVKGhxI~Gv)Ow=sXG1?&?>$Ncsv;{ z&!Cx|B&xFEnVLFGx9Kw>i`~QER&J^4^tkZ4pdSw?VG9Iu3Ggy|y&N1sV&01-(j|z# zc-^*ddzD!0zdAZ9EhF~5irVx%l`+fU&d{t|s-Uym+DZg8>%QxO)DW$vs5qMZsQK*G z3u2ITtyk5wJXs_QaLna(voe~m_;XM~xkm%0hy9CsenZ3VLkjgN)-F4*tFx%LjK>c? z#OV3PY%^d9ibLnbC6YsbAgw7cbUPp0FCUkcElw9<#tV}PoHYC%Wf9k>9z^I%u`80! zzvDwEz(otrjEL!9sCM+*cHB@Da<;Ju(a0tHlOpZZ~HR9rr>pb18suYLVmsq=4~?M^sO+ci|pJuwMihe~Dm=#XLD zyL!xBy*Q*;du|RBTbMNWrBhX(dCPg%C4cu+oUif2f11l|lWb-@r0~txwll@^3kLFC zcLjecw7;9l%{;hF`+beWp=CGmKv{m4bN+Swrec-A%uT|2a?K+@tYV8Vphz!Lw;nR& zth9jkeIv1pQ~0q0xPTbtt_Qp4dRkc=J#5;2)_rP)^nN?JZ>h1ex;@i>3$x0&R|Hk$ zONNd=x{a;itHSA)(^LtE+VXP7X)iKRpr~2^wKt)s26R1<<(86!fCx(KDNOJ3k ziNNENWrW0g|L-oaM^;&=9t%Ysmt$Gm+4Fu$p82X%sIS*6X@rzdjab}C($a{a9CndE zC+Ll(LUmBOhFTUqLIsYniin?Yev`92Fkm0GG`s)Z z!*N^VCyd)1lapRZ4GAKmI)b}}boPuZT5k450l@RKhQ@r}%hMjPKebz*$>JkFdH~ol zEiDb5l0#m##XfG!D)VO1G=3~k_$BH?E)V=_CKc`G5vX*1_=;+R%04&A8nz%#=1v#$ zf4dP-E6u^(*fRInsOB!=u5;sMMuP`HzPlw(;`L{RUGsGW2`AG14)@D-9BFe>)hvaN zaUi7`Jj3=%Ykheydv_~aRSpy0O63pPPMdMki_>^2vMT@0q`jN(WDKWC0*e&d{+|6- z>KxzQ!E(|hg;M49G&9ZgGAR%!X<+20tkj`~2MZyhdKq9`7@raR@IlJ``{g6tCBFPU zuDa@%o!=^|l8rFom-`9pnc^Iv1!%20YJL7e4&SdGB=ZG;N<7adB)3wgK)^h^sq@@o z>@2|2aTyt6@A|8nT&2Jm6x3+#x=Q|>pjA(|C&g{64KrK*R))C5juV^!Mtvu4{-yG# z9o)))bua5(6W2f{m4@7kLo5tU>M+|mBAZg2jl<%Q=|H7qTlmE73R*5>zCwUI3Y#Kr zdcU5ven;saeL)lKm*^PZmyt;5JEJ$Wxmn&_`8XwW8sHkWiOc=WOiWe)qs zWuLjlbANwNsOQuzNvID7WxFmzn;cesj%x=GTdUAN?CkAf6R{Z$C(%w>&2F93m`1C} z4mzuO8qR%EWk%s03YLq?mJ5oIBDcSLG_A`==vd>Lc-R=$5d$+I;BsKP!Pz<(K(CR_ zsiuIV=OHhDS}E*|`ToD~U*g|L=m@2+XZTQtjX$(ycrFMLo4%6*X|)#}tj=+cLOC^? z=*o1rFgL3o>-V6{QiXvqc2Iv>UumTbq1M}!IWlRR}k8)9~$C3ovp3z2hiP? z(eiruZjIl|c3lkY2fAA9^v*`O= z&uLa`)owzU9WK2D0OXhkfNgVz^t8Gb0Ww8>{T#fC?J6SE2;-k))6>&Q*CJRhf3l<9 zk8Dm``LC92KjCc{u)g2r%z)s;hvI1I$1+!bf8V*HFhGQc>wntvUaoVbWryJ96(Q+Y zq&2n}p}ND(KT5q8F{Qgkt1fSBK4fL$u`(^4uN`JyHztmxS<%=anYIqN#i2@bAwV43 z1KuNw)=+Qv*==Hga1eBLPB7)s4x~E^Sh#Dp##=~=Q!R72=w5zy6EAJRJ7-hNkCS@u zJKJi>u^|`gIUY;aCD|^rpFbn-wO3W05_aA7lRy8Bgwdf=O_BBR@1p^`wq&f^hKrvQ&loRpxMk4L zY#JmP_+T*rKsI0@#~y|piHT^2DluinkxAgDsYx9)GmVJi-m(OM^cw&IJs#8^Q4g33hD%93R_y=>D zr5!t!Dj&*Wf;aV&nQf`u{JIO=UKpp--oFXPly$=?e6Nn`?fF?*9f8)QV;NE?$Ff{e zQL%jn1h?=bY$Dg^uoUQjou&(Ax{Z`(8nl>-+jVS6%w1`*zX%%W={=n|2Da7KP90qX zSegzGt!q6GgVV#hMuLLYM__6~xVq~F0dd;jKm?hltq#8$V+yE0$H&J3%vwO-P8RnSL-~VRnTt z&{KUZaBWR%CR0h#8^gf~`6RiWtb-a))LQ4yNvyKmsq-VXlB<+NL-<=mmGbSs_mbz5nd`y(4DERb) zbZ~fV3=@oqiHUjcwX%2VEs%S%+$2SXTfH#K>q+|I4fn z!7xxTQQE6xEp*?(h*^K>scoHjR0D*FI%UhNF+_pe)Csq@e|}tC@>%rLYU^!b0o$*B zCQ}^14wx*}IXOX6DdAf1q9;9FiZzV;@Xzrhh^U0*1JGYQq&+I;7HbBD10E@$~iuc~K=0<}wIvOZYO zyp_@T69zT!)KT-7NY_rMjh=^xhp%7J(??%{05ah5ZYw@Dyq`$7!D?!EEUV;8MxE~I zPnW}Tyx}P;HJLet6k|L@PUee#!c^gB8IxXQGK?!14jf!O7NeLDQKO0l@M{pUYr)jv z<7v}Y)bUZ3d26Tcw(&Z7Rh(W_XM#!sm;x-3`ZzHj}z~9?G&h|92#vcu#@UX&NE` zstG^#PzCm~m#r^AuIrkO|CO9YGB**a`{&e0NV9=b6 zBK=ucv9o!jI3>nMJTjv9jp}n)>Ap##c-P}8z2E0FT94WNPVujB{RaRP>A>duN#RHHgAg8M-DeBFWruBeT z_l1A3;(U;t8$*0`P*zSZ@G@&XB_-u2p+XkdNv`i{%gghlq4&<)ac>=+B_wPCB^8wd zK1BCkq9X9P>1f*N-N6g(e3f~y$XU5Md1#nOx?EquxzzK=CWjf<8QC8m0;e{4PoctxY?O6j@)(p)>RCpG78U^0qfz>{;po(TL7&@tx=_7b!#b18d9x3o{7&DIqXlQ{l5nfP?8fzd-C<&8 zF4D-M279*Q*Lt0H8O|S~bOoAO>*%45^NL3>wajATLZlH<>P6h9P~}O|xuX?i)=E0eP)MTW%s~3%fI@x7UT2uC7XS z7t|v;VvBq+D3|9~u2g3`hALe_S`9_DWwbZ2;)tVoasm3m5{YKv0PUPQS6P5aVeNXl zP~d*|(WDQ8OU);glzl{t+0OuQTN$5zfPy1|RC#_u_w#qSE4JpX81&-o$>4*q_HpK6+Q@Hj{3A_Z~0A%v3;+#J;wOy720- z3gP)TLg(*kk+tTPV0;%8U<*qZmZyz}w1hu4(;(myXZtr+-gkQ+?NyfA$1RDbv*ZWL zsY}g1@UQWf9+QHj7vo5E|m>bSl(@YlBXVKaf{~Dd|rf12}~C)=O(|^i}a6rewsQSXOZh@opbE zb0pAi&AQ&DeDT>=fFxWNzrd@3CXUi{h^XjyIm<6vNzBT2I=6#I60*NofY9qlIrSrrC%fL_aC=zB)P<-7aE>^gkefw*B7)oLf{D|whp*es80 zq2E<#Y+y!HKGz%U=4-Rn@M>BK3dppekKFG7zwToD*r{d9c>3WB`i)c9^~vB#&4q{8 z2-%Us4?k~med*sB2MEJF$`I8EMT5cy;d|06-{hU_wxmtpn?o>y*2rC7*PH7XV4O%uNUFA?XLx5>;vtMCg92F-aD%FxJ1 zks!^M0{OsHDdc^AqY+>1K1eGoVYBqpm3j4wSWj1{>E4iW4}LRaS(SI&)RIN`(d?aR zlA4g_ndxh5C#Z?k5%UDI|K`?M8a15dgrqW2q+=ll$qmoRIKL>7xnEQJ>L& zqK68Ria4HI_|fkwIb47`l!>uO0|lL0cK7*->73bE20a*z|R0O{W zl5YL?_5ltjA^nXcYp~XAOm zea7MB_|xV00hz16{2eqsjdQT#>6>s7wN&7b|{wip-$%XO7l= zPtaTlDNUb~8h>(IF4oJF@R-E!RiFe>p@CSc+FF#~I{4V^wD)t8#QjGU@cDk*xg`_` zr2WH!>|1>%5I^6DRlP{2ajX4@g8QjN(S7)7$UeYSd(C_tIk39*^CxSpwiuhsE zwC39r_jjh6r0T`a^IgXkLT1LLg*SgA$s2`Uge{0lQ_3BJWxlpvO}7pm$!TaC63Tv4He6mGZa->$Gvx zw7cFF&X;Gma%vjdORWbaf5{qYSrNB)S(%33{Y#yg9cwAKWo;CoC>{^jnV7eY@&=)| ze&4<%N&NcK6sX<{_3iXJ_&_euSzuf~UD0t(ASf}L5=mK6i3Z660PZH1m-Qi`38-nE%;Z~EXXloy#grn4<)C!DXjxxjipvK2ST zh*}{}#q)0(10I*k`gJpTdY?_quF<-w=AH_m#n)rplKz5aUlkZyu~W>f?fP!g@H@-w zF1|fE%_%0*AkdHEKNVQ?Ruc+cPP{!UGtphGrUS=)9~54@7|~S!teX|#5D;07kDB0Q z7O|kEiQfvJdz(c<6=Up4@bfH)X323+HbMJi?dQy^8 zRAlZx@WA;st@WAS`Kqind%oES5_#l92a@_4v{Chy1O8n9vI>X2R_5<+RjgOb4{@tL z-|iWU4``mEoaU9w(0qJ_ix>C%Z$_S-Rr6!)Tw^8L+A24m%=S=DtkG>ExWotYla8}2 zV`vR}45z0=>n5s)o>}=H*-xz$n41@&4_$#{C>;Lgr&iVzI0kNh6D2m5BO55H2`L=r zl)0#uGpLT@f}2glyw|QyqZBDA3dUi+<+kNI5^tzgb-OO=rno%bNHL=duN;G>bLWarCOZFrgIaegSOJnm7HB3E@a=AeDz zd#5p?B=-x*lVF$gXx*Cs?dt7%py5n|701J2c{Phc`yGJ%4i*>aWE@`;;BM)0a7%UF zi9s7`R`jG>mVGhkDDy8jBlf2lZ4GnvQpf~X$T<;slj>H2xw)7- z6sSZ~p_lXV7ZDvSEHu|nO9Kly48t5+;`HYW_avX+fJa^ZBDDnM-j3RS)oSW$-7Hmv zT450PO80o1YNt|L-RvVusSGAvLc9P@#lUrpvutxTl03j`#d%O47$%8FV8C4WI+(S@ zf{G;x{77{hAV6ukERzzY$f`e{@9V?Ftd?gIxO;~c8Nn=BJo+*|Urowz%J;zE9~^qj zMn`i%x~`>hf0$H;EA^lyTZTojoTx2ySw9y0a%Z)rXo-1C^fYOC^qQMf;CX5nf!JX= zG3nRYbh+;4ZCCwG^H;s(GZSv&h<`{6X!-nsx#xz{H`h~-HeguXn=c-D>TPnoR%S4_ zA>J2vg2#WoY@1n(!A05U(7{1u>dRQ!$RCq;% zG_xA5cFhQ5xeqgMzjfKeCI|)m_omiauFP>J5$2}xl882UABK9*9DmxzKE`m!lqT=} zsV%x{yV~nq6e{J|`hAXsyh7jI&W%$-5sl7jWGcC1rXE z1U#NJb=@r40t09ePINy`E%0Urel}fZ(AWTT{o#M>v$|Z~>gE*FpT->Te@~lf@gI&q zk&(p5972x%;_3>xpEMNrq%o1EF!=zjz5bf<#PoTPShFx=4JmWHlz*T4%u%bZqu<`9 zV|s7*2#iaV%^8Ld1n1TeLU%Xsvv>wk8F~mPY}R6+DgEG-hTLzaSib88e)f-Jkz;A; z+d2mYt)H#y_D|-7yp8S$=60P9tF4EJHciWLKwF^MNV%204nXz|CoOxrA`CF1L(^mP zRvZbh3ytY9FxUj>QpKaAqxXXw*>Vg3zX6PjnW`6-->M2vv*Dz#{~o00HYHhBO$hp(#a#`| zz~6duW0=mBsWUS(0|}%3@XI;CajybLcV}k@n5M^VEkeh5h0pu&Z~gUbnB(m1V_9|S zekh+_7J-lc21%ghST@nc>8ZX{%kWm*eyySq5#xj9{+VIiBfPJ#B4#gV{G9e*(9*l6 zJiX?kGTz)B&Uc%oBJ#IJau*p-sYU987-PH^R&mra{389b50ddrqXK~{Q*wrlK1Y@RGEY>Vi)05dw6WwAt5i%w_W&jUm$~9 z5G$gAXI&jxG>O{kG_5Rd*F51OjY#~++L#1RKi_&m+NK4;xiqJz;=Sko>bLiG7TA1< zd=2quZ=_^%>eGeSALgJIs;2AP|7osb;kLNj16ZxGC>3A!lK`?XDz%*cwRXVeY5nK7 z=3Y=PiB0I2+joPQW4yjSAQ^t~Fq=^kiobx)Ks zF<(wsG4h;rvYKSds6hj@+aSAjSe<)BfY>ALwx5*b1%dFCn|6YBB}B_5wPO&R%}BK! zl@6_Y$2roK$pKbuRRzNU?oNI3C?U+7ZX=x%L<(U0CxiIn8{LVniN{Eg#3 zl@_|V%zJ6K=kbN?uv8w-&3+_X7j!A~5oHLR4}5uCcjEDz*S2g~b@(@&^dv1QD%v@1 zI~$*vz(x+0BKN-nw%K?===!jOQ~vVa5A^5u9^wj-s8kfnm(S7;AiHim_K<)Kipttq z{YoR)H&JVF`~@PFvQV*GOmFwGD0PykoGU}{{OQ^G3UQKXoy@WIIkZdIXVYCggAJib5g5oMGJQ=KDyYGuF(#M$;$*n&6b z&{|q;?`LRGmN60NyR{A>=WAS=#DoNVryUSZFmus3|M?fnf|O}z(jua4S6a@Thzkz` ziCPK>TimVOH0cU0|G|kIW&S0b+J^Z(SGCk(>yY8 z94$*#9-R6dcStR-frSHRke)Gvi8wuIo2!AHaNMQhJ~~C7%UDc4|3!U??f9#nlLLuobYeVvOEqAB@s4Tm^;_+T;YZu{1P}-E4zYg$ z8HD&xCob&jZ*C z5JI{B{)jDjH3<-aO-9`z|3-)m`O~8xO$P-2{z9@DwXJIZ)bs5Hj@{D*XCD0xru6-= z_n;(#9OZS@Vma1!+LM+Ru-&VIQ?QU`Ti1vk;M5&PZSib17wED=?BTd)PzDaC?ym`q z%StJFyjl5$>~$Wyluo$dtC#s{1T&(N`KF^}&krhizD`S-7s(4hQBy$;(HtLrynh#!N9Bw{kcHLtvWO7CE$>0;VKucD4Ui4d$@aLB>-lPh|Bbv zBlhCr*Iqcw9?mr`YByejH3Ur_9AU6OGW2OCdyRkzG@Svp8qACo3cUUxm2K+8oPkiC ziP70p&DuiOS}!m!13 z;5&yzO3z2PRp^O<-70b$T3X$=6w#C~@*ofc?cUQUYnNWFNq;D|5D_Z)duW1twjZL1 zy1Kf*zrTkE*YP`5r5QDIyr@2Vu=l?nJ24t}D1A1IZszhM;fj18v=(#fxMUh0` zKRF?QIKuE1q^t1N@_S#sCID1?-E|dS0-XWy2g9dL!eVPO0L#=!eRui*p#cxAbqRFV zQUnWw_ac7^$u0i4W|L}yTiE%Ek;DVgp@wws!|7iZP$0y~xB*8Qnt#?T$ zV`tTsNc)VmdY(F3^78V)0QffQpK1+QAWcL6#;PMgi}kPUhCqNZTs**T0wJBAoQ!l* zoSeC{3Y1!?y{4KP#b%j$IhWm{6F_*!kn-a3(Kwx8QK980tzr)<7w?mrNwiXH>ynmK zQv|PMcGlROpe$?VDho-P{-(1AJ>N#3EN7XJh2C0lTxKC5m=e|RSZ2K=>51a-%#&WR z#($$;mJa~P{Cwk;W@pP>ZwnecYdgD`!7YhCUPlLq=lP~icYt&*mH5wYkYkMe=?@C^ z=a`>WRcpYI>!>u1#e#m} z{7Ad=Q#Ey+ohOnznA;FVMQy#VhH`dwK~E`Ole%%+mqkIewY6RM##fg;kWjGv07&8K zt3<3sXyCOGPH3=r?o8RY_Fpz#Q&5Wc9HEE^;@a)VnhZsbwcH_BN1OR@|J%X+?7;Sx zTFPuT&NRI8Uep89Ca%w#8sX!7-%=+*Ae;NX09%yO9*x6Wg?iDqZL__yGomDVGs zMY;0NFx)}sFr488sy)A#{+dE?!E>tJJ?AT2$n~&TPTU*V>96(l4tI&unhjVuc|~Qp zL+p`&`nQe0`3kQk^mOsd?4z~|@3H8mVuIAnJ+JqKz9Ql&6V9}Gltvb5AbN}l<({bZ z-^hQmq>?-n14;jS*iIJ}!MI=A9cgOv*G@~Tx0AB9{f*UnEyV2)*P%veM>f=auhUR; zpTc3dAna#ji;ak8{2}Z;n?Qwl(u@OziMctDv;$z%)0^jBBcr2Iaip+=fsSoy`~rJo z+pj_(JX|sI->dG0Lu_zX2Q8(;{~V*F2WrIONpB*Ns6KIa)(X`X)Lo~1M5(zWM!@Sa zs4<a%ffG`ki81{1 z)BshraY@Lr{cfvL!|jU)EHAFb#Y`iLVwk@Q6oM1oO5OE{PqIkGylQV#ns10-qX~J7aTA_y2>7ZXp3Vm_x5i-Uq z{UKq68jQ#%Em&W#uCAPTNYTTSb}DbCu8S2FkW@%Nqk@8o-jn5RB6K1le5V*iQ9(M6 zZXsL;qXx0ZXqiZk7Q#-NZBVn^!sT;i)wTYT z-t{EOd50JTp#P4Oj`V`C*c=d zc&n}DmHhi=Z?3N?gJ{J1s4tKeS%_K-IxB6WX|p+Id}R;9+|nn~#LkpfX@rGeZUDLG z<7t~|EdWh=b#!!WY;2zI28D0(>5ab%ff4bJg>PITj#SL0_oU22*%~Z8VWdIsGNB1( zJ&J{t#c3nA@4(+}D_UvEY$4!V2CYeh+UlV^c!_D%)AffJ>zGJd8BCZnt*HZPU@OJ6 zXJx+`(ZK&xBmHXzI)OnyfTMtHM|WK0CMH|cd5!}LI%Y5>3?>CxWbtY^eGy>m!Kmca z?VLX5OX1oGP!y&bq%o#4wvkc z)nkW;6^MhG2Rmqa0iBtqZbii31a`trj5tliC3Ui-B!=yA@I_QYhDJKAWCsc0=IrSf zaph-b(S?CjlXiQZWYqZ9T+W-;hZqq=A@;`C5yz>fjUedv$4^_`&KgEwS(IT!GZ8GR zXmc`CUz7}a!~LlL=(fVz*^kf=Xwe9905-1UHLg=1WT)ZtNmY}EIRr!f9hkD9Q*qs# zQ1kA(00`Na2Sf-6k+Rs+lz`ooI{?y_r1x7374{8Z46X(Rlasg`#UC(?{{q zjMXq2KGy+!G^C%lYgKOq(SX8Z#taMopwIDgs@NgkchLFS-}LbVMi4(Y9q98mkwocs zmXPT3MM|gY4BY8^oCcst7Xne&am*i1%`ByfkaLXGT<}yOOvPBM-2V9D##V6yM&KO* zTUSY+eqpYgT74o`oMm@G&1n5Vje~}71}J=|K7Y`6O*(G*>Eo#A?gy1KKU@Ygx)ag^`k#<2|sB}!F z^*Em??hQ?jecbP9bR-RDl=Wum)cf>H^*yfTUi1246HzvM z+On6M#p}8ohK3JJCtUz3k*0=*nC}t#GL+o!Z?|c@pa-CllOlEQV+}Zu9vJw%Xd2Qo z8bs8KWapJr@IeG5wkXF6_5UHDQM^O^hJk1123smasle3=$pjSi$>A|F{Bj}=WkA}Y zSP$hf0`$rSrLkIy7lEp*va%9T^jv8ppNw4WW;w=@2|f&e$a@0F&wpv76JS9BiM@fG z+-s@;fQSH;dFMc{K*+3fwc;%u_>W*p&U@O|)Y@Re8C@hy?>>I&w7Hx|+YQ$VF#dlkXs(UOmQ$TUMRAoq^eawyP9*Lay@viU#|t?#{)x|i*W1(I&@jl#lQ!mI%RA17?M zq`f^GG7iwkfW1XASKz)0Q04>uHn4W0@q_F@TZ%&F^#`Dd;8XDd9M;n`3_E8)%kJoZ zqzlac+XlB)ZusILeR zVbgx}c&kfaz-Yv>uXDcP!ZzcWYK{g`wK2YxG0z|)$eMu)Ly07kg0|at{g+SkNb`48FpH>SB^eTk!mNxn_cK(t zPf($m18Q$%wiV<>i(;LRJJTNehX~bka7W#g4h($XhPH` z?ge2jgahAn?CFclVmg43$t;c~`dE;k54a^TNO>lATs{tj;Q%Pqp~)9`3NeU$7FT%h zMqS;fBDd_z%}tZ8^)Blfx<%7_le%jxON!RDa)hAWLMJu~ zMyS>G0ezul58cM3P$w#l#o}p!)$UYZ2R&)f=_nV47%|ERldy$mowQG1d96TJ(#pC# zVk7>erL@v`sAy>vx=QhyBL~D_1O%Yb5w%;uCJ5%RZW+4a-QG_W_578w z>h9@s!qvsaVk{G&XK!}p4<&AhObz|7=l+cq00xkio7)rcCy7BsD8A21Wk?rWLmL{T z8G1L^Kwbi5R=45z@PJ-6plHvoCDr$M39QY|zKN1paqzUYwI#E}!B7bhGPk_e?5<<_ zlkMX2>nQx0K%4@kfCH!)WU4f41T=k$arf0~aA>3{GZ+(vC^xE6Wl2OxUDj9|ON1yu zL6Ekd@~cVo&jiEcX+>x`x`ySA-%JT>=^nN^__-5`A04i9CPYcWI>jv$nQ$8fnjS(SwKc zB8PdyoN-W4Kr-CUhah2A+G^X%%yxQ%hUgt0BREEFjS;NAnd_|14+YC zFbLQcFK-_^-w)tQ#UqLa;vg<>WyH^*&Yog3Sj6po^L^7(^Y(dQ0?zwnFqi$()j0nd zlU9vL%Q(5$pJ1Rem^ua@t-dPH&)?WiR-AW-H!c8)ST6aWM8{^=*4T&|3HwdT(XSTw$q3~9aC z7KEandtD6&wp4c^=<05Obcb*F@IK-+2{XBMc)(wkU}byse;vFWyV7T3qC!m4Vaw&3 zLXQEz0ZF5@rOD;^gHa(OVP@>*Q**6q*wvDF!%tuJ4a8AbphppW?!BT!zL#xB80ES- zkCx`lWp%lF1S1}|{I6f5C4!1lCbBbJPezwlYahC&#zLt`>MI_wio(#0g%u2gSGFYb zn0ahd1BpuDzkgs8F*Hz=YrlIq@AKCo8u7uSf_i;~5%3ge3ghCUZm6l#ayfF1j(iv2 zdIa(cVAaE={)|dVWD2!c{KjVN=uhv#`vTYvtxIy|7Z>lIAJ6vo_K<>bsMy)r1qJ{z=_WYxV`AUGx(3OgP*UwANVWmWYqt)qm4|vcDE6RYP!k9+L&Q6SKSu)k!`uaYD1x<97WOBtm zL=r60$1$o-I+1-kE#TmS)$-Jp^dFj;brjzZ_b6N#>QK-T$oGIp1oeyO%Cs{AkMDK* z0fx9kF}s`XH;cOOFkx^s2n`pMSoj(1Ln3iGC&P*FHS3+pbzk$JY=K;)r4J|(g^EsG z;a<+=rwc`^IoeoBZrrx3f%t%5nK&ADjcG;1kBLiV^aXuGZQ+1Ks>^yGHarlmRnw}vl;QFm+Tj_dB zEzYu@qsk3GIVt5n7N=Ki5mJan4=xK1&0KsYGWsgHB7e_?I>n;Mcz#hRROYR0^kDh# zUE0rnB$Vj02u69UYd8>^c)5f}t+X-JFfd{QxBy<#q;%FEk1fZ5O8F^Ck1tz7p}<4Q zZ0q|_anP#Wq|r=Nzo?X07}Du#6otJ}(FSJjuSI0$#SVQ-nWWbl)8i6pN7-S`2xuA`A`t8k(bc%*v8O%Z${X8#YuD4hXXQ%h!)T zS4;X5iDaj=1xd|SJ|<;@38`3>)yZI51goSt#!-5pdSw)lnjAKk4-Le@I=v4%mj%PJ zSxw~*17QU(Y>UR94vphuEpbck^tvc!7Gl%8^ia~MV7&Y{YGLiX+w^BLT=6yn zoqqfgTlYy>HMAJ^Vi67}rYb{gUf6qNBxRV>&nx`X>GfbXY8Y&WFeI+Tc-9E8)@?2;$Cj?Wwdy~mX@(Q9o^J$sGYy)-}?dy)(Kp7;Z;gw24L zt7OX{P~m0Q8H~ zZ9hnOy=g0rTy9i_(tW*lkl^{0B>~Sf=hVAn%@>f!50E&v-)%+%U=XkqeO*~u>2QBo z$~bri7^qWI4AX%aZy>so1L>|It_l)>Nj00-)nd@{wu?{x{oMZ4XKih_ON(8XYm|xJ z1q8&&FuNOK#;>7%dj*7Pf3dL4NzqoK&D!;l7O#GS0?|NhRb<>eolen+r?aW^sITujGzQ%Wa-?Be9L`Vo`7xvL=^L8 zPeK?KXGpY?!XVX}bCy_pb*EQMM0bd^>tOV+jzY6sHRZ*Z43+2Sr+v%3s5F8F2<|`- z!pPl{>vBUw!-rfilZnCGFJg-f?kXdKmLSROy(OwG#vf5^8QC%88TQGf`dw&oND}{%1BrBbK-JeqXdfyT=$LlgXgZc zdbOD@rXZgMO`S4pyn`Md>1qWE=TgaNY4jtwhBSlFjaYlFU$>3aqzB5BmeX~X zv^GI@LFS&~`+Ko(L_Kpsj-mU|7`3~>OuhASD?cN9B|rNIHF2-f0QSunX<7AIJ8g>y zjZZ3NgIL;SNz@irVF|o6zu}H6@(l-X@Q^?>=@!@u)g;NPyj10UGw&Ot5b|+I6FE|{ zGN;LPxr*oxxtnK7br^8yyH~2Wb9_AJMy);MCNRl@!Jn!j1Otq=ze&+5+Avz5f}$Vg zA4PuDtm$`p(md!LYqa)s-IYi585Meo$xv6Jg;)}&A17%X9Kn%5C`o;HaL$8=l*VYpSSl(q+~>a^=E9Sw$u5HF z$>L^?ep} zDu0!;RTN`fGzI+r--H`U-oug;xm`I5#Gt-YM_YI8;d@|O>~^DQA5NCHCx_UeQA22Q#n`=?*UWD|K+ zU)!Q;3Exma{6p|JJ3A6&HRj{IK3n83Y|?!r-Op3BSlgO-N(tnHcAqdGjZ{@mZF+m^ zVH#{NnqcA~f+A+Q?r1yp@cqpxC34r|FA?55vWvg{T&QC1)yVh)%(Nwp)ce^rU))VE zCYueJn$}AkSW)@RqG`($zOa;h^u;gjIi4Ug(nw1tMw8_{I1bFFLHZgoy2?ORLe-DU z1OHy$)Ii$sW?PbCzMmV1Q>jkD>LRW!k!3sJ-km!eIxO#Z*u_AQbjFmwOIyj^#ztBg z1I$!b+4(oyDGJ#4Y!v+r!^2+vgoIC5iZKqR_aZ-GM6rprf>{fsUXGg*=kiS*?6ZO} zp%J)S*JkfA8&a2geA=$VQPE5@JkSQA`e%Pz(ZJdT-(B}cg)K3#a|RjD!Ho*FxVv?0@!S1;UL!!LL7X21~{Ve!&VoUzlekfq}lNVf*dTm_MB9&x;I08 zyk=IC^N-c}Uj6uZrm3t2fkeq!Xk;lcBRipc6T25sFp`v*NVyoh zi_~;kFnzm=fGD~yja&#~{D*L0Ft(R)g#4xjD!S;UHy_@f2Oya5XQ(>vr&~KK zDPr`rZQGrN|E}NP;dUA$zx*U+%vbqx84W>|6Kt7Xt?Vp;F^b%hd5_)I{z-Xo64e*h zZh&%podNz>#N_ldVgU08#1K+N%(mbtc$8H{624gW;iJpvx^D`GD?P~v^2<~q5_LXI z4|%brs-YOlt96=iae5-^Mv@*`MROx_=03BfF<*>Oe{upNgcM=S8%XQ0jT}kHfCa1V zx81dtQ#Yv?IZWhvy2pP=F6Tw8DW4S_Eh9puiR8#r3?vfPO4t-njJURIIS?&6@D;px4)+HG_Qde!JuGeLH z;!74CH^wcw@~MpJ&Peg)+{j@#E0gXd){4SCJQ^_BK2;|% z&^J@A+EiCb#!>}gMQ~yaGXk?P6y)6DtN;B-saa`$y#}jx+{iYCL7F6SYH{&Q=HMx| z;jc_@4=#e&D{#(aVR0X_7q`R$)J|H!pD@Bq??ZByj(cYdg9S9d;NT3QtN7dq&y%am z5++AT@agrEa-;+F%+|8@XlR`q=69=#srd&L%=#BH&!MdM8qjNS41an6roKIbzw4__6SvPG0(e=34RSeOhY^HNJbE!sZ-(`_=7>8r>Q z3~t)vE>3F3KMMRAqlr)dp8u|v!j@`q?0P~cjM@D6sfxXlL{lnL$F?O3vJoQc^f>2u zQE748i#IJ6*)QCqsB2d|=}TdfWrs^bj)$0A3aRKYV!8bw%%bTSj3|QT6N|f;eoHiX zF-WyeLuu?GJUSmL(FBoVgx&BaL2|ZVP?o-CkIK=VZ+_g!%xOyHc}Gc~m$GKzZM_B* z1X5?wmFOtLU9(4C5lnc07Byhv@p?Iw6%Qp?xz#Z1t7O?5!HVJbbb{)Jat$Gl3H#ff z-Q(Qz8;ewr2mv+P(l4#`s`Yyw3U$c%e#-%XcYy&b055>14lu@=ev_-ZG%n`z?B9=( zsgPOb1V#=g_aj(kUFGR&Z@X|s#npd1iW)M=>Ru)Fx0^ylqGYl(_ZL?f1TS+<%8N~W z6Xu)_pYny`vGt`!oo@Ry+G&Pynj;ZhP;AhNCT2nlal4mQLg|;B`N~g#$$$BR0R>SBe zRciw){TgOML?q$cBb!YyHC{ul9F@_eFuvcr1ZCT9emD|5lEMh}mAcg$T{S9Jbi9GM zOk?kQ04iK=$N?BxWwP25oN!}W{?dCjgC73Md3|;YQPJxN?`}U+ zx7JMl^9LM&fuaSr**T%x^5sEG4W3Wj59w^Z_b?354G+3fXy_E(EB=Q5> zgBD1pb9CkttT=z+4y=p1Z$6ldZ=kY4no>&bhS6-OoW)_5o!&w6Qn>I$E=5qAoh{{^ zCl#qFnEO{BD--qBSmBi{_u4a<99>RvgDO$vYapHE7{XPjoLYfj=Wi3P$Ix(d=ZbPK zWN|g!Q1_J4jjR?X`#&g!Ewo#xbA1@2qaMa(Td-^5T&(s|QBzbT%~v|R@j^(5iGKxa z=~UcS57P~gkL!YlX{68N_BhYON!MG#D>p9I6}z4!21C%`DgX_DSCSWabgx*d>v`RZ z=9;fxzcTinH6NGz!MyF;wqLFXY8!K`KAyF@5_%DVgWtaw=e3WORLSRT^$5mUEo?qx zi4y5D-)~)EWF~oyMVx5C>UpXSYe_)fdA6>J?F=RA`uV({B~*~q3*dWUW5Oa`gt%B8LZYl&yLY&bvg+27~q4a0~sP85m7!D7;@m?;G6+A z8u*g^%FBa=FiQ^)46q&M#RA!pvf;i>8ZpT}Q9fX!oTU1wUDsrW%&E*=+X{T8gyH}z zC7^!qBahqNZ^8)9?n!4d1AIDaSOW!gJ+N4;Y?`;q=EpK#&ZbCCqcPqdMzmRmkM!_Q zC6PeCseu5A^*{wpBWpW=ah7HtrBV?9>zooucO0hFxIy@@xzdVYOS`5^MG5Q zaGgz-bHf9dlb`7Qb+?-VGxkdj=j)Y7}(AC>kyK2p}jOlkF zvVcnKRE7dBi=ohtmjwnA)H@k2VhVza=iLgTk8gSoo}M{^t?xdjH9R>Hq9=a}{DSU% zm=yc$e6+~vaN*k-WsOmABbz{GNZZcGuYHZ_sKaLRmtvRGf(Iw%x%V#&hRrl;?Yc%i zVw9n#;#VZ>e!){~Is_|-r~t>0cMVu)3C5qAz;_5ruGmI)wG;`_RfOvnLsrgRlVH_c zJPGuSt|xE&@D6<~@NS7BnS8x*BmL3#T<_#qFQ@Ir>o+1zf6g1_$$O34=13>gIE7AtL3kV+a(q4 z0KnzYvO0J=U#1DVsl)-Fsi|L~KI5F{T+-7nv9v-n%%l64P`>lW@d~t*hfB3+Xi!t* zY}%%!NA=4_iWpGePn0>|qirEXp{J%+)z!7YhN9w2GtpRD%P;yT>bB^OhIC>3D!FxUc+qu{cbSdA=GgEfeHOOZ6V zjDug7d>SK$`k|o7tDt`0fvn&D-Me>ZfW`iqz>e+2rR8;}BNhx=0Uo5Bl}WXn8Z*S}ry zBaMIiJW*d}c+#UoxkP2wGNI<$ZP z-b|^^Mb?HKO5Lz@#FI5%E`;fNEf}$TUMmtC;9cdW@DSjryV_+kLRpZdTz85lE0&CK z2`<6<21n$z`noR{^-#p+QCMZ$*QYYFMQl4Xy$X9Usa0O9VH>$x3znNi8C}as_3LyO zSOxHBCE&9eMq3J^kI_O`^x#58S> zr#*3q~)jt7=cj>uSRZmgeS+(FbcL;o8t>TlRK%EA{wbrmH7yEV5%a7CdEG z^EJ^20F(pI!~rb>&tAIKq=fB+dNO8b6+)RbhIS_@bL9DnZENerHAk5*)F&0pfANNmC@dj@&xt5>{y;;V+?OA9;$ztdT+M}K^lq8eB`!HrIa+vr zdYLMW5~EKtU8Re4760|uPx~c43idhoW1lFg3|Cj~T{;#claFPxZ9McNI+=gIb-)&< zoV7aaTq|uc2Q-u^=ckwF^Oxs~#11ZiRs*BWueF*YRQOjhl60T~s=l6hfys;G?nCVl z_}Oy-cw!)tuya&R|!lkGTmwP7eP&K#b;rN#<9 zUPPCffn&nCEk%M42N^CDhdsNK@jv{tk(p5ryeBE@_5M(pI$(QI1J zsgSjBwitJ(7UDg3@9U(%c=F&G*4VNSGtcMV$GMC#U*~nlGu%C{)4rAbM7GPul)yGM zQFoe_Sf5Z)HBoFdKI#l3%%CUhu@uYEv1O{VU4ng&1_-v#uN=?@0Lle!0tH>&3Ke)b zXsCF$dob|^|KO9%Xe1Bt9dy}TdyK5dLJbHYmgwMWdxi(j!N^ZMV67K`Q?*I3ET^hM{RI>n$aJnhb26=-1I)18=c`wB zA5c@MCPZ(u0g9bZ1n=`du#1jE{($)}SPYNZjE(3ay)opHU}H5&**lsoc>$95LUug> zp#e5q+os(F&;b$DNSroK>W_85+uh5$SmJ#ou6HWRNT;=Kxvi3_pI(W+o$8-+>Bt3$aLLK5!NQ#UG^_lYE+l!Eq zdP0HuAkA2W&spD?)GaW# z{{he!^6%+6Cx;{+!5(Wy0-x@v`Q_jCNY`%o%f0Hh;S1likoLKM0iaAy36|l$hkLvU z3*{kTVmSGmlGyCx0{>rx+*P*y2&zBDm7n0l*Kk$B? zU%j(rDiz2!jZD2h38`Vl{J=n|?UJ)dI8ss4v^Sa6G7!^tsw6_A&lrOs?czwN(_lW)$7DsKsIZOrE)l+hc?jTt#LS5ktU^KWXFKl zF2q^om3L7|r#6*26JIZO?>P@>DOZOr#K>p0HJ(KM_vki2TX*~It&q@0_MflI5%*rg z&1czT%$B=D@rgjC_QmIJ7%=Z7DS;ku9Ef5p%bWH%*YCzMYHGEQ^iQ#&#g-I3dE&2R zowf8GA%n-O!5*9>dw>7QvUTAx=KWoNv2nYSkL&%$6I1OvPk^2?T6bkP-1mKJT?gPu zqqj+IP)M;a+$2ltwV#J-L}}Hv)KpJHMexQjf)L;V_ZHbSC2wS|HzwxFNA`<07d=z9 zqqNwbQ%4gK0wUZZ2mYf*olX$ebe$C^H5YTih` zt@3zMNeKy)ktBPtCzNZ{QDGrIZ@lF-v$lTSdpXMv+ad(CI*p^vTk~6Z@nAt5~s68unx0TUo zs;w;V!;NIu3QeYy3u%Q#HkDEkVQVLze;Gj7)kPdDMQA3^$wn+Wd(KmSmmdgOZU~wCm#eNt*F({M&KvUx$AwG}hhH z@191O`6Xg5{ur@g@QQ7ms8!AA+yqs zOs1Q?5GH{ii~7tRw-9~k?%=U#Dp*a;w1SYHT0h}2g(3(GCr}^*eIIGrhTrEzyrq6f z8v0XaRDw_xHb`VWL#2=X+2$<8PN0#+X84H??z|tB2&QRG)kf@iAqYjve6g_RiF^<( zy5Lwdffn0i=j!UafQ9awXD|^7gyn0QjfKv>L%#SS1Y+0YvNh`*I{ecVC&(vJ`4Iwo z(eTZ05t8S{Nj>=pN6FiaJ~-dsAJ4xpcQPM0WuiMFBwAAcee`EaE^<NRFS5Y>>KhT2A5C;}*~BJ}Wtb$!j6&!T5nCu1XuL!!%?BIQN5_`)xu<0Pd1xs7 zI+~^<`XG1Mq4_PW0a?ep2nM6A-~{0mr<>GcU&JyutB0Xo|4&k1xe1^-cI@6mLkw}| zS7ON47u|88Ab!Uw|G8Wf6}66m+Ga9SC_nv6_61n=TbvFRln09|SQSo9I0h1Q zOF>5j3MnOh%|>pL1k9K&}Z*2cAvUdqjQq~WmV_&)z=~2y-YmLJ zjmaKP$mrdSqw;mRq!Lu7=lo{t`G>yXJ=(PM`UL+z<}P9WmcM7l3RP!#@OJ1lVY^Yc zt*+*E_ZB`>0~|zGbyi`FhW{J?{RhQQeIj$gUMg9i#DmP|Y}VwOOpGW0L{H$CyIu<$ z<)L6R{QDk%{NkTQY#4zrjgk;q+=v)`u2OjdyrPZ3-t~HfL&RZ*hY$ew3O17oNYr?` z`o+6C9ea(0N+YaLA1pT=R?V1OI>PCkqNr(Vy-x7(c=@M0a8g*8k0v5$@+SAV7%j+y z*jbCck@`DBqG77a&Lk7vx61*;pO(}#f8k*>n1+tkTj^tea*67Rc6vH#F3P zIvO$U?EUixtSR42dS@ERrlXH8I3D@k#E1Oec#)f1XWA7|oTzj(G#dPQ4SR=!KF>RnK@i?2Lh-c`$yzr>xR-ss z+2OFVXxhKYeRbDke*{a-L4saxZl!tB-atoIM`TGZlT~-t<+yP-Pds)FFk`kOd39E` z3uH6f^}3)l$LDQvif)LKNSX@+>zyO1g^vUFio>=?=C#~wFcM6T<5=CN z5|^1tfCt;+l6L&TSt#c7wCRe|RFuBEpXZu-O?5TP{J8_!V0#PB{l=s-LAWOI#&o-* z^xD>b1C0iJ%3MZ!HKzi6;(CYi;MS0H$#?KrutH6w#>epDlX;{hM5mSfwq&LhL;v^U zYih>LThko~w>X=WZxODm%o+h#0jF#TzAVTbwa z&pwgKg#%`0j_Yg2kAgxHWS#ao*WtDah*f_0w_VGEhMVXV#6RLRMP)BdjoKHgpD|Qh zSvHVc>Y|E-wLAvO&~oVV&csMuTmCfWlbzH~yhC?P{ID8nF zIxpaDs)jlzHZ^R~54e>!nfD*X@5V;VAl5uMtRX~HfBe)tFtkxKnUiiRyKM?$x4|C8b~L1KuTCQdOb?xXiZc1MPq z)=2~U@6qt?{TgT}lavwW33^#OfiGS+S22CoHbznsbc3;|L$ng`)#F%9LVENAQyj;` zOR9Q^lhuN|#=ns0xJT(9Pa_HWt~m;ZR*4aZQC6PI&=lcJp6}Y60TyouR!eARJysGs zXN)1vj%|yU>4y$;lbc*UiZ2n9;f;;@jq>T9^c%sT zXw=oX>x@#N_f#ODDE!83vo*5%aNVj)B1VaBVOH`t)}=@Ce9QbituBwzR36_$CSI0d z?m$=6&7Ya`N4qsc$>RpB6dAq%FMI7&SbASZW($`M)TN2*4~R`6i80|lvLLPeS_eOGGQDOVw_`PN)2I$R~j5`PVRExMi4x7#&?QeDI&t@jy*rX5F*R^%BB?{#2|2KB;!#hGpDcMVs ze!~oAp-b%+#)a(!4-(roGGYjG&vJdL3f)+im+eeJVNkxsC}rL*HvaIzX$<@havIO) z1-d+Kc0vn3p#*eG4nB*sS7xDbRANnIsD!Soa+&lh3*SwnEoPS}FK5J4=qPlSWpYuy zl-GznolYT$CYsLuKxdG|!kJb(uZUQE8X1S?Iz&m!x%;vjC(lNN7D7Mf>e%_7c%{7)$W>IzwGn)0)O8Qq`6Mcl1oedr|Ir)f(>(Bx}(3ls$dqX@<9;vs_XG?d7MKS3;Hpno7A`al(dp#+2J6~l4TsN zZ;JcM@Az+%x8YVC&ywEK;josol@+i|;?Y?%*7CM?NI(RCMoNqOZ;ynK$ z$0+Bt83_IkFhU*?p2*4ebon$`3JjM=xS))Ohy@(p+ob$vrd?6%@EU!mzdUencK84+ zoc;1C%6J3Mlf5-RpV)7`{~C;lyE*k7;u_0`Oz>G~-mIwd^)(u^BqFnUi!G`X$lmaC zmfgI_EX>8AKuOlL=BuxXgKfILuC<~0zAT=FGi5uOXL<$;P5k@XkRLdg4WL<5rW)2q zFS*$5<6Tj+_3)aikG&94z@fXX z#~ePYw;IA_R+9+f*4la`TA)-@keD5o6eeWfAEc`&{{5{#vB;FurQIHn0z2&FpVB+C z`BLBq-z|)N=at-{{%?KA&am?eKBjFgNC+CMlpCSM^#_Ql3l4*~qTpye8R5^bL0X+Z z1!`SI!Q`%%7fQ?s+c)82)axK% zFP~(hLtk~!_%jXdO;@(Nb@tSg#H-t@HT1rnt-^+|?LWXXQ~4b)7|GGr%b2T(vN6ua?9BLKIJR|h z@_O0m&o23HPGOyED@sB)MOCw)du5d)3ex3`$`Q(Y%ZvXFNjqGv!fQA_U;Cs9d1V*D zYKfwZ@wgkUO`Xza+S)vRQ`{~-Qh~j~SuwU7lS8iyG-{S@XA=yEG7W~+bvb)6B1ZY#<7PLC)FSn8yzi;}fE1aQ$=sOZTRG zDUwk4S;ms&BR%&8{b~)TAHeL7U#D8wI00%K&CXn6m zwf?j9Tw&|z_2lUFW<@>gm!*|jBTY%g5eHnYeUM*~%}_uRc?!pbR{JuK5S$fJQl?A` zEs(0qWD+vhXqOi!)N=s?9!!6H9@6mp52kJsOv_W2OQgPTs8G^Ymgtb&h|J_*;g4LG zaj{}%1x3t~5{EZ;4drUhhNs2EvA@Lo_1`WNvxSfmWu5)hKRHQp1c@Ft>+Nl=tt;oZ z71}K~z?9pzo1oba#!8kcH?yj`AcgCH>LG9M_M?OpAVOj8&x@Pa@jL|?VJz+!J3=J( zz!fn+Go$5ww;QDI)DPdGLPSIYPdPOG&L+)nX(7!I<%|3F^iiF6k2U@18BI~e{twvF zFAFMCvSb>JQ$fhM-(+0+K10|LnYz5f-^$Y(%e&YojE`I-V@OV$hL5c)5w0#_Ez143 zrbW1_^xvWy;o=lli277MLthlr4A#X>X8rp*ZvPlS9F?#mL!b;K6OD=5ftP?6k7B5% zk4oI59KT2~@f@!HW}KXn=1a{^MT~&LJ`om7M!vuFFIKk3U~*jN+gO!#xj7j*8iTZD zQPEnJ#qW&}#i%O5J7h9Hu(m*~q?JO)dBnvhXDcrK<*#VYR79LDdud<|0pvxlNH_qL zmz0*iW|7&poYqgvaF#VTvSA^DXtaLb=c>|DsZor0jiR&J*Us!~YQbxI4KQ&vZL`g5 zIgY-X$iWhHxH_18(B8iu4Pc@ZOIb-$=V+%%dgyQ_k)!MPFZiSZaxPbeEM3yGdU~w|xUph8{=>vvbr=Th z?5iozlLqJ3cg4RRyx8XjR1JqB8RJoN94H+_Gk^~HKw&(zix&ZRLpY-T; zcd2ZG4P9+;w<#(86W}8T%X@ z9Ar38YcXWG&_E3r2);g^*9AnOG)HCjN}%;=Y;>E<5e7jKyAI^Jdar3O=pnGc8mBk! z!ugaaqxsGmEodaVd*i;eIwY4-GU5x)!&Fcp;knu%HcE<)RjT0CO#U#0Wv7+)B}4EF z%`m@sJ#G5M6w{ETDQ=Legx>)2!KIXq)aliToNG>PXkHxTl;uY-)1Irj_k5Sfw_q#c zH_^tNX-p@TSLOQ=@MwYCZqQxk`?@K?!m8f%xG1J4ZvD0+q77N9FU1* z!f%P?>{K7jmg~!pLDHcu2ppZr7KGxPt_6XC{JY%WfdBS2i4yP;T|nhJZeCkhND?Ch z4^V1aNC=bg>h2qek&G7W-CbgTG6};D%0>hau-1sZ%iG$AILF0IN4$(Xr1o=^*I=-r zNnChFhu320G0$D8hqV9)j)Qphk7`0Jy_(?oCA2X-O=dF)tV~14@S2>9e}6iY(S&+n zQ-3{D2!3VVudz%c;nf}&4(Cf;;v*bJAwk~KqG+vYNM~j;%jM8ZKO~{;HsNTQ4BvD1 z?Kv_5uld2GwQhK`gR}PfZBf!U8-B%urs6)5M13?g-^fdkWp5|VRrRJrop#5FL3ZBj z8O8o^+*^>E@dCz)aSDKoXZCb|4RWbSbG+*A6h7D8Usw2W1DpY9rh}*#B!~%cv;mh} zceg+f{i^}`HT?*r|8XA`=7MqAuO)uh()Q9LKgwJw?i`x7-QmQSW8D`3?(-x_WV;j9-UWMQW&fF;zGW# zAyTWhiXss&BoQL>)P#6Pnxw92Nu&k@+_GdtAc0SS3}q=nsMn4yO^i$fST^gr&e+Dl zTo2{8g+yW#i_Uejc6+N?lgTM@o+5CY%|(f+-e#SS<~_Ts6(==yNkM^0hpU-T@Vh21 zy!RFrCT8Pt?<4s0i@v>MOl2nMFZZ(hcD5k zGe?_02-|^%{TvA6098YqyS#ad8f0+XgUW8dGY~x_i3tzOwjUytll#|Xx!ycw5JoZ5 zlPd#&6sDPjK|EhH6jB+ZKg_>D!#H#CI|B7G|WacJ;!pL;fyiA$!F|gsZVD zq8@8U>OBmat79`pbonuelm)JT?>fL31iC*S@E~5b4!1YlXWu;YRY1_{4sgrnT7Ay9 z3ogWy9s1ya2jp>Nq@=k37(oyT5@r&ImBG+8^tTq>e}-YNQL_L3ZhN(VHO=$b?DT`F zXuHw49w?AbC5aZ(&`7D?xc>r9V<0P$yTJ$JF_4a7C0N*U&PS`sW3WD)LI2LFL6eEO zFGQ@Hzu6j<4`T6wo6~b($G3s~z97_ifPgM03?6=^TJ!xy1PvvfG)e&s#Mg)S%Q1A7 z8VweriIEZBeYr<;22XmkfVukOPxkQ&&4#(%OW=*UxOlY3h#3dJVg(RzgkMA+ z=g!SBNeUStaS%MBPx*don~v{uR(DDZ3lD0iWm;Yf3`mwE?gjJasl#umG2io@&H&P| z735xZ0EWa9XvX>@j~;Lqh?%8;Xw_=4{`vjkidwn=?S%Jk2LqFp8S#~e0CHE8+3a)l zvG7OfNYDj(x9z8yfxR8zDPm-9pDm4wSi~RH;Ov5lIyd;%z)zrmq>fI5v2o8Fi!`SS zvz4|=M?TNe(G=2u^GN0PJCLEt+2?E*{qe8*zUDBiHlh|Bl7=+C+>~m;@URiViHT{f zMjOcm*asgi#nO4H@^V|dpYEN|1+H>p1A>2wL~=j%H*`FAa)Xh}QbL{iV$20;1g|aDAFGuqndB`n%FV$+gL7fCU27-U`OJnY&&rPf&6DK@zLg0)5}YPfY4p{V4#c zfQXx2zn0A)+*e2Y|NC!2LLNZa42_N|t6$)c6YOTHP`k~jPW>(N|7Z6A&wY9jFBFs4 z_ix}NCVG)P#!PzprcOHE634aFVxhh&-$S#oog8fvi?z|jZdEUhX>7^H8RCh;gqAb- zSsMf07pUuHBYg+*YN71y77zW0Wwuv{VuDv4jX&kG>PFJboJZ)si`M1Y>7}l4zpS{O zw^>uGvG>|tQikc5Rw$EgVfKngVYjIlX=zPHfJU;;95INPmV_Nu`(T9z6qVcH zbFx^>0J;4=D7@#SK8~gZ4U~u(F{gu3=xA4i-Q<}zC>h36Je%@ z2Xf;H*aAiZWKKQ2c_(4jIk8!%agyn{UdTeQeR*-ebNldJf8VY@FYDGYy)?=VmPZ&cwGh+G88mN(a0NDYgHexdxi8)|iW}JMx0)IrHDg9sS z8f7FV8lYl8cLJk%gV|)x(vk+TkiPyV_;{RPgt>!8vh|v!3Ya>yT8(n^*FfM;;B_@Q z@q$r${{enr)*#wtcWdD1qq^`jO&$M;xKa=LO0q3R_smv zBnTk}?|$+xn(=r32Mr17=`rA+XBy{HfL zy0U=oGVrr*sVcy*q=+1fK`*$F;iKIf0i;YDwaY$!BVK3c+5sBsxO8@lfzFz0Myi?G zoC@QrUkgY=WO`(~6Gft#cy0P?9R%7>gKsfRGu^Wu^o!NeYOljr6wBh|z%fM`tQ zO#+adjcuA%WqY_lF46c)Ixhj~(`xbrfxy{;iAqYog*jBG&3M59F)Ab)s-Ct~K3>Ks zwLcv-ipj)|d%DcD8OC#2TqwXucJM8UueIpA%U?+NZVBtE3*j;)AGoDGEn4uLSHwqW znrdnr)o)Xyi~Z^aSj zSU)U>^lpU*+2Az}<3r_b_kvLeBEFl8$C4h&TNH(V3VCew3j2$!$e5WC6e;<&P@^z3 zbzwpRF`q|xiw*wV5vZz2lqulJDEwMtMFsh2YWUmtP(_%~?+)qvhTzha@KShgy zH`OD4Wc5(M4>4Pe2G5`P+#~q)13HbWsyJLkRZlAu4lCUY{OpkeyhHWE_ELdf!zzzn zx*+)YQ0}wq9VDt`ZN?2X$~T5In5a_r{}%Hv9nqBqsnu^~;j2v55yqM>g2X75$xF$? zs+8<^c-}z~Ey&P(tT2?K5IZ@415bn>Ert?@Lf~eibHhey-FKrA@>%#NfpOy4cnj@+ z5_1KMuA@KVxUQ*{$V<(bb$*!>5Z`c<3y~1#r^m9_=RCIRWih}0jS@j>z`MY?a_tt7 z2sg`MH;_Pf0^t6+h1;VujA1x?*O>ecku4@2bM||6&w|5t2dultCi=-{Rt4NqhS< zU_!EiTgdx&?-FP=U1os@9H6D%|3^16GV%z>^vXV>{q~REFCd~6Bp#egXYy!EV}c3T zyZ7&3Ej{4#3Fpc~0Mev*!vPcoEFcL8{%wGSc&lutBr!bU4qaS9?N(E#V0U0VyXRl~3t3_5+GJlkV` z@)k!KFzzKCX}hUK!y;N!;DoXgQQ0b0AAW=;5hu=%C&1%!+fZ*(Hw>s;N>_h$GpCWh97A1Lq?12|a;TB@;LX($&FQ(RQYKPkNxfPdPpkG64unr)kR9wW^MqjB3>Y~L z>gv|vfy(Q5OG`_UJog6xrUMV>A6!^I``XR|f(6hT0|pA<0GI?Sbl2aQs;!{s1GvXZ zIKNCHoSmHkc-PFr;=-d1fY>;F_Y~)n(~l`+P#f)g;lu<;PD;CW#7PSy^vKsk`m* zGROZ55%RdTS|^{@J{$%LQ2ST67)WgfE-}gKlb_zw!zKllj|`1I&ckvtiehU)d;kb!l8he$dC)1D@B0=#WmVPN zo6j8m_G!S11de*`Bx(|6D&<=2VCe$k>Z`4|{`A{6?Yk>CB?5i^X@G~D@U)mZax17&Do~8ttv(9jTI4?~I zO-%XJgC_K$BMQlUzxNh&#gWA{qe|y0Q-@2Jg!dPe_-nMe|k_fX%axbY00bw9YWj~I3vmctR#^An$>AAcdOZj z>)_(yIkl{Mv=MmC6^vB_rap)Upi6A|zwWNY9jg9)+qcA!G))q+rJ+&wv1dyXl6~Jo zw(K!v9|~pPLzZ6ImqJKGNR~*FkR@*##aJ4<`abji{)^waTytGBoXebZKA&f~pXa%6 ztD2piV4dSlwcNegO(yTJ{0Rh$j~gJ8KBYZ88~V5^aUkRzBBvyGkXu zGk=N(1p;U?1=_8%*Oi>iUzC(wema(;Cmd&=ufKG=wxhSf!^=zJrTcCaw#T7fPq-U7 z@UQQWd8^^rsjiVE8@Kxw8Uh^MJBQSGGeL(*M0d_6ZDH zy<94^x1r(b$7wCp;GiSt2I37nlopuG%va=3mPM|}IJh~G?WW#pFDX|R7Ayn z2O}SKWsE}Pl%1XZ>z7Bp+4TRBuVrOqfGRS7q-=pV50c+7duyN86rqm3+Sl_{dh`|Y z(%yAtw-XOU)hzEZ&2lP}{Y@*!VY$O3&i*zDznx>ASpekz78WQ?!AFm4sDBx;14UR(fnA^l$9HycSX5g+Mp_oSuB_xflgYG zv!Bf1l3Omn6tFhi*2{WN2_wDFV8-*&o$Pt()airHY-yCU&FTi-<{=Y5hbDiF6e_9j zTLQ!8n=INl$q5O-=+`wwUu05Q0vzt>39$^Z1_#`iNv+%uwT#AtNu3K1ew&Tlj#MoI zndP!F`leE!Q+K-V)D8b~#N4Mw6UalpukofOJE^SJ8~c+S8v2%Uh2 zSTUPu9l)|e`_o-IZ|>1E(on~$*8}DZ`Zgav7(Koh=3hVQF(+`|3Py`yB#wN-_5P*2B*K62{C2)WYr3%#avHmqwQ z9kjHxb3*6k_>L$kDP6t{*CmQ%Ws%fD$FKOdGB7Z}Uuz%|nhb1_X8j=@HsHKS9hxGT z!X!Ip?eBOY&IFUnn-#_vbMyo`nN979O_$RIB!~` zVfs_kM|B_I(AbEXQMdY6;sz%GkSEbw9BE$ZUbTkxBH8lW2qee%B~%_O&1qiDcXATQ=i`XRGs`RZf(=Hs*u-4ZaO(JrDvL zRpcv&?TwabgZ>_pVfx?g)tS7)!de4SW3h4I;QKN)CE2^i_nt>7UYb;BvViL5|UK~5EEGaYvWz>jEItwl5ZfAuIb`Z z4iQ@AI24q=w%_&RLquTEz%p#}+&zO}_o&~ANF;)GQjuG3sN4L9va2vvN9Bmq*B@S; zX_M?cPObJS@YiQaAOTKK=gQD^mdRThE|{90W_9qGdU5n+hp|{}W@cL2*z|OwWL$me z^XKFgZC*pM43=1jFHLTEw$o8T7zexA$Nx@U2cj02xTHAzqgWSpEn`IHdw80t?}CEiI=&MnD0J#VRQ9urZ3v zCmaKf@t%X-&FlGc^|vP^s!iH_=G7neb>EUu6RW)tyQAX}I+t6GDyCm}o>E-(SAf2D2S-QHMSBRU#~|rE>Z)I;Jan3` zi=1kCj5VVB9QA z!aC|Hrq`>vt*D4kS~`IAwPR>#2!MUc%sa#;gU8vt>7ogsqYUueX{C@RxFvvUOGrql zsGJ$bRa919W;*;X+X*7w70;ff>i$=hYmJ--Lcns-Wq5^!`x`Pd4t0<^QQVGob(A{( zN!sIUyLsjKr-=#2L^V>Cd1J4K%o$}I(o4>FF`i&&))pv!&<0R3cD3c(V9upA5=aDi zN}+%vXYFR#2@YPElq2DmuxD%GRLCT(R7|=vAl8SZ35-RHnYsBn&IGW-7?OL|&zuoz zh%EqE%PJ^Hk_0KTzo*Zf=?o#ew-AW_;Q-^m9~z=(K7~TfHF4+!$nj9r#`i`aVjgy! z7MvI6T5CHKzQeC+2;vQW$cc%GtAeRPvtir0jKviPP#coY(Q6A_iF)u*+GTEtlA_ye`#^i$;Blc0Aln2WSW43BAM;&eYaR0pR z?l=Sn20A)AVvy;&Wz%lg52!BP*crsIW>;c*fsX+^WG*1N>6Zo?zbsTg>| zfAPGMLDT%-1BT*Yqx(mrsvk^2;nJpg)*pD;`CaLDB{Q-Qo+ zuN}q=&AqBu($plCH4rf073(86{q<|jsO#?#rO%BSx@F_;^t3Xf4qqFnwBJWQf^7{1 z$?r1G2ezH&U)^UrOAhQJ?Wl*hqj15Y5HjkHOydw-Bym7b_8j4l_0b*I`fiE61|4<(P zFw905d)Ggpy`IMg55L?}Pmfh@LtVwN!nlr+iORk!+>wB(s zMJVZ%>?&o72!M`jh9ALbPzYa>lanb(379i0i8%Wv3-J?ajQoOG12bN-?@JUI{R1+c zVXwY?`4Sk4@raFGoNp^`Q5cPbA_#hb?dZ`v0Wk;~e0Xj-@WO*Hf9qi?kkVpRL+SW{ zk_ajN+zo`fOXF_E)5kA?HYzPORlh)i3{13MTfZj9$HzeqeSH_#-Q5k9*vJ*PnzEzp z?A>()6-eUc5oOsLv6eWo=OK5Z+T^Msm(|}-U9%Fz zEFZOGW06j2#P#F+F_Odm{gSApfvgKEcQ>5W)CfaeG8)sj*OOrI8QP;L*aZOGR0}b< zV(*Ci@$tvxfAra5TA(EO=g%LC0|1YK{PtfqiHkv88_UVbk;(Ji`%MH2{5-|G4H^RT zwv}H|)h1J4zw$EC!P7ITwFv`)C|N0~>8hKm^0QS<^vmy5EY?cvka6%-FpQC|M-43h zbH`#_EOGW9-Jkb;Q!}l6v$RPdVn_ZwaSDm8`SMJax6Y{Fso|K2zFy8n`u3dH+xQ2q z%iH@&T8tDNeJV7I{4T4vt3m0n3%Na74FoiU8{+eqc(b0B_yzD{Q^tk}?IW@oz8XtFVob*>HnDo%UawYOJ3iAgN z%7CCCOEh<|q5#X!IF)y;wvj3EeoRj0pIoJu$xv1|d0T5Nwz9mu5v&NCi-%@+kX|$k zZZ)Vph+NG?Q^;xM&s?n>Uk+>|plBMq;Ec5X^xRyr3|**7u@l(s?2)VtQ(wLSrl*OT{ zP1ml0L)VZH1@(U_D+k=4>y~}U%;a8;gO_ZKK+If(x=t)VkFwv>sExu{*SXt ztsz27qez>Ho`%}X5?@Xn%9HH|&a-_e$=6g@$JTT;{DKal3vu>PUyj@HbSg66BF%O} zj875pqLi_V2a5%P&-d7|W6fSOEX~#}KK2l`r3qh)A{@YGB<~+WWj6BVPa+YVeV$UN z%tEt(DzVn4V-L0lMY9K-@JRf{nAaLR&#rF(SPPpqqoCj@?+OG^hlhvL-+%o%+=uDn zyUn5A$}3d8W?!@?uFM(2#`?QVL*QF71W)} zN=qq4?ES43$hl!Ch_t#IcMC4}uM1@J&d%ciBS9+~L$v*$gWY_0q_w>FgE1nU;0V7| zQ;Y0(f{66S&70%U9*OBaCaf0>@GcmBIPPsV7G4odg|u%C>0th%vGJ0GL`_|t5Bw|2 zj4Z_D&?RyH@r*6uEMQ&d`1$!Eu7VxN$j&?6>}?Bzc#e)|e{TZLW{Bp7=E+Sc_JhxZ zj72GUjZblPJs4uk@=;e1dNZ)L4uiWUC?W!GeUm81qE4abW-10bmMRcInFFS8HlELo zx7dT1#myU>AY`{}_6h@@W{OnW=g*(pR$o>^^lMAzC3a2QCXiKLp~-GVGGFR#*A?8c27 zpt*5#RZVmSpo76dy;yZgujv+uGi3$B_@D8OqO_=SZG7URjgD*b98U&m7Pxz`7ZW~q zk#XW+2WRCQP&J*w-M7xJ9`zYI{%FZ%!h6eu&hO68`^dYO{axl=k~ZUxa}=1X7M2ij z!@O$gCj{2(nCPM+c1*Cv987ffYFylrst8sMdw4@o{eSjmO$AqPDs^d7{Tme=S2XoC JYSitb{s+7-h$#R7 diff --git a/tests/_images/Shapes_can_color_two_shapes_elements_by_annotation.png b/tests/_images/Shapes_can_color_two_shapes_elements_by_annotation.png index e99f972d0d8e054f6d9489da565a1400fdf943ab..2df9620138cb5962f80669170fea7cc0177ff009 100644 GIT binary patch literal 14434 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 literal 42246 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 diff --git a/tests/pl/test_render_labels.py b/tests/pl/test_render_labels.py index 2048d11c..fc59864c 100644 --- a/tests/pl/test_render_labels.py +++ b/tests/pl/test_render_labels.py @@ -7,6 +7,7 @@ import scanpy as sc from anndata import AnnData from matplotlib.colors import Normalize +from matplotlib.legend import Legend from spatial_image import to_spatial_image from spatialdata import SpatialData, deepcopy, get_element_instances from spatialdata.models import Labels2DModel, Labels3DModel, TableModel @@ -96,6 +97,79 @@ def test_plot_can_stack_render_labels(self, sdata_blobs: SpatialData): .pl.show() ) + def test_two_categorical_label_renders_make_two_distinct_legends(self, sdata_blobs: SpatialData): + # Regression test for #364: two render_labels calls coloring by two categorical columns + # must produce two separate, column-titled legends (not one merged/replaced legend), and + # the second render must not reuse the first's colors. State-based (no image comparison). + n = sdata_blobs["table"].n_obs + sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_labels"] * n) + sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_labels" + sdata_blobs["table"].obs["cat0"] = pd.Categorical((["A", "B"] * ((n + 1) // 2))[:n]) + sdata_blobs["table"].obs["cat1"] = pd.Categorical((["C", "D"] * ((n + 1) // 2))[:n]) + + ( + sdata_blobs.pl.render_labels("blobs_labels", color="cat0") + .pl.render_labels("blobs_labels", color="cat1") + .pl.show() + ) + + fig = plt.gcf() + ax = fig.axes[0] + legends = [c for c in ax.get_children() if isinstance(c, Legend)] + assert len(legends) == 2 + entries = {leg.get_title().get_text(): {t.get_text() for t in leg.get_texts()} for leg in legends} + assert entries == {"cat0": {"A", "B"}, "cat1": {"C", "D"}} + + # palette offset: the second categorical render must not reuse the first's colors + c0 = set(sdata_blobs["table"].uns["cat0_colors"]) + c1 = set(sdata_blobs["table"].uns["cat1_colors"]) + assert c0.isdisjoint(c1) + + # legends are laid left-to-right (not stacked vertically): top-aligned, non-overlapping x + fig.canvas.draw() + inv = ax.transAxes.inverted() + boxes = sorted((leg.get_window_extent().transformed(inv) for leg in legends), key=lambda b: b.x0) + assert boxes[0].x1 <= boxes[1].x0 # no horizontal overlap + assert abs(boxes[0].y1 - boxes[1].y1) < 0.01 # tops aligned + plt.close() + + def test_three_categorical_label_renders_make_three_legends(self, sdata_blobs: SpatialData): + # Regression test for #364: re-adding prior legends must not duplicate them; three renders + # yield exactly three distinct legends (not four with a repeat). + n = sdata_blobs["table"].n_obs + sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_labels"] * n) + sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_labels" + for col, (a, b) in {"cat0": ("A", "B"), "cat1": ("C", "D"), "cat2": ("E", "F")}.items(): + sdata_blobs["table"].obs[col] = pd.Categorical(([a, b] * ((n + 1) // 2))[:n]) + + ( + sdata_blobs.pl.render_labels("blobs_labels", color="cat0") + .pl.render_labels("blobs_labels", color="cat1") + .pl.render_labels("blobs_labels", color="cat2") + .pl.show() + ) + + ax = plt.gcf().axes[0] + titles = sorted(c.get_title().get_text() for c in ax.get_children() if isinstance(c, Legend)) + assert titles == ["cat0", "cat1", "cat2"] + plt.close() + + def test_single_categorical_label_render_legend_has_no_title(self, sdata_blobs: SpatialData): + # A lone categorical render produces exactly one, untitled legend: the column title is only + # added to disambiguate 2+ legends on an axis. + n = sdata_blobs["table"].n_obs + sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_labels"] * n) + sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_labels" + sdata_blobs["table"].obs["cat0"] = pd.Categorical((["A", "B"] * ((n + 1) // 2))[:n]) + + sdata_blobs.pl.render_labels("blobs_labels", color="cat0").pl.show() + + ax = plt.gcf().axes[0] + legends = [c for c in ax.get_children() if isinstance(c, Legend)] + assert len(legends) == 1 + assert legends[0].get_title().get_text() == "" + plt.close() + def test_plot_can_color_by_rgba_array(self, sdata_blobs: SpatialData): sdata_blobs.pl.render_labels("blobs_labels", color=[0.5, 0.5, 1.0, 0.5]).pl.show() From 2780d5645ae03713e9777a5b8141714b8b95826b Mon Sep 17 00:00:00 2001 From: anon Date: Thu, 18 Jun 2026 17:02:46 +0200 Subject: [PATCH 2/2] fix(labels): title lone categorical legend; stack stacked legends vertically MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The per-render categorical legends (#364) were laid left-to-right in figure fraction with no width budget, so a 2nd legend overflowed the figure's right edge (clipped, or rescued by bbox_inches=tight into a wide gap). Stack them top-to-bottom in the right margin instead — the standard right-margin convention — so wide legends grow figure height on save rather than running off the right. Also title a lone categorical legend by its source column (it previously went through scanpy's untitled right-margin path), matching the colorbar auto-title and the 2+-legend behavior. --- src/spatialdata_plot/pl/basic.py | 37 +++++++++++++++++--------------- src/spatialdata_plot/pl/utils.py | 10 ++++----- tests/pl/test_render_labels.py | 17 ++++++++------- 3 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/spatialdata_plot/pl/basic.py b/src/spatialdata_plot/pl/basic.py index 3a24e668..c780c152 100644 --- a/src/spatialdata_plot/pl/basic.py +++ b/src/spatialdata_plot/pl/basic.py @@ -1589,7 +1589,7 @@ def show( if fig_params.fig is not None: for panel_ax in fig_params.axs if fig_params.axs is not None else [fig_params.ax]: if isinstance(panel_ax, Axes): - _layout_panel_legends_rightward(panel_ax, fig_params.fig) + _layout_panel_legends(panel_ax, fig_params.fig) _layout_pending_colorbars(pending_colorbars, fig_params, colorbar_params) @@ -1877,40 +1877,43 @@ def _draw_colorbar( trackers_axes[location] = pad_axes + (bbox_axes.width if vertical else bbox_axes.height) -def _layout_panel_legends_rightward(ax: Axes, fig: Figure, gap: float = 0.01) -> None: - """Lay the per-render categorical legends (#364) left-to-right along the top of the right margin. +def _layout_panel_legends(ax: Axes, fig: Figure, gap: float = 0.01) -> None: + """Title and stack the per-render categorical legends (#364) in the right margin. Only legends this code created (tagged ``_sdata_column``) are touched, so fill/outline and - channel legends keep their own placement. Layout is in figure-fraction so the axis shrink that - spreading them triggers under ``constrained_layout`` can't rescale the measured widths into overlap. + channel legends keep their own placement. Each legend is titled by its source column (matching + colorbars). When 2+ legends share an axis they are stacked top-to-bottom — the right-margin + convention — so wide legends grow the figure height on save instead of overflowing its right edge. """ legends = [c for c in ax.get_children() if isinstance(c, Legend) and hasattr(c, "_sdata_column")] - if len(legends) < 2: + if not legends: return - # 2+ legends share the axis: title each by its column so they can be told apart (an explicit - # title set earlier stays as-is). + # Title each legend by its source column so it reads like the colorbars (an explicit title set + # earlier stays as-is). A lone legend keeps scanpy's placement; only its title is added here. for leg in legends: if not leg.get_title().get_text(): leg.set_title(leg._sdata_column) - # Let constrained_layout settle the axes, then freeze it: otherwise it shrinks the axes to - # "make room" for the margin legends (squashing the plot, leaving a gap). Frozen, the legends - # still count for `bbox_inches="tight"` on save. Reached only for panels with 2+ legends. + if len(legends) < 2: + return + # 2+ legends share the axis. Let constrained_layout settle, then freeze it: otherwise it shrinks + # the axes to "make room" for the margin legends (squashing the plot, leaving a gap). Frozen, the + # legends still count for `bbox_inches="tight"` on save. fig.canvas.draw() fig.set_layout_engine("none") invf = fig.transFigure.inverted() ax_bb = ax.get_window_extent().transformed(invf) left, top = ax_bb.x1 + gap, ax_bb.y1 - # Anchor all at one point and settle, so widths are measured in a single consistent layout state. + # Anchor all at one point and settle, so heights are measured in a single consistent layout state. for leg in legends: leg.set_bbox_to_anchor((left, top), transform=fig.transFigure) if hasattr(leg, "set_loc"): leg.set_loc("upper left") fig.canvas.draw() - widths = [leg.get_window_extent().transformed(invf).width for leg in legends] - x = left - for leg, w in zip(legends, widths, strict=True): - leg.set_bbox_to_anchor((x, top), transform=fig.transFigure) - x += w + gap + heights = [leg.get_window_extent().transformed(invf).height for leg in legends] + y = top + for leg, h in zip(legends, heights, strict=True): + leg.set_bbox_to_anchor((left, y), transform=fig.transFigure) + y -= h + gap def _layout_pending_colorbars( diff --git a/src/spatialdata_plot/pl/utils.py b/src/spatialdata_plot/pl/utils.py index 164509f2..a14834a2 100644 --- a/src/spatialdata_plot/pl/utils.py +++ b/src/spatialdata_plot/pl/utils.py @@ -430,13 +430,13 @@ def _stack_categorical_legend( ) -> None: """Build the 2nd+ categorical legend on a shared axes without dropping existing ones (#364). - Placement is finalized later by ``_layout_panel_legends_rightward``; the anchor here is provisional. + Placement and the column auto-title are finalized later by ``_layout_panel_legends``; the anchor + and (absent an explicit ``title``) the title here are provisional. """ handles = _categorical_legend_handles(ax, color_mapping, na_hex) if (cur := ax.get_legend()) is not None: ax.add_artist(cur) # only the current legend would be dropped by ax.legend() below - # Auto-title (by column) is applied in `_layout_panel_legends_rightward`, where the legend - # count is known, so a lone legend stays untitled; an explicit `title` still wins here. + # Auto-title (by column) is applied in `_layout_panel_legends`; an explicit `title` still wins here. new_leg = ax.legend( handles=handles, title=title, @@ -522,8 +522,8 @@ def _decorate_axs( na_in_legend=na_in_legend, multi_panel=fig_params.axs is not None, ) - # Tag with the column; the column auto-title is applied only when 2+ legends share - # the axis (see `_layout_panel_legends_rightward`). An explicit title wins now. + # Tag with the column; the column auto-title is applied in `_layout_panel_legends`. + # An explicit title wins now. if (legend := ax.get_legend()) is not None: legend._sdata_column = value_to_plot # type: ignore[attr-defined] if legend_title is not None: diff --git a/tests/pl/test_render_labels.py b/tests/pl/test_render_labels.py index fc59864c..eaba52dc 100644 --- a/tests/pl/test_render_labels.py +++ b/tests/pl/test_render_labels.py @@ -125,12 +125,13 @@ def test_two_categorical_label_renders_make_two_distinct_legends(self, sdata_blo c1 = set(sdata_blobs["table"].uns["cat1_colors"]) assert c0.isdisjoint(c1) - # legends are laid left-to-right (not stacked vertically): top-aligned, non-overlapping x + # legends are stacked vertically in the right margin (not left-to-right): left-aligned and + # non-overlapping in y, so the second can't overflow the figure's right edge (#364) fig.canvas.draw() inv = ax.transAxes.inverted() - boxes = sorted((leg.get_window_extent().transformed(inv) for leg in legends), key=lambda b: b.x0) - assert boxes[0].x1 <= boxes[1].x0 # no horizontal overlap - assert abs(boxes[0].y1 - boxes[1].y1) < 0.01 # tops aligned + boxes = sorted((leg.get_window_extent().transformed(inv) for leg in legends), key=lambda b: b.y0, reverse=True) + assert boxes[1].y1 <= boxes[0].y0 # no vertical overlap (lower legend's top <= upper's bottom) + assert abs(boxes[0].x0 - boxes[1].x0) < 0.01 # left edges aligned plt.close() def test_three_categorical_label_renders_make_three_legends(self, sdata_blobs: SpatialData): @@ -154,9 +155,9 @@ def test_three_categorical_label_renders_make_three_legends(self, sdata_blobs: S assert titles == ["cat0", "cat1", "cat2"] plt.close() - def test_single_categorical_label_render_legend_has_no_title(self, sdata_blobs: SpatialData): - # A lone categorical render produces exactly one, untitled legend: the column title is only - # added to disambiguate 2+ legends on an axis. + def test_single_categorical_label_render_legend_titled_by_column(self, sdata_blobs: SpatialData): + # A lone categorical render produces exactly one legend titled by its source column, matching + # the colorbar's auto-title (#364). n = sdata_blobs["table"].n_obs sdata_blobs["table"].obs["region"] = pd.Categorical(["blobs_labels"] * n) sdata_blobs["table"].uns["spatialdata_attrs"]["region"] = "blobs_labels" @@ -167,7 +168,7 @@ def test_single_categorical_label_render_legend_has_no_title(self, sdata_blobs: ax = plt.gcf().axes[0] legends = [c for c in ax.get_children() if isinstance(c, Legend)] assert len(legends) == 1 - assert legends[0].get_title().get_text() == "" + assert legends[0].get_title().get_text() == "cat0" plt.close() def test_plot_can_color_by_rgba_array(self, sdata_blobs: SpatialData):

9i(HDG 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