o
    ØRWj›’  ã                   @  s  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m	Z	m
Z
mZmZmZ d dlmZmZmZ d dlmZmZ d dlZddlmZ ddlmZmZmZ dd	lmZ dd
lmZm Z  ddl!m"Z" ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z- e
g e.f Z/e
g df Z0ed Z1e2e1ee3 f Z4e 5d¡Z6edd�G dd„ dƒƒZ7edd�G dd„ dƒƒZ8dVdd„Z9dWd"d#„Z:dXd&d'„Z;dYd*d+„Z<dZd2d3„Z=d[d4d5„Z>dd6œd\d>d?„Z?d]dCdD„Z@d^dGdH„ZAd_dJdK„ZBd`dMdN„ZCd`dOdP„ZDG dQdR„ dReƒZEG dSdT„ dTe ƒZFg dU¢ZGdS )aé    )ÚannotationsN)ÚAnyÚLiteralÚMappingÚCallableÚOptionalÚ	AwaitableÚcast)ÚfieldÚreplaceÚ	dataclass)ÚSelfÚoverrideé   )ÚWorkloadIdentity)Ú	NOT_GIVENÚTimeoutÚNotGiven)Úis_given)ÚOpenAIÚAsyncOpenAI)ÚFinalRequestOptions)Ú	_ProviderÚ_configure_provider)ÚOpenAIError)ÚDEFAULT_MAX_RETRIES)ÚAwsCredentialsProviderÚbedrockÚ_BedrockProviderRuntimezstr | Awaitable[str])ÚbearerÚtoken_providerÚawsé    T)Úfrozenc                   @  s8   e Zd ZU ded< ded< ded< edd�Zd	ed
< dS )Ú_LegacyRuntimeSignatureÚ_LegacyAuthModeÚmodeÚstrÚbase_urlú
str | NoneÚregionF©ÚreprÚobjectÚcredential_identityN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r
   r.   © r3   r3   úa/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/openai/lib/bedrock.pyr$      s
   
 r$   c                   @  s¸   e Zd ZU edd�Zded< eddd�Zded< ded< d	ed
< ded< edd�Zded< edd�Zded< edd�Z	ded< eddd�Z
ded< d	ed< edd�Zded< d	ed< dS )Ú_LegacyBedrockStateFr+   r)   Úexplicit_api_key)r,   Úcompareú7BedrockTokenProvider | AsyncBedrockTokenProvider | Noner    Ú
aws_regionÚboolÚregion_was_explicitÚaws_profileÚaws_access_key_idÚaws_secret_access_keyÚaws_session_tokenúAwsCredentialsProvider | NoneÚaws_credentials_providerÚuses_environment_bearerÚenvironment_bearer_tokenÚuses_region_derived_base_urlN)r/   r0   r1   r
   r6   r2   r    r=   r>   r?   rA   rC   r3   r3   r3   r4   r5   &   s   
 r5   ÚstateÚreturnr'   c                 C  s   | j p| jr	| jndpdS )NÚ )r6   rB   rC   )rE   r3   r3   r4   Ú_state_api_key6   s   rH   ÚconstructorúCallable[..., object]Únamer:   c              	   C  sH   zt  | ¡j}W n ttfy   Y dS w ||v p#tdd„ | ¡ D ƒƒS )NFc                 s  s   � | ]
}|j tjju V  qd S ©N)ÚkindÚinspectÚ	ParameterÚVAR_KEYWORD)Ú.0Ú	parameterr3   r3   r4   Ú	<genexpr>@   s   € 
ÿz/_constructor_accepts_keyword.<locals>.<genexpr>)rN   Ú	signatureÚ
parametersÚ	TypeErrorÚ
ValueErrorÚanyÚvalues)rI   rK   rU   r3   r3   r4   Ú_constructor_accepts_keyword:   s   ÿÿrZ   r*   r)   c                 C  s8   | pt j d¡pt j d¡}|d ur| ¡ r| ¡ S d S )NÚ
AWS_REGIONÚAWS_DEFAULT_REGION)ÚosÚenvironÚgetÚstrip)r*   Ú
configuredr3   r3   r4   Ú_configured_regionE   s   rb   r(   ústr | httpx.URL | Nonec                 C  s@   t | tƒr|  ¡ sd } | d urdS tj d¡}|d u p| ¡  S )NFÚAWS_BEDROCK_BASE_URL)Ú
isinstancer'   r`   r]   r^   r_   )r(   Úenvironment_base_urlr3   r3   r4   Ú_uses_region_derived_base_urlJ   s   rg   r<   r=   r>   r?   rA   r@   c                 C  s   t dd„ | ||||fD ƒƒS )Nc                 s  s   � | ]}|d uV  qd S rL   r3   )rQ   Úvaluer3   r3   r4   rS   \   s
   € ÿ
