Ë
    µŒjF  ã                   ó’  — d dl Z d dlmZ d dlmZmZmZmZ d dlm	Z	 d dl
mZmZmZ d dlmZ  e j                   e«      ZdZdZd	Zd
ZdZdZdZdZdZdZdZdZdeeef   deeef   fd„Z deeeef      deeeef      deeef   fd„Z!deeef   defd„Z"dedefd„Z#de$e   de%dee&   fd„Z'de$e   de%dee&   fd „Z( G d!„ d"e«      Z)y)#é    N)Úmd5)ÚAnyÚDictÚListÚOptional)Úget_from_dict_or_env)ÚGraphDocumentÚNodeÚRelationship)Ú
GraphStoreÚ
__Entity__z
SHOW SCHEMA INFO
zù
CALL schema.node_type_properties()
YIELD nodeType AS label, propertyName AS property, propertyTypes AS type
WITH label AS nodeLabels, collect({key: property, types: type}) AS properties
RETURN {labels: nodeLabels, properties: properties} AS output
a?  
MATCH (n)-[e]->(m)
WITH DISTINCT
    labels(n) AS start_node_labels,
    type(e) AS rel_type,
    labels(m) AS end_node_labels,
    e,
    keys(e) AS properties
UNWIND CASE WHEN size(properties) > 0 THEN properties ELSE [null] END AS prop
WITH
    start_node_labels,
    rel_type,
    end_node_labels,
    CASE WHEN prop IS NULL THEN [] ELSE [prop, valueType(e[prop])] END AS property_info
RETURN
    start_node_labels,
    rel_type,
    end_node_labels,
    COLLECT(DISTINCT CASE 
    WHEN property_info <> [] 
    THEN property_info 
    ELSE null END) AS properties_info
zv
UNWIND $data AS row
CALL merge.node(row.label, row.properties, {}, {}) 
YIELD node 
RETURN distinct 'done' AS result
z|
UNWIND $data AS row
MERGE (source {id: row.source_id})
MERGE (target {id: row.target_id})
RETURN distinct 'done' AS result
zÝ
UNWIND $data AS row
MATCH (source {id: row.source_id})
MATCH (target {id: row.target_id})
WITH source, target, row
CALL merge.relationship(source, row.type, {}, {}, target, {})
YIELD rel
RETURN distinct 'done' AS result
z“
MERGE (d:Document {id:$document.metadata.id})
SET d.content = $document.page_content
SET d += $document.metadata
RETURN distinct 'done' AS result
z£
UNWIND $data AS row
MATCH (source {id: row.source_id}), (d:Document {id: $document.metadata.id})
MERGE (d)-[:MENTIONS]->(source)
RETURN distinct 'done' AS result
z1
Node labels and properties (name and type) are:
z)
Relationship labels and properties are:
z7
Nodes are connected with the following relationships:
ÚdataÚreturnc                 óÄ  — | d   D ���cg c]O  }|d   |d   D ��cg c].  }|d   |d   D �cg c]  }d|d   j                  «       i‘Œ c}dœ‘Œ0 c}}|d   |d   d	œ‘ŒQ c}}}| d
   D ���cg c]G  }|d   |d   D ��cg c].  }|d   |d   D �cg c]  }d|d   j                  «       i‘Œ c}dœ‘Œ0 c}}dœ‘ŒI c}}}dœS c c}w c c}}w c c}}}w c c}w c c}}w c c}}}w )NÚedgesÚend_node_labelsÚ
