U
    è½|e	~  ã                %   @   s,  d dl mZ d dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZmZ e ejd¡ e ej¡jZe ej¡jZejdd�d~d
d„ƒZejdd�dd„ ƒZejdd�dd„ ƒZejdd�dd„ ƒZejdej ejjejjdddd�ejjejjdddd�¡gejejdœd�dd„ ƒZejej ej ejjdd¡ej ejjdd¡f¡ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�ƒgdejjddd… ejjddd… ejjejjejjejjejjdœdd�dd„ ƒZ ejdd�dd„ ƒZ!ejej ej "ejj¡ej "ejj¡f¡ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�ƒgdejjejjejjejjejjdœdd�d d!„ ƒZ#ejej ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�¡gdejjejjejjejjejjejjd"œdd�d#d$„ ƒZ$e ¡ d%d&„ ƒZ%ejdd'�d(d)„ ƒZ&ejd*ej ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�¡gdejjddd… ejjejjejj'ejjd+œd,�d-d.„ ƒZ(e ¡ d/d0„ ƒZ)e ¡ d1d2„ ƒZ*e ¡ dd4d5„ƒZ+e ¡ d6d7„ ƒZ,e ¡ d8d9„ ƒZ-ejd*ej ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�¡gdd'�d:d;„ ƒZ.e ¡ d<d=„ ƒZ/ejd*ej ejjejjdddd�ejjejjdddd�ejjejjdddd�ejjejjdddd�¡gdejj'ejj'd>œd,�d?d@„ ƒZ0ej1dd'�dAdB„ ƒZ2e ¡ dCdD„ ƒZ3e ¡ dEdF„ ƒZ4e ¡ dGdH„ ƒZ5e ¡ dIdJ„ ƒZ6e ¡ dKdL„ ƒZ7e ¡ dMdN„ ƒZ8e ¡ dOdP„ ƒZ9e ¡ dQdR„ ƒZ:ejdejjejjejjejj'ejjdSœd,�dTdU„ ƒZ;ej1dddV�dWdX„ ƒZ<e ¡ dYdZ„ ƒZ=ejdd[ejjid,�d\d]„ ƒZ>e ¡ d^d_„ ƒZ?e ¡ d`da„ ƒZ@ejdejjejjejjejj'ejjdbœd,�dcdd„ ƒZAej1dddV�dedf„ ƒZBe ¡ dgdh„ ƒZCdidj„ ZDe ¡ eCfdkdl„ƒZEe ¡ d€dmdn„ƒZFe ¡ dodp„ ƒZGe ¡ dqdr„ ƒZHejddsdt�d�dvdw„ƒZIejddsdt�d‚dxdy„ƒZJe&e&e(e)e)e)e*e*e*e*e+e-e.e,e/e4e3e5e6e7e8e9e:e?eEeEeFeFeFeFe@eGeGeHeHeHdzœ$ZKd{ZLe(ejMd|œe(ejMd|œe;e<d|œe>e<d|œeAeBd|œe0e2d|œd}œZNdS )ƒé    )Úprint_functionN)ÚnormÚtau_rand)ÚkantorovichÚjensen_shannon_divergenceÚsymmetric_kl_divergenceÚCT)Úcacheçñhãˆµøä>ç:Œ0âŽyE>c                 C   s$   t  | | ¡}|||t  |¡  kS ©N)ÚnpÚabs)ÚaÚbÚrtolÚatolÚdiff© r   úO/var/www/website-v5/atlas_env/lib/python3.8/site-packages/pynndescent/sparse.pyÚisclose   s    r   c                 C   s@   t  | ¡}t  t jdt jd�|dd … |d d… kf¡}|| S )Né   ©Údtypeéÿÿÿÿ)r   ÚsortÚconcatenateÚonesÚbool_)ÚarrÚauxÚflagr   r   r   Ú
arr_unique   s    
.r"   c                 C   s:   | j d dkr|S |j d dkr$| S tt | |f¡ƒS d S ©Nr   )Úshaper"   r   r   )Úar1Úar2r   r   r   Ú	arr_union&   s
    r'   c                 C   s:   t  | |f¡}| ¡  |d d… |dd … |d d… k S )Nr   r   )r   r   r   )r%   r&   r    r   r   r   Úarr_intersect2   s    r(   zi4(i4[:],i4[:])r   )Úreadonly)Úi1Úi2)Úlocalsc           	      C   sî   | j d dks|j d dkr dS d}d}| j d d }|j d d }| | }|| }d}||kr¢|d7 }||k rê|d7 }| | }nqê||k rê|d7 }|| }qèqêqX||k rÄ||k rÄ|d7 }| | }qX||k rê||k rê|d7 }|| }qXqêqX|S ©Nr   r   ©r$   )	r%   r&   r*   r+   Zlimit1Zlimit2Új1Új2Úresultr   r   r   Úfast_intersection_size:   s6    