ÿz)_has_explicit_aws_auth.<locals>.<genexpr>)rX   ©r<   r=   r>   r?   rA   r3   r3   r4   Ú_has_explicit_aws_authT   s   ûþrj   c                  C  s   t j d¡} | stdƒ‚| S )NÚAWS_BEARER_TOKEN_BEDROCKzuCould not find credentials for Bedrock. Set `AWS_BEARER_TOKEN_BEDROCK` or configure the default AWS credential chain.)r]   r^   r_   r   )Útokenr3   r3   r4   Ú_environment_bearer_tokenh   s   ÿrm   )r;   Úapi_keyr    r8   r9   r;   úbool | Noneú*tuple[_Provider, _LegacyBedrockState, str]c        
         C  sX  t tt| ƒƒrtdƒ‚| dkrtdƒ‚| d ur|d urtdƒ‚t|||||d�}
| d us0|d ur6|
r6tdƒ‚tj d¡}| d u oJ|d u oJ|
 oJt|ƒ}t	|ƒ}t
|ƒ}t|tƒr_| ¡ s_d }n	|d u rft}n|}t||| d urq| n|ru|nt||||||d�	}t| |||	d u r�t|o�| ¡ ƒn|	|||||||rš|nd |d�}||| pª|r§|ndpªdfS )	NúQPass refreshable Bedrock credentials via `bedrock_token_provider`, not `api_key`.rG   z)The `api_key` argument must not be empty.ú•Bedrock authentication is ambiguous. Configure exactly one explicit mode: bearer credential, static AWS credentials, profile, or credential provider.ri   rk   )	r*   r(   rn   r    Úaccess_key_idÚsecret_access_keyÚsession_tokenÚprofileÚcredential_provider)r6   r    r9   r;   r<   r=   r>   r?   rA   rB   rC   rD   )Úcallabler	   r-   r   rj   r]   r^   r_   r:   rb   rg   re   r'   r`   r   r   r5   )rn   r    r9   r<   r=   r>   r?   rA   r(   r;   Úexplicit_aws_authÚenvironment_tokenrB   Úresolved_regionrD   Úprovider_base_urlÚproviderrE   r3   r3   r4   Ú_legacy_providerr   sn   ÿûÿÿ÷
òr~   Úclientú"BedrockOpenAI | AsyncBedrockOpenAIúFtuple[dict[str, object], _Provider | None, _LegacyBedrockState | None]c       	      
   C  sÜ  t | ƒ | j}
