§
    §eîi2  ã                  ó"  — d dl mZ d dlZd dlZd dlmZmZmZmZ d dl	m
Z
 d dlmZmZ d dlZddlmZmZmZ ddlmZ d	Zd
ZdZdddœZ G d„ de¦  «        Z G d„ de¦  «        Z	 d.d/d„Z	 d0dddddddœd1d'„Z	 d2ddd)œd3d+„Z G d,„ d-¦  «        ZdS )4é    )ÚannotationsN)ÚAnyÚCallableÚ	TypedDictÚcast)ÚPath)ÚLiteralÚNotRequiredé   )Ú
OAuthErrorÚOpenAIErrorÚSubjectTokenProviderError)Ú	to_threadz/urn:ietf:params:oauth:grant-type:token-exchangez#https://auth.openai.com/oauth/tokeni°  z$urn:ietf:params:oauth:token-type:jwtz)urn:ietf:params:oauth:token-type:id_token)ÚjwtÚidc                  ó$   — e Zd ZU ded<   ded<   dS )ÚSubjectTokenProviderzLiteral['jwt', 'id']Ú
token_typezCallable[[], str]Ú	get_tokenN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    úY/home/div/.hermes/hermes-agent/venv/lib/python3.11/site-packages/openai/auth/_workload.pyr   r      s*   € € € € € € Ø$Ð$Ð$Ñ$Ø Ð Ð Ñ Ð Ð r   r   c                  óN   — e Zd ZU dZded<   	 ded<   	 ded<   	 ded<   	 ded	<   d
S )ÚWorkloadIdentityz+A unique string that identifies the client.ÚstrÚ	client_idÚidentity_provider_idÚservice_account_idr   ÚproviderzNotRequired[float]Úrefresh_buffer_secondsN)r   r   r   Ú__doc__r   r   r   r   r   r      s]   € € € € € € Ø5Ð5à€N€N�Nà2ØÐÐÑàGØÐÐÑàEØ"Ð"Ð"Ñ"àØ.Ð.Ð.Ñ.Ð.Ð.r   r   ú3/var/run/secrets/kubernetes.io/serviceaccount/tokenÚtoken_file_pathú
str | PathÚreturnc                ó   ‡ — dˆ fd„}d|dœS )aK  
    Get a subject token provider for Kubernetes clusters with Workload Identity configured.

    Cloud providers typically mount the subject token as a file in the container.

    Args:
        token_file_path: path to the mounted service account token file. Defaults to `/var/run/secrets/kubernetes.io/serviceaccount/token`.
    r)   r   c                 ó$  •— 	 t          ‰d¦  «        5 } |                      ¦   «                              ¦   «         }|st          d‰› d�¦  «        ‚|cd d d ¦  «         S # 1 swxY w Y   d S # t          $ r}t          d‰› d|› �¦  «        |‚d }~ww xY w)NÚrzThe token file at z
 is empty.z!Failed to read the token file at z: )ÚopenÚreadÚstripr   Ú	Exception)ÚfÚtokenÚer'   s      €r   r   z5k8s_service_account_token_provider.<locals>.get_token;   s   ø€ ð	oÝ�o sÑ+Ô+ð ¨qØŸš™œŸšÑ(Ô(�Øð fÝ3Ð4dÈÐ4dÐ4dÐ4dÑeÔeÐeØð	ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð øõ
 ð 	oð 	oð 	oÝ+Ð,fÐP_Ð,fÐ,fÐcdÐ,fÐ,fÑgÔgÐmnÐnøøøøð	oøøøs:   ƒA* “=AÁA* ÁA!Á!A* Á$A!Á%A* Á*
