§
    Šhþhh:  ã                  ó2  — U d Z ddlmZ ddlmZmZmZmZ ddlm	Z	m
Z
mZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZ e	rFddlZddlZddlZddl Z!ddl"m#Z$ ddl%m&Z&m'Z'm(Z( e$e
e
e
e
e
f         Z) ed	¦  «        Z*d
Z+de,d<   e
Z-de,d<   g d¢Z. G d„ de¦  «        Z/ G d„ dee/e¦  «        Z0 G d„ de/e¦  «        Z1 G d„ deee
         e¦  «        Z2 G d„ dee¦  «        Z3 G d„ de0e3e¦  «        Z4 G d„ de2e3e¦  «        Z5 G d„ de1e¦  «        Z6 G d„ d e4e¦  «        Z7 G d!„ d"e5e¦  «        Z8 G d#„ d$e/e¦  «        Z9 G d%„ d&e4e¦  «        Z: G d'„ d(e5e¦  «        Z; G d)„ d*e1e¦  «        Z<d+Z=de,d,<   d-Z>de,d.<   d/Z?de,d0<   d1Z@de,d2<   d3ZAde,d4<   d5ZBde,d6<   d7ZCde,d8<   d9ZDde,d:<   d;ZEde,d<<   d=ZFde,d><   e<ZGde,d?<   e<ZHde,d@<   dAZIde,dB<   dCZJde,dD<   dEZKde,dF<   dGZLde,dH<   e0ZMde,dI<   	 ee1e9f         ZNde,dJ<   eeMeNf         ZOde,dK<   	 e2ZPde,dL<   	  edMeO¬N¦  «        ZQ	  edOeM¬N¦  «        ZR	  edPeN¬N¦  «        ZS edQeP¬N¦  «        ZT	 dkdV„ZUdldX„ZV edYe¦  «        ZWeZXdZe,d[<   eZYd\e,d]<    ed^e¦  «        ZZ ed_e¦  «        Z[ ed`e¦  «        Z\dmdb„Z]dndd„Z^dodf„Z_dpdh„Z`dqdj„ZadS )ruõ  The home for *mostly* [structural] counterparts to [nominal] native types.

If you find yourself being yelled at by a typechecker and ended up here - **do not fear!**

We have 5 funky flavors, which tackle two different problem spaces.

How do we describe [Native types] when ...
- ... **wrapping in** a [Narwhals type]?
- ... **matching to** an [`Implementation`]?