| jpd}|
jd u o|t|
ƒk}t|||||d�}|d up'|d u}|r0|r0tdƒ‚|d ur6|n|r@|d u r@|s@|nd }|d upI|d u}|d upQ|	d u}|sc|sc|sct| ƒ i | j| jfS |rt|}|}d }d }d }d }d }n1|r…d }d }|}|}|}|}|}n |
j	}|
j}|
j
r–|
jp“tƒ }d }|
j}|
j}|
j}|
j}|
j}|d ur«|n| j}|d up´|
j}|d urÂ|d u rÂ|
jsÂd }|	d urÉ|	}n	|
jrÏd}n| j}|||||||||dœ	}t| jjdƒré||d< |d d fS )NrG   ri   rr   ©	rn   Úbedrock_token_providerr9   r<   r=   r>   r?   rA   r(   Ú_region_was_explicit)Ú!_synchronize_legacy_routing_stateÚ_bedrock_statern   r    rH   rj   r   Ú _refresh_legacy_provider_runtimeÚ_bedrock_providerr6   rB   rC   rm   r<   r=   r>   r?   rA   r9   r;   rD   r(   rZ   Ú	__class__Ú__init__)r   rn   r    r9   r<   r=   r>   r?   rA   r(   rE   Úcurrent_api_keyÚapi_key_was_mutatedÚaws_overrideÚexplicit_bearer_overrideÚeffective_api_keyÚbearer_overrideÚrouting_overrideÚnext_api_keyÚnext_token_providerÚnext_profileÚnext_access_key_idÚnext_secret_access_keyÚnext_session_tokenÚnext_credentials_providerÚnext_regionÚnext_region_was_explicitÚnext_base_urlÚprovider_kwargsr3   r3   r4   Ú_copy_configurationÃ   sš   
ûÿÿÿÿû÷
r�   ÚconfigurationÚ_LegacyAuthConfigurationc                 C  sH   |\}}t |tƒrtj| ¡ td� ¡ nt|ƒ}t|t| j	ƒ| j
|d�S )N)Úkey)r&   r(   r*   r.   )re   r'   ÚhashlibÚblake2sÚencodeÚ_LEGACY_SIGNATURE_KEYÚdigestÚidr$   r(   r9   )r   rž   r&   Ú
credentialr.   r3   r3   r4   Ú_legacy_runtime_signature)  s   ÿýür¨   r   c              	   C  s‚   |\}}|dkrt |tƒr|stdƒ‚t| j| j|d�S |dkr,t| j| jtd|ƒd�S | j}t| j| j|j|j	|j
|j|jd�S )Nr   z0The Bedrock bearer credential must not be empty.)r*   r(   rn   r    ÚAsyncBedrockTokenProvider)r*   r(   r    )r*   r(   rv   rs   rt   ru   rw   )re   r'   r   r   r9   r(   r	   r†   r<   r=   r>   r?   rA   )r   rž   r&   r§   rE   r3   r3   r4   Ú_provider_for_legacy_client;  s2   ýýùrª   ÚNonec                 C  sŒ   | j }t| jƒ|jk}| j|jk}|rt| jdd�| _d| _|r@t| j| j| jd ud�| _| jjrB| jd urDd| j› d�| _d S d S d S d S )NF)rD   )r9   r;   zhttps://bedrock-mantle.z.api.aws/openai/v1)	Ú_bedrock_runtime_signaturer'   r(   r9   r*   r   r†   rg   rD   )r   Úprevious_signatureÚbase_url_changedÚregion_changedr3   r3   r4   r…   [  s    ýùr…   c                 C  s–   t | ƒ |  ¡ }t| |ƒ}|| jkrd S t| |ƒ}|| _|| _t|ƒ| _t	| jt
ƒrC| jd u rC| jjd urC| jj| _t| j| jd�| _t| |ƒ| _d S )N©r9   )r…   Ú_legacy_auth_configurationr¨   r¬   rª   rˆ   Ú	_providerr   Ú_provider_runtimere   r   r9   r*   r   r†   )r   rž   rT   r}   r3   r3   r4   r‡   l  s    




ÿ

