Ë
    l^(hü=  ã                  óÞ   — d dl m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	 d dl
Zd dlmZmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ erd d
lmZ  ej6                  e«      Z G d„ de«      Zy)é    )ÚannotationsN)Únullcontext)ÚTYPE_CHECKINGÚLiteral)Úaverage_precision_scoreÚmatthews_corrcoef)Úpaired_cosine_distancesÚpaired_euclidean_distancesÚpaired_manhattan_distances)ÚSentenceEvaluator)ÚInputExample)ÚSimilarityFunction)ÚSentenceTransformerc                  ó¾   ‡ — e Zd ZdZ	 	 	 	 	 	 d
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zedd„«       Z	 d	 	 	 	 	 	 	 	 	 dd„Zdd„Z	e
dd„«       Ze
dd„«       Zd	„ Zˆ xZS )ÚBinaryClassificationEvaluatoraV  
    Evaluate a model based on the similarity of the embeddings by calculating the accuracy of identifying similar and
    dissimilar sentences.
    The metrics are the cosine similarity, dot score, Euclidean and Manhattan distance
    The returned score is the accuracy with a specified metric.

    The results are written in a CSV. If a CSV already exists, then values are appended.

    The labels need to be 0 for dissimilar pairs and 1 for similar pairs.

    Args:
        sentences1 (List[str]): The first column of sentences.
        sentences2 (List[str]): The second column of sentences.
        labels (List[int]): labels[i] is the label for the pair (sentences1[i], sentences2[i]). Must be 0 or 1.
        name (str, optional): Name for the output. Defaults to "".
        batch_size (int, optional): Batch size used to compute embeddings. Defaults to 32.
        show_progress_bar (bool, optional): If true, prints a progress bar. Defaults to False.
        write_csv (bool, optional): Write results to a CSV file. Defaults to True.
        truncate_dim (Optional[int], optional): The dimension to truncate sentence embeddings to. `None` uses the model's current truncation dimension. Defaults to None.
        similarity_fn_names (Optional[List[Literal["cosine", "dot", "euclidean", "manhattan"]]], optional): The similarity functions to use. If not specified, defaults to the ``similarity_fn_name`` attribute of the model. Defaults to None.

    Example:
        ::

            from sentence_transformers import SentenceTransformer
            from sentence_transformers.evaluation import BinaryClassificationEvaluator
            from datasets import load_dataset

            # Load a model
            model = SentenceTransformer('all-mpnet-base-v2')

            # Load a dataset with two text columns and a class label column (https://huggingface.co/datasets/sentence-transformers/quora-duplicates)
            eval_dataset = load_dataset("sentence-transformers/quora-duplicates", "pair-class", split="train[-1000:]")

            # Initialize the evaluator
            binary_acc_evaluator = BinaryClassificationEvaluator(
                sentences1=eval_dataset["sentence1"],
                sentences2=eval_dataset["sentence2"],
                labels=eval_dataset["label"],
                name="quora_duplicates_dev",
            )
            results = binary_acc_evaluator(model)
            '''
            Binary Accuracy Evaluation of the model on the quora_duplicates_dev dataset:
            Accuracy with Cosine-Similarity:             81.60  (Threshold: 0.8352)
            F1 with Cosine-Similarity:                   75.27  (Threshold: 0.7715)
            Precision with Cosine-Similarity:            65.81
            Recall with Cosine-Similarity:               87.89
            Average Precision with Cosine-Similarity:    76.03
            Matthews Correlation with Cosine-Similarity: 62.48
            '''
            print(binary_acc_evaluator.primary_metric)
            # => "quora_duplicates_dev_cosine_ap"
            print(results[binary_acc_evaluator.primary_metric])
            # => 0.760277070888393
    c
                ó�  •— t         ‰| �  «        || _        || _        || _        || _        |	xs g | _        t        | j                  «      t        | j                  «      k(  sJ ‚t        | j                  «      t        | j                  «      k(  sJ ‚|D ]  }