propertiesÚkeyÚtypesÚtype©r   r   Ústart_node_labels©r   r   r   r   ÚnodesÚlabels©r   r   ©r   r   )Úlower)r   ÚedgeÚpropÚ	type_itemÚnodes        ús/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/graphs/memgraph_graph.pyÚget_schema_subsetr$   e   sa  € ð$ ˜Wšõ!
ñ  &�ð $(Ð(9Ñ#:ð !% \Ò 2ô	ñ !3˜ð  $ E™{ð .2°'ª]ó"á-: 	ð $ Y¨vÑ%6×%<Ñ%<Ó%>Ò?Ø-:ñ"óð !3ò	ð &*Ð*=Ñ%>Ø˜V™óð &ó!
ð@ ˜Wšõ
ñ &�ð ˜x™.ð !% \Ò 2ô	ñ !3˜ð  $ E™{ð .2°'ª]ó"á-: 	ð $ Y¨vÑ%6×%<Ñ%<Ó%>Ò?Ø-:ñ"óð !3ò	óð &ó
ñ'#ð #ùò"ùó	ùô
ùò0"ùó	ùô
sQ   ŠC	›C«B>ÁCÁC	Á+C
Á<CÂCÂ(CÂ/C
Â>CÃC	ÃCÃC
r   Úrelsc                 ó²  — |D ��cg c]=  }|d   |d   D �cg c]  }|d   d|d   j                  «       igdœ‘Œ  c}|d   |d   d	œ‘Œ? c}}| D ���cg c]_  }t        |d
   «      dd  g|d   D ��cg c]9  }|d   d   d   dk7  r)|d   |d   D �cg c]  }d|j                  «       i‘Œ c}dœ‘Œ; c}}dœ‘Œa c}}}dœS c c}w c c}}w c c}w c c}}w c c}}}w )Nr   Úproperties_infor   r   é   r   r   Úrel_typer   r   r   r   Ú r   r   r   )r   Ú_remove_backticks)r   r%   Úrelr    r"   r!   s         r#   Úget_reformated_schemar-   Œ   sG  € ñ ô
ñ �ð $'Ð'8Ñ#9ð !$Ð$5Ò 6óá 6˜ð ! ™G°¸¸Q¹¿¹»Ð/HÐ.IÓJØ 6ñð &)Ð)<Ñ%=Ø˜J™óð ò
ñ4 õ
ñ �ô -¨T°(©^Ó<¸Q¸RÐ@ÐAð !% \Ò 2ô	ñ !3˜Ø˜LÑ)¨!Ñ,¨UÑ3°rÒ9ð  $ E™{àIMÈgÊó"ÙIV¸I˜V Y§_¡_Ó%6Ò7Èñ"óð !3ò	óð ó
ñð ùòùó
ùò$"ùó	ùô
s?   †C–#B<¹CÁC
Á/CÂCÂ&CÂ-C
Â<CÃCÃC
Úschemac           	      óÀ  — d}d}d}| d   D ]i  }|ddj                  |d   «      › d�z  }|d   g k(  rŒ'|dz  }|d   D ]6  }d	j                  |d
   D �ch c]  }|d   ’Œ	 c}«      }|d|d   › d|› d�z  }Œ8 Œk | d   D ]œ  }|d   }	dj                  |d   «      }
dj                  |d   «      }|d|
› d|	› d|› d�z  }|d   g k(  rŒH|d|	› d�z  }|d   D ]D  }d	j                  |d
   D �ch c]  }|d   j                  «       ’Œ c}«      }|d|d   › d|› d�z  }ŒF Œž dj                  |r	t        |z   nd|r	t        |z   nd|rt        |z   g«      S dg«      S c c}w c c}w )Nr*   r   z- labels: (:Ú:r   z)