r2   )Ú
result_indÚresult_dataÚvalr*   r+   r/   r0   )Úfastmathr,   r	   c                 C   sä  | j d |j d  }tj|tjd�}tj|tjd�}d}d}d}	|| j d k �r(||j d k �r(| | }
|| }|
|krº|| ||  }|dkr¨|
||	< |||	< |	d7 }	|d7 }|d7 }q@|
|k rô|| }|dkrê|
||	< |||	< |	d7 }	|d7 }q@|| }|dk�r|||	< |||	< |	d7 }	|d7 }q@|| j d k �rv| | }
|| }|dk�rj|
||	< |||	< |	d7 }	|d7 }�q(||j d k �rÄ|| }|| }|dk�r¸|||	< |||	< |	d7 }	|d7 }�qv|d |	… }|d |	… }||fS ©Nr   r   r   )r$   r   ÚzerosÚint32Úfloat32)Úind1Údata1Úind2Údata2Úresult_sizer3   r4   r*   r+   Únnzr/   r0   r5   r   r   r   Ú
sparse_sump   sb     





rA   c                 C   s   t | ||| ƒS r   )rA   )r;   r<   r=   r>   r   r   r   Úsparse_diffÉ   s    rB   )r5   r*   r+   r/   r0   c                 C   sÂ   t jj t jj¡}t jj t jj¡}d}d}|| jd k rº||jd k rº| | }|| }	||	krž|| ||  }
|
dkrŒ| |¡ | |
¡ |d7 }|d7 }q,||	k r°|d7 }q,|d7 }q,||fS r-   )	ÚnumbaÚtypedÚListÚ
empty_listÚtypesr9   r:   r$   Úappend)r;   r<   r=   r>   r3   r4   r*   r+   r/   r0   r5   r   r   r   Ú
sparse_mulÎ   s$    




rI   )r1   r5   r*   r+   r/   r0   c                 C   sÒ   | j d }|j d }d}d}d}| | }	|| }
|	|
krŠ|| ||  }||7 }|d7 }||krd|S | | }	|d7 }||kr€|S || }
q0|	|
k r°|d7 }||kr¦|S | | }	q0|d7 }||krÄ|S || }
q0|S )Nr   ç        r   r.   )r;   r<   r=   r>   Údim1Údim2r1   r*   r+   r/   r0   r5   r   r   r   Úsparse_dot_product  s8    




