§
    šŠtj–+  ã                  ó  — d Z ddlmZ ddlZddlZddl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ZddlmZmZ ddlmZmZmZmZ ddlmZ  ej        e¦  «        Z ej        dd	¦  «        Zerdd
lmZ  G d„ de¦  «        Z 	 ddd„Z!dd„Z"dS )z#Wrapper around a Power BI endpoint.é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚDictÚIterableÚListÚOptionalÚUnion)ÚClientTimeoutÚServerTimeoutError)Ú	BaseModelÚ
ConfigDictÚFieldÚmodel_validator)ÚTimeoutÚPOWERBI_BASE_URLz"https://api.powerbi.com/v1.0/myorg)ÚTokenCredentialc                  ó¾  — e Zd ZU dZded<   ded<   dZded<   dZd	ed
<   dZded<   dZded<    e	ddd¬¦  «        Z
ded<    e	e¬¦  «        Zded<   dZded<    ed¬¦  «        Z ed¬¦  «        ed8d „¦   «         ¦   «         Zed9d!„¦   «         Zed:d"„¦   «         Zd;d$„Zd9d%„Zed9d&„¦   «         Z	 d<d=d)„Zd>d+„Zd?d,„Z	 d<d@d-„Z	 d<d@d.„ZdAd1„ZdAd2„ZdBd5„Z dCd6„Z!dCd7„Z"dS )DÚPowerBIDatasetaO  Create PowerBI engine from dataset ID and credential or token.

    Use either the credential or a supplied token to authenticate.
    If both are supplied the credential is used to generate a token.
    The impersonated_user_name is the UPN of a user to be impersonated.
    If the model is not RLS enabled, this will be ignored.
    ÚstrÚ
dataset_idú	List[str]Útable_namesNúOptional[str]Úgroup_idzOptional[TokenCredential]Ú
credentialÚtokenÚimpersonated_user_nameé   r   é
   )ÚdefaultÚgtÚleÚintÚsample_rows_in_table_info)Údefault_factoryúDict[str, str]ÚschemaszOptional[aiohttp.ClientSession]Ú
aiosessionT)Úarbitrary_types_allowedÚbefore)ÚmodeÚvaluesúDict[str, Any]Úreturnr   c                ó~   — |                      dg ¦  «        }d„ |D ¦   «         |d<   d|v sd|v r|S t          d¦  «        ‚)z?Validate that at least one of token and credentials is present.r   c                ó,   — g | ]}t          |¦  «        ‘ŒS © ©Úfix_table_name©Ú.0Útables     úc/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/utilities/powerbi.pyú
<listcomp>z2PowerBIDataset.validate_params.<locals>.<listcomp>9   s    € Ð PÐ PÐ P¸5¥°Ñ!6Ô!6Ð PÐ PÐ Pó    r   r   z.Please provide either a credential or a token.)ÚgetÚ
ValueError)Úclsr-   r   s      r8   Úvalidate_paramszPowerBIDataset.validate_params4   sX   € ð —j’j °Ñ3Ô3ˆØ PÐ PÀKÐ PÑ PÔ Pˆˆ}ÑØ�fÐÐ °Ð 6Ð 6ØˆMÝÐIÑJÔJÐJr:   c                óh   — | j         rt          › d| j         › d| j        › d�S t          › d| j        › d�S )zGet the request url.z/groups/z
/datasets/z/executeQueries)r   ÚBASE_URLr   ©Úselfs    r8   Úrequest_urlzPowerBIDataset.request_url>   sK   € ð Œ=ð 	bÝÐaÐa¨¬ÐaÐaÀÄÐaÐaÐaÐaÝÐFÐF d¤oÐFÐFÐFÐFr:   c                óæ   — | j         rdd| j         z   dœS ddlm} | j        rF	 | j                             d¦  «        j         }dd|z   dœS # t
          $ r} |d¦  «        |‚d}~ww xY w |d	¦  «        ‚)
