§
    šŠtj�  ã                  óò  — d dl mZ d dl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
 d dlmZmZmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZ d dl m!Z!  ej"        e#¦  «        Z$dZ%dZ&dZ'e G d„ d¦  «        ¦   «         Z(e G d„ d¦  «        ¦   «         Z)e G d„ d¦  «        ¦   «         Z*e G d„ d¦  «        ¦   «         Z+ G d„ de¦  «        Z, G d„ de¦  «        Z- G d„ de¦  «        Z.dS )é    )ÚannotationsN)Ú	dataclassÚfield)Úmd5)ÚAnyÚIterableÚIteratorÚListÚOptionalÚTupleÚType)ÚCallbackManagerForRetrieverRun©ÚDocument)Ú
Embeddings)ÚRunnableÚRunnableConfig)ÚVectorStoreÚVectorStoreRetriever)Ú
ConfigDictiÖvAi×vAiÚvAc                  óZ   — e Zd ZU dZdZded<   dZded<   dZd	ed
<   dZd	ed<   dZ	ded<   dS )ÚSummaryConfigaj  Configuration for summary generation.

    is_enabled: True if summary is enabled, False otherwise
    max_results: maximum number of results to summarize
    response_lang: requested language for the summary
    prompt_name: name of the prompt to use for summarization
      (see https://docs.vectara.com/docs/learn/grounded-generation/select-a-summarizer)
    FÚboolÚ
is_enabledé   ÚintÚmax_resultsÚengÚstrÚresponse_langz"vectara-summary-ext-24-05-med-omniÚprompt_nameÚstreamN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r    r!   r"   © ó    úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/vectorstores/vectara.pyr   r      ss   € € € € € € ðð ð €JÐÐÐÑØ€KÐÐÐÑØ€MÐÐÐÑØ;€KÐ;Ð;Ð;Ñ;Ø€FÐÐÐÑÐÐr)   r   c                  ó>   — e Zd ZU dZdZded<   dZded<   dZd	ed
<   dS )Ú	MMRConfiga£  Configuration for Maximal Marginal Relevance (MMR) search.
       This will soon be deprated in favor of RerankConfig.

    is_enabled: True if MMR is enabled, False otherwise
    mmr_k: number of results to fetch for MMR, defaults to 50
    diversity_bias: number between 0 and 1 that determines the degree
        of diversity among the results with 0 corresponding
        to minimum diversity and 1 to maximum diversity.
        Defaults to 0.3.
        Note: diversity_bias is equivalent 1-lambda_mult
        where lambda_mult is the value often used in max_marginal_relevance_search()
        We chose to use that since we believe it's more intuitive to the user.
    Fr   r   é2   r   Úmmr_kç333333Ó?ÚfloatÚdiversity_biasN)r#   r$   r%   r&   r   r'   r.   r1   r(   r)   r*   r,   r,   .   sM   € € € € € € ðð ð €JÐÐÐÑØ€E€O€O€O�OØ€NÐÐÐÑÐÐr)   r,   c                  óL   — e Zd ZU dZdZded<   dZded<   dZd	ed
<   dZded<   dS )ÚRerankConfiga¾  Configuration for Reranker.

    reranker: "mmr", "rerank_multilingual_v1", "udf" or "none"
    rerank_k: number of results to fetch before reranking, defaults to 50
    mmr_diversity_bias: for MMR only - a number between 0 and 1 that determines
        the degree of diversity among the results with 0 corresponding
        to minimum diversity and 1 to maximum diversity.
        Defaults to 0.3.
        Note: mmr_diversity_bias is equivalent 1-lambda_mult
        where lambda_mult is the value often used in max_marginal_relevance_search()
        We chose to use that since we believe it's more intuitive to the user.
    user_function: for UDF only - the user function to use for reranking.
    Únoner   Úrerankerr-   r   Úrerank_kr/   r0   Úmmr_diversity_biasÚ Úuser_functionN)	r#   r$   r%   r&   r5   r'   r6   r7   r9   r(   r)   r*   r3   r3   C   sc   € € € € € € ðð ð €HÐÐÐÑØ€HÐÐÐÑØ #ÐÐ#Ð#Ð#Ñ#Ø€MÐÐÐÑÐÐr)   r3   c                  óÊ   — e Zd ZU dZdZded<   dZded<   dZd	ed
<   dZded<   dZ	ded<   dZ
ded<    ee¬¦  «        Zded<    ee¬¦  «        Zded<   	 	 	 	 	 	 	 	 	 	 ddd„ZdS )ÚVectaraQueryConfigaW  Configuration for Vectara query.

    k: Number of Documents to return. Defaults to 10.
    lambda_val: lexical match parameter for hybrid search.
    filter Dictionary of argument(s) to filter on metadata. For example a
        filter can be "doc.rating > 3.0 and part.lang = 'deu'"} see
        https://docs.vectara.com/docs/search-apis/sql/filter-overview
        for more details.
    score_threshold: minimal score threshold for the result.
        If defined, results with score less than this value will be
        filtered out.
    n_sentence_before: number of sentences before the matching segment
        to add, defaults to 2
    n_sentence_after: number of sentences before the matching segment
        to add, defaults to 2
    rerank_config: RerankConfig configuration dataclass
    summary_config: SummaryConfig configuration dataclass
    é
   r   Úkç        r0   Ú