rM   c                 C   sÎ  t | |ƒ}tj|jd tjd�}tj|jd tjd�}d}d}d}	|| jd k �r*||jd k �r*| | }
|| }|
|krÄ|| ||  }|dkr²|| ||	< || ||	< |	d7 }	|d7 }|d7 }qB|
|k rú|| }|dkrð|| ||	< |	d7 }	|d7 }qB|| }|dk�r || ||	< |	d7 }	|d7 }qB|| jd k �rl|| }|dk�r`|| ||	< |	d7 }	|d7 }�q*||jd k �r®|| }|dk�r¢|| ||	< |	d7 }	|d7 }�ql|d |	… }|d |	… }||fS r7   )r'   r   r8   r$   r:   )r;   r<   r=   r>   r3   Zresult_data1Zresult_data2r*   r+   r@   r/   r0   r5   r   r   r   Údense_union>  sV    
 





rN   )r6   c                 C   sD   t | |||ƒ\}}d}t|jd ƒD ]}||| d 7 }q$t |¡S )NrJ   r   é   )rB   Úranger$   r   Úsqrt©r;   r<   r=   r>   Ú_Úaux_datar1   Úir   r   r   Úsparse_euclideanx  s
    rV   z#f4(i4[::1],f4[::1],i4[::1],f4[::1]))rT   r1   r   ÚdimrU   )r6   r,   c           	      C   sD   t | |||ƒ\}}d}t|ƒ}t|ƒD ]}||| ||  7 }q&|S ©NrJ   )rB   ÚlenrP   )	r;   r<   r=   r>   rS   rT   r1   rW   rU   r   r   r   Úsparse_squared_euclidean�  s    rZ   c                 C   s@   t | |||ƒ\}}d}t|jd ƒD ]}|t || ¡7 }q$|S ©NrJ   r   ©rB   rP   r$   r   r   rR   r   r   r   Úsparse_manhattan�  s
    r]   c                 C   sB   t | |||ƒ\}}d}t|jd ƒD ]}t|t || ¡ƒ}q$|S r[   )rB   rP   r$   Úmaxr   r   rR   r   r   r   Úsparse_chebyshev¦  s
    r_   ç       @c           	      C   sL   t | |||ƒ\}}d}t|jd ƒD ]}|t || ¡| 7 }q$|d|  S )NrJ   r   ç      ð?r\   )	r;   r<   r=   r>   ÚprS   rT   r1   rU   r   r   r   Úsparse_minkowski¯  s
    rc   c                 C   s$   t | |||ƒd jd }t|ƒ| S r#   )rB   r$   Úfloat)r;   r<   r=   r>   Ú
n_featuresÚnum_not_equalr   r   r   Úsparse_hamming¸  s    rg   c                 C   s~   t  |¡}t  |¡}t| |||ƒ\}}d|  t j¡}t| |||ƒ\}}	t  |	¡}	t||	||ƒ\}
}d}|D ]}||7 }ql|S )Nra   rJ   )r   r   rA   Úastyper:   rB   rI   )r;   r<   r=   r>   Ú	abs_data1Ú	abs_data2Ú
denom_indsÚ
denom_dataÚ
numer_indsÚ
numer_datarS   Úval_datar1   r5   r   r   r   Úsparse_canberra¾  s    



rp   c           	      C   sv   t | |||ƒ\}}t |¡}|jd dkr.dS t |¡}|dkrDdS t| |||ƒ\}}t |¡}t |¡}t|ƒ| S ©Nr   rJ   )rA   r   r   r$   ÚsumrB   rd   )	r;   r<   r=   r>   rS   rl   Údenominatorrn   Ú	numeratorr   r   r   Úsparse_bray_curtisÏ  s    



ru   c                 C   sB   t | |ƒ}| jd |jd  | }|dkr.dS t|| ƒ| S d S rq   ©r2   r$   rd   ©r;   r<   r=   r>   Ú	num_equalÚnum_non_zeror   r   r   Úsparse_jaccardï  s
    
rz   )ry   rx   c                 C   sN   t | |ƒ}| jd |jd  | }|dkr.dS |dkr:tS t || ¡ S d S rq   )r2   r$   ÚFLOAT32_MAXr   Úlog2rw   r   r   r   Úsparse_alternative_jaccardú  s    
r}   c                 C   s   dt d|  ƒ S )Nra   r`   )Úpow)Úvr   r   r   Úcorrect_alternative_jaccard  s    r€   c                 C   s6   t | |ƒ}| jd |jd  | }|| }t|ƒ| S r#   rv   ©r;   r<   r=   r>   re   Únum_true_truery   rf   r   r   r   Úsparse_matching  s    
rƒ   c                 C   sJ   t | |ƒ}| jd |jd  | }|| }|dkr6dS |d| |  S d S )Nr   rJ   r`   ©r2   r$   ©r;   r<   r=   r>   r‚   ry   rf   r   r   r   Úsparse_dice#  s    
r†   c                 C   sR   t | |ƒ}| jd |jd  | }|| }|dkr6dS t|| | ƒ||  S d S rq   rv   r�   r   r   r   Úsparse_kulsinski/  s    
ÿr‡   c                 C   s:   t | |ƒ}| jd |jd  | }|| }d| ||  S ©Nr   r`   r„   r�   r   r   r   Úsparse_rogers_tanimoto=  s    
r‰   c                 C   sl   | j d |j d kr&t | |k¡r&dS t| |ƒ}|t |dk¡krX|t |dk¡krXdS t|| ƒ| S d S rq   )r$   r   Úallr2   rr   rd   )r;   r<   r=   r>   re   r‚   r   r   r   Úsparse_russellraoF  s    "
$r‹   c                 C   s:   t | |ƒ}| jd |jd  | }|| }d| ||  S rˆ   r„   r�   r   r   r   Úsparse_sokal_michenerS  s    
rŒ   c                 C   sJ   t | |ƒ}| jd |jd  | }|| }|dkr6dS |d| |  S d S )Nr   rJ   g      à?r„   r…   r   r   r   Úsparse_sokal_sneath\  s    
r�   c           
      C   st   t | |||ƒ\}}d}t|ƒ}t|ƒ}|D ]}	||	7 }q*|dkrL|dkrLdS |dks\|dkr`dS d|||   S d S ©NrJ   ra   )rI   r   )
r;   r<   r=   r>   rS   rT   r1   Únorm1Únorm2r5   r   r   r   Úsparse_cosineh  s    
r‘   )r1   Únorm_xÚnorm_yrW   rU   c                 C   s–   t | |||ƒ\}}d}t|ƒ}t|ƒ}t|ƒ}	t|	ƒD ]}
|||
 7 }q6|dkr\|dkr\dS |dksl|dkrptS |dkr|tS || | }t |¡S d S rX   )rI   r   rY   rP   r{   r   r|   )r;   r<   r=   r>   rS   rT   r1   r’   r“   rW   rU   r   r   r   Úsparse_alternative_cosinez  s    r”   )r6   r	   c                 C   s2   t dt| ƒdd�s| dk rdS dtd|  ƒ S d S ©NrJ   gH¯¼šò×z>)r   ra   r`   )r   r   r~   ©Údr   r   r   Ú!sparse_correct_alternative_cosine˜  s    r˜   c                 C   s   t | |||ƒ}d| S )Nra   )rM   ©r;   r<   r=   r>   r1   r   r   r   Ú
