§
    ¬³Ùg\3  ã                   ó€   — d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	 ddl
mZmZ d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zdddœd„ZdS )z,Functions returning normal forms of matricesé    )Údefaultdicté   )ÚDomainMatrix)ÚDMDomainErrorÚDMShapeError)Úsymmetric_residue)ÚQQÚZZc                 ód   — t          | ¦  «        }t          j        || j        | j        ¦  «        }|S )aJ  
    Return the Smith Normal Form of a matrix `m` over the ring `domain`.
    This will only work if the ring is a principal ideal domain.

    Examples
    ========

    >>> from sympy import ZZ
    >>> from sympy.polys.matrices import DomainMatrix
    >>> from sympy.polys.matrices.normalforms import smith_normal_form
    >>> m = DomainMatrix([[ZZ(12), ZZ(6), ZZ(4)],
    ...                   [ZZ(3), ZZ(9), ZZ(6)],
    ...                   [ZZ(2), ZZ(16), ZZ(14)]], (3, 3), ZZ)
    >>> print(smith_normal_form(m).to_Matrix())
    Matrix([[1, 0, 0], [0, 10, 0], [0, 0, -30]])

    )Úinvariant_factorsr   ÚdiagÚdomainÚshape)ÚmÚinvsÚsmfs      úV/granary/edev/quantum/lib/python3.11/site-packages/sympy/polys/matrices/normalforms.pyÚsmith_normal_formr      s.   € õ$ ˜QÑÔ€DÝ
Ô
˜D !¤(¨A¬GÑ
4Ô
4€CØ€Jó    c                 óà   — t          t          | ¦  «        ¦  «        D ]P}| |         |         }||z  || |         |         z  z   | |         |<   ||z  || |         |         z  z   | |         |<   ŒQd S ©N)ÚrangeÚlen)	r   ÚiÚjÚaÚbÚcÚdÚkÚes	            r   Úadd_columnsr"   (   sz   € õ •3�q‘6”6‰]Œ]ð "ð "ˆØˆaŒD�ŒGˆØ�A‘#˜˜!˜Aœ$˜qœ'™	‘/ˆˆ!ŒˆQ‰Ø�A‘#˜˜!˜Aœ$˜qœ'™	‘/ˆˆ!ŒˆQ‰ˆð"ð "r   c                 óV  ‡ ‡‡‡‡— ‰ j         Š‰j        sd}t          |¦  «        ‚d‰ j        v rdS ‰ j        x\  ŠŠ}t	          ‰                      ¦   «         j                             ¦   «         ¦  «        Š ˆfd„Šˆˆˆfd„}ˆˆfd„}ˆ fd„t          ‰¦  «        D ¦   «         }|r0|d         dk    r$‰ |d                  ‰ d         c‰ d<   ‰ |d         <   nQˆ fd„t          ‰¦  «        D ¦   «         }|r4|d         dk    r(‰ D ]%}||d                  |d         c|d<   ||d         <   Œ&t          ˆ fd	„t          d
‰¦  «        D ¦   «         ¦  «        s)t          ˆ fd„t          d
‰¦  «        D ¦   «         ¦  «        rh |‰ ¦  «        Š  |‰ ¦  «        Š t          ˆ fd	„t          d
‰¦  «        D ¦   «         ¦  «        °?t          ˆ fd„t          d
‰¦  «        D ¦   «         ¦  «        °hd
|v rd}n:t          d„ ‰ d
d…         D ¦   «         ‰d
z
  ‰d
z
  f‰¦  «        }t          |¦  «        }‰ d         d         rÝ‰ d         d         g}	|	                     |¦  «         t          t          |	¦  «        d
z
  ¦  «        D ]˜}
|	|
         rŽ‰                     |	|
d
z            |	|
         ¦  «        d
         dk    r_‰                     |	|
d
z            |	|
         ¦  «        }‰                     |	|
         |¦  «        d         |	|