|
dk(  rŒ	|
dk(  rŒJ ‚ || _        || _	        || _
        |€Lt        j                  «       t        j                  k(  xs% t        j                  «       t        j                  k(  }|| _        d|rd|z   ndz   dz   | _        ddg| _        | j'                  | j                  «       y )	Nr   é   Ú binary_classification_evaluationÚ_Ú z_results.csvÚepochÚsteps)ÚsuperÚ__init__Ú
sentences1Ú
sentences2ÚlabelsÚtruncate_dimÚsimilarity_fn_namesÚlenÚ	write_csvÚnameÚ
batch_sizeÚloggerÚgetEffectiveLevelÚloggingÚINFOÚDEBUGÚshow_progress_barÚcsv_fileÚcsv_headersÚ_append_csv_headers)Úselfr   r   r   r"   r#   r)   r!   r   r   ÚlabelÚ	__class__s              €ú|/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sentence_transformers/evaluation/BinaryClassificationEvaluator.pyr   z&BinaryClassificationEvaluator.__init__Q   s3  ø€ ô 	‰ÑÔØ$ˆŒØ$ˆŒØˆŒØ(ˆÔØ#6Ò#<¸"ˆÔ ä�4—?‘?Ó#¤s¨4¯?©?Ó';Ò;Ð;Ð;Ü�4—?‘?Ó#¤s¨4¯;©;Ó'7Ò7Ð7Ð7Øò 	,ˆEØ˜A“: ¨!£Ð+Ð+ð	,ð #ˆŒØˆŒ	Ø$ˆŒØÐ$ä×(Ñ(Ó*¬g¯l©lÑ:Òi¼f×>VÑ>VÓ>XÔ\c×\iÑ\iÑ>ið ð "3ˆÔà:ÉD¸cÀDºjÐVXÑYÐ\jÑjˆŒØ# WÐ-ˆÔà× Ñ  ×!9Ñ!9Õ:ó    c                óh   — g d¢}|D ])  }|D ]"  }| j                   j                  |› d|› �«       Œ$ Œ+ y )N)ÚaccuracyÚaccuracy_thresholdÚf1Ú	precisionÚrecallÚf1_thresholdÚapÚmccr   )r+   Úappend)r-   r   ÚmetricsÚvÚms        r0   r,   z1BinaryClassificationEvaluator._append_csv_headersw   sG   € ò	
ˆð %ò 	4ˆAØò 4�Ø× Ñ ×'Ñ'¨1¨#¨Q¨q¨c¨
Õ3ñ4ñ	4r1   c                óà   — g }g }g }|D ]Y  }|j                  |j                  d   «       |j                  |j                  d   «       |j                  |j                  «       Œ[  | |||fi |¤ŽS )Nr   r   )r;   Útextsr.   )ÚclsÚexamplesÚkwargsr   r   ÚscoresÚexamples          r0   Úfrom_input_examplesz1BinaryClassificationEvaluator.from_input_examples‡   st   € àˆ
Øˆ
Øˆàò 	)ˆGØ×Ñ˜gŸm™m¨AÑ.Ô/Ø×Ñ˜gŸm™m¨AÑ.Ô/Ø�M‰M˜'Ÿ-™-Õ(ð	)ñ �:˜z¨6Ñ<°VÑ<Ð<r1   c           
     óà  ‡‡— |dk7  r|dk(  rd|› �}nd|› d|› d�}nd}| j                   �|d| j                   › d	�z  }t        j                  d
| j                  › d|› d�«       | j                  s-|j
                  g| _        | j                  | j                  «       | j                  |«      Š||g}| j                  D ]4  }d|v sŒ|j                  dd¬«      \  }Š|j                  ‰|   ‰   «       Œ6 |�í| j                  rát        j                  j                  || j                  «      }	t        j                  j!                  |	«      sZt#        |	ddd¬«      5 }