sparse_dot   s    rš   r1   c                 C   s*   t | |||ƒ}|dkrtS t |¡ S d S rX   )rM   r{   r   r|   r™   r   r   r   Úsparse_alternative_dot§  s    r›   c                 C   sT  d}d}d}| j d dkr,|j d dkr,dS | j d dksH|j d dkrLdS t|j d ƒD ]}||| 7 }qZt|j d ƒD ]}||| 7 }qz|| }|| }tj|j d tjd�}	tj|j d tjd�}
t|j d ƒD ]}|| | |	|< qÖt|j d ƒD ]}|| | |
|< qút t|	ƒd || j d  |d   ¡}t t|
ƒd ||j d  |d   ¡}t| |	||
ƒ\}}t|ƒ}|D ]}||7 }�q~t| j d ƒD ]$}| | |k�rœ||	| | 8 }�qœt|j d ƒD ]$}|| |k�rÐ||
| | 8 }�qÐt	| |ƒ}||| ||j d   7 }|dk�r2|dk�r2dS |dk�r@dS d|||   S d S )NrJ   r   ra   r   rO   )
r$   rP   r   Úemptyr:   rQ   r   rI   Úsetr'   )r;   r<   r=   r>   re   Úmu_xÚmu_yÚdot_productrU   Úshifted_data1Úshifted_data2r�   r�   Údot_prod_indsÚdot_prod_dataÚcommon_indicesr5   Úall_indicesr   r   r   Úsparse_correlation·  sT     ÿ ÿ

r§   c                 C   sš   t | |||ƒ\}}d}t |¡}t |¡}t || ¡}	|D ]}
|t |
¡7 }q<|dkrd|dkrddS |dkst|dkrxdS ||	kr„dS t d||	  ¡S d S rŽ   )rI   r   rr   rQ   )r;   r<   r=   r>   Úaux_indsrT   r1   r�   r�   Úsqrt_norm_prodr5   r   r   r   Úsparse_hellingerô  s    