zGet the token.zapplication/jsonzBearer )zContent-TypeÚAuthorizationr   )ÚClientAuthenticationErrorz1https://analysis.windows.net/powerbi/api/.defaultz4Could not get a token from the supplied credentials.Nz No credential or token supplied.)r   Úazure.core.exceptionsrF   r   Ú	get_tokenÚ	Exception)rB   rF   r   Úexcs       r8   ÚheaderszPowerBIDataset.headersE   så   € ð Œ:ð 	à 2Ø!*¨T¬ZÑ!7ðð ð ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð Œ?ð 	ðØœ×1Ò1ØGñô äð ð %7Ø%.°Ñ%6ðð ð øõ ð ð ð Ø/Ð/ØJñô àðøøøøðøøøð (Ð'Ð(JÑKÔKÐKs   £&A
 Á

A%ÁA Á A%úIterable[str]c                ó   — | j         S )zGet names of tables available.©r   rA   s    r8   Úget_table_nameszPowerBIDataset.get_table_names`   s   € àÔÐr:   c                ó€   — | j         r6d                     d„ | j                              ¦   «         D ¦   «         ¦  «        S dS )zGet the available schema's.ú, c                ó"   — g | ]\  }}|› d |› �‘ŒS )z: r2   )r6   ÚkeyÚvalues      r8   r9   z.PowerBIDataset.get_schemas.<locals>.<listcomp>g   s*   € ÐWÐWÐW±J°C¸ Ð/Ð/¨Ð/Ð/ÐWÐWÐWr:   z9No known schema's yet. Use the schema_powerbi tool first.)r(   ÚjoinÚitemsrA   s    r8   Úget_schemaszPowerBIDataset.get_schemasd   sB   € àŒ<ð 	YØ—9’9ÐWÐWÀ$Ä,×BTÒBTÑBVÔBVÐWÑWÔWÑXÔXÐXØJÐJr:   c                ó*   — |                       ¦   «         S )z-Information about all tables in the database.)Úget_table_inforA   s    r8   Ú
table_infozPowerBIDataset.table_infoj   s   € ð ×"Ò"Ñ$Ô$Ð$r:   úOptional[Union[List[str], str]]úOptional[List[str]]c                óÞ  ‡ ‡— |�ãt          |t          ¦  «        r}t          |¦  «        dk    rj|d         dk    r^d„ |D ¦   «         }ˆ fd„|D ¦   «         Š‰r.t                               dd                     ‰¦  «        ¦  «         ˆfd„|D ¦   «         }|r|ndS t          |t          ¦  «        r<|dk    r6|‰ j        vrt                               d	|¦  «         dS t          |¦  «        gS ‰ j        S )
zHGet the tables names that need to be queried, after checking they exist.Nr   Ú c                ó,   — g | ]}t          |¦  «        ‘ŒS r2   r3   r5   s     r8   r9   z7PowerBIDataset._get_tables_to_query.<locals>.<listcomp>y   s    € ÐOÐOÐO¸%¥¨uÑ 5Ô 5ÐOÐOÐOr:   c                ó&   •— g | ]}|‰j         v¯|‘ŒS r2   rN   ©r6   r7   rB   s     €r8   r9   z7PowerBIDataset._get_tables_to_query.<locals>.<listcomp>z   s-   ø€ ð 'ð 'ð 'Ø#°uÀDÔDTÐ7TÐ7T�EÐ7TÐ7TÐ7Tr:   z!Table(s) %s not found in dataset.rQ   c                ó   •— g | ]}|‰v¯|‘Œ	S r2   r2   )r6   r7   Únon_existing_tabless     €r8   r9   z7PowerBIDataset._get_tables_to_query.<locals>.<listcomp>‚   s+   ø€ ð ð ð Ø#°uÐDWÐ7WÐ7W�EÐ7WÐ7WÐ7Wr:   zTable %s not found in dataset.)	Ú
isinstanceÚlistÚlenÚloggerÚwarningrU   r   r   r4   )rB   r   Úfixed_tablesÚtablesrc   s   `   @r8   Ú_get_tables_to_queryz#PowerBIDataset._get_tables_to_queryo   sF  øø€ ð Ð"å˜;­Ñ-Ô-ð2å˜Ñ$Ô$ qÒ(Ð(Ø ”N bÒ(Ð(àOÐOÀ;ÐOÑOÔO�ð'ð 'ð 'ð 'Ø'3ð'ñ 'ô 'Ð#ð 'ð Ý—N’NØ;ØŸ	š	Ð"5Ñ6Ô6ñô ð ðð ð ð Ø'3ðñ ô �ð "(Ð1�v�v¨TÐ1Ý˜+¥sÑ+Ô+ð 5°¸rÒ0AÐ0AØ dÔ&6Ð6Ð6Ý—N’NÐ#CÀ[ÑQÔQÐQØ˜4Ý& {Ñ3Ô3Ð4Ð4ØÔÐr:   Útables_todoc                ó    ‡ — ˆ fd„|D ¦   «         S )z-Get the tables that still need to be queried.c                ó&   •— g | ]}|‰j         v¯|‘ŒS r2   )r(   ra   s     €r8   r9   z3PowerBIDataset._get_tables_todo.<locals>.<listcomp>�   s%   ø€ ÐLÐLÐL˜%°%¸t¼|Ð2KÐ2K�Ð2KÐ2KÐ2Kr:   r2   )rB   rl   s   ` r8   Ú_get_tables_todozPowerBIDataset._get_tables_todo�   s   ø€ àLÐLÐLÐL ;ÐLÑLÔLÐLr:   c                óx   ‡— ˆfd„| j                              ¦   «         D ¦   «         }d                     |¦  «        S )z=Create a string of the table schemas for the supplied tables.c                ó"   •— g | ]\  }}|‰v ¯	|‘ŒS r2   r2   )r6   r7   Úschemar   s      €r8   r9   z9PowerBIDataset._get_schema_for_tables.<locals>.<listcomp>“   s.   ø€ ð 
ð 
ð 
Ù$�u˜fÀÈÐ@TÐ@TˆFÐ@TÐ@TÐ@Tr:   rQ   )r(   rV   rU   )rB   r   r(   s    ` r8   Ú_get_schema_for_tablesz%PowerBIDataset._get_schema_for_tables‘   sM   ø€ ð
ð 
ð 
ð 
Ø(,¬×(:Ò(:Ñ(<Ô(<ð
ñ 
ô 
ˆð �yŠy˜Ñ!Ô!Ð!r:   c                ó¼   — |                       |¦  «        }|€dS |                      |¦  «        }|D ]}|                      |¦  «         Œ|                      |¦  «        S )ú'Get information about specified tables.NúNo (valid) tables requested.)rk   ro   Ú_get_schemars   )rB   r   Útables_requestedrl   r7   s        r8   rY   zPowerBIDataset.get_table_info˜   ss   € ð  ×4Ò4°[ÑAÔAÐØÐ#Ø1Ð1Ø×+Ò+Ð,<Ñ=Ô=ˆØ ð 	$ð 	$ˆEØ×Ò˜UÑ#Ô#Ð#Ð#Ø×*Ò*Ð+;Ñ<Ô<Ð<r:   c              ƒ  óÎ   ‡ K  — ‰                       |¦  «        }|€dS ‰                      |¦  «        }t          j        ˆ fd„|D ¦   «         Ž ƒ d{V —† ‰                      |¦  «        S )ru   Nrv   c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r2   )Ú_aget_schemara   s     €r8   r9   z2PowerBIDataset.aget_table_info.<locals>.<listcomp>¬   s'   ø€ ÐQÐQÐQ¸E˜t×0Ò0°Ñ7Ô7ÐQÐQÐQr:   )rk   ro   ÚasyncioÚgatherrs   )rB   r   rx   rl   s   `   r8   Úaget_table_infozPowerBIDataset.aget_table_info¤   s†   øè è € ð  ×4Ò4°[ÑAÔAÐØÐ#Ø1Ð1Ø×+Ò+Ð,<Ñ=Ô=ˆÝŒnÐQÐQÐQÐQÀ[ÐQÑQÔQÐRÐRÐRÐRÐRÐRÐRÐRØ×*Ò*Ð+;Ñ<Ô<Ð<r:   r7   ÚNonec                ó’  — 	 |                       d| j        › d|› d�¦  «        }t          |d         d         d         d         d         ¦  «        | j        |<   dS # t          $ r) t
                               d|¦  «         d	| j        |<   Y dS t          $ r1}t
                               d
||¦  «         d	| j        |<   Y d}~dS d}~ww xY w)úGet the schema for a table.úEVALUATE TOPN(rQ   ú)Úresultsr   rj   Úrowsú'Timeout while getting table info for %sÚunknownú)Error while getting table info for %s: %sN)Úrunr%   Ú
json_to_mdr(   r   rg   rh   rI   ©rB   r7   ÚresultrJ   s       r8   rw   zPowerBIDataset._get_schema¯   sø   € ð
	,Ø—X’XØK Ô!?ÐKÐKÀ5ÐKÐKÐKñô ˆFõ #-¨V°IÔ->¸qÔ-AÀ(Ô-KÈAÔ-NÈvÔ-VÑ"WÔ"WˆDŒL˜ÑÐÐøÝð 	,ð 	,ð 	,Ý�NŠNÐDÀeÑLÔLÐLØ"+ˆDŒL˜ÑÐÐÐÝð 	,ð 	,ð 	,Ý�NŠNÐFÈÈsÑSÔSÐSØ"+ˆDŒL˜ÑÐÐÐÐÐÐøøøøð	,øøøs   ‚AA Á/CÂ	CÂ&CÃCc              ƒ  ó¢  K  — 	 |                       d| j        › d|› d�¦  «        ƒ d{V —†}t          |d         d         d         d         d         ¦  «        | j        |<   dS # t          $ r) t
                               d	|¦  «         d
| j        |<   Y dS t          $ r1}t
                               d||¦  «         d