t%        j&                  |
«      }|j)                  | j                  «       |j)                  |«       ddd«       n>t#        |	ddd¬«      5 }
t%        j&                  |
«      }|j)                  |«       ddd«       ‰j+                  «       D ����ci c]%  \  }}|j+                  «       D ]  \  }}|› d|› �|“Œ Œ' }}}}}t-        | j                  «      dkD  rB|j/                  ‰d   D �‡ci c]  Šd‰› �t1        ˆˆfd„‰D «       «      “Œ c}«       d| _        n| j                  d   › d�| _        | j5                  || j                  «      }| j7                  ||||«       |S # 1 sw Y   ŒðxY w# 1 sw Y   ŒüxY wc c}}}}w c c}w )aê  
        Compute the evaluation metrics for the given model.

        Args:
            model (SentenceTransformer): The model to evaluate.
            output_path (str, optional): Path to save the evaluation results CSV file. Defaults to None.
            epoch (int, optional): The epoch number. Defaults to -1.
            steps (int, optional): The number of steps. Defaults to -1.

        Returns:
            Dict[str, float]: A dictionary containing the evaluation metrics.
        éÿÿÿÿz after epoch z
 in epoch z after z stepsr   Nz (truncated to ú)z/Binary Accuracy Evaluation of the model on the z datasetú:r   r   )ÚmaxsplitÚwzutf-8)ÚnewlineÚmodeÚencodingÚaÚcosineÚmax_c              3  ó.   •K  — | ]  }‰|   ‰   –— Œ y ­w©N© )Ú.0Ú
short_nameÚmetricrD   s     €€r0   ú	<genexpr>z9BinaryClassificationEvaluator.__call__.<locals>.<genexpr>Î   s   øè ø€ Ò(]È
¨°
Ñ);¸FÕ)CÑ(]ùs   ƒÚmax_apr   Ú_ap)r   r$   Úinfor"   r   Úsimilarity_fn_namer,   Úcompute_metricesr+   Úsplitr;   r!   ÚosÚpathÚjoinr*   ÚisfileÚopenÚcsvÚwriterÚwriterowÚitemsr    ÚupdateÚmaxÚprimary_metricÚprefix_name_to_metricsÚ store_metrics_in_model_card_data)r-   ÚmodelÚoutput_pathr   r   Úout_txtÚfile_output_dataÚheader_nameÚsim_fctÚcsv_pathÚfrf   rW   ÚvaluesrX   Úvaluer<   rD   s                 `  @r0   Ú__call__z&BinaryClassificationEvaluator.__call__“   sõ  ù€ ð �BŠ;Ø˜Š{Ø)¨%¨Ð1‘à& u g¨W°U°G¸6ÐB‘àˆGØ×ÑÐ(Ø˜¨×):Ñ):Ð(;¸1Ð=Ñ=ˆGä�‰ÐEÀdÇiÁiÀ[ÐPXÐY`ÐXaÐabÐcÔdà×'Ò'Ø(-×(@Ñ(@Ð'AˆDÔ$Ø×$Ñ$ T×%=Ñ%=Ô>Ø×&Ñ& uÓ-ˆà! 5˜>Ðà×+Ñ+ò 	AˆKØ�kÒ!Ø"-×"3Ñ"3°CÀ!Ð"3Ó"D‘�˜Ø ×'Ñ'¨¨w©¸Ñ(?Õ@ð	Að
 Ð" t§~¢~Ü—w‘w—|‘| K°·±Ó?ˆHÜ—7‘7—>‘> (Ô+Ü˜(¨B°SÀ7ÔKð 6ÈqÜ ŸZ™Z¨›]�FØ—O‘O D×$4Ñ$4Ô5Ø—O‘OÐ$4Ô5÷6ð 6ô
 ˜(¨B°SÀ7ÔKð 6ÈqÜ ŸZ™Z¨›]�FØ—O‘OÐ$4Ô5÷6ð '-§l¡l£n÷
ñ 
á"�
˜FØ!'§¡£ò
ñ �˜ð ˆl˜!˜F˜8Ð$ eÑ+ð
Ø$ð
ˆó 
ô
 ˆt×'Ñ'Ó(¨1Ò,Ø�N‰Nð #)¨Ñ"2÷àð ˜6˜(�O¤SÔ(]ÐV\Ô(]Ó%]Ñ]òôð #+ˆDÕà%)×%=Ñ%=¸aÑ%@Ð$AÀÐ"EˆDÔà×-Ñ-¨g°t·y±yÓAˆØ×-Ñ-¨e°W¸eÀUÔKØˆ÷76ð 6ú÷
6ð 6üõ
ùòs%   ÅAKÆ5'KÇ9*K#
É K+ËKËK c                óê  — | j                   €
t        «       n|j                  | j                   «      5  	 t        t	        | j
                  | j                  z   «      «      }|j                  || j                  | j                  d¬«      }t        ||«      D ��ci c]  \  }}||“Œ
 }}}| j
                  D �cg c]  }||   ‘Œ	 }}| j                  D �cg c]  }||   ‘Œ	 }}d d d «       t        j                  j                  d„ dddœt        j                  j                  d„ dddœt        j                   j                  d„ d	d