rª   )r1   Ú	l1_norm_xÚ	l1_norm_yrW   rU   c                 C   s¦   t | |||ƒ\}}d}t |¡}t |¡}t|ƒ}	t|	ƒD ]}
|t ||
 ¡7 }q:|dkrf|dkrfdS |dksv|dkrztS |dkr†tS t || ¡| }t |¡S d S r[   )rI   r   rr   rY   rP   rQ   r{   r|   )r;   r<   r=   r>   r¨   rT   r1   r«   r¬   rW   rU   r   r   r   Úsparse_alternative_hellinger	  s    

r­   c                 C   s8   t dt| ƒdd�s| dk rdS t dtd|  ƒ ¡S d S r•   )r   r   r   rQ   r~   r–   r   r   r   Ú$sparse_correct_alternative_hellinger)  s    r®   c                 C   s   t  | |k ¡S r   )r   r:   )ÚxÚyr   r   r   Údummy_ground_metric1  s    r±   c                    s   t  ¡ ‡ ‡fdd„ƒ}|S )aš  Generate a "ground_metric" suitable for passing to a ``sparse_kantorovich``
    distance function. This should be a metric that, given indices of the data,
    should produce the ground distance between the corresponding vectors. This
    allows the construction of a cost_matrix or ground_distance_matrix between
    sparse samples on the fly -- without having to compute an all pairs distance.
    This is particularly useful for things like word-mover-distance.

    For example, to create a suitable ground_metric for word-mover distance one
    would use:

    ``wmd_ground_metric = create_ground_metric(word_vectors, cosine)``

    Parameters
    ----------
    ground_vectors: array of shape (n_features, d)
        The set of vectors between which ground_distances are measured. That is,
        there should be a vector for each feature of the space one wishes to compute
        Kantorovich distance over.

    metric: callable (numba jitted)
        The underlying metric used to cpmpute distances between feature vectors.

    Returns
    -------
    ground_metric: callable (numba jitted)
        A ground metric suitable for passing to ``sparse_kantorovich``.
    c                    s   ˆˆ |  ˆ | ƒS r   r   )Zindex1Úindex2©Úground_vectorsÚmetricr   r   Úground_metricS  s    z+create_ground_metric.<locals>.ground_metric)rC   Únjit)r´   rµ   r¶   r   r³   r   Úcreate_ground_metric6  s    r¸   c                 C   sh   t  | jd |jd f¡}t| jd ƒD ]2}t|jd ƒD ]}|| | || ƒ|||f< q:q(t|||ƒS r#   )r   rœ   r$   rP   r   )r;   r<   r=   r>   r¶   Zcost_matrixrU   Újr   r   r   Úsparse_kantorovichZ  s
    rº   c                 C   s  d}d}d}d}d}	d}
d}t  |¡}t  |¡}dd„ }|| jd k �rF|	|jd k �rF| | }||	 }||krÄ||||  7 }|
|| | 7 }
|||	 | 7 }||
| |ƒ}|}|d7 }|	d7 }	q8||k �r
||||  7 }|
|| | 7 }
||
| |ƒ}|}|d7 }q8||||  7 }|||	 | 7 }||
| |ƒ}|}|	d7 }	q8|| jd k �rœ| | }||||  7 }|
|| | 7 }
||
| |ƒ}|}|d7 }�qF|	|jd k �rò||	 }||||  7 }|||	 | 7 }||
| |ƒ}|}|	d7 }	�qœt  |d| ¡S )NrJ   r   c                 S   s   t  t  | ¡|¡S r   )r   Úpowerr   )r¯   rb   r   r   r   Ú<lambda>q  ó    z'sparse_wasserstein_1d.<locals>.<lambda>r   ra   )r   rr   r$   r»   )r;   r<   r=   r>   rb   r1   Zold_indÚdeltar*   r+   Úcdf1Úcdf2r«   r¬   r   r/   r0   r   r   r   Úsparse_wasserstein_1de  s^    

 