BÁ4B
Â
Br   ©r   r   ©r)   r   r   )r'   r   s   ` r   Ú"k8s_service_account_token_providerr6   /   s7   ø€ ðoð oð oð oð oð oð  ¨iÐ8Ð8Ð8r   úhttps://management.azure.com/z
2018-02-01ç      $@)Ú	object_idr    Ú
msi_res_idÚapi_versionÚtimeoutÚhttp_clientÚresourcer   r9   ú
str | Noner    r:   r;   r<   Úfloatr=   úhttpx.Client | Nonec               ó2   ‡ ‡‡‡‡‡‡— dˆˆˆˆˆˆ ˆfd„}d|dœS )aŽ  
    Get a subject token provider for Azure Managed Identities.

    See: https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http

    Args:
        resource: the resource URI to request a token for. Defaults to `https://management.azure.com/` (Azure Resource Manager).
        object_id: the object ID of the managed identity to use, when multiple are assigned.
        client_id: the client ID of the managed identity to use, when multiple are assigned.
        msi_res_id: the ARM resource ID of the managed identity to use, when multiple are assigned.
        api_version: the Azure IMDS API version. Defaults to `2018-02-01`.
        timeout: the request timeout in seconds. Defaults to 10.0.
        http_client: optional httpx.Client instance to use for requests. If not provided, a new client will be created for each request.
    r)   r   c                 ó2  •— 	 d} ‰‰dœ}‰�‰|d<   ‰�‰|d<   ‰
�‰
|d<   ‰	�‰	                      | |ddi‰¬¦  «        }nFt          j        ¦   «         5 }|                      | |ddi‰¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |j        rt	          d	|j        › �|¬
¦  «        ‚|                     ¦   «         }|                      d¦  «        }|st	          d|¬
¦  «        ‚t          t          |¦  «        S # t          $ r}t	          d|› �¦  «        |‚d }~ww xY w)Nz5http://169.254.169.254/metadata/identity/oauth2/token)zapi-versionr>   r9   r    r:   ÚMetadataÚtrue©ÚparamsÚheadersr<   z4Failed to fetch Azure subject token from IMDS: HTTP ©ÚresponseÚaccess_tokenz3Azure IMDS response did not include an access_tokenz/Failed to fetch Azure subject token from IMDS: )
ÚgetÚhttpxÚClientÚis_errorr   Ústatus_codeÚjsonr   r   r0   )ÚurlrG   rJ   ÚclientÚdatar2   r3   r;   r    r=   r:   r9   r>   r<   s          €€€€€€€r   r   z8azure_managed_identity_token_provider.<locals>.get_tokena   sË  ø€ ð	jØIˆCØ5@ÈhÐ%WÐ%WˆFØÐ$Ø&/��{Ñ#ØÐ$Ø&/��{Ñ#ØÐ%Ø'1��|Ñ$àÐ&Ø&Ÿ?š?¨3°vÈ
ÐTZÐG[Ðel˜?ÑmÔm��å”\‘^”^ð m vØ%Ÿzšz¨#°fÀzÐSYÐFZÐdk˜zÑlÔl�Hðmð mð mñ mô mð mð mð mð mð mð møøøð mð mð mð mð Ô ð Ý/ØaÈ8ÔK_ÐaÐaØ%ðñ ô ð ð —=’=‘?”?ˆDØ—H’H˜^Ñ,Ô,ˆEØð Ý/ØIÐT\ðñ ô ð õ �˜UÑ#Ô#Ð#øÝð 	jð 	jð 	jÝ+Ð,aÐ^_Ð,aÐ,aÑbÔbÐhiÐiøøøøð	jøøøs=   ƒAC4 ÁA8Á,C4 Á8A<Á<C4 Á?A<Â A3C4 Ã4
DÃ>DÄDr   r4   r5   r   )r>   r9   r    r:   r;   r<   r=   r   s   ``````` r   Ú%azure_managed_identity_token_providerrU   H   sb   øøøøøøø€ ð2jð jð jð jð jð jð jð jð jð jð jð jð@  ¨iÐ8Ð8Ð8r   úhttps://api.openai.com/v1)r<   r=   Úaudiencec               ó"   ‡ ‡‡— dˆ ˆˆfd„}d|dœS )a5  
    Get a subject token provider for GCP VM instances using the instance metadata server.

    See: https://cloud.google.com/compute/docs/instances/verifying-instance-identity

    Args:
        audience: the unique URI agreed upon by both the instance and the system verifying
            the instance's identity. Defaults to `https://api.openai.com/v1`.
        timeout: the request timeout in seconds. Defaults to 10.0.
        http_client: optional httpx.Client instance to use for requests. If not provided, a new client will be created for each request.
    r)   r   c                 óÀ  •— 	 d} d‰i}‰�‰                      | |ddi‰¬¦  «        }nFt          j        ¦   «         5 }|                      | |ddi‰¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |j        rt	          d|j        › �|¬¦  «        ‚|j                             ¦   «         }|st	          d|¬¦  «        ‚|S # t          $ r}t	          d	|› �¦  «        |‚d }~ww xY w)