dœt        j"                  j                  d„ dd
dœi}	t%        j&                  | j(                  «      }
i }| j*                  D �]J  }|	|   } |d   «      }|d   }|d   }| j-                  ||
|«      \  }}| j/                  ||
|«      \  }}}}t1        |
||rdndz  «      }|r||k\  n||k  }t3        |
|«      }t4        j7                  d|› d|dz  d›d|d›d�«       t4        j7                  d|› d|dz  d›d|d›d�«       t4        j7                  d|› d|dz  d›�«       t4        j7                  d|› d|dz  d›�«       t4        j7                  d|› d |dz  d›�«       t4        j7                  d!|› d"|dz  d›d#�«       ||||||||d$œ||<   �ŒM |S c c}}w c c}w c c}w # t        $ rj |j                  | j
                  | j                  | j                  d¬«      }|j                  | j                  | j                  | j                  d¬«      }Y �Œ…w xY w# 1 sw Y   �Œ‹xY w)%NT)r#   r)   Úconvert_to_numpyc                ó    — dt        | |«      z
  S )Nr   )r	   ©ÚxÚys     r0   ú<lambda>z@BinaryClassificationEvaluator.compute_metrices.<locals>.<lambda>û   s   € ¨Ô-DÀQÈÓ-JÑ)J€ r1   zCosine-Similarity)Úscore_fnr"   Úgreater_is_betterc                ó‚   — t        j                  t        j                  | «      t        j                  |«      z  d¬«      S )NrH   )Úaxis)ÚnpÚsumÚasarrayr|   s     r0   r   z@BinaryClassificationEvaluator.compute_metrices.<locals>.<lambda>   s'   € ¬¯©´·