r   z  properties:
z or r   r   z    - r   z: Ú
r   r   r   z(:z)-[:z]->(:z
- labels: z
  properties:
)Újoinr   ÚNODE_PROPS_TEXTÚREL_PROPS_TEXTÚREL_TEXT)r.   Únode_props_dataÚrel_props_dataÚrel_datar"   r    Ú
prop_typesÚprop_types_strr,   r)   Ústart_labelsÚ
end_labelss               r#   Útransform_schema_to_textr=   ¯   sò  € Ø€OØ€NØ€Hà�w”ˆØ˜\¨#¯(©(°4¸±>Ó*BÐ)CÀ3ÐGÑGˆØ�Ñ Ò#ØØÐ,Ñ,ˆØ˜Ô&ˆDØ#Ÿ[™[Ø6:¸7²mÓD±m¨
�˜FÓ#°mÑDóˆNð  ¨¨U© }°B°~Ð6FÀbÐIÑI‰Oñ	 'ð  ð �gŒˆØ�v‘;ˆØ—x‘x Ð$7Ñ 8Ó9ˆØ—X‘X˜cÐ"3Ñ4Ó5ˆ
Ø�b˜˜ d¨8¨*°E¸*¸ÀSÐIÑIˆàˆ|Ñ Ò"Øà˜J x jÐ0AÐBÑBˆØ˜Ô%ˆDØ#Ÿ[™[Ø>BÀ7ºmÓL¹m°
�˜FÑ#×)Ñ)Õ+¸mÑLóˆNð   t¨E¡{ m°2°nÐ5EÀRÐHÑH‰Nñ	 &ð ð  �7‰7á1@ŒO˜oÒ-ÀbÙ/=ŒN˜^Ò+À2Ù#+ŒH�xÑð	
óð ð 24ð	
óð ùò) Eùò  Ms   ÁEÃ(EÚtextc                 ó&   — | j                  dd«      S )NÚ`r*   )Úreplace)r>   s    r#   r+   r+   Ø   s   € Ø�<‰<˜˜RÓ Ð ó    ÚbaseEntityLabelc                 óà   — g }| D ]f  }|j                   d|j                  iz  }|rt        |j                  «      t        gnt        |j                  «      g}||dœ}|j                  |«       Œh |S )NÚid)Úlabelr   )r   rE   r+   r   ÚBASE_ENTITY_LABELÚappend)r   rC   Útransformed_nodesr"   Úproperties_dictrF   Ú	node_dicts          r#   Ú_transform_nodesrL   Ü   sw   € ØÐÛˆØŸ/™/¨T°4·7±7¨OÑ;ˆñ ô ˜tŸy™yÓ)Ô+<Ñ=ä# D§I¡IÓ.Ð/ð 	ð
 $°?ÑCˆ	Ø× Ñ  Õ+ð ð ÐrB   Úrelationshipsc                 ó\  — g }| D ]¤  }t        |j                  «      |rt        gnt        |j                  j                  «      g|j                  j                  |rt        gnt        |j
                  j                  «      g|j
                  j                  dœ}|j                  |«       Œ¦ |S )N)r   Úsource_labelÚ	source_idÚtarget_labelÚ	target_id)r+   r   rG   ÚsourcerE   ÚtargetrH   )rM   rC   Útransformed_relationshipsr,   Úrel_dicts        r#   Ú_transform_relationshipsrW   ê   s•   € ð !#ÐÛˆä% c§h¡hÓ/ñ #ô #Ñ#ä'¨¯
©
¯©Ó8Ð9àŸ™Ÿ™ñ #ô #Ñ#ä'¨¯
©
¯©Ó8Ð9àŸ™Ÿ™ñ
ˆð 	"×(Ñ(¨Õ2ð! ð" %Ð$rB   c                   óö   — e Zd ZdZ	 	 	 	 	 dddœdee   dee   dee   dee   ded	ee   d
dfd„Zdd„Z	e
d
efd„«       Ze
d
eeef   fd„«       Zi fdeded
eeeef      fd„Zdd„Z	 	 ddee   deded
dfd„Zy)ÚMemgraphGrapha¨  Memgraph wrapper for graph operations.

    Parameters:
    url (Optional[str]): The URL of the Memgraph database server.
    username (Optional[str]): The username for database authentication.
    password (Optional[str]): The password for database authentication.
    database (str): The name of the database to connect to. Default is 'memgraph'.
    refresh_schema (bool): A flag whether to refresh schema information
    at initialization. Default is True.
    driver_config (Dict): Configuration passed to Neo4j Driver.

    *Security note*: Make sure that the database connection uses credentials
        that are narrowly-scoped to only include necessary permissions.
        Failure to do so may result in data corruption or loss, since the calling
        code may attempt commands that would result in deletion, mutation
        of data if appropriately prompted or reading sensitive data if such
        data is present in the database.
        The best way to guard against such negative outcomes is to (as appropriate)
        limit the permissions granted to the credentials used with this tool.

        See https://python.langchain.com/docs/security for more information.
    N)Údriver_configÚurlÚusernameÚpasswordÚdatabaseÚrefresh_schemarZ   r   c                óŽ  — 	 ddl }t        d|idd«      }|dk(  r|dk(  rd}n"t        d|idd«      }t        d	|id	d
«      }||f}t        d|iddd«      } |j                  j                  |fd|i|xs i ¤Ž| _        || _        d| _        i | _        	 | j
                  j                  «        |r	 | j                  «        yy# t        $ r t        d«      ‚w xY w# |j                  j                  $ r t        d«      ‚|j                  j                  $ r t        d«      ‚w xY w# |j                  j                  $ r}	|	‚d}	~	ww xY w)z-Create a new Memgraph graph wrapper instance.r   NzRCould not import neo4j python package. Please install it with `pip install neo4j`.r[   ÚMEMGRAPH_URIr*   r\   ÚMEMGRAPH_USERNAMEr]   ÚMEMGRAPH_PASSWORDr^   ÚMEMGRAPH_DATABASEÚmemgraphÚauthzMCould not connect to Memgraph database. Please ensure that the url is correctz`Could not connect to Memgraph database. Please ensure that the username and password are correct)Úneo4jÚImportErrorr   ÚGraphDatabaseÚdriverÚ_driverÚ	_databaser.   Ústructured_schemaÚverify_connectivityÚ