d
z            z  |	|
d
z   <   ||	|
<   Œ˜ n|‰ d         d         fz   }	t!          |	¦  «        S )a3  
    Return the tuple of abelian invariants for a matrix `m`
    (as in the Smith-Normal form)

    References
    ==========

    [1] https://en.wikipedia.org/wiki/Smith_normal_form#Algorithm
    [2] https://web.archive.org/web/20200331143852/https://sierra.nmsu.edu/morandi/notes/SmithNormalForm.pdf

    z8The matrix entries must be over a principal ideal domainr   © c                 óÈ   •— t          ‰	¦  «        D ]P}| |         |         }||z  || |         |         z  z   | |         |<   ||z  || |         |         z  z   | |         |<   ŒQd S r   )r   )
r   r   r   r   r   r   r   r    r!   Úcolss
            €r   Úadd_rowsz#invariant_factors.<locals>.add_rowsH   su   ø€ õ �t‘”ð 	&ð 	&ˆAØ�!”�Q”ˆAØ˜‘c˜A˜a œd 1œg™I‘oˆAˆaŒD�‰GØ˜‘c˜A˜a œd 1œg™I‘oˆAˆaŒD�‰GˆGð	&ð 	&r   c           
      ó  •— | d         d         dk    r| S | d         d         }t          d‰¦  «        D ]Ñ}| |         d         dk    rŒ‰                     | |         d         |¦  «        \  }}|dk    r ‰
| d|dd| d¦  «         ŒS‰                     || |         d         ¦  «        \  }}}‰                     | |         d         |¦  «        d         }‰                     ||¦  «        d         }	 ‰
| d|||||	 ¦  «         |}ŒÒ| S ©Nr   r   )r   ÚdivÚgcdex)r   Úpivotr   r   Úrr   r   ÚgÚd_0Úd_jr'   r   Úrowss             €€€r   Úclear_columnz'invariant_factors.<locals>.clear_columnP   s  ø€ àˆQŒ4�Œ7�aŠ<ˆ<ØˆHØ�!”�Q”ˆÝ�q˜$‘”ð 	ð 	ˆAØ�Œt�AŒw˜!Š|ˆ|ØØ—:’:˜a œd 1œg uÑ-Ô-‰DˆAˆqØ�AŠvˆvØ�˜˜A˜q ! Q¨¨¨AÑ.Ô.Ð.Ð.à Ÿ,š, u¨a°¬d°1¬gÑ6Ô6‘��1�aØ—j’j  1¤ a¤¨!Ñ,Ô,¨QÔ/�Ø—j’j ¨Ñ*Ô*¨1Ô-�Ø�˜˜A˜q ! Q¨¨c¨TÑ2Ô2Ð2Ø��Øˆr   c           
      ó   •— | d         d         dk    r| S | d         d         }t          d‰