±
¸1³ÄÇ
Á
È1ÃÑ0MÐTVÔ)W€ r1   zDot-Productc                ó   — t        | |«       S rT   )r   r|   s     r0   r   z@BinaryClassificationEvaluator.compute_metrices.<locals>.<lambda>  ó   € Ô*DÀQÈÓ*JÐ)J€ r1   zManhattan-DistanceFc                ó   — t        | |«       S rT   )r
   r|   s     r0   r   z@BinaryClassificationEvaluator.compute_metrices.<locals>.<lambda>
  rˆ   r1   zEuclidean-Distancer€   r�   r"   r   rH   zAccuracy with z:             éd   z.2fz	(Threshold: z.4frI   zF1 with z:                   zPrecision with z:            zRecall with z:               zAverage Precision with z:    zMatthews Correlation with z: ú
)r3   r4   r5   r8   r6   r7   r9   r:   )r   r   Útruncate_sentence_embeddingsÚlistÚsetr   r   Úencoder#   r)   ÚzipÚ	TypeErrorr   ÚCOSINErw   ÚDOT_PRODUCTÚ	MANHATTANÚ	EUCLIDEANr„   r†   r   r   Úfind_best_acc_and_thresholdÚfind_best_f1_and_thresholdr   r   r$   r\   )r-   rn   Ú	sentencesÚ
embeddingsÚsentÚembÚemb_dictÚembeddings1Úembeddings2Úsimilarity_fnsr   Úoutput_scoresr]   Úsimilarity_fnrD   r�   r"   ÚaccÚacc_thresholdr5   r6   r7   r8   r9   Úpredicted_labelsr:   s                             r0   r^   z.BinaryClassificationEvaluator.compute_metricesÚ   sÉ  € Ø"×/Ñ/Ð7Œ[Œ]¸U×=_Ñ=_Ð`d×`qÑ`qÓ=rñ 	KðKô !¤ T§_¡_°t·±Ñ%FÓ!GÓH�	ð  #Ÿ\™\ØØ#Ÿ™Ø&*×&<Ñ&<Ø%)ð	 *ó �
ô 8;¸9ÀjÓ7Q×R©)¨$°˜D #™IÐR�ÑRØ:>¿/¹/ÖJ°$˜x¨›~ÐJ�ÐJØ:>¿/¹/ÖJ°$˜x¨›~ÐJ�ÐJ÷9	Kô> ×%Ñ%×+Ñ+ÙJØ+Ø%)ñ.ô
 ×*Ñ*×0Ñ0ÙWØ%Ø%)ñ3ô
 ×(Ñ(×.Ñ.ÙJØ,Ø%*ñ1ô
 ×(Ñ(×.Ñ.ÙJØ,Ø%*ñ1ð!
ˆô. —‘˜DŸK™KÓ(ˆØˆØ"&×":Ñ":ó 	ÐØ*Ð+=Ñ>ˆMØ.�] :Ñ.¨{¸KÓHˆFØ -Ð.AÑ BÐØ  Ñ(ˆDà!%×!AÑ!AÀ&È&ÐRcÓ!dÑˆC�Ø26×2QÑ2QÐRXÐZ`ÐbsÓ2tÑ/ˆB�	˜6 <Ü(¨°Ñ@Q¹1ÐWYÑ1ZÓ[ˆBá;L ¨,Ò 6ÐSYÐ]iÑSiÐÜ# FÐ,<Ó=ˆCä�K‰K˜.¨¨¨n¸SÀ3¹YÀs¸OÈ>ÐZgÐhkÐYlÐlmÐnÔoÜ�K‰K˜( 4 &Ð(<¸RÀ#¹XÀc¸NÈ.ÐYeÐfiÐXjÐjkÐlÔmÜ�K‰K˜/¨$¨¨}¸YÈ¹_ÈSÐ<QÐRÔSÜ�K‰K˜, t fÐ,<¸VÀc¹\È#Ð<NÐOÔPÜ�K‰KÐ1°$°°u¸RÀ#¹XÀc¸NÐKÔLÜ�K‰KÐ4°T°F¸"¸SÀ3¹YÀs¸OÈ2ÐNÔOð  Ø&3ØØ ,Ø&Ø ØØñ	1ˆMÐ,Ó-ð)	ð> Ðùóy SùÚJùÚJøô/ ò à#Ÿl™lØ—O‘OØ#Ÿ™Ø&*×&<Ñ&<Ø%)ð	 +ó �ð $Ÿl™lØ—O‘OØ#Ÿ™Ø&*×&<Ñ&<Ø%)ð	 +ó “ðú÷	Kñ 	KúsY   ²M(´+K2Á8M(ÂK"Â$M(Â5K(ÃM(ÃK-ÃM(Ë"M(Ë2A/M%Í!M(Í$M%Í%M(Í(M2c                ót  — t        | «      t        |«      k(  sJ ‚t        t        | |«      «      }t        |d„ |¬«      }d}d}d}t	        |dk(  «      }t        t        |«      dz
  «      D ]J  }||   \  }	}
|
dk(  r|dz  }n|dz  }||z   t        |«      z  }||kD  sŒ2|}||   d   ||dz      d   z   dz  }ŒL ||fS )Nc                ó   — | d   S ©Nr   rU   ©r}   s    r0   r   zKBinaryClassificationEvaluator.find_best_acc_and_threshold.<locals>.<lambda>8  ó
   € ¨!¨A©$€ r1   ©ÚkeyÚreverser   rH   r   é   )r    r�   r�   Úsortedr…   Úrange)rD   r   Úhigh_score_more_similarÚrowsÚmax_accÚbest_thresholdÚpositive_so_farÚremaining_negativesÚiÚscorer.   r¢   s               r0   r–   z9BinaryClassificationEvaluator.find_best_acc_and_threshold3  sí   € ä�6‹{œc &›kÒ)Ð)Ð)Ü”C˜ Ó'Ó(ˆä�d¡Ð8OÔPˆàˆØˆàˆÜ! &¨A¡+Ó.Ðä”s˜4“y 1‘}Ó%ò 
	CˆAØ ™7‰LˆE�5Ø˜ŠzØ 1Ñ$‘à# qÑ(Ð#à"Ð%8Ñ8¼CÀ»KÑGˆCØ�W‹}Ø�Ø"& q¡'¨!¡*¨t°A¸±E©{¸1©~Ñ"=ÀÑ!B‘ð
	Cð ˜Ð&Ð&r1   c                óò  — t        | «      t        |«      k(  sJ ‚t        j                  | «      } t        j                  |«      }t        t	        | |«      «      }t        |d„ |¬«      }dx}x}}d}d}d}	t        |«      }