r‡   c                      ó  e Zd ZU dZded< ded< ded< ded	< d
ed< ded< dddddddddddddeedddddddddœdQ‡ fd4d5„ZdRd7d8„ZdSd9d:„Z	e
dTd<d=„ƒZe
dU‡ fd@dA„ƒZe
dddeddddddddddddededddddi dBœdVdOdP„ƒZeZ‡  ZS )WÚBedrockOpenAIzECompatibility client for Amazon Bedrock's OpenAI-compatible endpoint.r   rˆ   r5   r†   úBedrockTokenProvider | NoneÚ_bedrock_token_providerr:   rg   r$   r¬   r)   r9   NFT©rn   rƒ   r9   r<   r=   r>   r?   rA   ÚorganizationÚprojectÚwebhook_secretr(   Úwebsocket_base_urlÚtimeoutÚmax_retriesÚdefault_headersÚdefault_queryÚhttp_clientÚ_strict_response_validationÚ_enforce_credentialsr²   Ú_stater„   rn   rƒ   r<   r=   r>   r?   rA   r@   r¹   rº   r»   r(   rc   r¼   r½   ú!float | Timeout | None | NotGivenr¾   Úintr¿   úMapping[str, str] | NonerÀ   úMapping[str, object] | NonerÁ   úhttpx.Client | NonerÂ   rÃ   r²   ú_Provider | NonerÄ   ú_LegacyBedrockState | Noner„   ro   rF   r«   c                  ó  |d u s|d u rt ||||||||||d�
\}}}n|jp&|jr#|jndp&d}tƒ j||	|
||||||||dd� || _|| _td|j	ƒ| _
|j| _t d| jj¡}t| jtƒr\| jjnd }|jpm|pm|d url| d¡nd | _t|| jd�| _|pzd| _t| |  ¡ ƒ| _d S )	N©
rn   r    r9   r<   r=   r>   r?   rA   r(   r;   rG   F©r}   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   r¶   ú&bedrock-mantle\.([a-z0-9-]+)\.api\.awsé   r°   ©r~   r6   rB   rC   ÚsuperrŠ   rˆ   r†   r	   r    r·   rD   rg   ÚreÚ	fullmatchr(   Úhostre   r³   r   r*   r9   Úgroupr   rn   r¨   r±   r¬   ©Úselfrn   rƒ   r9   r<   r=   r>   r?   rA   r¹   rº   r»   r(   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   r²   rÄ   r„   Úpublic_api_keyÚcanonical_regionÚprovider_region©r‰   r3   r4   rŠ   ‹  ó^   öÿýôÿÿý
zBedrockOpenAI.__init__rŸ   c                 C  ó<   | j d ur
d| j fS | jjd us| jjs| jrd| jfS dS ©Nr    r   )r!   N©r·   r†   r6   rB   rn   ©rØ   r3   r3   r4   r±   Ú  ó   

ÿþ
z(BedrockOpenAI._legacy_auth_configurationc                 C  ó(   | j jd u o| j o| jd u o| j j S rL   ©r†   r6   rn   r·   rB   rá   r3   r3   r4   Ú_uses_aws_authå  ó   ÿþüzBedrockOpenAI._uses_aws_authr'   c                 C  sf   | j jr| j jp	d}| jr| j|kr| jS |S | jd ur0tt|  ¡ ƒ}t|tƒr*|s.t	dƒ‚|S | jS ©NrG   zHExpected `bedrock_token_provider` argument to return a non-empty string.)
r†   rB   rC   rn   r·   r	   r-   re   r'   rW   ©rØ   Úcapturedrl   r3   r3   r4   Ú_refresh_api_keyí  s   
zBedrockOpenAI._refresh_api_keyÚoptionsr   c                   s   t | ƒ tƒ  |¡S rL   ©r‡   rÒ   Ú_prepare_options©rØ   rë   rÜ   r3   r4   rí   ù  s   zBedrockOpenAI._prepare_options©rn   Úadmin_api_keyÚworkload_identityr}   rƒ   r9   r<   r=   r>   r?   rA   r¹   rº   r»   r¼   r(   r½   rÁ   r¾   r¿   Úset_default_headersrÀ   Úset_default_queryrÃ   Ú_extra_kwargsú!str | BedrockTokenProvider | Nonerð   rñ   úWorkloadIdentity | Noner}   ú_Provider | None | NotGivenúint | NotGivenrò   ró   rô   úMapping[str, Any]r   c                   ó8  t |ƒrtdƒ‚t|tƒstdƒ‚|d us|d urtdƒ‚|d ur)|d ur)tdƒ‚|d ur5|d ur5tdƒ‚ˆ j}|d urCi |¥|¥}n|d urI|}ˆ j}|d urWi |¥|¥}n|d ur]|}tˆ ||||||	|
||d�
\}}}i |¥|d urw|nˆ j|d ur|nˆ j	|d ur‡|nˆ j
|d ur�|nˆ jt|tƒr™ˆ jn||pžˆ jt|ƒr¤|nˆ j|||d u r®dn|dœ
¥|¥}|d urÉtˆ jjd	ƒrÉ||d	< ||d
< nK|d u�r|jˆ jjp×ˆ jjˆ jjˆ jjˆ jjˆ jjˆ jjˆ jjˆ jjˆ jjròdnˆ jd�	 ‡ fdd„|  ¡ D ƒ}nˆ jt!u�r‡ fdd„|  ¡ D ƒ}ˆ jdi |¤ŽS )Nrq   zHConfigure `provider` on `OpenAI`, not on `BedrockOpenAI.with_options()`.zRBedrockOpenAI only supports Bedrock bearer token or AWS credential authentication.úPThe `default_headers` and `set_default_headers` arguments are mutually exclusiveúLThe `default_query` and `set_default_query` arguments are mutually exclusive©	rn   r    r9   r<   r=   r>   r?   rA   r(   T©
r¹   rº   r»   r¼   r½   rÁ   r¾   r¿   rÀ   rÃ   r²   rÄ   rG   r‚   c                   ó$   i | ]\}}t ˆ jj|ƒr||“qS r3   ©rZ   r‰   rŠ   ©rQ   rK   rh   rá   r3   r4   Ú
<dictcomp>[  ó    ýÿz&BedrockOpenAI.copy.<locals>.<dictcomp>c                   ó,   i | ]\}}|d ust ˆ jj|ƒr||“qS rL   r   r  rá   r3   r4   r  a  ó
    þr3   )"rx   r   re   r   rW   Ú_custom_headersÚ_custom_queryr�   r¹   rº   r»   r¼   r½   Ú_clientr   r¾   rZ   r‰   rŠ   Úupdater†   r6   rC   r    r9   r<   r=   r>   r?   rA   rD   r(   Úitemsrµ   © rØ   rn   rð   rñ   r}   rƒ   r9   r<   r=   r>   r?   rA   r¹   rº   r»   r¼   r(   r½   rÁ   r¾   r¿   rò   rÀ   ró   rÃ   rô   ÚheadersÚparamsrœ   Úinherited_providerÚinherited_stateÚconstructor_kwargsr3   rá   r4   Úcopyþ  óŽ   