lambda_valr8   r   ÚfilterNúOptional[float]Úscore_thresholdé   Ún_sentence_beforeÚn_sentence_after)Údefault_factoryr3   Úrerank_configr   Úsummary_configÚn_sentence_contextúOptional[int]Ú
mmr_configúOptional[MMRConfig]úOptional[SummaryConfig]úOptional[RerankConfig]c                ó¤  — || _         || _        || _        || _        |	r|	| _        nt          ¦   «         | _        |r)|| _        || _        t          j	        dt          ¦  «         n|| _        || _        |
r	|
| _        d S |r=t          d|j        |j        ¬¦  «        | _        t          j	        dt          ¦  «         d S t          ¦   «         | _        d S )Nz[n_sentence_context is deprecated. Please use n_sentence_before and n_sentence_after insteadÚmmr©r5   r6   r7   z9MMRConfig is deprecated. Please use RerankConfig instead.)r=   r?   r@   rB   rH   r   rD   rE   ÚwarningsÚwarnÚDeprecationWarningrG   r3   r.   r1   )Úselfr=   r?   r@   rB   rD   rE   rI   rK   rH   rG   s              r*   Ú__init__zVectaraQueryConfig.__init__w   s  € ð ˆŒØ$ˆŒØˆŒØ.ˆÔàð 	2Ø"0ˆDÔÐå"/¡/¤/ˆDÔð ð 
	5Ø%7ˆDÔ"Ø$6ˆDÔ!ÝŒMðLå"ñô ð ð ð &7ˆDÔ"Ø$4ˆDÔ!ð ð 	0Ø!.ˆDÔÐÐØð 	0Ý!-ØØ#Ô)Ø#-Ô#<ð"ñ "ô "ˆDÔõ
 ŒMØKÝ"ñô ð ð ð õ
 ".¡¤ˆDÔÐÐr)   )
r<   r>   r8   NrC   rC   NNNN)r=   r   r?   r0   r@   r   rB   rA   rD   r   rE   r   rI   rJ   rK   rL   rH   rM   rG   rN   )r#   r$   r%   r&   r=   r'   r?   r@   rB   rD   rE   r   r3   rG   r   rH   rV   r(   r)   r*   r;   r;   Y   sû   € € € € € € ðð ð& €A€K€K€K�KØ€JÐÐÐÑØ€FÐÐÐÑØ'+€OÐ+Ð+Ð+Ñ+ØÐÐÐÐÑØÐÐÐÐÑØ"' %¸Ð"EÑ"EÔ"E€MÐEÐEÐEÑEØ$) E¸-Ð$HÑ$HÔ$H€NÐHÐHÐHÑHð ØØØ+/Ø!"Ø !Ø,0Ø*.Ø26Ø04ð20ð 20ð 20ð 20ð 20ð 20ð 20r)   r;   c                  ó  — e Zd ZdZ	 	 	 	 	 dFdGd„ZedHd„¦   «         ZdId„ZdJd„ZdKdLd„Z	dMdNd„Z
	 dMdOd%„Z	 	 dPdQd)„Z	 	 dRdSd/„ZdTd1„ZdUd2„ZdVd4„Z	 	 dWdXd:„Ze	 	 dPdYd>„¦   «         Ze	 	 dPdZd@„¦   «         Zd[dB„Zd[dC„Zd\dE„ZdS )]ÚVectaraa€  `Vectara API` vector store.

     See (https://vectara.com).

    Example:
        .. code-block:: python

            from langchain_community.vectorstores import Vectara

            vectorstore = Vectara(
                vectara_customer_id=vectara_customer_id,
                vectara_corpus_id=vectara_corpus_id,
                vectara_api_key=vectara_api_key
            )
    Néx   Ú	langchainÚvectara_customer_idúOptional[str]Úvectara_corpus_idÚvectara_api_keyÚvectara_api_timeoutr   Úsourcer   c                óP  — |pt           j                             d¦  «        | _        |pt           j                             d¦  «        | _        |pt           j                             d¦  «        | _        | j        �| j        �| j        €t                               d¦  «         n"t                               d| j        › �¦  «         || _	        t          j        ¦   «         | _        t          j                             d¬¦  «        }| j                             d	|¦  «         || _        dS )
zInitialize with Vectara API.ÚVECTARA_CUSTOMER_IDÚVECTARA_CORPUS_IDÚVECTARA_API_KEYNzHCan't find Vectara credentials, customer_id or corpus_id in environment.zUsing corpus id é   )Úmax_retrieszhttp://)ÚosÚenvironÚgetÚ_vectara_customer_idÚ_vectara_corpus_idÚ_vectara_api_keyÚloggerÚwarningÚdebugÚ_sourceÚrequestsÚSessionÚ_sessionÚadaptersÚHTTPAdapterÚmountr_   )rU   r[   r]   r^   r_   r`   Úadapters          r*   rV   zVectara.__init__½   s  € ð %8ð %
½2¼:¿>º>Ø!ñ<
ô <
ˆÔ!ð #4ð #
µr´z·~²~Øñ8
ô 8
ˆÔð !0Ð Tµ2´:·>²>ÐBSÑ3TÔ3TˆÔàÔ%Ð-ØÔ&Ð.ØÔ$Ð,å�NŠNðñô ð ð õ
 �LŠLÐE¨DÔ,CÐEÐEÑFÔFÐFØˆŒå Ô(Ñ*Ô*ˆŒÝÔ#×/Ò/¸AÐ/Ñ>Ô>ˆØŒ×Ò˜I wÑ/Ô/Ð/Ø#6ˆÔ Ð Ð r)   ÚreturnúOptional[Embeddings]c                ó   — d S ©Nr(   ©rU   s    r*   Ú
embeddingszVectara.embeddingsß   s   € àˆtr)   Údictc                ó.   — | j         | j        d| j        dœS )z=Returns headers that should be attached to each post request.zapplication/json)z	x-api-keyzcustomer-idúContent-TypezX-Source)rl   rj   rp   r|   s    r*   Ú_get_post_headerszVectara._get_post_headersã   s'   € ð Ô.ØÔ4Ø.Øœð	
ð 
ð 	
r)   Údoc_idr   c           
     ó:  — | j         | j        |dœ}| j                             dt	          j        |¦  «        d|                      ¦   «         | j        ¬¦  «        }|j        dk    r7t           
                    d|› d|j        › d|j        › d	|j        › �¦  «         d
S dS )zØ
        Delete a document from the Vectara corpus.

        Args:
            doc_id (str): ID of the document to delete.
        Returns:
            bool: True if deletion was successful, False otherwise.
        )Úcustomer_idÚ	corpus_idÚdocument_idz$https://api.vectara.io/v1/delete-docT)ÚdataÚverifyÚheadersÚtimeoutéÈ   z#Delete request failed for doc_id = z with status code ú	, reason z, text F)rj   rk   rs   ÚpostÚjsonÚdumpsr�   r_   Ústatus_coderm   ÚerrorÚreasonÚtext)rU   r‚   ÚbodyÚresponses       r*   Ú_delete_doczVectara._delete_docì   sÖ   € ð  Ô4ØÔ0Ø!ð