exceptionsÚServiceUnavailableÚ
ValueErrorÚ	AuthErrorr_   ÚClientError)
Úselfr[   r\   r]   r^   r_   rZ   rg   rf   Úes
             r#   Ú__init__zMemgraphGraph.__init__  s£  € ð	Ûô # E¨3 <°¸ÓGˆð �rŠ>˜h¨"šnØ‰Dä+Ø˜XÐ&ØØ#óˆHô
 ,Ø˜XÐ&ØØ#óˆHð
 ˜hÐ'ˆDÜ'Ø˜Ð" JÐ0CÀZó
ˆð 2�u×*Ñ*×1Ñ1Øñ
Øð
Ø,Ò2°ñ
ˆŒð "ˆŒØˆŒØ13ˆÔð	Ø�L‰L×,Ñ,Ô.ñ ðØ×#Ñ#Õ%ð øôe ò 	Üð>óð ð	ûðL ×Ñ×2Ñ2ò 	Üð8óð ð ×Ñ×)Ñ)ò 	ÜðKóð ð	ûð ×#Ñ#×/Ñ/ò Ø�ûðús0   ‚C ÂC Â/D$ ÃCÃAD!Ä$EÄ=D?Ä?Ec                 óŠ   — | j                   r7t        j                  d«       | j                   j                  «        d | _         y y )NzClosing the driver connection.)rk   ÚloggerÚinfoÚclose©rt   s    r#   rz   zMemgraphGraph.close_  s2   € Ø�<Š<Ü�K‰KÐ8Ô9Ø�L‰L×ÑÔ ØˆD�Lð rB   c                 ó   — | j                   S )z(Returns the schema of the Graph database)r.   r{   s    r#   Ú
get_schemazMemgraphGraph.get_schemae  s   € ð �{‰{ÐrB   c                 ó   — | j                   S )z3Returns the structured schema of the Graph database)rm   r{   s    r#   Úget_structured_schemaz#MemgraphGraph.get_structured_schemaj  s   € ð ×%Ñ%Ð%rB   ÚqueryÚparamsc                 óÞ  — ddl m} 	 | j                  j                  || j                  |¬«      \  }}}|D �cg c]  }|j                  «       ‘Œ }}|S c c}w # |$ rœ}|j                  dk(  s|j                  dk(  rd|j                  v sf|j                  dk(  rd|j                  v sId	|j                  v s;|j                  d
k(  rd|j                  v s|j                  d
k(  rd|j                  v s‚ Y d}~nd}~ww xY w| j                  j                  | j                  ¬«      5 }	|	j                  ||«      }|D �cg c]  }|j                  «       ‘Œ nc c}w }}|cddd«       S # 1 sw Y   yxY w)a	  Query the graph.

        Args:
            query (str): The Cypher query to execute.
            params (dict): The parameters to pass to the query.

        Returns:
            List[Dict[str, Any]]: The list of dictionaries containing the query results.
        r   ©Ú