Nz]http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identityrW   zMetadata-FlavorÚGooglerF   z=Failed to fetch GCP subject token from metadata server: HTTP rI   z+GCP metadata server returned an empty tokenz8Failed to fetch GCP subject token from metadata server: )	rL   rM   rN   rO   r   rP   Útextr/   r0   )	rR   rG   rJ   rS   r2   r3   rW   r=   r<   s	         €€€r   r   z(gcp_id_token_provider.<locals>.get_token–   s|  ø€ ð	sØqˆCØ  (Ð+ˆFàÐ&Ø&Ÿ?š?¨3°vÐHYÐ[cÐGdÐnu˜?ÑvÔv��å”\‘^”^ð v vØ%Ÿzšz¨#°fÐGXÐZbÐFcÐmt˜zÑuÔu�Hðvð vð vñ vô vð vð vð vð vð vð vøøøð vð vð vð vð Ô ð Ý/ØjÐT\ÔThÐjÐjØ%ðñ ô ð ð ”M×'Ò'Ñ)Ô)ˆEØð rÝ/Ð0]ÐhpÐqÑqÔqÐqØˆLøÝð 	sð 	sð 	sÝ+Ð,jÐghÐ,jÐ,jÑkÔkÐqrÐrøøøøð	søøøs;   ƒ7B; ºA"ÁB; Á"A&Á&B; Á)A&Á*AB; Â;
CÃCÃCr   r4   r5   r   )rW   r<   r=   r   s   ``` r   Úgcp_id_token_providerr\   „   sE   øøø€ ð$sð sð sð sð sð sð sð sð. ¨YÐ7Ð7Ð7r   c                  ót   — e Zd Zedœdd„Zdd„Zdd	„Zdd„Zdd„Zdd„Z	dd„Z
dd„Zd d„Zd d„Zd d„Zd!d„ZdS )"ÚWorkloadIdentityAuth)Útoken_exchange_urlÚworkload_identityr   r_   r   c               óÆ   — || _         || _        d | _        d | _        d | _        d| _        t          j        ¦   «         | _        t          j	        | j        ¦  «        | _
        d S ©NF)r`   r_   Ú_cached_tokenÚ"_cached_token_expires_at_monotonicÚ"_cached_token_refresh_at_monotonicÚ_refreshingÚ	threadingÚLockÚ_lockÚ	ConditionÚ
_condition)Úselfr`   r_   s      r   Ú__init__zWorkloadIdentityAuth.__init__±   s[   € ð "3ˆÔØ"4ˆÔà)-ˆÔØ@DˆÔ/Ø@DˆÔ/Ø!&ˆÔÝ”^Ñ%Ô%ˆŒ
Ý#Ô-¨d¬jÑ9Ô9ˆŒˆˆr   r)   c                óè  — | j         5  | j        rH|                      ¦   «         r4| j                             ¦   «          | j        r|                      ¦   «         °4|                      ¦   «         s:|                      ¦   «         s&t          t          | j        ¦  «        cd d d ¦  «         S | j        rr| j        r | j                             ¦   «          | j        ° | j        }|                      ¦   «         rt          d¦  «        ‚t          t          |¦  «        cd d d ¦  «         S d| _        d d d ¦  «         n# 1 swxY w Y   	 |  
                    ¦   «          | j         5  |                      ¦   «         rt          d¦  «        ‚t          t          | j        ¦  «        cd d d ¦  «         | j         5  d| _        | j                             ¦   «          d d d ¦  «         S # 1 swxY w Y   S # 1 swxY w Y   	 | j         5  d| _        | j                             ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S # | j         5  d| _        | j                             ¦   «          d d d ¦  «         w # 1 swxY w Y   w xY w)Nz)Token is unusable after refresh completedTF)ri   rf   Ú_token_unusablerk   ÚwaitÚ_needs_refreshr   r   rc   ÚRuntimeErrorÚ_perform_refreshÚ
notify_all)rl   r2   s     r   r   zWorkloadIdentityAuth.get_tokenÁ   sî  € ØŒZð 	$ð 	$ØÔ"ð ' t×';Ò';Ñ'=Ô'=ð 'Ø”×$Ò$Ñ&Ô&Ð&ð Ô"ð ' t×';Ò';Ñ'=Ô'=ð 'ð ×'Ò'Ñ)Ô)ð 5°$×2EÒ2EÑ2GÔ2Gð 5Ý�C Ô!3Ñ4Ô4ð	$ð 	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð Ôð (ØÔ&ð +Ø”O×(Ò(Ñ*Ô*Ð*ð Ô&ð +àÔ*�Ø×'Ò'Ñ)Ô)ð TÝ&Ð'RÑSÔSÐSÝ�C Ñ'Ô'ð	$ð 	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð  $ˆDÔð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð"		-Ø×!Ò!Ñ#Ô#Ð#Ø”ð 5ð 5Ø×'Ò'Ñ)Ô)ð TÝ&Ð'RÑSÔSÐSÝ�C Ô!3Ñ4Ô4ð5ð 5ð 5ð 5ñ 5ô 5ð 5ð
 ”ð -ð -Ø#(�Ô Ø”×*Ò*Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ð 5ð
 ”ð -ð -Ø#(�Ô Ø”×*Ò*Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -ø�”ð -ð -Ø#(�Ô Ø”×*Ò*Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -øøøs—   ˆBD2Â&A,D2ÄD2Ä2D6Ä9D6Ä>H0 Å=G"ÆH0 Æ)!GÇG	ÇG	Ç"G&Ç&H0 Ç)G&Ç*H0 Ç5!H#È#H'È*H'È0I1È8!I%ÉI1É%I)É)I1É,I)É-I1c              ƒ  ó:   K  — t          | j        ¦  «        ƒ d {V —†S ©N)r   r   ©rl   s    r   Úget_token_asyncz$WorkloadIdentityAuth.get_token_asyncÞ   s(   è è € Ý˜tœ~Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.r   ÚNonec                óp   — | j         5  d | _        d | _        d | _        d d d ¦  «         d S # 1 swxY w Y   d S rv   )ri   rc   rd   re   rw   s    r   Úinvalidate_tokenz%WorkloadIdentityAuth.invalidate_tokená   s†   € ØŒZð 	;ð 	;Ø!%ˆDÔØ6:ˆDÔ3Ø6:ˆDÔ3ð	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð 	;ð 	;s   ˆ+«/²/c                ó  — |                       ¦   «         }t          j        ¦   «         }|d         }| j        5  |d         | _        ||z   | _        ||                      |¦  «        z   | _        d d d ¦  «         d S # 1 swxY w Y   d S )NÚ
expires_inrK   )Ú_fetch_token_from_exchangeÚtimeÚ	monotonicri   rc   rd   Ú_refresh_delay_secondsre   )rl   Ú
token_dataÚnowr}   s       r   rs   z%WorkloadIdentityAuth._perform_refreshç   sà   € Ø×4Ò4Ñ6Ô6ˆ
ÝŒnÑÔˆØ Ô-ˆ
àŒZð 	dð 	dØ!+¨NÔ!;ˆDÔØ69¸JÑ6FˆDÔ3Ø69¸D×<WÒ<WÐXbÑ<cÔ<cÑ6cˆDÔ3ð	dð 	dð 	dñ 	dô 	dð 	dð 	dð 	dð 	dð 	dð 	dð 	døøøð 	dð 	dð 	dð 	dð 	dð 	ds   ·5A9Á9A=Â A=údict[str, Any]c                ó  — |                       ¦   «         }| j        d         d         }t                               |¦  «        }|€?t	          d|›dd                     t                               ¦   «         ¦  «        › �¦  «        ‚t          j        ¦   «         5 }| 	                    | j
        t          | j        d         ||| j        d         | j        d         d	œd
¬¦  «        }|                      |¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )Nr#   r   zUnsupported token type: z. Supported types: z, r    r!   r"   )Ú
grant_typer    Úsubject_tokenÚsubject_token_typer!   r"   r8   )rQ   r<   )Ú_get_subject_tokenr`   ÚSUBJECT_TOKEN_TYPESrL   r   ÚjoinÚkeysrM   rN   Úpostr_   ÚTOKEN_EXCHANGE_GRANT_TYPEÚ_handle_token_response)rl   r‡   r   rˆ   rS   rJ   s         r   r~   z/WorkloadIdentityAuth._fetch_token_from_exchangeñ   sX  € Ø×/Ò/Ñ1Ô1ˆàÔ+¨JÔ7¸ÔEˆ
Ý0×4Ò4°ZÑ@Ô@ÐØÐ%ÝØs¨:ÐsÐsÈDÏIÊIÕVi×VnÒVnÑVpÔVpÑLqÔLqÐsÐsñô ð õ Œ\‰^Œ^ð 	9˜vØ—{’{ØÔ'å";Ø!%Ô!7¸Ô!DØ%2Ø*<Ø,0Ô,BÐCYÔ,ZØ*.Ô*@ÐAUÔ*Vðð ð ð #ñ ô ˆHð ×.Ò.¨xÑ8Ô8ð	9ð 	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9s   ÂADÄDÄ	DrJ   úhttpx.Responsec                ó  — 	 |j         r|                     ¦   «         nd }n# t          $ r d }Y nw xY w|j        dv rt	          ||¬¦  «        ‚|j        rž|€t          d¦  «        ‚|                     d¦  «        }|                     d¦  «        }t          |t          ¦  «        r|st          d¦  «        ‚t          |t          t          f¦  «        st          d¦  «        ‚|t          |¦  «        dœS t          d	|j        › �¦  «        ‚)
N)i�  i‘  i“  )rJ   Úbodyz4Token exchange succeeded but response body was emptyrK   r}   z<Token exchange response did not include a valid access_tokenz:Token exchange response did not include a valid expires_in)rK   r}   z"Token exchange failed with status )ÚcontentrQ   Ú
ValueErrorrP   r   Ú
is_successr   rL   Ú
isinstancer   Úintr@   )rl   rJ   r’   rK   r}   s        r   r�   z+WorkloadIdentityAuth._handle_token_response
  s1  € ð	Ø&.Ô&6Ð@�8—=’=‘?”?�?¸DˆDˆDøÝð 	ð 	ð 	ØˆDˆDˆDð	øøøð Ô ?Ð2Ð2Ý h°TÐ:Ñ:Ô:Ð:àÔð 		SØˆ|Ý!Ð"XÑYÔYÐYØŸ8š8 NÑ3Ô3ˆLØŸš ,Ñ/Ô/ˆJÝ˜l­CÑ0Ô0ð b¸ð bÝ!Ð"`ÑaÔaÐaÝ˜j­3µ¨,Ñ7Ô7ð `Ý!Ð"^Ñ_Ô_Ð_Ø$0ÅÀjÑ@QÔ@QÐRÐRÐRåØG°Ô1EÐGÐGñ