ð 
ˆð
 ”=×%Ò%Ø2Ý”˜DÑ!Ô!ØØ×*Ò*Ñ,Ô,ØÔ,ð &ñ 
ô 
ˆð Ô 3Ò&Ð&Ý�LŠLð#°fð #ð #ØÔ'ð#ð #Ø2:´/ð#ð #à”=ð#ð #ñô ð ð
 �5Øˆtr)   FÚdocÚuse_core_apic                ój  — i }| j         |d<   | j        |d<   ||d<   |rdnd}| j                             |                      ¦   «         |t          j        |¦  «        | j        d¬¦  «        }|j        }|                     ¦   «         }d|v r|d         d	         nd }|d
k    s|r|dk    rdS |r|dk    rdS dS )Nr„   r…   Údocumentz$https://api.vectara.io/v1/core/indexzhttps://api.vectara.io/v1/indexT)r‰   Úurlr‡   rŠ   rˆ   ÚstatusÚcodeé™  ÚALREADY_EXISTSÚE_ALREADY_EXISTSÚ	FORBIDDENÚE_NO_PERMISSIONSÚE_SUCCEEDED)	rj   rk   rs   r�   r�   rŽ   r�   r_   r�   )	rU   r—   r˜   ÚrequestÚapi_endpointr•   r�   ÚresultÚ
status_strs	            r*   Ú
_index_doczVectara._index_doc
  sü   € Ø"$ˆØ!%Ô!:ˆ�ÑØ#Ô6ˆ�ÑØ!ˆ�
Ñð ð3Ð2Ð2à2ð 	ð
 ”=×%Ò%Ø×*Ò*Ñ,Ô,ØÝ”˜GÑ$Ô$ØÔ,Øð &ñ 
ô 
ˆð Ô*ˆà—’‘”ˆØ19¸VÐ1CÐ1C�V˜HÔ% fÔ-Ð-Èˆ
Ø˜#ÒÐ Ð°Ð?OÒ1OÐ1OØ%Ð%Øð 	!˜Z¨;Ò6Ð6Ø%Ð%à �=r)   ÚidsúOptional[List[str]]Úkwargsr   úOptional[bool]c                óF   ‡ — |rˆ fd„|D ¦   «         }t          |¦  «        S dS )zéDelete by vector ID or other criteria.
        Args:
            ids: List of ids to delete.

        Returns:
            Optional[bool]: True if deletion is successful,
            False otherwise, None if not implemented.
        c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r(   )r–   )Ú.0ÚidrU   s     €r*   ú
<listcomp>z"Vectara.delete.<locals>.<listcomp>2  s'   ø€ Ð:Ð:Ð:°�t×'Ò'¨Ñ+Ô+Ð:Ð:Ð:r)   T)Úall)rU   r©   r«   Úsuccesss   `   r*   ÚdeletezVectara.delete(  s7   ø€ ð ð 	Ø:Ð:Ð:Ð:°cÐ:Ñ:Ô:ˆGÝ�w‘<”<Ðà�4r)   Ú
files_listúIterable[str]Ú	metadatasúOptional[List[dict]]ú	List[str]c                óZ  — g }t          |¦  «        D �]—\  }}t          j                             |¦  «        st                               d|› d�¦  «         ŒD|r||         ni }|t          |d¦  «        ft          j        |¦  «        dœ}|  	                    ¦   «         }	|	 
                    d¦  «         | j                             d| j        › d| j        › d�|d	|	| j        ¬
¦  «        }
|
j        dk    rC|
                     ¦   «         d         d         }t                               d|› d|› d�¦  «         �Œ#|
j        dk    r7|
                     ¦   «         d         d         }|                     |¦  «         �Œet                               d|› d|
                     ¦   «         › �¦  «         �Œ™|S )ac  
        Vectara provides a way to add documents directly via our API where
        pre-processing and chunking occurs internally in an optimal way
        This method provides a way to use that API in LangChain

        Args:
            files_list: Iterable of strings, each representing a local file path.
                    Files could be text, HTML, PDF, markdown, doc/docx, ppt/pptx, etc.
                    see API docs for full list
            metadatas: Optional list of metadatas associated with each file

        Returns:
            List of ids associated with each of the files indexed
        zFile z does not exist, skippingÚrb)ÚfileÚdoc_metadatar€   z https://api.vectara.io/upload?c=z&o=z&d=TrueT)Úfilesrˆ   r‰   rŠ   rž   rš   Ú
documentIdz# already exists on Vectara (doc_id=z), skippingr‹   zError indexing file z: )Ú	enumeraterg   ÚpathÚexistsrm   r‘   ÚopenrŽ   r�   r�   Úpoprs   r�   rj   rk   r_   r�   ÚinfoÚappend)rU   rµ   r·   r«   Údoc_idsÚinxr¼   Úmdr¾   r‰   r•   r‚   s               r*   Ú	add_fileszVectara.add_files7  sÌ  € ð( ˆÝ" :Ñ.Ô.ð 	Nñ 	N‰IˆC�Ý”7—>’> $Ñ'Ô'ð Ý—’ÐD TÐDÐDÐDÑEÔEÐEØØ#,Ð4�˜3”�°"ˆBà�t D¨$Ñ/Ô/Ð0Ý $¤
¨2¡¤ðð ˆEð ×,Ò,Ñ.Ô.ˆGØ�KŠK˜Ñ'Ô'Ð'Ø”}×)Ò)Øq°4Ô3LÐqÐqÐQUÔQhÐqÐqÐqØØØØÔ0ð *ñ ô ˆHð Ô# sÒ*Ð*Ø!Ÿš™œ¨Ô4°\ÔB�Ý—’ØX˜DÐXÐXÀVÐXÐXÐXñô ð ñ ð Ô%¨Ò,Ð,Ø!Ÿš™œ¨Ô4°\ÔB�Ø—’˜vÑ&Ô&Ð&Ñ&å—’ÐL°4ÐLÐL¸8¿=º=¹?¼?ÐLÐLÑMÔMÐMÑMàˆr)   Útextsr½   úOptional[dict]c           
     ó.  — t          ¦   «         }|D ])}|                     |                     ¦   «         ¦  «         Œ*|                     ¦   «         }|€d„ |D ¦   «         }|rd|d<   nddi}|                     dd¦  «        }|rdnd}	d	|d