Neo4jError)Ú	database_Úparameters_z+Neo.DatabaseError.Statement.ExecutionFailedz4Neo.DatabaseError.Transaction.TransactionStartFailedzin an implicit transactionz'Neo.ClientError.Statement.SemanticErrorz&in an open transaction is not possiblez+tried to execute in an explicit transactionú0Memgraph.ClientError.MemgraphError.MemgraphErrorzin multicommand transactionsúSchemaInfo disabledN)r^   )
Úneo4j.exceptionsr„   rk   Úexecute_queryrl   r   ÚcodeÚmessageÚsessionÚrun)
rt   r€   r�   r„   r   Ú_ÚrÚ	json_dataru   r�   s
             r#   r€   zMemgraphGraph.queryo  sX  € õ 	0ð"	ØŸ™×3Ñ3ØØŸ.™.Ø"ð 4ó ‰JˆD�!�Qñ
 ,0Ó0©4 a˜Ÿ™�¨4ˆIÐ0ØÐùò 1øàò 	ð Ÿ™Ð"OÒOØŸ6™6ØQòRð 5¸¿	¹	ÑAð —F‘FÐGÒGà@ÀAÇIÁIÑMØHÈAÏIÉIÑUð —F‘FÐPÒPØ7¸1¿9¹9ÑDð —F‘FÐPÒPØ-°·±Ñ:ð ÿøð5	úð: �\‰\×!Ñ!¨4¯>©>Ð!Ô:¸gØ—;‘;˜u fÓ-ˆDÙ+/Ó0©4 a˜Ÿ™�©4ùÒ0ˆIÐ0Ø÷ ;×:Ò:úsA   ˆ0A ¸AÁA ÁA ÁC9ÁBC4Ã4C9Ä"E#Ä9EÅ	E#Å#E,c                 ó’  — ddl }ddlm} | j                  d«      g k(  ry	 | j                  t        «      d   j                  d«      }|�.t        |t        |j                  f«      r|j                  |«      }n|}|€J ‚t        |«      }|| _        t        |«      | _        y# |$ r<}|j                  dk(  r#d|j                  v rt         j#                  d«       Y d}~nd}~ww xY w| j                  t$        «      D �cg c]  }|d	   ‘Œ	 nc c}w }}| j                  t&        «      }	t)        ||	«      }|| _        t        |«      | _        y)
zB
        Refreshes the Memgraph graph schema information.
        r   Nrƒ   zMATCH (n) RETURN n LIMIT 1r.   r‡   rˆ   z˜Schema generation with SHOW SCHEMA INFO query failed. Set --schema-info-enabled=true to use SHOW SCHEMA INFO query. Falling back to alternative queries.Úoutput)Úastr‰   r„   r€   ÚSCHEMA_QUERYÚgetÚ
isinstanceÚstrÚASTÚliteral_evalr$   rm   r=   r.   r‹   rŒ   rx   ry   ÚNODE_PROPERTIES_QUERYÚ	REL_QUERYr-   )
rt   r”   r„   ÚresultÚschema_resultrm   ru   r€   r   r%   s
             r#   r_   zMemgraphGraph.refresh_schema¥  s3  € ó 	å/ð �:‰:Ð2Ó3°rÒ9Øð	Ø—Z‘Z¤Ó-¨aÑ0×4Ñ4°XÓ>ˆFØÐ!¤j°¼#¸s¿w¹w¸Ô&HØ #× 0Ñ 0°Ó 8‘à &�Ø Ð,Ð,Ð,Ü 1°-Ó @ÐØ%6ˆDÔ"Ü2Ð3DÓEˆDŒKØøØò 		à—‘ÐLÒLØ)¨Q¯Y©YÑ6ä—‘ð;ôÿøð		úð /3¯j©jÔ9NÔ.OÓPÑ.O U��x“Ñ.OùÒPˆÐPØ�z‰zœ)Ó$ˆä1°%¸Ó>ÐØ!2ˆÔÜ.Ð/@ÓAˆ�s   ¡A?B! Â!C"Â&2CÃC"Ã<D	Úgraph_documentsÚinclude_sourcerC   c           	      ób  — |rK| j                  dt        › d�«       | j                  dt        › d�«       | j                  dt        › d�«       |D �]L  }|r¤|j                  j                  j	                  d«      sSt        |j                  j                  j                  d«      «      j                  «       |j                  j                  d<   | j                  t        d|j                  j                  i«       | j                  t        d	t        |j                  |«      i«       t        |j                  |«      }| j                  t         d	|i«       | j                  t"        d	|i«       |s�Œ | j                  t$        ||j                  j                  d