| j        |<   Y d}~dS d}~ww xY w)r�   r‚   rQ   rƒ   Nr„   r   rj   r…   r†   r‡   rˆ   )Úarunr%   rŠ   r(   r   rg   rh   rI   r‹   s       r8   r{   zPowerBIDataset._aget_schema½   s  è è € ð
	,ØŸ9š9ØK Ô!?ÐKÐKÀ5ÐKÐKÐKñô ð ð ð ð ð ð ˆFõ #-¨V°IÔ->¸qÔ-AÀ(Ô-KÈAÔ-NÈvÔ-VÑ"WÔ"WˆDŒL˜ÑÐÐøÝ!ð 	,ð 	,ð 	,Ý�NŠNÐDÀeÑLÔLÐLØ"+ˆDŒL˜ÑÐÐÐÝð 	,ð 	,ð 	,Ý�NŠNÐFÈÈsÑSÔSÐSØ"+ˆDŒL˜ÑÐÐÐÐÐÐøøøøð	,øøøs   „AA" Á"/CÂ	CÂ&C	Ã	CÚcommandúdict[str, Any]c                ó$   — d|› ig| j         ddidœS )z(Create the json content for the request.ÚqueryÚincludeNullsT)ÚqueriesÚimpersonatedUserNameÚserializerSettings)r   )rB   r�   s     r8   Ú_create_json_contentz#PowerBIDataset._create_json_contentË   s.   € ð ! g -Ð0Ð1Ø$(Ô$?Ø#1°4Ð"8ð
ð 
ð 	
r:   c                óæ   — t                                d|¦  «         t          j        | j        |                      |¦  «        | j        d¬¦  «        }|j        dk    r	 dS |                     ¦   «         S )zAExecute a DAX command and return a json representing the results.úRunning command: %sr    )ÚjsonrK   Útimeouté“  úFTokenError: Could not login to PowerBI, please check your credentials.)	rg   ÚdebugÚrequestsÚpostrC   r—   rK   Ústatus_coderš   )rB   r�   Úresponses      r8   r‰   zPowerBIDataset.runÓ   sy   € å�ŠÐ*¨GÑ4Ô4Ð4Ý”=ØÔØ×*Ò*¨7Ñ3Ô3Ø”LØð	
ñ 
ô 
ˆð Ô 3Ò&Ð&àXðð ð �}Š}‰ŒÐr:   c           	   ƒ  óà  K  — t                                d|¦  «         | j        r¶| j                             | j        | j        |                      |¦  «        t          d¬¦  «        ¬¦  «        4 ƒd{V —†	 }|j        dk    r	 ddd¦  «        ƒd{V —† dS | 	                    |j
        ¬¦  «        ƒ d{V —†}|cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   t          j        ¦   «         4 ƒd{V —†}|                     | j        | j        |                      |¦  «        t          d¬¦  «        ¬¦  «        4 ƒd{V —†	 }|j        dk    r%	 ddd¦  «        ƒd{V —† ddd¦  «        ƒd{V —† dS | 	                    |j
        ¬¦  «        ƒ d{V —†}|cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   	 ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )	z;Execute a DAX command and return the result asynchronously.r™   r    )Útotal)rK   rš   r›   Nrœ   r�   )Úcontent_type)rg   rž   r)   r    rC   rK   r—   r   Ústatusrš   r¥   ÚaiohttpÚClientSession)rB   r�   r¢   Úresponse_jsonÚsessions        r8   rŽ   zPowerBIDataset.arunâ   su  è è € å�ŠÐ*¨GÑ4Ô4Ð4ØŒ?ð 
	%Ø”×+Ò+ØÔ ØœØ×.Ò.¨wÑ7Ô7Ý%¨BÐ/Ñ/Ô/ð	 ,ñ ô ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð
 Ø”? cÒ)Ð)Øcð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð '/§m¢mÀÔAV mÑ&WÔ&WÐ WÐ WÐ WÐ WÐ WÐ W�Ø$ð	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%õ Ô(Ñ*Ô*ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%¨gØ—|’|ØÔ ØœØ×.Ò.¨wÑ7Ô7Ý%¨BÐ/Ñ/Ô/ð	 $ñ ô ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð
 Ø”? cÒ)Ð)Øcð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð
	%ð 
	%ð 
	%ñ 
	%ô 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð '/§m¢mÀÔAV mÑ&WÔ&WÐ WÐ WÐ WÐ WÐ WÐ W�Ø$ð	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð
	%ð 
	%ð 
	%ð 
	%ñ 
	%ô 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð
	%ð 
	%ð 
	%ñ 
	%ô 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%øøøð 
	%ð 
	%ð 
	%ð 
	%ð 
	%ð 
	%s[   Á5C
Â"C
Ã

CÃCÃ4AGÅ F8ÅGÅ1"F8ÆGÆ8
G	ÇGÇG	ÇGÇ
G'Ç*G')r-   r.   r/   r   )r/   r   )r/   r'   )r/   rL   ©N)r   r[   r/   r\   )rl   r   r/   r   )r   r   r/   r   )r   r[   r/   r   )r7   r   r/   r   )r�   r   r/   r�   )r�   r   r/   r   )#Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r%   Údictr(   r)   r   Úmodel_configr   Úclassmethodr>   ÚpropertyrC   rK   rO   rW   rZ   rk   ro   rs   rY   r~   rw   r{   r—   r‰   rŽ   r2   r:   r8   r   r      s¤  € € € € € € ðð ð €O€O�OØÐÐÑØ"€HÐ"Ð"Ð"Ñ"Ø,0€JÐ0Ð0Ð0Ñ0Ø€EÐÐÐÑØ,0ÐÐ0Ð0Ð0Ñ0Ø%* U°1¸¸rÐ%BÑ%BÔ%BÐÐBÐBÐBÑBØ#˜e°DÐ9Ñ9Ô9€GÐ9Ð9Ð9Ñ9Ø26€JÐ6Ð6Ð6Ñ6à�:Ø $ðñ ô €Lð €_˜(Ð#Ñ#Ô#ØðKð Kð Kñ „[ñ $Ô#ðKð ðGð Gð Gñ „XðGð ðLð Lð Lñ „XðLð4 ð  ð  ð  ðKð Kð Kð Kð ð%ð %ð %ñ „Xð%ð
 >Bð ð  ð  ð  ð  ð<Mð Mð Mð Mð"ð "ð "ð "ð >Bð