t          j        |¦  «        |	d„ t          ||¦  «        D ¦   «         i}
|                      |
|¬¦  «        }|dk    r+|  	                    |¦  «         |                      |
¦  «         n|dk    rt          d¦  «         |gS )aš  Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            doc_metadata: optional metadata for the document

        This function indexes all the input text strings in the Vectara corpus as a
        single Vectara document, where each input text is considered a "section" and the
        metadata are associated with each section.
        if 'doc_metadata' is provided, it is associated with the Vectara document.

        Returns:
            document ID of the document added

        Nc                ó   — g | ]}i ‘ŒS r(   r(   )r¯   Ú_s     r*   r±   z%Vectara.add_texts.<locals>.<listcomp>ˆ  s   € Ð+Ð+Ð+ ˜Ð+Ð+Ð+r)   rZ   r`   r˜   FÚpartsÚsectionr†   ÚmetadataJsonc                óB   — g | ]\  }}|t          j        |¦  «        d œ‘ŒS ))r“   rÒ   )rŽ   r�   )r¯   r“   rÉ   s      r*   r±   z%Vectara.add_texts.<locals>.<listcomp>“  s<   € ð ð ð á�D˜"ð ­t¬z¸"©~¬~Ð>Ð>ðð ð r)   )r˜   r    r¢   ziNo permissions to add document to Vectara. 
                Check your corpus ID, customer ID and API key)r   ÚupdateÚencodeÚ	hexdigestri   rŽ   r�   Úzipr¨   r–   Úprint)rU   rË   r·   r½   r«   Údoc_hashÚtr‚   r˜   Úsection_keyr—   Úsuccess_strs               r*   Ú	add_textszVectara.add_textsl  s`  € õ. ‘5”5ˆØð 	(ð 	(ˆAØ�OŠO˜AŸHšH™JœJÑ'Ô'Ð'Ð'Ø×#Ò#Ñ%Ô%ˆØÐØ+Ð+ UÐ+Ñ+Ô+ˆIØð 	3Ø%0ˆL˜Ñ"Ð"à$ kÐ2ˆLà—z’z .°%Ñ8Ô8ˆØ!-Ð<�g�g°9ˆà˜6Ø�DœJ |Ñ4Ô4Øð ð å # E¨9Ñ 5Ô 5ðñ ô ð
ˆð —o’o c¸�oÑEÔEˆàÐ,Ò,Ð,Ø×Ò˜VÑ$Ô$Ð$Ø�OŠO˜CÑ Ô Ð Ð ØÐ.Ò.Ð.ÝðAñô ð ð ˆxˆr)   ÚqueryÚconfigr;   ÚchatÚchat_conv_idc                ó–  — t          |j        t          ¦  «        rt          di |j        ¤Ž|_        t          |j        t          ¦  «        rt          di |j        ¤Ž|_        d|d|j        j        dv r|j        j        n|j        |j	        |j
        dœ| j        |j        dœgdœgi}|j        dk    r$d|j        i|d         d         d         d         d	<   |j        j        d
k    r&t          d|j        j        idœ|d         d         d<   n\|j        j        dk    r$t           |j        j        dœ|d         d         d<   n(|j        j        dk    rdt$          i|d         d         d<   |j        j        rV|j        j        |j        j        |j        j        dœg|d         d         d<   |r d|dœ|d         d         d         d         d<   |S )zÞBuild the body for the API

        Args:
            query: Text to look up documents similar to.
            config: VectaraQueryConfig object
        Returns:
            A dictionary with the body of the query
        rÞ   r   )rP   ÚudfÚrerank_multilingual_v1)ÚsentencesBeforeÚsentencesAfter)ÚcorpusIdÚmetadataFilter)rÞ   ÚstartÚ
numResultsÚcontextConfigÚ	corpusKeyÚlambdarì   ÚlexicalInterpolationConfigrP   ÚdiversityBias)Ú
rerankerIdÚ	mmrConfigÚrerankingConfigrã   )rð   ÚuserFunctionrä   rð   )ÚmaxSummarizedResultsÚresponseLangÚsummarizerPromptNameÚsummaryT)ÚstoreÚconversationIdrà   r(   )Ú
isinstancerG   r~   r3   rH   r   r5   r6   r=   rD   rE   rk   r@   r?   ÚMMR_RERANKER_IDr7   ÚUDF_RERANKER_IDr9   ÚRERANKER_MULTILINGUAL_V1_IDr   r   r    r!   )rU   rÞ   rß   rà   rá   r«   r”   s          r*   Ú_get_query_bodyzVectara._get_query_body¥  sU  € õ  �fÔ*­DÑ1Ô1ð 	HÝ#/Ð#GÐ#G°&Ô2FÐ#GÐ#GˆFÔ Ý�fÔ+­TÑ2Ô2ð 	KÝ$1Ð$JÐ$J°FÔ4IÐ$JÐ$JˆFÔ!ð à"Øð #Ô0Ô9ØGðHð Hð Ô,Ô5Ð5ð
 $œXð ,2Ô+CØ*0Ô*Að&ð &ð )-Ô(?Ø.4¬mðð ð"ðð ðð
ˆð6 Ô˜qÒ Ð à˜&Ô+ðNˆD�ŒM˜!Ô˜[Ô)¨!Ô,Ð-IÑJð ÔÔ(¨EÒ1Ð1å-Ø-¨vÔ/CÔ/VÐWð3ð 3ˆD�ŒM˜!ÔÐ.Ñ/Ð/ð Ô!Ô*¨eÒ3Ð3å-Ø &Ô 4Ô Bð3ð 3ˆD�ŒM˜!ÔÐ.Ñ/Ð/ð Ô!Ô*Ð.FÒFÐFàÕ9ð3ˆD�ŒM˜!ÔÐ.Ñ/ð Ô Ô+ð 	ð -3Ô,AÔ,MØ$*Ô$9Ô$GØ,2Ô,AÔ,Mðð ð+ˆD�ŒM˜!Ô˜YÑ'ð ð à!Ø&2ð:ð :��W”˜aÔ  Ô+¨AÔ.¨vÑ6ð ˆr)   úList[Tuple[Document, float]]c           
     ó:  ‡—  | j         |‰fi |¤Ž}| j                             |                      ¦   «         dt	          j        |¦  «        | j        ¬¦  «        }|j        dk    r6t           	                    dd|j        › d|j
        › d|j        › d�¦  «         g S |                     ¦   «         }‰j        r!ˆfd	„|d
         d         d         D ¦   «         }n|d
         d         d         }|d
         d         d         }g }	|D ]g}