öÿõô

÷
þ
þzBedrockOpenAI.copy)0rn   r)   rƒ   r¶   r9   r)   r<   r)   r=   r)   r>   r)   r?   r)   rA   r@   r¹   r)   rº   r)   r»   r)   r(   rc   r¼   rc   r½   rÅ   r¾   rÆ   r¿   rÇ   rÀ   rÈ   rÁ   rÉ   rÂ   r:   rÃ   r:   r²   rÊ   rÄ   rË   r„   ro   rF   r«   ©rF   rŸ   ©rF   r:   ©rF   r'   ©rë   r   rF   r   )4rn   rõ   rð   r)   rñ   rö   r}   r÷   rƒ   r¶   r9   r)   r<   r)   r=   r)   r>   r)   r?   r)   rA   r@   r¹   r)   rº   r)   r»   r)   r¼   rc   r(   rc   r½   rÅ   rÁ   rÉ   r¾   rø   r¿   rÇ   rò   rÇ   rÀ   rÈ   ró   rÈ   rÃ   ro   rô   rù   rF   r   ©r/   r0   r1   Ú__doc__r2   r   r   rŠ   r±   rå   r   rê   rí   r  Úwith_optionsÚ__classcell__r3   r3   rÜ   r4   rµ   �  s„   
 ç
O
åirµ   c                      r´   )WÚAsyncBedrockOpenAIzKAsync compatibility client for Amazon Bedrock's OpenAI-compatible endpoint.r   rˆ   r5   r†   ú AsyncBedrockTokenProvider | Noner·   r:   rg   r$   r¬   r)   r9   NFTr¸   rn   rƒ   r<   r=   r>   r?   rA   r@   r¹   rº   r»   r(   rc   r¼   r½   rÅ   r¾   rÆ   r¿   rÇ   rÀ   rÈ   rÁ   úhttpx.AsyncClient | NonerÂ   rÃ   r²   rÊ   rÄ   rË   r„   ro   rF   r«   c                  rÌ   )	NrÍ   rG   FrÎ   r  rÏ   rÐ   r°   rÑ   r×   rÜ   r3   r4   rŠ   u  rÝ   zAsyncBedrockOpenAI.__init__rŸ   c                 C  rÞ   rß   rà   rá   r3   r3   r4   r±   Ä  râ   z-AsyncBedrockOpenAI._legacy_auth_configurationc                 C  rã   rL   rä   rá   r3   r3   r4   rå   Ï  ræ   z!AsyncBedrockOpenAI._uses_aws_authr'   c                 Ã  s|   �| j jr| j jp
d}| jr| j|kr| jS |S | jd ur;tt|  ¡ ƒ}t |¡r.|I d H }t	|t
ƒr5|s9tdƒ‚|S | jS rç   )r†   rB   rC   rn   r·   r	   r-   rN   Úisawaitablere   r'   rW   rè   r3   r3   r4   rê   ×  s   €