t        t        |«      dz
  «      D ]Z  }||   \  }}|dz  }|dk(  r|	dz  }	|	dkD  sŒ |	|z  }|	|
z  }d|z  |z  ||z   z  }||kD  sŒ>|}|}|}||   d   ||dz      d   z   dz  }Œ\ ||||fS )Nc                ó   — | d   S r§   rU   r¨   s    r0   r   zJBinaryClassificationEvaluator.find_best_f1_and_threshold.<locals>.<lambda>W  r©   r1   rª   r   r   r­   )r    r„   r†   r�   r�   r®   r…   r¯   )rD   r   r°   r±   Úbest_f1Úbest_precisionÚbest_recallÚ	thresholdÚnextractÚncorrectÚtotal_num_duplicatesr¶   r·   r.   r6   r7   r5   s                    r0   r—   z8BinaryClassificationEvaluator.find_best_f1_and_thresholdN  s>  € ä�6‹{œc &›kÒ)Ð)Ð)ä—‘˜FÓ#ˆÜ—‘˜FÓ#ˆä”C˜ Ó'Ó(ˆä�d¡Ð8OÔPˆà12Ð2ˆÐ2�. ;Øˆ	ØˆØˆÜ" 6›{Ðä”s˜4“y 1‘}Ó%ò 	BˆAØ ™7‰LˆE�5Ø˜‰MˆHà˜ŠzØ˜A‘�à˜!‹|Ø$ xÑ/�	Ø!Ð$8Ñ8�Ø˜‘] VÑ+¨y¸6Ñ/AÑB�Ø˜“<Ø �GØ%.�NØ"(�KØ!% a¡¨¡¨d°1°q±5©k¸!©nÑ!<ÀÑ A‘Ið	Bð" ˜¨°YÐ>Ð>r1   c                ó@   — i }| j                   �| j                   |d<   |S )Nr   )r   )r-   Úconfig_dicts     r0   Úget_config_dictz-BinaryClassificationEvaluator.get_config_dictr  s)   € ØˆØ×ÑÐ(Ø*.×*;Ñ*;ˆK˜Ñ'ØÐr1   )r   é    FTNN)r   ú	list[str]r   rÅ   r   z	list[int]r"   Ústrr#   Úintr)   Úboolr!   rÈ   r   z
int | Noner   z?list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None)r   rÅ   ÚreturnÚNone)rB   zlist[InputExample])NrH   rH   )
rn   r   ro   rÆ   r   rÇ   r   rÇ   rÉ   zdict[str, float])rn   r   rÉ   zdict[str, dict[str, float]])r°   rÈ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r,   ÚclassmethodrF   rx   r^   Ústaticmethodr–   r—   rÃ   Ú__classcell__)r/   s   @r0   r   r      s  ø„ ñ7ð| ØØ"'ØØ#'Ø_cð$;àð$;ð ð$;ð ð	$;ð
 ð$;ð ð$;ð  ð$;ð ð$;ð !ð$;ð ]õ$;óL4ð  ò	=ó ð	=ð bdðEØ(ðEØ7:ðEØJMðEØ[^ðEà	óEóNWðr ò'ó ð'ð4 ò!?ó ð!?öFr1   r   )Ú
__future__r   re   r&   r`   Ú
contextlibr   Útypingr   r   Únumpyr„   Úsklearn.metricsr   r   Úsklearn.metrics.pairwiser	   r
   r   Ú2sentence_transformers.evaluation.SentenceEvaluatorr   Úsentence_transformers.readersr   Ú*sentence_transformers.similarity_functionsr   Ú)sentence_transformers.SentenceTransformerr   Ú	getLoggerrË   r$   r   rU   r1   r0   ú<module>rÝ      sS   ðÝ "ã 
Û Û 	Ý "ß )ã ß Fß tÑ tå PÝ 6Ý IáÝMà	ˆ×	Ñ	˜8Ó	$€ô_Ð$5õ _r1   