d„ |
d         D ¦   «         }|
d         }d„ ||         d         D ¦   «         }d|vrd|d<   |                     |¦  «         |	                     |¦  «         Œhd„ t          ||	¦  «        D ¦   «         }‰j        j        dv r|d‰j        …         }‰j        j        ro|d
         d         d         d         d         }|d
         d         d         d         d         d         }|                     t+          |d|dœ¬¦  «        df¦  «         |S )a7  Run a Vectara query

        Args:
            query: Text to look up documents similar to.
            config: VectaraQueryConfig object
        Returns:
            A list of k Documents matching the given query
            If summary is enabled, last document is the summary text with 'summary'=True
        zhttps://api.vectara.io/v1/query)r‰   r›   r‡   rŠ   r‹   úQuery failed %sú(code rŒ   ú
, details ú)c                ó6   •— g | ]}|d          ‰j         k    ¯|‘ŒS ©Úscore)rB   )r¯   Úrrß   s     €r*   r±   z)Vectara.vectara_query.<locals>.<listcomp>  s5   ø€ ð ð ð àØ�W”: Ô 6Ò6Ð6ð à6Ð6Ð6r)   ÚresponseSetr   r•   rš   c                ó,   — i | ]}|d          |d         “ŒS ©ÚnameÚvaluer(   ©r¯   Úms     r*   ú
<dictcomp>z)Vectara.vectara_query.<locals>.<dictcomp>%  s"   € Ð?Ð?Ð?¨A�!�F”)˜Q˜wœZÐ?Ð?Ð?r)   ÚmetadataÚdocumentIndexc                ó,   — i | ]}|d          |d         “ŒS r  r(   r  s     r*   r  z)Vectara.vectara_query.<locals>.<dictcomp>'  s"   € ÐTÐTÐT°�a˜”i  7¤ÐTÐTÐTr)   r`   Úvectarac                óR   — g | ]$\  }}t          |d          |¬¦  «        |d         f‘Œ%S ©r“   ©Úpage_contentr  r  r   ©r¯   ÚxrÉ   s      r*   r±   z)Vectara.vectara_query.<locals>.<listcomp>-  sU   € ð 	
ð 	
ð 	
ñ ��2õ Ø!" 6¤Øðñ ô ð �'”
ðð	
ð 	
ð 	
r)   ©rP   rä   Nr÷   r“   ÚfactualConsistencyr  T)r÷   Úfcsr  r>   )rþ   rs   r�   r�   rŽ   r�   r_   r�   rm   r‘   r’   r“   rB   rÔ   rÆ   r×   rG   r5   r=   rH   r   r   )rU   rÞ   rß   r«   r”   r•   r¦   Ú	responsesÚ	documentsr·   r  rÉ   Údoc_numÚdoc_mdÚresr÷   r  s     `              r*   Úvectara_queryzVectara.vectara_queryø  s·  ø€ ð $ˆtÔ# E¨6Ð<Ð<°VÐ<Ð<ˆØ”=×%Ò%Ø×*Ò*Ñ,Ô,Ø1Ý”˜DÑ!Ô!ØÔ,ð	 &ñ 
ô 
ˆð Ô 3Ò&Ð&Ý�LŠLØ!ð$˜Ô-ð $ð $¸¼ð $ð $Ø”=ð$ð $ð $ñô ð ð
 ˆIà—’‘”ˆàÔ!ð 	=ðð ð ð à Ô.¨qÔ1°*Ô=ðñ ô ˆIˆIð ˜}Ô-¨aÔ0°Ô<ˆIØ˜=Ô)¨!Ô,¨ZÔ8ˆ	àˆ	Øð 	!ð 	!ˆAØ?Ð?°°:´Ð?Ñ?Ô?ˆBØ˜Ô(ˆGØTÐT°Y¸wÔ5GÈ
Ô5SÐTÑTÔTˆFØ˜vÐ%Ð%Ø#,��xÑ Ø�IŠI�fÑÔÐØ×Ò˜RÑ Ô Ð Ð ð	
ð 	
õ ˜Y¨	Ñ2Ô2ð	
ñ 	
ô 	
ˆð ÔÔ(Ð,MÐMÐMØ�j˜œ�j”/ˆCØÔ Ô+ð 
	Ø˜]Ô+¨AÔ.¨yÔ9¸!Ô<¸VÔDˆGØ˜Ô'¨Ô*¨9Ô5°aÔ8Ð9MÔNÈwÔWˆCØ�JŠJåØ%,À4ÐPSÐ7TÐ7Tðñ ô ð ð	ñô ð ð ˆ
r)   c                óJ   — t          di |¤Ž}|                      ||¦  «        }|S )a�  Return Vectara documents most similar to query, along with scores.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 10.

            any other querying variable in VectaraQueryConfig like:
            - lambda_val: lexical match parameter for hybrid search.
            - filter: filter string
            - score_threshold: minimal score threshold for the result.
            - n_sentence_before: number of sentences before the matching segment
            - n_sentence_after: number of sentences after the matching segment
            - rerank_config: optional configuration for Reranking
              (see RerankConfig dataclass)
            - summary_config: optional configuration for summary
              (see SummaryConfig dataclass)
        Returns:
            List of Documents most similar to the query and score for each.
        r(   )r;   r#  )rU   rÞ   r«   rß   Údocss        r*   Úsimilarity_search_with_scorez$Vectara.similarity_search_with_scoreG  s1   € õ0 $Ð-Ð- fÐ-Ð-ˆØ×!Ò! %¨Ñ0Ô0ˆØˆr)   úList[Document]c                ó6   —  | j         |fi |¤Ž}d„ |D ¦   «         S )a  Return Vectara documents most similar to query, along with scores.

        Args:
            query: Text to look up documents similar to.
            any other querying variable in VectaraQueryConfig

        Returns:
            List of Documents most similar to the query
        c                ó   — g | ]\  }}|‘ŒS r(   r(   ©r¯   r—   rÏ   s      r*   r±   z-Vectara.similarity_search.<locals>.<listcomp>u  ó   € Ð2Ð2Ð2™˜˜Q�Ð2Ð2Ð2r)   )r&  )rU   rÞ   r«   Údocs_and_scoress       r*   Úsimilarity_searchzVectara.similarity_searchc  s>   € ð <˜$Ô;Øð