## Wrapping in a Narwhals type
[//]: # (TODO @dangotbanned: Replace `Thing` with a better name)

The following examples use the placeholder type `Thing` which represents one of:
- `DataFrame`: (Eager) 2D data structure representing data as a table with rows and columns.
- `LazyFrame`: (Lazy) Computation graph/query against a DataFrame/database.
- `Series`: 1D data structure representing a single column.

Our goal is to **wrap** a *partially-unknown* native object **in** a [generic class]:

    def wrapping_in_df(native: IntoDataFrameT) -> DataFrame[IntoDataFrameT]: ...
    def wrapping_in_lf(native: IntoLazyFrameT) -> LazyFrame[IntoLazyFrameT]: ...
    def wrapping_in_ser(native: IntoSeriesT) -> Series[IntoSeriesT]: ...

### (1) `Native<Thing>`
Minimal [`Protocol`]s that are [assignable to] *almost any* supported native type of that group:

    class NativeThing(Protocol):
        def something_common(self, *args: Any, **kwargs: Any) -> Any: ...

Note:
    This group is primarily a building block for more useful types.

### (2) `Into<Thing>`
*Publicly* exported [`TypeAlias`]s of **(1)**:

    IntoThing: TypeAlias = NativeThing

**But**, occasionally, there'll be an edge-case which we can spell like:

    IntoThing: TypeAlias = Union[<type that does not fit the protocol>, NativeThing]

Tip:
    Reach for these when there **isn't a need to preserve** the original native type.

### (3) `Into<Thing>T`
*Publicly* exported [`TypeVar`]s, bound to **(2)**:

    IntoThingT = TypeVar("IntoThingT", bound=IntoThing)

Important:
    In most situations, you'll want to use these as they **do preserve** the original native type.

Putting it all together, we can now add a *narwhals-level* wrapper:

    class Thing(Generic[IntoThingT]):
        def to_native(self) -> IntoThingT: ...

## Matching to an `Implementation`
This problem differs as we need to *create* a relationship between *otherwise-unrelated* types.

Comparing the problems side-by-side, we can more clearly see this difference:

    def wrapping_in_df(native: IntoDataFrameT) -> DataFrame[IntoDataFrameT]: ...
    def matching_to_polars(native: pl.DataFrame) -> Literal[Implementation.POLARS]: ...

### (4) `Native<Backend>`
If we want to describe a set of specific types and **match** them in [`@overload`s], then these the tools we need.

For common and easily-installed backends, [`TypeAlias`]s are composed of the native type(s):

    NativePolars: TypeAlias = pl.DataFrame | pl.LazyFrame | pl.Series

Otherwise, we need to define a [`Protocol`] which the native type(s) can **match** against *when* installed:

    class NativeDask(NativeLazyFrame, Protocol):
        _partition_type: type[pd.DataFrame]

Tip:
    The goal is to be as minimal as possible, while still being *specific-enough* to **not match** something else.

Important:
    See [ibis#9276 comment] for a more *in-depth* example that doesn't fit here ðŸ˜„

### (5) `is_native_<backend>`
[Type guards] for **(4)**, *similar* to those found in `nw.dependencies`.

They differ by checking **all** native types/protocols in a single-call and using ``Native<Backend>`` aliases.

[structural]: https://typing.python.org/en/latest/spec/glossary.html#term-structural
[nominal]: https://typing.python.org/en/latest/spec/glossary.html#term-nominal
[Native types]: https://narwhals-dev.github.io/narwhals/how_it_works/#polars-and-other-implementations
[Narwhals type]: https://narwhals-dev.github.io/narwhals/api-reference/dataframe/
[`Implementation`]: https://narwhals-dev.github.io/narwhals/api-reference/implementation/
[`Protocol`]: https://typing.python.org/en/latest/spec/protocol.html
[assignable to]: https://typing.python.org/en/latest/spec/glossary.html#term-assignable
[`TypeAlias`]: https://mypy.readthedocs.io/en/stable/kinds_of_types.html#type-aliases
[`TypeVar`]: https://mypy.readthedocs.io/en/stable/generics.html#type-variables-with-upper-bounds
[generic class]: https://docs.python.org/3/library/typing.html#user-defined-generic-types
[`@overload`s]: https://typing.python.org/en/latest/spec/overload.html
[ibis#9276 comment]: https://github.com/ibis-project/ibis/issues/9276#issuecomment-3292016818
[Type guards]: https://typing.python.org/en/latest/spec/narrowing.html
é    )Úannotations)ÚCallableÚ
CollectionÚIterableÚSized)ÚTYPE_CHECKINGÚAnyÚProtocolÚTypeVarÚUnionÚcast)Úget_cudfÚ	get_modinÚ
get_pandasÚ
get_polarsÚget_pyarrowÚis_dask_dataframeÚis_duckdb_relationÚis_ibis_tableÚis_pyspark_connect_dataframeÚis_pyspark_dataframeÚis_sqlframe_dataframeN)ÚBaseDataFrame)ÚSelfÚ	TypeAliasÚTypeIsÚTzCallable[[Any], TypeIs[T]]r   Ú_GuardÚ
Incomplete)+ÚIntoDataFrameÚIntoDataFrameTÚ	IntoFrameÚ
IntoFrameTÚIntoLazyFrameÚIntoLazyFrameTÚ
IntoSeriesÚIntoSeriesTÚ	NativeAnyÚNativeArrowÚ
NativeCuDFÚ
NativeDaskÚNativeDataFrameÚNativeDuckDBÚNativeFrameÚ
NativeIbisÚNativeKnownÚNativeLazyFrameÚNativeModinÚNativePandasÚNativePandasLikeÚNativePandasLikeDataFrameÚNativePandasLikeSeriesÚNativePolarsÚNativePySparkÚNativePySparkConnectÚNativeSQLFrameÚNativeSeriesÚNativeSparkLikeÚNativeUnknownÚis_native_arrowÚis_native_cudfÚis_native_daskÚis_native_duckdbÚis_native_ibisÚis_native_modinÚis_native_pandasÚis_native_pandas_likeÚis_native_polarsÚis_native_pysparkÚis_native_pyspark_connectÚis_native_spark_likeÚis_native_sqlframec                  ó.   — e Zd Zedd„¦   «         Zd	d„ZdS )
r.   Úreturnr	   c                ó   — d S ©N© ©Úselfs    úG/var/www/histauto/venv/lib/python3.11/site-packages/narwhals/_native.pyÚcolumnszNativeFrame.columns¼   s   € Ø!˜có    ÚargsÚkwargsc                ó   — d S rN   rO   ©rQ   rU   rV   s      rR   ÚjoinzNativeFrame.join¾   ó   € € € rT   N©rL   r	   ©rU   r	   rV   r	   rL   r	   )Ú__name__Ú
__module__Ú__qualname__ÚpropertyrS   rY   rO   rT   rR   r.   r.   »   s2   € € € € € ØØ!Ð!Ð!ñ „XØ!Ø9Ð9Ð9Ð9Ð9Ð9rT   r.   c                  ó   — e Zd ZdS )r,   N©r]   r^   r_   rO   rT   rR   r,   r,   Á   ó   € € € € € € € rT   r,   c                  ó   — e Zd Zdd„ZdS )r1   rU   r	   rV   rL   c                ó   — d S rN   rO   rX   s      rR   ÚexplainzNativeLazyFrame.explainÅ   rZ   rT   Nr\   )r]   r^   r_   rf   rO   rT   rR   r1   r1   Ä   s   € € € € € Ø<Ð<Ð<Ð<Ð<Ð<rT   r1   c                  ó   — e Zd Zdd„ZdS )r;   rU   r	   rV   rL   c                ó   — d S rN   rO   rX   s      rR   ÚfilterzNativeSeries.filterÉ   rZ   rT   Nr\   )r]   r^   r_   ri   rO   rT   rR   r;   r;   È   s   € € € € € Ø;Ð;Ð;Ð;Ð;Ð;rT   r;   c                  ó†   — e Zd ZU ded<   	 dd„Zdd	„Zdd
„Zedd„¦   «         Zedd„¦   «         Z	dddœd d„Z
d!d"d„Zd#d„ZdS )$Ú_BasePandasLiker	   ÚindexÚkeyrL   c               ó   — d S rN   rO   )rQ   rm   s     rR   Ú__getitem__z_BasePandasLike.__getitem__Ð   rZ   rT   Úotherú float | Collection[float] | Selfr   c               ó   — d S rN   rO   ©rQ   rp   s     rR   Ú__mul__z_BasePandasLike.__mul__Ñ   rZ   rT   c               ó   — d S rN   rO   rs   s     rR   Ú__floordiv__z_BasePandasLike.__floordiv__Ò   rZ   rT   c                ó   — d S rN   rO   rP   s    rR   Úlocz_BasePandasLike.locÓ   s   € Ø˜#rT   útuple[int, ...]c                ó   — d S rN   rO   rP   s    rR   Úshapez_BasePandasLike.shapeÕ   s   € Ø(+¨rT   .)ÚaxisÚcopyÚlabelsr|   r}   Úboolc               ó   — d S rN   rO   )rQ   r~   r|   r}   s       rR   Úset_axisz_BasePandasLike.set_axis×   rZ   rT   Údeepc                ó   — d S rN   rO   )rQ   r‚   s     rR   r}   z_BasePandasLike.copyØ   rZ   rT   rU   ÚkwdsúSelf | Incompletec                ó   — dS )z·`mypy` & `pyright` disagree on overloads.

        `Incomplete` used to fix [more important issue](https://github.com/narwhals-dev/narwhals/pull/3016#discussion_r2296139744).
        NrO   ©rQ   rU   r„   s      rR   Úrenamez_BasePandasLike.renameÙ   rZ   rT   N)rm   r	   rL   r	   )rp   rq   rL   r   r[   )rL   ry   )r~   r	   r|   r	   r}   r   rL   r   ©.)r‚   r   rL   r   )rU   r	   r„   r	   rL   r…   )r]   r^   r_   Ú__annotations__ro   rt   rv   r`   rx   r{   r�   r}   rˆ   rO   rT   rR   rk   rk   Ì   s¬   € € € € € € Ø€J€J�JØKà2Ð2Ð2Ð2ØNÐNÐNÐNØSÐSÐSÐSØØÐÐñ „XØØØ+Ð+Ð+ñ „XØ+Ø36ÀSÐVÐVÐVÐVÐVÐVØ1Ð1Ð1Ð1Ð1ðð ð ð ð ð rT   rk   c                  ó   — e Zd ZdS )Ú_BasePandasLikeFrameNrb   rO   rT   rR   rŒ   rŒ   à   rc   rT   rŒ   c                  ó   — e Zd Zd	d
d„ZdS )Ú_BasePandasLikeSeries.Úcondr	   rp   rL   r…   c               ó   — d S rN   rO   )rQ   r�   rp   s      rR   Úwherez_BasePandasLikeSeries.whereä   rZ   rT   Nr‰   )r�   r	   rp   r	   rL   r…   )r]   r^   r_   r‘   rO   rT   rR   rŽ   rŽ   ã   s   € € € € € ØMÐMÐMÐMÐMÐMÐMrT   rŽ   c                  ó   — e Zd ZU ded<   dS )r+   útype[pd.DataFrame]Ú_partition_typeN©r]   r^   r_   rŠ   rO   rT   rR   r+   r+   ç   ó   € € € € € € Ø'Ð'Ð'Ñ'Ð'Ð'rT   r+   c                  ó   — e Zd Zdd„ZdS )Ú_CuDFDataFramerU   r	   r„   rL   c                ó   — d S rN   rO   r‡   s      rR   Úto_pylibcudfz_CuDFDataFrame.to_pylibcudfì   rZ   rT   N©rU   r	   r„   r	   rL   r	   ©r]   r^   r_   rš   rO   rT   rR   r˜   r˜   ë   ó   € € € € € Ø?Ð?Ð?Ð?Ð?Ð?rT   r˜   c                  ó   — e Zd Zdd„ZdS )Ú_CuDFSeriesrU   r	   r„   rL   c                ó   — d S rN   rO   r‡   s      rR   rš   z_CuDFSeries.to_pylibcudfð   rZ   rT   Nr›   rœ   rO   rT   rR   rŸ   rŸ   ï   r�   rT   rŸ   c                  ó.   — e Zd Zd
d„Zd
d„Zd
d„Zd
d„Zd	S )r/   rU   r	   r„   rL   c                ó   — d S rN   rO   r‡   s      rR   ÚsqlzNativeIbis.sqlô   rZ   rT   c                ó   — d S rN   rO   r‡   s      rR   Ú__pyarrow_result__zNativeIbis.__pyarrow_result__õ   rZ   rT   c                ó   — d S rN   rO   r‡   s      rR   Ú__pandas_result__zNativeIbis.__pandas_result__ö   rZ   rT   c                ó   — d S rN   rO   r‡   s      rR   Ú__polars_result__zNativeIbis.__polars_result__÷   rZ   rT   Nr›   )r]   r^   r_   r£   r¥   r§   r©   rO   rT   rR   r/   r/   ó   s@   € € € € € Ø6Ð6Ð6Ð6ØEÐEÐEÐEØDÐDÐDÐDØDÐDÐDÐDÐDÐDrT   r/   c                  ó   — e Zd ZU ded<   dS )Ú_ModinDataFramer“   Ú_pandas_classNr•   rO   rT   rR   r«   r«   ú   s   € € € € € € Ø%Ð%Ð%Ñ%Ð%Ð%rT   r«   c                  ó   — e Zd ZU ded<   dS )Ú_ModinSeriesztype[pd.Series[Any]]r¬   Nr•   rO   rT   rR   r®   r®   þ   r–   rT   r®   c                  ó   — e Zd Zdd„ZdS )Ú_PySparkDataFrameÚargr	   rV   rL   c                ó   — d S rN   rO   )rQ   r±   rV   s      rR   ÚdropDuplicatesWithinWatermarkz/_PySparkDataFrame.dropDuplicatesWithinWatermark  rZ   rT   N)r±   r	   rV   r	   rL   r	   )r]   r^   r_   r³   rO   rT   rR   r°   r°     s   € € € € € ØQÐQÐQÐQÐQÐQrT   r°   z'pl.DataFrame | pl.LazyFrame | pl.Seriesr7   zpa.Table | pa.ChunkedArray[Any]r)   zduckdb.DuckDBPyRelationr-   zpd.DataFrame | pd.Series[Any]r3   z_ModinDataFrame | _ModinSeriesr2   z_CuDFDataFrame | _CuDFSeriesr*   z+pd.Series[Any] | _CuDFSeries | _ModinSeriesr6   z/pd.DataFrame | _CuDFDataFrame | _ModinDataFramer5   z2NativePandasLikeDataFrame | NativePandasLikeSeriesr4   z'_BaseDataFrame[Any, Any, Any, Any, Any]r:   r8   r9   z5NativeSQLFrame | NativePySpark | NativePySparkConnectr<   zhNativePolars | NativeArrow | NativePandasLike | NativeSparkLike | NativeDuckDB | NativeDask | NativeIbisr0   z0NativeDataFrame | NativeSeries | NativeLazyFramer=   zNativeKnown | NativeUnknownr(   r    r$   r"   r&   r#   )Úboundr!   r%   r'   Úobjr	   rL   úTypeIs[NativePolars]c                ój   — t          ¦   «         x}d uo!t          | |j        |j        |j        f¦  «        S rN   )r   Ú
isinstanceÚ	DataFrameÚSeriesÚ	LazyFrame)rµ   Úpls     rR   rF   rF   n  s;   € Ý‘,”,ÐˆB tÐ+ð µ
ØˆbŒl˜BœI r¤|Ð4ñ1ô 1ð rT   úTypeIs[NativeArrow]c                ó^   — t          ¦   «         x}d uot          | |j        |j        f¦  «        S rN   )r   r¸   ÚTableÚChunkedArray)rµ   Úpas     rR   r>   r>   t  s7   € Ý‘-”-ÐˆB¨Ð,ð µØˆbŒh˜œÐ(ñ2ô 2ð rT   z_Guard[NativeDask]z_Guard[NativeDuckDB]rA   z_Guard[NativeSQLFrame]rJ   z_Guard[NativePySpark]z_Guard[NativePySparkConnect]z_Guard[NativeIbis]úTypeIs[NativePandas]c                ó^   — t          ¦   «         x}d uot          | |j        |j        f¦  «        S rN   )r   r¸   r¹   rº   )rµ   Úpds     rR   rD   rD   „  s.   € Ý‘,”,ÐˆB tÐ+ÐZµ
¸3ÀÄÈrÌyÐ@YÑ0ZÔ0ZÐZrT   úTypeIs[NativeModin]c                ó^   — t          ¦   «         x}d uot          | |j        |j        f¦  «        S rN   )r   r¸   r¹   rº   )rµ   Úmpds     rR   rC   rC   ˆ  s7   € Ý‘;”;ÐˆC tÐ+ð µ
ØˆcŒm˜SœZÐ(ñ1ô 1ð rT   úTypeIs[NativeCuDF]c                ó^   — t          ¦   «         x}d uot          | |j        |j        f¦  «        S rN   )r   r¸   r¹   rº   )rµ   Úcudfs     rR   r?   r?   Ž  s7   € Ý‘J”JÐˆD tÐ+ð µ
ØˆdŒn˜dœkÐ*ñ1ô 1ð rT   úTypeIs[NativePandasLike]c                ó\   — t          | ¦  «        pt          | ¦  «        pt          | ¦  «        S rN   )rD   r?   rC   ©rµ   s    rR   rE   rE   ”  s*   € Ý˜CÑ Ô ÐO¥N°3Ñ$7Ô$7ÐO½?È3Ñ;OÔ;OÐOrT   úTypeIs[NativeSparkLike]c                ó\   — t          | ¦  «        pt          | ¦  «        pt          | ¦  «        S rN   )rJ   rG   rH   rÍ   s    rR   rI   rI   ˜  s2   € å˜3ÑÔð 	*Ý˜SÑ!Ô!ð	*å$ SÑ)Ô)ðrT   )rµ   r	   rL   r¶   )rµ   r	   rL   r½   )rµ   r	   rL   rÂ   )rµ   r	   rL   rÅ   )rµ   r	   rL   rÈ   )rµ   r	   rL   rË   )rµ   r	   rL   rÎ   )bÚ__doc__Ú
__future__r   Úcollections.abcr   r   r   r   Útypingr   r	   r
   r   r   r   Únarwhals.dependenciesr   r   r   r   r   r   r   r   r   r   r   ÚduckdbÚpandasrÄ   Úpolarsr¼   ÚpyarrowrÁ   Úsqlframe.base.dataframer   Ú_BaseDataFrameÚtyping_extensionsr   r   r   ÚSQLFrameDataFramer   r   rŠ   r   Ú__all__r.   r,   r1   r;   rk   rŒ   rŽ   r+   r˜   rŸ   r/   r«   r®   r°   r7   r)   r-   r3   r2   r*   r6   r5   r4   r:   r8   r9   r<   r0   r=   r(   r    r$   r"   r&   r#   r!   r%   r'   rF   r>   r@   rA   rJ   rG   rH   rB   rD   rC   r?   rE   rI   rO   rT   rR   ú<module>rÞ      sR  ððfð fð fðP #Ð "Ð "Ð "Ð "Ð "à AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ Eðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð  Ø€M€M€MØÐÐÐØÐÐÐØÐÐÐØGÐGÐGÐGÐGÐGØ9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9à& s¨C°°c¸3Ð'>Ô?ÐØˆ�‰Œ€AØ4€FÐ4Ð4Ð4Ñ4Ø€JÐÐÐÑð,ð ,ð ,€ðd:ð :ð :ð :ð :�(ñ :ô :ð :ð 9Ð 8Ð 8Ð 8Ð 8�e˜[¨(Ñ 8Ô 8Ð 8ð=ð =ð =ð =ð =�k 8ñ =ô =ð =ð<ð <ð <ð <ð <�5˜( 3œ-¨ñ <ô <ð <ðð ð ð ð �e˜Xñ ô ð ð( LÐ KÐ KÐ KÐ K˜?¨O¸XÑ KÔ KÐ KðNð Nð Nð Nð N˜L¨/¸8ñ Nô Nð Nð(ð (ð (ð (ð (� (ñ (ô (ð (ð@ð @ð @ð @ð @Ð)¨8ñ @ô @ð @ð@ð @ð @ð @ð @Ð'¨ñ @ô @ð @ðEð Eð Eð Eð E�˜hñ Eô Eð Eð&ð &ð &ð &ð &Ð*¨Hñ &ô &ð &ð(ð (ð (ð (ð (Ð(¨(ñ (ô (ð (ðRð Rð Rð Rð R˜¨ñ Rô Rð Rð D€Ð CÐ CÐ CÑ CØ:€Ð :Ð :Ð :Ñ :Ø3€Ð 3Ð 3Ð 3Ñ 3Ø9€Ð 9Ð 9Ð 9Ñ 9Ø9€Ð 9Ð 9Ð 9Ñ 9Ø6€
Ð 6Ð 6Ð 6Ñ 6Ø$QÐ Ð QÐ QÐ QÑ QØ'XÐ Ð XÐ XÐ XÑ XØRÐ Ð RÐ RÐ RÑ RØE€Ð EÐ EÐ EÑ EØ,€Ð ,Ð ,Ð ,Ñ ,Ø"3Ð Ð 3Ð 3Ð 3Ñ 3ØT€Ð TÐ TÐ TÑ Tð D€ð  Dð  Dð  Dñ  DØM€Ð MÐ MÐ MÑ MØ4€	Ð 4Ð 4Ð 4Ñ 4à*€Ð *Ð *Ð *Ñ *ð
ð ! °*Ð!<Ô=€Ð =Ð =Ð =Ñ =Ø˜]¨MÐ9Ô:€	Ð :Ð :Ð :Ñ :ðð %€
Ð $Ð $Ð $Ñ $ðð ˆW�\¨Ð3Ñ3Ô3€
ðð �Ð)°Ð?Ñ?Ô?€ðð �Ð)°Ð?Ñ?Ô?€Øˆg�m¨:Ð6Ñ6Ô6€ððð ð ð ðð ð ð ð �Ð*Ð,=Ñ>Ô>€Ø);Ð Ð ;Ð ;Ð ;Ñ ;Ø-BÐ Ð BÐ BÐ BÑ BØ�DÐ0Ð2FÑGÔGÐ Ø ˜DØ"Ð$@ñô Ð ð �Ð*¨MÑ:Ô:€ð[ð [ð [ð [ðð ð ð ðð ð ð ðPð Pð Pð Pðð ð ð ð ð rT   