=ð 
=ð 
=ð 
=ð 
=ð >Bð	=ð 	=ð 	=ð 	=ð 	=ð,ð ,ð ,ð ,ð,ð ,ð ,ð ,ð
ð 
ð 
ð 
ðð ð ð ð%ð %ð %ð %ð %ð %r:   r   Újson_contentsú'List[Dict[str, Union[str, int, float]]]Ú
table_namer   r/   r   c                ól  — t          | ¦  «        dk    rdS d}| d                              ¦   «         }|D ]P}|                     dd¦  «                             dd¦  «         |r|                     |› d�d¦  «         |d|› d�z  }ŒQ|dz  }| D ]'}|                     ¦   «         D ]}|d|› d�z  }Œ|dz  }Œ(|S )	z*Convert a JSON object to a markdown table.r   r^   ú[ú.ú]z| ú z|
)rf   ÚkeysÚreplacer-   )rµ   r·   Ú	output_mdrK   ÚheaderÚrowrT   s          r8   rŠ   rŠ   ý   sù   € õ
 ˆ=ÑÔ˜QÒÐØˆrØ€IØ˜AÔ×#Ò#Ñ%Ô%€GØð $ð $ˆØ�Š�s˜CÑ Ô ×(Ò(¨¨bÑ1Ô1Ð1Øð 	1Ø�NŠN˜jÐ+Ð+Ð+¨RÑ0Ô0Ð0Ø�^˜&�^�^�^Ñ#ˆ	ˆ	Ø�Ñ€IØð ð ˆØ—Z’Z‘\”\ð 	'ð 	'ˆEØ˜˜e˜˜˜Ñ&ˆIˆIØ�UÑˆ	ˆ	ØÐr:   r7   c                ón   — d| v r0|                       d¦  «        s|                      d¦  «        sd| › d�S | S )z9Add single quotes around table names that contain spaces.r¼   ú')Ú