ð 
àð
ð 
ˆð 3Ð2 /Ð2Ñ2Ô2Ð2r)   r-   ç      à?Úfetch_kÚlambda_multr0   c                óN   — t          d|d|z
  ¬¦  «        |d<    | j        |fi |¤ŽS )aS  Return docs selected using the maximal marginal relevance.
        Maximal marginal relevance optimizes for similarity to query AND diversity
        among selected documents.

        Args:
            query: Text to look up documents similar to.
            k: Number of Documents to return. Defaults to 5.
            fetch_k: Number of Documents to fetch to pass to MMR algorithm.
                     Defaults to 50
            lambda_mult: Number between 0 and 1 that determines the degree
                        of diversity among the results with 0 corresponding
                        to maximum diversity and 1 to minimum diversity.
                        Defaults to 0.5.
            kwargs: any other querying variable in VectaraQueryConfig
        Returns:
            List of Documents selected by maximal marginal relevance.
        rP   é   rQ   rG   )r3   r-  )rU   rÞ   r/  r0  r«   s        r*   Úmax_marginal_relevance_searchz%Vectara.max_marginal_relevance_searchw  sE   € õ0 #/Ø WÀÀ[Áð#
ñ #
ô #
ˆˆÑð &ˆtÔ% eÐ6Ð6¨vÐ6Ð6Ð6r)   ÚclsúType[Vectara]Ú	embeddingc                ód   — |                      di ¦  «        } | di |¤Ž} |j        ||fd|i|¤Ž |S )aÙ  Construct Vectara wrapper from raw documents.
        This is intended to be a quick way to get started.
        Example:
            .. code-block:: python

                from langchain_community.vectorstores import Vectara
                vectara = Vectara.from_texts(
                    texts,
                    vectara_customer_id=customer_id,
                    vectara_corpus_id=corpus_id,
                    vectara_api_key=api_key,
                )
        r½   r(   )rÄ   rÝ   )r4  rË   r6  r·   r«   r½   r  s          r*   Ú
from_textszVectara.from_texts”  sO   € ð6 —z’z .°"Ñ5Ô5ˆØ�#�-�-˜�-�-ˆØˆÔ˜% ÐPÐP¸ÐPÈÐPÐPÐPØˆr)   r¾   c                óB   —  | di |¤Ž}|                      ||¦  «         |S )aÞ  Construct Vectara wrapper from raw documents.
        This is intended to be a quick way to get started.
        Example:
            .. code-block:: python

                from langchain_community.vectorstores import Vectara
                vectara = Vectara.from_files(
                    files_list,
                    vectara_customer_id=customer_id,
                    vectara_corpus_id=corpus_id,
                    vectara_api_key=api_key,
                )
        r(   )rÊ   )r4  r¾   r6  r·   r«   r  s         r*   Ú