z#AsyncBedrockOpenAI._refresh_api_keyrë   r   c                 ƒ  s   �t | ƒ tƒ  |¡I d H S rL   rì   rî   rÜ   r3   r4   rí   å  s   €z#AsyncBedrockOpenAI._prepare_optionsrï   ú&str | AsyncBedrockTokenProvider | Nonerð   rñ   rö   r}   r÷   rø   rò   ró   rô   rù   r   c                   rú   )Nrq   zRConfigure `provider` on `AsyncOpenAI`, not on `AsyncBedrockOpenAI.with_options()`.zWAsyncBedrockOpenAI only supports Bedrock bearer token or AWS credential authentication.rû   rü   rý   Trþ   r²   rÄ   rG   r‚   c                   rÿ   r3   r   r  rá   r3   r4   r  G  r  z+AsyncBedrockOpenAI.copy.<locals>.<dictcomp>c                   r  rL   r   r  rá   r3   r4   r  M  r  r3   )"rx   r   re   r   rW   r  r  r�   r¹   rº   r»   r¼   r½   r  r   r¾   rZ   r‰   rŠ   r	  r†   r6   rC   r    r9   r<   r=   r>   r?   rA   rD   r(   r
  r  r  r3   rá   r4   r  ê  r  zAsyncBedrockOpenAI.copy)0rn   r)   rƒ   r  r9   r)   r<   r)   r=   r)   r>   r)   r?   r)   rA   r@   r¹   r)   rº   r)   r»   r)   r(   rc   r¼   rc   r½   rÅ   r¾   rÆ   r¿   rÇ   rÀ   rÈ   rÁ   r  rÂ   r:   rÃ   r:   r²   rÊ   rÄ   rË   r„   ro   rF   r«   r  r  r  r  )4rn   r  rð   r)   rñ   rö   r}   r÷   rƒ   r  r9   r)   r<   r)   r=   r)   r>   r)   r?   r)   rA   r@   r¹   r)   rº   r)   r»   r)   r¼   rc   r(   rc   r½   rÅ   rÁ   r  r¾   rø   r¿   rÇ   rò   rÇ   rÀ   rÈ   ró   rÈ   rÃ   ro   rô   rù   rF   r   r  r3   r3   rÜ   r4   r  k  s„   
 ç
O
åir  )rµ   r  ÚBedrockTokenProviderr©   r   )rE   r5   rF   r'   )rI   rJ   rK   r'   rF   r:   )r*   r)   rF   r)   )r(   rc   rF   r:   )r<   r)   r=   r)   r>   r)   r?   r)   rA   r@   rF   r:   r  )rn   r)   r    r8   r9   r)   r<   r)   r=   r)   r>   r)   r?   r)   rA   r@   r(   rc   r;   ro   rF   rp   )r   r€   rn   r)   r    r8   r9   r)   r<   r)   r=   r)   r>   r)   r?   r)   rA   r@   r(   rc   rF   r�   )r   r€   rž   rŸ   rF   r$   )r   r€   rž   rŸ   rF   r   )r   r€   rF   r«   )HÚ
__future__r   r]   rÓ   r¡   rN   Útypingr   r   r   r   r   r   r	   Údataclassesr
   r   r   Útyping_extensionsr   r   ÚhttpxÚauthr   Ú_typesr   r   r   Ú_utilsr   r  r   r   Ú_modelsr   r²   r   r   Ú_exceptionsr   Ú_base_clientr   Úproviders.bedrockr   r   r   r'   r   r©   r%   Útupler-   rŸ   Úurandomr¤   r$   r5   rH   rZ   rb   rg   rj   rm   r~   r�   r¨   rª   r…   r‡   rµ   r  Ú__all__r3   r3   r3   r4   Ú<module>   sZ    $







õ
Q
f

 
 k m