startswithÚendswith)r7   s    r8   r4   r4     s@   € à
ˆe€|€|˜E×,Ò,¨SÑ1Ô1€|¸%¿.º.ÈÑ:MÔ:M€|Ø�5ˆ|ˆ|ˆ|ÐØ€Lr:   r«   )rµ   r¶   r·   r   r/   r   )r7   r   r/   r   )#r¯   Ú
__future__r   r|   ÚloggingÚosÚtypingr   r   r   r   r   r	   r
   r§   rŸ   r   r   Úpydanticr   r   r   r   Úrequests.exceptionsr   Ú	getLoggerr¬   rg   Úgetenvr@   Úazure.core.credentialsr   r   rŠ   r4   r2   r:   r8   ú<module>rÏ      s˜  ðØ )Ð )à "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Là €€€Ø €€€Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð ð ð ð ð ð ð ð ð ð ð (Ð 'Ð 'Ð 'Ð 'Ð 'à	ˆÔ	˜8Ñ	$Ô	$€àˆ2Œ9Ð'Ð)MÑNÔN€àð 7Ø6Ð6Ð6Ð6Ð6Ð6ð]%ð ]%ð ]%ð ]%ð ]%�Yñ ]%ô ]%ð ]%ðD !%ðð ð ð ð ð,ð ð ð ð ð r:   