œ«       �ŒO | j'                  «        y)a*  
        Take GraphDocument as input as uses it to construct a graph in Memgraph.

        Parameters:
        - graph_documents (List[GraphDocument]): A list of GraphDocument objects
        that contain the nodes and relationships to be added to the graph. Each
        GraphDocument should encapsulate the structure of part of the graph,
        including nodes, relationships, and the source document information.
        - include_source (bool, optional): If True, stores the source document
        and links it to nodes in the graph using the MENTIONS relationship.
        This is useful for tracing back the origin of data. Merges source
        documents based on the `id` property from the source document metadata
        if available; otherwise it calculates the MD5 hash of `page_content`
        for merging process. Defaults to False.
        - baseEntityLabel (bool, optional): If True, each newly created node
        gets a secondary __Entity__ label, which is indexed and improves import
        speed and performance. Defaults to False.
        zCREATE CONSTRAINT ON (b:z) ASSERT b.id IS UNIQUE;zCREATE INDEX ON :z(id);Ú;rE   zutf-8Údocumentr   )r   r£   N)r€   rG   rS   Úmetadatar–   r   Úpage_contentÚencodeÚ	hexdigestÚINCLUDE_DOCS_QUERYÚ__dict__ÚNODE_IMPORT_QUERYrL   r   rW   rM   ÚREL_NODES_IMPORT_QUERYÚREL_IMPORT_QUERYÚINCLUDE_DOCS_SOURCE_QUERYr_   )rt   rŸ   r    rC   r£   r8   s         r#   Úadd_graph_documentsz!MemgraphGraph.add_graph_documentsÐ  so  € ñ2 Ø�J‰JØ*Ô+<Ð*=Ð=UÐVôð �J‰JÐ*Ô+<Ð*=¸UÐCÔDØ�J‰JÐ*Ô+<Ð*=¸QÐ?Ô@ä'ˆHÙØ—‘×/Ñ/×3Ñ3°DÔ9Ü58Ø Ÿ™×4Ñ4×;Ñ;¸GÓDó6ç‘i“kð —O‘O×,Ñ,¨TÑ2ð —
‘
Ô-°
¸H¿O¹O×<TÑ<TÐ/UÔVà�J‰JÜ!ØÔ)¨(¯.©.¸/ÓJÐKôô
 0°×0FÑ0FÈÓXˆHØ�J‰JÜ&Ø˜Ð"ôð �J‰JÜ Ø˜Ð"ôó
 Ø—
‘
Ü-Ø%°8·?±?×3KÑ3KÑLöð3 (ð: 	×ÑÕrB   )NNNNT)r   N)FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r˜   Úboolr   rv   rz   Úpropertyr}   r   r   Údictr   r€   r_   r	   r®   © rB   r#   rY   rY     s8  „ ñð2 "Ø"&Ø"&Ø"&Ø#ðCð )-òCà�c‰]ðCð ˜3‘-ðCð ˜3‘-ð	Cð
 ˜3‘-ðCð ðCð   ‘~ðCð 
óCóJ ð ð˜Cò ó ðð ð& t¨C°¨H¡~ò &ó ð&ð 02ñ 4˜3ð 4¨ð 4°d¸4ÀÀSÀ¹>Ñ6Jó 4ól)Bð\  %Ø %ñ	=à˜mÑ,ð=ð ð=ð ð	=ð
 
ô=rB   rY   )*ÚloggingÚhashlibr   Útypingr   r   r   r   Úlangchain_core.utilsr   Ú)langchain_community.graphs.graph_documentr	   r
   r   Ú&langchain_community.graphs.graph_storer   Ú	getLoggerr¯   rx   rG   r•   r›   rœ   rª   r«   r¬   r¨   r­   r3   r4   r5   r˜   r$   r-   r=   r+   Úlistr³   rµ   rL   rW   rY   r¶   rB   r#   Ú<module>r¿      ss  ðÛ Ý ß ,Ó ,å 5ç WÑ WÝ =à	ˆ×	Ñ	˜8Ó	$€ð !Ð ð€ðÐ ð€	ð0Ð ðÐ ðÐ ðÐ ðÐ ð€ð€ð€ð
$˜D  c ™Nð $¨t°C¸°H©~ó $ðN Ø��S˜#�X‘Ñð Ø'+¨D°°c°©NÑ';ð à	ˆ#ˆsˆ(�^ó ðF& T¨#¨s¨(¡^ð &¸ó &ðR!˜Cð ! Có !ð˜D ™Jð ¸ð À$ÀtÁ*ó ð%Ø˜Ñ%ð%Ø8<ð%à	ˆ$�Zó%ô0K�Jõ KrB   