from_fileszVectara.from_files´  s0   € ð. �#�-�-˜�-�-ˆØ×Ò˜% Ñ+Ô+Ð+Øˆr)   Ú
VectaraRAGc                ó"   — t          | |¦  «        S )zReturn a Vectara RAG runnable.©r;  ©rU   rß   s     r*   Úas_ragzVectara.as_ragÏ  s   € å˜$ Ñ'Ô'Ð'r)   c                ó&   — t          | |d¬¦  «        S )z'Return a Vectara RAG runnable for chat.T)rà   r=  r>  s     r*   Úas_chatzVectara.as_chatÓ  s   € å˜$ ¨TÐ2Ñ2Ô2Ð2r)   ÚVectaraRetrieverc                ód   — t          | |                     dt          ¦   «         ¦  «        ¬¦  «        S )zreturn a retriever object.rß   )Úvectorstorerß   )rB  ri   r;   )rU   r«   s     r*   Úas_retrieverzVectara.as_retriever×  s3   € åØ V§Z¢Z°Õ:LÑ:NÔ:NÑ%OÔ%Oð
ñ 
ô 
ð 	
r)   )NNNrY   rZ   )
r[   r\   r]   r\   r^   r\   r_   r   r`   r   )rx   ry   )rx   r~   )r‚   r   rx   r   ©F)r—   r~   r˜   r   rx   r   r{   )r©   rª   r«   r   rx   r¬   )rµ   r¶   r·   r¸   r«   r   rx   r¹   )NN)
rË   r¶   r·   r¸   r½   rÌ   r«   r   rx   r¹   )FN)rÞ   r   rß   r;   rà   r¬   rá   r\   r«   r   rx   r~   )rÞ   r   rß   r;   r«   r   rx   rÿ   )rÞ   r   r«   r   rx   rÿ   )rÞ   r   r«   r   rx   r'  )r-   r.  )
rÞ   r   r/  r   r0  r0   r«   r   rx   r'  )r4  r5  rË   r¹   r6  ry   r·   r¸   r«   r   rx   rX   )r4  r5  r¾   r¹   r6  ry   r·   r¸   r«   r   rx   rX   )rß   r;   rx   r;  )r«   r   rx   rB  )r#   r$   r%   r&   rV   Úpropertyr}   r�   r–   r¨   r´   rÊ   rÝ   rþ   r#  r&  r-  r3  Úclassmethodr8  r:  r?  rA  rE  r(   r)   r*   rX   rX   ¬   s#  € € € € € ðð ð$ .2Ø+/Ø)-Ø#&Ø!ð 7ð  7ð  7ð  7ð  7ðD ðð ð ñ „Xðð
ð 
ð 
ð 
ðð ð ð ð<!ð !ð !ð !ð !ð<ð ð ð ð ð$ +/ð3ð 3ð 3ð 3ð 3ðp +/Ø'+ð	7ð 7ð 7ð 7ð 7ðz  %Ø&*ðQð Qð Qð Qð QðfMð Mð Mð Mð^ð ð ð ð83ð 3ð 3ð 3ð. Ø ð	7ð 7ð 7ð 7ð 7ð: ð +/Ø*.ð	ð ð ð ñ „[ðð> ð +/Ø*.ð	ð ð ð ñ „[ðð4(ð (ð (ð (ð3ð 3ð 3ð 3ð
ð 
ð 
ð 
ð 
ð 
r)   rX   c                  óT   — e Zd ZU dZded<   	 ded<   	  ed¬¦  «        Zdd„Zdd„ZdS )rB  zVectara Retriever class.rX   rD  r;   rß   T)Úarbitrary_types_allowedrÞ   r   Úrun_managerr   r«   r   rx   r'  c               óL   —  | j         j        || j        fi |¤Ž}d„ |D ¦   «         S )Nc                ó   — g | ]\  }}|‘ŒS r(   r(   r*  s      r*   r±   z<VectaraRetriever._get_relevant_documents.<locals>.<listcomp>ï  r+  r)   )rD  r#  rß   )rU   rÞ   rK  r«   r,  s        r*   Ú_get_relevant_documentsz(VectaraRetriever._get_relevant_documentsë  s9   € ð 9˜$Ô*Ô8¸ÀÄÐVÐVÈvÐVÐVˆØ2Ð2 /Ð2Ñ2Ô2Ð2r)   r  r¹   c                ó(   —  | j         j        |fi |¤ŽS )zAdd documents to vectorstore.)rD  Úadd_documents)rU   r  r«   s      r*   rP  zVectaraRetriever.add_documentsñ  s    € à-ˆtÔÔ-¨iÐBÐB¸6ÐBÐBÐBr)   N)rÞ   r   rK  r   r«   r   rx   r'  )r  r'  r«   r   rx   r¹   )	r#   r$   r%   r&   r'   r   Úmodel_configrN  rP  r(   r)   r*   rB  rB  Þ  s�   € € € € € € Ø"Ð"àÐÐÑØ+àÐÐÑØ+à�:Ø $ðñ ô €Lð3ð 3ð 3ð 3ðCð Cð Cð Cð Cð Cr)   rB  c                  ó6   — e Zd ZdZ	 ddd	„Z	 ddd„Z	 ddd„Zd
S )r;  z—Vectara RAG runnable.

    Parameters:
        vectara: Vectara object
        config: VectaraQueryConfig object
        chat: bool, default False
    Fr  rX   rß   r;   rà   r   c                ó>   — || _         || _        || _        d | _        d S r{   )r  rß   rà   Úconv_id)rU   r  rß   rà   s       r*   rV   zVectaraRAG.__init__ÿ  s$   € ð ˆŒØˆŒØˆŒ	ØˆŒˆˆr)   NÚinputr   úOptional[RunnableConfig]r«   r   rx   úIterator[dict]c           
   +  ó6  ‡ K  — ‰ j                              |‰ j        ‰ j        ‰ j        ¦  «        }‰ j         j                             ‰ j                              ¦   «         dt          j	        |¦  «        ‰ j         j
        d¬¦  «        }|j        dk    r6t                               dd|j        › d|j        › d|j        › d	�¦  «         d
S g }g }d|iV — |                     ¦   «         D �]±}|�r«t          j        |                     d¦  «        ¦  «        }	|	d         }
|
d         }|�€�|
                     dd
¦  «        }|€ŒYt)          |                     d¦  «        ¦  «        dk    rJt                               d|                     d¦  «        d                              d¦  «        › �¦  «         ŒÉ|                     dd
¦  «        }|rd|                     dd
¦  «        rN|d         }t                               d|› �¦  «         |dk    r#d
‰ _        t                               d¦  «         �ŒE|r|                     dd
¦  «        nd
}|r|‰ _        |                     dd
¦  «        r2|                     di ¦  «                             dd
¦  «        }d|iV — �Œ°t-          |d         ¦  «        }d|iV — �ŒÍ‰ j        j        rˆ fd„|d         D ¦   «         }n|d         }|d          }g }|D ]g}d!„ |d"         D ¦   «         }|d#         }d$„ ||         d"         D ¦   «         }d%|vrd&|d%<   |                     |¦  «         |                     |¦  «         Œhd'„ t5          ||¦  «        D ¦   «         }‰ j        j        j        d(v r|d
‰ j        j        …         }d)|iV — �Œ³d
S )*a  Get streaming output from Vectara RAG.

        Args:
            input: The input query
            config: RunnableConfig object
            kwargs: Any additional arguments

        Returns:
            The output dictionary with question, answer and context
        z&https://api.vectara.io/v1/stream-queryT)r‰   r›   r‡   rŠ   r"   r‹   r  r  rŒ   r  r  NÚquestionzutf-8r¦   r	  r÷   rœ   r   z&Summary generation failed with status ÚstatusDetailrà   zChat query failed with code ÚRESOURCE_EXHAUSTEDz-Sorry, Vectara chat turns exceeds plan limit.rù   r  r  r  r“   Úanswerc                ó@   •— g | ]}|d          ‰j         j        k    ¯|‘ŒS r  )rß   rB   )r¯   r  rU   s     €r*   r±   z%VectaraRAG.stream.<locals>.<listcomp>Y  s7   ø€ ð %ð %ð %à !Ø  œz¨D¬KÔ,GÒGÐGð àGÐGÐGr)   r•   rš   c                ó,   — i | ]}|d          |d         “ŒS r  r(   r  s     r*   r  z%VectaraRAG.stream.<locals>.<dictcomp>c  s"   € ÐKÐKÐK¸˜a œi¨¨7¬ÐKÐKÐKr)   r  r  c                ó,   — i | ]}|d          |d         “ŒS r  r(   r  s     r*   r  z%VectaraRAG.stream.<locals>.<dictcomp>e  s2   € ð "ð "ð "à !ð ˜fœI q¨¤zð"ð "ð "r)   r`   r  c                óR   — g | ]$\  }}t          |d          |¬¦  «        |d         f‘Œ%S r  r   r  s      r*   r±   z%VectaraRAG.stream.<locals>.<listcomp>m  sU   € ð 	ð 	ð 	ñ "˜A˜rõ %Ø-.¨v¬YØ)+ðñ ô ð ˜gœJðð	ð 	ð 	r)   r  Úcontext)r  rþ   rß   rà   rT  rs   r�   r�   rŽ   r�   r_   r�   rm   r‘   r’   r“   Ú