¦  «        D ]Ù}| d         |         dk    rŒ‰                     | d         |         |¦  «        \  }}|dk    rt          | d|dd| d¦  «         ŒW‰                     || d         |         ¦  «        \  }}}‰                     | d         |         |¦  «        d         }‰                     ||¦  «        d         }	t          | d|||||	 ¦  «         |}ŒÚ| S r)   )r   r*   r"   r+   )r   r,   r   r   r-   r   r   r.   r/   r0   r&   r   s             €€r   Ú	clear_rowz$invariant_factors.<locals>.clear_rowc   s  ø€ àˆQŒ4�Œ7�aŠ<ˆ<ØˆHØ�!”�Q”ˆÝ�q˜$‘”ð 	ð 	ˆAØ�Œt�AŒw˜!Š|ˆ|ØØ—:’:˜a œd 1œg uÑ-Ô-‰DˆAˆqØ�AŠvˆvÝ˜A˜q ! Q¨¨A¨2¨qÑ1Ô1Ð1Ð1à Ÿ,š, u¨a°¬d°1¬gÑ6Ô6‘��1�aØ—j’j  1¤ a¤¨!Ñ,Ô,¨QÔ/�Ø—j’j ¨Ñ*Ô*¨1Ô-�Ý˜A˜q ! Q¨¨3°°Ñ5Ô5Ð5Ø��Øˆr   c                 ó8   •— g | ]}‰|         d          d k    ¯|‘ŒS ©r   r$   ©Ú.0r   r   s     €r   ú
<listcomp>z%invariant_factors.<locals>.<listcomp>w   s&   ø€ Ð
2Ð
2Ð
2� Q q¤T¨!¤W°¢\ \ˆ1 \ \ \r   c                 ó8   •— g | ]}‰d          |         d k    ¯|‘ŒS r6   r$   )r8   r   r   s     €r   r9   z%invariant_factors.<locals>.<listcomp>{   s&   ø€ Ð6Ð6Ð6�Q¨¨1¬¨a¬°Aª¨ˆq¨¨¨r   c              3   ó<   •K  — | ]}‰d          |         d k    V — ŒdS ©r   Nr$   r7   s     €r   ú	<genexpr>z$invariant_factors.<locals>.<genexpr>�   ó/   øè è € Ð3Ð3 ˆq�Œt�AŒw˜!Š|Ð3Ð3Ð3Ð3Ð3Ð3r   r   c              3   ó<   •K  — | ]}‰|         d          d k    V — ŒdS r<   r$   r7   s     €r   r=   z$invariant_factors.<locals>.<genexpr>‚   r>   r   c                 ó"   — g | ]}|d d…         ‘ŒS )r   Nr$   )r8   r-   s     r   r9   z%invariant_factors.<locals>.<listcomp>‰   s    € Ð#9Ð#9Ð#9¨a A a b b¤EÐ#9Ð#9Ð#9r   N)r   Úis_PIDÚ
ValueErrorr   ÚlistÚto_denseÚrepÚto_ddmr   Úanyr   r   Úextendr   r*   ÚgcdÚtuple)r   Úmsgr   r2   r4   ÚindÚrowr   Úlower_rightÚresultr   r.   r'   r&   r   r1   s   `           @@@@r   r   r   1   s·  øøøøø€ ð ŒX€FØŒ=ð ØHˆÝ˜‰oŒoÐàˆAŒG€|€|ØˆràœÐ �J€Dˆ$�ÝˆQ�ZŠZ‰\Œ\Ô×$Ò$Ñ&Ô&Ñ'Ô'€Að&ð &ð &ð &ð &ðð ð ð ð ð ð ð&ð ð ð ð ð ð( 3Ð
2Ð
2Ð
2•e˜D‘k”kÐ
2Ñ
2Ô
2€CØ
ð :ˆs�1Œv˜Š{ˆ{Ø˜C œFœ) Q q¤Tˆˆˆ!‰ˆa��A”‰iˆià6Ð6Ð6Ð6�% ™+œ+Ð6Ñ6Ô6ˆØð 	:�3�q”6˜Q’;�;Øð :ð :�Ø&)¨#¨a¬&¤k°3°q´6Ð#��A‘˜˜C œF™˜õ Ð3Ð3Ð3Ð3¥U¨1¨T¡]¤]Ð3Ñ3Ô3Ñ3Ô3ð ÝÐ3Ð3Ð3Ð3¥U¨1¨T¡]¤]Ð3Ñ3Ô3Ñ3Ô3ðàˆL˜‰OŒOˆØˆI�a‰LŒLˆõ Ð3Ð3Ð3Ð3¥U¨1¨T¡]¤]Ð3Ñ3Ô3Ñ3Ô3ð ÝÐ3Ð3Ð3Ð3¥U¨1¨T¡]¤]Ð3Ñ3Ô3Ñ3Ô3ðð
 	ˆE€z€zØˆˆå"Ð#9Ð#9°1°Q°R°R´5Ð#9Ñ#9Ô#9¸DÀ¹FÀDÈÁFÐ;KÈVÑTÔTˆÝ  Ñ-Ô-ˆàˆ„tˆA„wð #Ø�A”$�q”'�ˆØ�Š�dÑÔÐå•s˜6‘{”{ 1‘}Ñ%Ô%ð 	ð 	ˆAØ�aŒyð ˜VŸZšZ¨¨q°©s¬°V¸A´YÑ?Ô?ÀÔBÀaÒGÐGØ—J’J˜v a¨¡cœ{¨F°1¬IÑ6Ô6�Ø$Ÿjšj¨°¬°AÑ6Ô6°qÔ9¸&ÀÀ1Á¼+ÑE��q˜‘s‘Ø��q‘	�	àøà˜˜1œ˜aœ˜