rÁ   c                 C   s   t | |||ƒ\}}t||ƒS r   )rN   r   ©r;   r<   r=   r>   Zdense_data1Zdense_data2r   r   r   Ú sparse_jensen_shannon_divergence¥  s    rÃ   c                 C   s   t | |||ƒ\}}t||ƒS r   )rN   r   rÂ   r   r   r   Úsparse_symmetric_kl_divergence«  s    rÄ   F)Úparallelr	   ra   c              	   C   sÐ  t  | jd ¡D �]´}| |df g}	||df g}
td| jd ƒD �] }| ||f dk r^ �qfd}tt|	ƒƒD ]Ì}|	| }||| ||f  || ||f d  … }||| ||f  || ||f d  … }||| ||d  … }||| ||d  … }|||||ƒ}|
| tkrn||||f k rnt|ƒ|k rnd} �q<qn|rB|	 | ||f ¡ |
 |||f ¡ qBt| jd ƒD ]P}|t|	ƒk �r¨|	| | ||f< |
| |||f< nd| ||f< tj	|||f< �qtq| |fS )Nr   r   TFr   )
rC   Úpranger$   rP   rY   ÚFLOAT32_EPSr   rH   r   Úinf)ÚindicesÚ	distancesÚdata_indicesÚdata_indptrÚ	data_dataÚdistÚ	rng_stateÚprune_probabilityrU   Únew_indicesÚnew_distancesr¹   r!   ÚkÚcZfrom_indÚ	from_dataZto_indÚto_datar—   r   r   r   Ú	diversify±  sD     ÿ ÿr×   c	                 C   sž  | j d d }	t |	¡D �]~}
|| |
 | |
d  … }|| |
 | |
d  … }t |¡}tj|j d tjd�}td|j d ƒD ]Ü}|| }t|ƒD ]Æ}|| }|| dkr’|| }|| }||| ||d  … }||| ||d  … }||| ||d  … }||| ||d  … }|||||ƒ}|| tkr’||| k r’t	|ƒ|k r’d||<  q~q’q~t|j d ƒD ],}|| }|| dk�rjd|| |
 | < �qjqd S )Nr   r   r   )
r$   rC   rÆ   r   Úargsortr   Úint8rP   rÇ   r   )Úgraph_indptrÚgraph_indicesÚ
graph_datarÌ   rË   rÍ   rÎ   rÏ   rÐ   Ún_nodesrU   Úcurrent_indicesÚcurrent_dataÚorderÚretainedÚidxr¹   rÓ   Úlrb   ÚqÚ	from_indsrÕ   Zto_indsrÖ   r—   r   r   r   Údiversify_csrè  s6    
ræ   )$Ú	euclideanÚl2ÚsqeuclideanÚ	manhattanÚl1ÚtaxicabÚ	chebyshevÚlinfÚlinftyÚ	linfinityÚ	minkowskiÚcanberraÚ
braycurtisÚhammingÚjaccardÚdiceÚmatchingÚ	kulsinskiÚrogerstanimotoÚ
russellraoÚsokalmichenerÚsokalsneathÚcosineÚcorrelationr   ZwassersteinZwasserstein_1dzwasserstein-1dúkantorovich-1drÿ   Ú	hellingerzjensen-shannonZjensen_shannonzsymmetric-klÚsymmetric_klZsymmetric_kullback_liebler)rô   r÷   rø   rù   rú   rû   rþ   )rÎ   Ú
correction)rç   rè   rý   Údotr   rõ   )r
   r   )r`   )r   )ra   )ra   )OÚ
__future__r   ÚlocaleÚnumpyr   rC   Úpynndescent.utilsr   r   Úpynndescent.distancesr   r   r   Ú	setlocaleÚ
LC_NUMERICÚfinfor:   ÚepsrÇ   r^   r{   r·   r   r"   r'   r(   rG   r9   ÚArrayÚuint16r2   ÚTuplerA   rB   ÚListTyperI   rM   rN   rV   ÚintprZ   r]   r_   rc   rg   rp   ru   rz   r}   Ú	vectorizer€   rƒ   r†   r‡   r‰   r‹   rŒ   r�   r‘   r”   r˜   rš   r›   r§   rª   r­   r®   r±   r¸   rº   rÁ   rÃ   rÄ   r×   ræ   Úsparse_named_distancesÚsparse_need_n_featuresrQ   Ú!sparse_fast_distance_alternativesr   r   r   r   Ú<module>   s.  






þþþø
)þÿ÷ÿù	è
?

þÿ÷þûé
üþ	úí
'
9

üþ	ûõ
	



üþ	ö


üþ	õ










ûý


 ÿý
	
<
ûý


$
?

	 ø6
 ÷8×,

þþþþñ