iter_linesÚloadsÚdecoderi   ÚlenrÅ   r   rB   rÔ   rÆ   r×   rG   r5   r=   )rU   rU  rß   r«   r”   r•   r  r  Úliner‡   r¦   Úresponse_setr÷   rà   Úst_coderT  r  Úchunkr·   r  rÉ   r   r!  r"  s   `                       r*   r"   zVectaraRAG.stream  se  øè è € ð  Œ|×+Ò+¨E°4´;ÀÄ	È4Ì<ÑXÔXˆà”<Ô(×-Ò-Ø”L×2Ò2Ñ4Ô4Ø8Ý”˜DÑ!Ô!Ø”LÔ4Øð .ñ 
ô 
ˆð Ô 3Ò&Ð&Ý�LŠLØ!ð$˜Ô-ð $ð $¸¼ð $ð $Ø”=ð$ð $ð $ñô ð ð
 ˆFàˆ	Øˆ	à˜5Ð!Ð!Ð!Ð!à×'Ò'Ñ)Ô)ð N	+ñ N	+ˆDØñ M+Ý”z $§+¢+¨gÑ"6Ô"6Ñ7Ô7�Ø˜hœ�Ø% mÔ4�ØÑ'Ø$Ÿjšj¨°DÑ9Ô9�GØ�Ø Ý˜7Ÿ;š; xÑ0Ô0Ñ1Ô1°AÒ5Ð5ÝŸšðNØ&Ÿ{š{¨8Ñ4Ô4°QÔ7×;Ò;¸NÑKÔKðNð Nñô ð ð !ð #Ÿ;š; v¨tÑ4Ô4�DØð % §¢¨°4Ñ 8Ô 8ð %Ø"& x¤.˜ÝŸšÐ$LÀ7Ð$LÐ$LÑMÔMÐMØ"Ð&:Ò:Ð:Ø+/˜DœLÝ"ŸLšLØ Oñô ð ñ %àBFÐP˜dŸhšhÐ'7¸Ñ>Ô>Ð>ÈD�GØð /Ø'.˜œð —{’{Ð#7¸Ñ>Ô>ð !Ø%ŸkškÐ*>ÀÑCÔC×GÒGÈÐQUÑVÔV˜Ø$ c˜lÐ*Ð*Ð*Ù õ   ¨¤Ñ0Ô0�EØ# UÐ+Ð+Ð+Ð+Ñ+à”{Ô2ð =ð%ð %ð %ð %à%1°*Ô%=ð%ñ %ô %˜	˜	ð %1°Ô$<˜	Ø ,¨ZÔ 8�IØ "�IØ&ð 
-ð 
-˜ØKÐK¸Q¸z¼]ÐKÑKÔK˜Ø"# OÔ"4˜ð"ð "à%.¨wÔ%7¸
Ô%Cð"ñ "ô "˜ð $¨6Ð1Ð1Ø/8˜F 8Ñ,ØŸ	š	 &Ñ)Ô)Ð)Ø!×(Ò(¨Ñ,Ô,Ð,Ð,ð	ð 	õ &)¨°IÑ%>Ô%>ð	ñ 	ô 	�Cð ”{Ô0Ô9ð >ð ð ð " / D¤K¤M /Ô2˜Ø$ cÐ*Ð*Ð*Ð*ùØˆr)   r~   c                ó  — ddi}|                       |¦  «        D ]j}d|v r|d         |d<   Œd|v r|d         |d<   Œ"d|v r|dxx         |d         z  cc<   Œ=d|v r|d         |d<   ŒMt                               d|› �¦  «         Œk|S )Nr\  r8   ra  rY  r  zUnknown chunk type: )r"   rm   r‘   )rU   rU  rß   r«   r"  ri  s         r*   ÚinvokezVectaraRAG.invoke  sÀ   € ð ˜ˆnˆØ—[’[ Ñ'Ô'ð 
	=ð 
	=ˆEØ˜EÐ!Ð!Ø!& yÔ!1��I‘�Ø˜uÐ$Ð$Ø"'¨
Ô"3��J‘�Ø˜UÐ"Ð"Ø�H��”  x¤Ñ0��‘�Ø˜%��Ø" 5œ\��E‘
�
å—’Ð;°EÐ;Ð;Ñ<Ô<Ð<Ð<Øˆ
r)   rF  )r  rX   rß   r;   rà   r   r{   )rU  r   rß   rV  r«   r   rx   rW  )rU  r   rß   rV  r«   r   rx   r~   )r#   r$   r%   r&   rV   r"   rk  r(   r)   r*   r;  r;  ö  s€   € € € € € ðð ð JOðð ð ð ð ð ,0ðvð vð vð vð vðv ,0ðð ð ð ð ð ð r)   r;  )/Ú
__future__r   rŽ   Úloggingrg   rR   Údataclassesr   r   Úhashlibr   Útypingr   r   r	   r
   r   r   r   rq   Ú langchain_core.callbacks.managerr   Úlangchain_core.documentsr   Úlangchain_core.embeddingsr   Úlangchain_core.runnablesr   r   Úlangchain_core.vectorstoresr   r   Úpydanticr   Ú	getLoggerr#   rm   rû   rý   rü   r   r,   r3   r;   rX   rB  r;  r(   r)   r*   ú<module>rx     sÉ  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ Gà €€€ðð ð ð ð ð ð .Ð -Ð -Ð -Ð -Ð -Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€à€Ø'Ð Ø€ð ðð ð ð ð ñ ô ñ „ðð" ð ð  ð  ð  ð  ñ  ô  ñ „ð ð( ðð ð ð ð ñ ô ñ „ðð* ðO0ð O0ð O0ð O0ð O0ñ O0ô O0ñ „ðO0ðdo
ð o
ð o
ð o
ð o
ˆkñ o
ô o
ð o
ðdCð Cð Cð Cð CÐ+ñ Cô Cð Cð0[ð [ð [ð [ð [�ñ [ô [ð [ð [ð [r)   