ô 
ð 	
s   ‚   /®/c                ób   — | j         d         } |d         ¦   «         }|st          d¦  «        ‚|S )Nr#   r   z>The workload identity provider returned an empty subject token)r`   r   )rl   r#   r‡   s      r   r‰   z'WorkloadIdentityAuth._get_subject_token"  s?   € ØÔ)¨*Ô5ˆØ-˜ Ô-Ñ/Ô/ˆØð 	`ÝÐ^Ñ_Ô_Ð_ØÐr   Úboolc                ó<   — | j         d u p|                      ¦   «         S rv   )rc   Ú_token_expiredrw   s    r   ro   z$WorkloadIdentityAuth._token_unusable)  s!   € ØÔ! TÐ)ÐB¨T×-@Ò-@Ñ-BÔ-BÐBr   c                óL   — | j         €dS t          j        ¦   «         | j         k    S )NT)rd   r   r€   rw   s    r   r›   z#WorkloadIdentityAuth._token_expired,  s&   € ØÔ2Ð:Ø�4ÝŒ~ÑÔ 4Ô#JÒJÐJr   c                óL   — | j         €dS t          j        ¦   «         | j         k    S rb   )re   r   r€   rw   s    r   rq   z#WorkloadIdentityAuth._needs_refresh1  s&   € ØÔ2Ð:Ø�5ÝŒ~ÑÔ 4Ô#JÒJÐJr   r}   r@   c                óŽ   — | j                              dt          ¦  «        }t          ||dz  ¦  «        }t	          ||z
  d¦  «        S )Nr$   r   g        )r`   rL   ÚDEFAULT_REFRESH_BUFFER_SECONDSÚminÚmax)rl   r}   Úconfigured_bufferÚeffective_buffers       r   r�   z+WorkloadIdentityAuth._refresh_delay_seconds6  sH   € Ø Ô2×6Ò6Ð7OÕQoÑpÔpÐÝÐ0°*¸q±.ÑAÔAÐÝ�:Ð 0Ñ0°#Ñ6Ô6Ð6r   N)r`   r   r_   r   r5   )r)   ry   )r)   r„   )rJ   r�   r)   r„   )r)   r™   )r}   r@   r)   r@   )r   r   r   ÚDEFAULT_TOKEN_EXCHANGE_URLrm   r   rx   r{   rs   r~   r�   r‰   ro   r›   rq   r�   r   r   r   r^   r^   °   s#  € € € € € ð
 #=ð	:ð :ð :ð :ð :ð :ð -ð -ð -ð -ð:/ð /ð /ð /ð;ð ;ð ;ð ;ðdð dð dð dð9ð 9ð 9ð 9ð2
ð 
ð 
ð 
ð0ð ð ð ðCð Cð Cð CðKð Kð Kð Kð
Kð Kð Kð Kð
7ð 7ð 7ð 7ð 7ð 7r   r^   )r&   )r'   r(   r)   r   )r7   )r>   r   r9   r?   r    r?   r:   r?   r;   r   r<   r@   r=   rA   r)   r   )rV   )rW   r   r<   r@   r=   rA   r)   r   )Ú
__future__r   r   rg   Útypingr   r   r   r   Úpathlibr   Útyping_extensionsr	   r
   rM   Ú_exceptionsr   r   r   Ú_utils._syncr   rŽ   r¤   rŸ   rŠ   r   r   r6   rU   r\   r^   r   r   r   ú<module>r«      s÷  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2à €€€à LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LØ $Ð $Ð $Ð $Ð $Ð $àMÐ ØBÐ Ø!%Ð ð 2Ø
5ðð Ð ð!ð !ð !ð !ð !˜9ñ !ô !ð !ð
/ð /ð /ð /ð /�yñ /ô /ð /ð& #Xð9ð 9ð 9ð 9ð 9ð4 4ð99ð !Ø Ø!Ø#ØØ'+ð99ð 99ð 99ð 99ð 99ð 99ðz 0ð)8ð Ø'+ð	)8ð )8ð )8ð )8ð )8ð )8ðXI7ð I7ð I7ð I7ð I7ñ I7ô I7ð I7ð I7ð I7r   