Ñ"ˆÝ�‰=Œ=Ðr   c                 ót   — t          j        | |¦  «        \  }}}| dk    r|| z  dk    rd}| dk     rdnd}|||fS )a§  
    This supports the functions that compute Hermite Normal Form.

    Explanation
    ===========

    Let x, y be the coefficients returned by the extended Euclidean
    Algorithm, so that x*a + y*b = g. In the algorithms for computing HNF,
    it is critical that x, y not only satisfy the condition of being small
    in magnitude -- namely that |x| <= |b|/g, |y| <- |a|/g -- but also that
    y == 0 when a | b.

    r   éÿÿÿÿr   )r
   r+   )r   r   ÚxÚyr.   s        r   Ú_gcdexrT   œ   sO   € õ Œh�q˜!‰nŒn�G€A€qˆ!ØˆA‚v€v�!�a‘%˜1’*�*ØˆØ�a’%�%ˆBˆB˜QˆØˆa�ˆ7€Nr   c                 ó€  — | j         j        st          d¦  «        ‚| j        \  }}|                      ¦   «         j                             ¦   «                              ¦   «         } |}t          |dz
  dd¦  «        D �]}|dk    r �n	|dz  }t          |dz
  dd¦  «        D ]x}| |         |         dk    rdt          | |         |         | |         |         ¦  «        \  }}}| |         |         |z  | |         |         |z  }
}	t          | |||||
 |	¦  «         Œy| |         |         }|dk     rt          | ||dddd¦  «         | }|dk    r|dz  }ŒÖt          |dz   |¦  «        D ])}| |         |         |z  }t          | ||d| dd¦  «         Œ*�Œt          j        |                      ¦   «         ¦  «        dd…|d…f         S )aè  
    Compute the Hermite Normal Form of DomainMatrix *A* over :ref:`ZZ`.

    Parameters
    ==========

    A : :py:class:`~.DomainMatrix` over domain :ref:`ZZ`.

    Returns
    =======

    :py:class:`~.DomainMatrix`
        The HNF of matrix *A*.

    Raises
    ======

    DMDomainError
        If the domain of the matrix is not :ref:`ZZ`.

    References
    ==========

    .. [1] Cohen, H. *A Course in Computational Algebraic Number Theory.*
       (See Algorithm 2.4.5.)

    úMatrix must be over domain ZZ.r   rQ   r   N)r   Úis_ZZr   r   rD   rE   rF   Úcopyr   rT   r"   r   Úfrom_repÚto_dfm_or_ddm)ÚAr   Únr    r   r   ÚuÚvr   r-   Úsr   Úqs                r   Ú_hermite_normal_formra   ±   s÷  € ð8 Œ8Œ>ð >ÝÐ<Ñ=Ô=Ð=ð Œ7�D€A€qØ	�
Š
‰ŒÔ×ÒÑ!Ô!×&Ò&Ñ(Ô(€Að 	
€AÝ�1�q‘5˜"˜bÑ!Ô!ð !2ñ !2ˆØ�Š6ˆ6ð ‰EØ	ˆQ‰ˆõ �q˜1‘u˜b "Ñ%Ô%ð 	2ð 	2ˆAØ�Œt�AŒw˜!Š|ˆ|õ !  1¤ a¤¨!¨A¬$¨q¬'Ñ2Ô2‘��1�aØ˜”t˜A”w !‘| Q q¤T¨!¤W°¡\�1�Ý˜A˜q ! Q¨¨A¨2¨qÑ1Ô1Ð1øØˆaŒD�ŒGˆàˆqŠ5ˆ5Ý˜˜1˜a  Q¨¨AÑ.Ô.Ð.Ø�ˆAð �Š6ˆ6Ø�‰FˆAˆAõ
 ˜1˜q™5 !‘_”_ð 2ð 2�Ø�a”D˜”G˜q‘L�Ý˜A˜q ! Q¨¨¨A¨qÑ1Ô1Ð1Ð1ñ2õ
 Ô  §¢Ñ!2Ô!2Ñ3Ô3°A°A°A°q°r°r°EÔ:Ð:r   c                 óº  — | j         j        st          d¦  «        ‚t          j        |¦  «        r|dk     rt          d¦  «        ‚d„ }t          t          ¦  «        }| j        \  }}||k     rt          d¦  «        ‚|  	                    ¦   «         j
                             ¦   «                              ¦   «         } |}|}t          |dz
  dd¦  «        D �]a}|dz  }t          |dz
  dd¦  «        D ]u}	| |         |	         dk    rat          | |         |         | |         |	         ¦  «        \  }
}}| |         |         |z  | |         |	         |z  }} || |||	|
|| |¦  «         Œv| |         |         }|dk    r|x| |         |<   }t          ||¦  «        \  }
}}t          |¦  «        D ]}|
| |         |         z  |z  ||         |<   Œ ||         |         dk    r|||         |<   t          |dz   |¦  «        D ]5}	||         |	         ||         |         z  }t          ||	|d| dd¦  «         Œ6||z  }�Œct!          |||ft          ¦  «         	                    ¦   «         S )a[  
    Perform the mod *D* Hermite Normal Form reduction algorithm on
    :py:class:`~.DomainMatrix` *A*.

    Explanation
    ===========

    If *A* is an $m \times n$ matrix of rank $m$, having Hermite Normal Form
    $W$, and if *D* is any positive integer known in advance to be a multiple
    of $\det(W)$, then the HNF of *A* can be computed by an algorithm that
    works mod *D* in order to prevent coefficient explosion.

    Parameters
    ==========

    A : :py:class:`~.DomainMatrix` over :ref:`ZZ`
        $m \times n$ matrix, having rank $m$.
    D : :ref:`ZZ`
        Positive integer, known to be a multiple of the determinant of the
        HNF of *A*.

    Returns
    =======

    :py:class:`~.DomainMatrix`
        The HNF of matrix *A*.

    Raises
    ======

    DMDomainError
        If the domain of the matrix is not :ref:`ZZ`, or
        if *D* is given but is not in :ref:`ZZ`.

    DMShapeError
        If the matrix has more rows than columns.

    References
    ==========

    .. [1] Cohen, H. *A Course in Computational Algebraic Number Theory.*
       (See Algorithm 2.4.8.)

    rV   r   z0Modulus D must be positive element of domain ZZ.c                 ó$  — t          t          | ¦  «        ¦  «        D ]r}| |         |         }	t          ||	z  || |         |         z  z   |z  |¦  «        | |         |<   t          ||	z  || |         |         z  z   |z  |¦  «        | |         |<   Œsd S r   )r   r   r   )
r   ÚRr   r   r   r   r   r   r    r!   s
             r   Úadd_columns_mod_Rz8_hermite_normal_form_modulo_D.<locals>.add_columns_mod_R0  sž   € õ •s˜1‘v”v‘”ð 	Fð 	FˆAØ�!”�Q”ˆAÝ'¨¨Q©°°Q°q´T¸!´W±Ñ)<ÀÑ(AÀ1ÑEÔEˆAˆaŒD�‰GÝ'¨¨Q©°°Q°q´T¸!´W±Ñ)<ÀÑ(AÀ1ÑEÔEˆAˆaŒD�‰GˆGð	Fð 	Fr   z2Matrix must have at least as many columns as rows.rQ   r   )r   rW   r   r
   Úof_typer   Údictr   r   rD   rE   rF   rX   r   rT   r"   r   )r[   ÚDre   ÚWr   r\   r    rd   r   r   r]   r^   r   r-   r_   r   Úiir`   s                     r   Ú_hermite_normal_form_modulo_Drk   þ   s‹  € ðZ Œ8Œ>ð >ÝÐ<Ñ=Ô=Ð=ÝŒ:�a‰=Œ=ð P˜A šE˜EÝÐNÑOÔOÐOðFð Fð Fõ 	•DÑÔ€AàŒ7�D€A€qØˆ1‚u€uÝÐOÑPÔPÐPØ	�
Š
‰ŒÔ×ÒÑ!Ô!×&Ò&Ñ(Ô(€AØ	€AØ	€AÝ�1�q‘5˜"˜bÑ!Ô!ð ñ ˆØ	ˆQ‰ˆÝ�q˜1‘u˜b "Ñ%Ô%ð 	;ð 	;ˆAØ�Œt�AŒw˜!Š|ˆ|Ý   1¤ a¤¨!¨A¬$¨q¬'Ñ2Ô2‘��1�aØ˜”t˜A”w !‘| Q q¤T¨!¤W°¡\�1�Ø!Ð! ! Q¨¨1¨a°°Q°B¸Ñ:Ô:Ð:øØˆaŒD�ŒGˆØ�Š6ˆ6ØˆOˆAˆaŒD�‰G�aÝ˜˜A‘,”,‰ˆˆ1ˆaÝ˜‘(”(ð 	&ð 	&ˆBØ˜˜2œ˜qœ‘z A‘~ˆAˆbŒE�!‰HˆHØˆQŒ4�Œ7�aŠ<ˆ<ØˆAˆaŒD�‰GÝ�q˜1‘u˜a‘”ð 	.ð 	.ˆAØ�!”�Q”˜1˜Qœ4 œ7Ñ"ˆAÝ˜˜1˜a  Q B¨¨1Ñ-Ô-Ð-Ð-Ø	ˆa‰ˆ‰Ý˜˜A˜q˜6¥2Ñ&Ô&×/Ò/Ñ1Ô1Ð1r   NF)rh   Ú
check_rankc                óô   — | j         j        st          d¦  «        ‚|�M|r;|                      t          ¦  «                             ¦   «         | j        d         k    rt          | |¦  «        S t          | ¦  «        S )a)  
    Compute the Hermite Normal Form of :py:class:`~.DomainMatrix` *A* over
    :ref:`ZZ`.

    Examples
    ========

    >>> from sympy import ZZ
    >>> from sympy.polys.matrices import DomainMatrix
    >>> from sympy.polys.matrices.normalforms import hermite_normal_form
    >>> m = DomainMatrix([[ZZ(12), ZZ(6), ZZ(4)],
    ...                   [ZZ(3), ZZ(9), ZZ(6)],
    ...                   [ZZ(2), ZZ(16), ZZ(14)]], (3, 3), ZZ)
    >>> print(hermite_normal_form(m).to_Matrix())
    Matrix([[10, 0, 2], [0, 15, 3], [0, 0, 2]])

    Parameters
    ==========

    A : $m \times n$ ``DomainMatrix`` over :ref:`ZZ`.

    D : :ref:`ZZ`, optional
        Let $W$ be the HNF of *A*. If known in advance, a positive integer *D*
        being any multiple of $\det(W)$ may be provided. In this case, if *A*
        also has rank $m$, then we may use an alternative algorithm that works
        mod *D* in order to prevent coefficient explosion.

    check_rank : boolean, optional (default=False)
        The basic assumption is that, if you pass a value for *D*, then
        you already believe that *A* has rank $m$, so we do not waste time
        checking it for you. If you do want this to be checked (and the
        ordinary, non-modulo *D* algorithm to be used if the check fails), then
        set *check_rank* to ``True``.

    Returns
    =======

    :py:class:`~.DomainMatrix`
        The HNF of matrix *A*.

    Raises
    ======

    DMDomainError
        If the domain of the matrix is not :ref:`ZZ`, or
        if *D* is given but is not in :ref:`ZZ`.

    DMShapeError
        If the mod *D* algorithm is used but the matrix has more rows than
        columns.

    References
    ==========

    .. [1] Cohen, H. *A Course in Computational Algebraic Number Theory.*
       (See Algorithms 2.4.5 and 2.4.8.)

    rV   Nr   )	r   rW   r   Ú
convert_tor	   Úrankr   rk   ra   )r[   rh   rl   s      r   Úhermite_normal_formrp   V  so   € ðv Œ8Œ>ð >ÝÐ<Ñ=Ô=Ð=Ø€}˜j€}¨A¯LªL½Ñ,<Ô,<×,AÒ,AÑ,CÔ,CÀqÄwÈqÄzÒ,QÐ,QÝ,¨Q°Ñ2Ô2Ð2å# AÑ&Ô&Ð&r   )Ú__doc__Úcollectionsr   Údomainmatrixr   Ú
exceptionsr   r   Úsympy.ntheory.modularr   Úsympy.polys.domainsr	   r
   r   r"   r   rT   ra   rk   rp   r$   r   r   ú<module>rw      s  ðØ 2Ð 2à #Ð #Ð #Ð #Ð #Ð #à &Ð &Ð &Ð &Ð &Ð &Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &ðð ð ð."ð "ð "ðhð hð hðVð ð ð*J;ð J;ð J;ðZU2ð U2ð U2ðp !%°ð @'ð @'ð @'ð @'ð @'ð @'ð @'r   