
    Mi                     4   S r SSKrSSKrSSKrSSKJr  SSKJrJrJ	r	J
r
JrJrJr  SSKrSSKrSSKJr  SSKJr  SSKJr  SSKJr  SS	KJrJr  SS
KJr  SSKJrJrJ r   SSK!J"r"  SSK#J$r$J%r%J&r&J'r'J(r(  SSK)7  SSK*J+r+  SSK,J-r-J.r.J/r/J0r0  \" 5       r1\ " 5       r2\" 5       r3\"" 5       r4\.   S'S\&S\
S   S\
S   S\\	\5\54      S\\	\5\54      S\(4S jj5       r6\.   S(S\&S\
S   S\\
S      S\\	\5\54      S\\	\5\54      S\\(\\\\(4   4   4S jj5       r7\.   S'S\5S\
S   S\\	\5\54      S\\	\5\54      S\(4
S jj5       r8\.   S'S\5S\
S   S\\	\5\54      S\\	\5\54      S\4
S jj5       r9\.   S'S\5S\
S   S\\	\5\54      S\\	\5\54      S\\\\4   4
S jj5       r:\.   S'S\5S\
S   S\\	\5\54      S\\	\5\54      S\4
S  jj5       r;\.    S)S\
S   S\\5   S\\	\5\54      S\\	\5\54      4S! jj5       r<\.    S)S\
S   S\\5   S\\	\5\54      S\\	\5\54      4S" jj5       r=\.   S'S\5S\
S#   S\\	\5\54      S\\	\5\54      S\'4
S$ jj5       r>\.    S*S\5S%\\5   S\\\
S#   \54      S\\	\5\54      S\\	\5\54      S\\'\\\\'4   4   4S& jj5       r?g)+z_
Main File for Files API implementation

https://platform.openai.com/docs/api-reference/files

    N)partial)Any	CoroutineDictLiteralOptionalUnioncast)get_secret_str)get_llm_provider)Logging)AzureOpenAIFilesAPI)AsyncHTTPHandlerHTTPHandler)BaseLLMHTTPHandler)FileDeleted
FileObjectOpenAIFilesAPI)VertexAIFilesHandler)CreateFileRequestFileContentRequest	FileTypesHttpxBinaryResponseContentOpenAIFileObject)*)LlmProviders)ProviderConfigManagerclientget_litellm_paramssupports_httpx_timeoutfilepurpose)
assistantsbatchz	fine-tunecustom_llm_provider)openaiazure	vertex_aibedrockextra_headers
extra_bodyreturnc                   #     [         R                  " 5       nSUS'   U UUUUS.UEn[        [        40 UD6n[        R
                  " 5       n	[        U	R                  U5      n
UR                  SU
5      I Sh  vN n[         R                  " U5      (       a  UI Sh  vN nU$ UnU$  N/ N! [         a  nUeSnAff = f7f)z
Async: Files are used to upload documents that can be used with features like Assistants, Fine-tuning, and Batch API.

LiteLLM Equivalent of POST: POST https://api.openai.com/v1/files
Tacreate_file)r!   r"   r%   r*   r+   N)
asyncioget_event_loopr   create_filecontextvarscopy_contextrunrun_in_executoriscoroutine	Exception)r!   r"   r%   r*   r+   kwargsloop	call_argsfuncctxfunc_with_contextinit_responseresponsees                 l/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/litellm/files/main.pyr.   r.   2   s     %%'!%~ #6*$
 
	 {0i0 &&(#CGGT2"2249JKK}--**H  %H L*
  sY   C A4B, 8B(9$B, B*B, #C $B, 'C (B, *B, ,
B=6B88B==C c                 |
    UR                  SS5      SL n[        S-0 UD6n[        S-0 UD6n[        [        [
           UR                  S5      5      n	U	c  [        S5      eUR                  S5      n
UR                  =(       d    UR                  SS	5      =(       d    S	nUbS  [        U[        R                  5      (       a4  [        [        [        U5      5      SL a  UR                  =(       d    S	nUnO3Ub+  [        U[        R                  5      (       d  [        U5      nOUc  S
n[!        U UUUS9n["        R$                  " S['        U5      S9nUb[  [(        R+                  UUUU=(       d    0 UR,                  UR.                  U	UU
b  [        U
[0        [2        45      (       a  U
OSUS9
nU$ US:X  Ga,  UR,                  =(       dS    [4        R,                  =(       d<    [6        R8                  " S5      =(       d    [6        R8                  " S5      =(       d    SnUR:                  =(       d7    [4        R:                  =(       d     [6        R8                  " SS5      =(       d    SnUR.                  =(       dD    [4        R.                  =(       d-    [4        R<                  =(       d    [6        R8                  " S5      n[>        R+                  UUUUUR@                  UUS9nU$ US:X  Ga!  UR,                  =(       d"    [4        R,                  =(       d    [C        S5      nURD                  =(       d"    [4        RD                  =(       d    [C        S5      nUR.                  =(       dK    [4        R.                  =(       d4    [4        RF                  =(       d    [C        S5      =(       d    [C        S5      nUR                  S0 5      nUb  UR                  SS5        O[C        S5        [H        R+                  UUUUUUR@                  UUS9nU$ US:X  a  UR,                  =(       d    SnURJ                  =(       d"    [4        RJ                  =(       d    [C        S 5      nURL                  =(       d"    [4        RL                  =(       d    [C        S!5      nURN                  =(       d    [C        S"5      n[P        R+                  UUUUUUUR@                  US#9nU$ [4        RR                  RU                  S$RW                  U5      S%U[        RX                  " S&S'[        RZ                  " S(S)S*9S+9S,9e! [\         a  nUeSnAff = f).z
Files are used to upload documents that can be used with features like Assistants, Fine-tuning, and Batch API.

LiteLLM Equivalent of POST: POST https://api.openai.com/v1/files

Specify either provider_list or custom_llm_provider.
r.   FTlitellm_logging_objNzlogging_obj is requiredr   request_timeoutX       @)r!   r"   r*   r+    )modelprovider)
provider_configlitellm_paramscreate_file_dataheadersapi_baseapi_keylogging_obj	_is_asyncr   timeoutr&   OPENAI_BASE_URLOPENAI_API_BASEhttps://api.openai.com/v1OPENAI_ORGANIZATIONOPENAI_API_KEY)rQ   rN   rO   rR   max_retriesorganizationrL   r'   AZURE_API_BASEAZURE_API_VERSIONAZURE_OPENAI_API_KEYAZURE_API_KEYr+   azure_ad_tokenAZURE_AD_TOKEN)rQ   rN   rO   api_versionrR   rX   rL   rK   r(   VERTEXAI_PROJECTVERTEXAI_LOCATIONVERTEXAI_CREDENTIALS)rQ   rN   vertex_projectvertex_locationvertex_credentialsrR   rX   rL   zbLiteLLM doesn't support {} for 'create_file'. Only ['openai', 'azure', 'vertex_ai'] are supported.n/a  Unsupported providerr1   "https://github.com/BerriAI/litellmmethodurlstatus_codecontentrequestmessagerH   llm_providerr?    )/popGenericLiteLLMParamsdictr
   r   LiteLLMLoggingObjget
ValueErrorrR   
isinstancehttpxTimeoutr    strreadfloatr   r   get_provider_files_configr   base_llm_http_handlerr1   rN   rO   r   r   litellmosgetenvrY   
openai_keyopenai_files_instancerX   r   r`   	azure_keyazure_files_instancerd   re   rf   vertex_ai_files_instance
exceptionsBadRequestErrorformatResponseRequestr7   )r!   r"   r%   r*   r+   r8   rQ   optional_paramslitellm_params_dictrP   r   rR   read_timeout_create_file_requestrJ   r?   rN   rY   rO   r`   vertex_ai_projectvertex_ai_locationrf   r@   s                           rA   r1   r1   ^   s	    _JJ~u5=	.88"nVn&'4I)J
 677H% "))VVZZ8I3-OVSV 7EMM22&tC1D'EF%O"<<.3L"G GU]])K)KGnG_G0'!	 
 0II!"56
 &,88 /2!5%+(11'//'#%v5E'FGG   9 Hl O !H,  (( /##/99.// 99.// /   ,, ''992D9 	   '' /??/%%/ 99-.	  -88#!+77)!5 9 H` O !G+&//g73C3Cg~VfGgH++ 7&&7!"56   '' 3??3$$3 ""893 "/2  ),,\2>J%/6/0+77#!'+77!52 8 	Hb O !K/&//52H.. 6))6!"45   // 7**7!"56 
 "1!C!C "~&H 0;;#!0 2#5+77!5 < 	H.  $$44|  D  D' 0 #2!MMDhi 5    s4   F-T* 0D2T* #D'T* CT* AT* *
T;4T66T;file_id)r&   r'   c                   #     [         R                  " 5       nSUS'   [        [        U UUU40 UD6n[        R
                  " 5       n[        UR                  U5      nUR                  SU5      I Sh  vN n	[         R                  " U	5      (       a  U	I Sh  vN n
OU	n
[        S0 U
R                  5       D6$  NE N"! [         a  nUeSnAff = f7f)U
Async: Get file contents

LiteLLM Equivalent of GET https://api.openai.com/v1/files
Tis_asyncNru   )r/   r0   r   file_retriever2   r3   r4   r5   r6   r   
model_dumpr7   r   r%   r*   r+   r8   r9   r;   r<   r=   r>   r?   r@   s               rA   afile_retriever     s     %%'!z 
 
 &&(#CGGT2"2249JKK}--**H$H8("5"5"788 L*
  sM   CA.B< 2B83$B< B:B< 7C8B< :B< <
CCCCc                 :    [        S!0 UD6nUR                  =(       d    UR                  SS5      =(       d    SnUbE  [        U[        R
                  5      (       a&  [        U5      SL a  UR                  =(       d    SnUnO3Ub+  [        U[        R
                  5      (       d  [        U5      nOUc  SnUR                  SS5      SL nUS:X  Ga,  UR                  =(       dS    [        R                  =(       d<    [        R                  " S	5      =(       d    [        R                  " S
5      =(       d    Sn	UR                  =(       d7    [        R                  =(       d     [        R                  " SS5      =(       d    Sn
UR                  =(       dD    [        R                  =(       d-    [        R                   =(       d    [        R                  " S5      n["        R%                  U UU	UUUR&                  U
S9nGO|US:X  Ga  UR                  =(       d"    [        R                  =(       d    [)        S5      n	UR*                  =(       d"    [        R*                  =(       d    [)        S5      nUR                  =(       dK    [        R                  =(       d4    [        R,                  =(       d    [)        S5      =(       d    [)        S5      nUR                  S0 5      nUb  UR                  SS5        O[)        S5        [.        R%                  UU	UUUUR&                  U S9nOV[        R0                  R3                  SR5                  U5      SU[        R6                  " SS[        R8                  " SSS9S9S 9e[;        [<        U5      $ ! [>         a  nUeSnAff = f)"o
Returns the contents of the specified file.

LiteLLM Equivalent of POST: POST https://api.openai.com/v1/files
rD   rE   NFrF   r   Tr&   rS   rT   rU   rV   rW   r   rQ   rN   rO   rR   rX   rY   r'   rZ   r[   r\   r]   r+   r^   r_   )rQ   rN   rO   r`   rR   rX   r   zXLiteLLM doesn't support {} for 'file_retrieve'. Only 'openai' and 'azure' are supported.rg   rh   ri   create_threadrj   rk   rn   rr   ru   ) rw   rR   rz   r|   r}   r~   r    r   r   rv   rN   r   r   r   rY   rO   r   r   retrieve_filerX   r   r`   r   r   r   r   r   r   r   r
   r   r7   )r   r%   r*   r+   r8   r   rR   r   rQ   rN   rY   rO   r?   r`   r@   s                  rA   r   r   9  s/   c.88!))VVZZ8I3-OVSV 7EMM22&':;uD"<<.3L"G GU]])K)KGnG_GJJz51T9	(*  (( /##/99.// 99.// /   ,, ''992D9 	   '' /??/%%/ 99-.	  -::#!+77) ; H !G+&//g73C3Cg~VfGgH++ 7&&7!"56   '' 3??3$$3 ""893 "/2  ),,\2>J%/6/0+99#!'+77 : H $$44ryy' 0 #2!MMFjk 5   J)) s   NN	 	
NNNc                   #     [         R                  " 5       nSUS'   [        [        U UUU40 UD6n[        R
                  " 5       n[        UR                  U5      nUR                  SU5      I Sh  vN n	[         R                  " U	5      (       a  U	I Sh  vN n
OU	n
[        [        U
5      $  N< N! [         a  nUeSnAff = f7f)zR
Async: Delete file

LiteLLM Equivalent of DELETE https://api.openai.com/v1/files
Tr   N)r/   r0   r   file_deleter2   r3   r4   r5   r6   r
   r   r7   r   s               rA   afile_deleter     s     %%'!z 
 
 &&(#CGGT2"2249JKK}--**H$HK** L*
  sM   CA.B3 2B/3$B3 B1B3 .C/B3 1B3 3
C=B??CCc                 v    [        S"0 UD6n[        S"0 UD6nUR                  =(       d    UR                  SS5      =(       d    SnUR                  S5      nUbE  [	        U[
        R                  5      (       a&  [        U5      SL a  UR                  =(       d    Sn	U	nO3Ub+  [	        U[
        R                  5      (       d  [        U5      nOUc  SnUR                  SS5      SL n
US	:X  Ga,  UR                  =(       dS    [        R                  =(       d<    [        R                  " S
5      =(       d    [        R                  " S5      =(       d    SnUR                  =(       d7    [        R                  =(       d     [        R                  " SS5      =(       d    SnUR                   =(       dD    [        R                   =(       d-    [        R"                  =(       d    [        R                  " S5      n[$        R'                  U U
UUUUR(                  US9nGO~US:X  Ga!  UR                  =(       d"    [        R                  =(       d    [+        S5      nUR,                  =(       d"    [        R,                  =(       d    [+        S5      nUR                   =(       dK    [        R                   =(       d4    [        R.                  =(       d    [+        S5      =(       d    [+        S5      nUR                  S0 5      nUb  UR                  SS5        O[+        S5        [0        R'                  U
UUUUUR(                  U UUS9	nOV[        R2                  R5                  SR7                  U5      SU[
        R8                  " SS[
        R:                  " SSS9S 9S!9e[=        [>        U5      $ ! [@         a  nUeSnAff = f)#zK
Delete file

LiteLLM Equivalent of DELETE https://api.openai.com/v1/files
rD   rE   r   NFrF   r   Tr&   rS   rT   rU   rV   rW   r   r'   rZ   r[   r\   r]   r+   r^   r_   )	rQ   rN   rO   r`   rR   rX   r   r   rK   zJLiteLLM doesn't support {} for 'create_batch'. Only 'openai' is supported.rg   rh   ri   r   rj   rk   rn   rr   ru   )!rw   r   rR   rz   r|   r}   r~   r    r   r   rv   rN   r   r   r   rY   rO   r   r   delete_filerX   r   r`   r   r   r   r   r   r   r   r
   r   r7   )r   r%   r*   r+   r8   r   r   rR   r   r   rQ   rN   rY   rO   r?   r`   r@   s                    rA   r   r     sQ   c.880:6:!))VVZZ8I3-OVSVH% 7EMM22&':;uD"<<.3L"G GU]])K)KGnG_GJJz51T9	(*  (( /##/99.// 99.// /   ,, ''992D9 	   '' /??/%%/ 99-.	  -88#!+77) 9 H !G+&//g73C3Cg~VfGgH++ 7&&7!"56   '' 3??3$$3 ""893 "/2  ),,\2>J%/6/0+77#!'+772 8 
H $$44dkk' 0 #2!MMFjk 5   K** s   N$N' '
N81N33N8c                 x  #     [         R                  " 5       nSUS'   [        [        U UUU40 UD6n[        R
                  " 5       n[        UR                  U5      nUR                  SU5      I Sh  vN n	[         R                  " U	5      (       a  U	I Sh  vN n
U
$ U	n
U
$  N/ N! [         a  nUeSnAff = f7f)zN
Async: List files

LiteLLM Equivalent of GET https://api.openai.com/v1/files
Tr   N)
r/   r0   r   	file_listr2   r3   r4   r5   r6   r7   )r%   r"   r*   r+   r8   r9   r;   r<   r=   r>   r?   r@   s               rA   
afile_listr   J  s     %%'!z 
 
 &&(#CGGT2"2249JKK}--**H  %H L*
  sY   B:A.B& 2B"3$B& B$B& B:B& !B:"B& $B& &
B70B22B77B:c                     [        S!0 UD6nUR                  =(       d    UR                  SS5      =(       d    SnUbE  [        U[        R
                  5      (       a&  [        U 5      SL a  UR                  =(       d    SnUnO3Ub+  [        U[        R
                  5      (       d  [        U5      nOUc  SnUR                  SS5      SL nU S:X  Ga,  UR                  =(       dS    [        R                  =(       d<    [        R                  " S	5      =(       d    [        R                  " S
5      =(       d    Sn	UR                  =(       d7    [        R                  =(       d     [        R                  " SS5      =(       d    Sn
UR                  =(       dD    [        R                  =(       d-    [        R                   =(       d    [        R                  " S5      n["        R%                  UUU	UUUR&                  U
S9nU$ U S:X  Ga   UR                  =(       d"    [        R                  =(       d    [)        S5      n	UR*                  =(       d"    [        R*                  =(       d    [)        S5      nUR                  =(       dK    [        R                  =(       d4    [        R,                  =(       d    [)        S5      =(       d    [)        S5      nUR                  S0 5      nUb  UR                  SS5        O[)        S5        [.        R%                  UU	UUUUR&                  US9nU$ [        R0                  R3                  SR5                  U 5      SU [        R6                  " SS[        R8                  " SSS9S9S 9e! [:         a  nUeSnAff = f)"zG
List files

LiteLLM Equivalent of GET https://api.openai.com/v1/files
rD   rE   NFrF   r   Tr&   rS   rT   rU   rV   rW   )r"   rQ   rN   rO   rR   rX   rY   r'   rZ   r[   r\   r]   r+   r^   r_   )rQ   rN   rO   r`   rR   rX   r"   zTLiteLLM doesn't support {} for 'file_list'. Only 'openai' and 'azure' are supported.rg   rh   ri   r   rj   rk   rn   rr   ru   )rw   rR   rz   r|   r}   r~   r    r   r   rv   rN   r   r   r   rY   rO   r   r   
list_filesrX   r   r`   r   r   r   r   r   r   r   r7   )r%   r"   r*   r+   r8   r   rR   r   rQ   rN   rY   rO   r?   r`   r@   s                  rA   r   r   s  s2   a.88!))VVZZ8I3-OVSV 7EMM22&':;uD"<<.3L"G GU]])K)KGnG_GJJz51T9	(*  (( /##/99.// 99.// /   ,, ''992D9 	   '' /??/%%/ 99-.	  -77#!+77) 8 Hj Y !G+&//g73C3Cg~VfGgH++ 7&&7!"56   '' 3??3$$3 ""893 "/2  ),,\2>J%/6/0+66#!'+77 7 H,  $$44nuu' 0 #2!MMBfg 5    s&   G:M: =D&M: $AM: :
NNN)r&   r'   r(   c                   #     [         R                  " 5       nSUS'   UR                  SS5      n[        [        U UUUU40 UD6n[
        R                  " 5       n[        UR                  U5      n	UR                  SU	5      I Sh  vN n
[         R                  " U
5      (       a  U
I Sh  vN nU$ U
nU$  N/ N! [         a  nUeSnAff = f7f)r   Tafile_contentrH   N)r/   r0   rv   r   file_contentr2   r3   r4   r5   r6   r7   )r   r%   r*   r+   r8   r9   rH   r;   r<   r=   r>   r?   r@   s                rA   r   r     s     %%'"&

7D) 
 
 &&(#CGGT2"2249JKK}--**H  %H L*
  sY   CBB9 B5$B9 *B7+B9 0C1B9 4C5B9 7B9 9
C
CC

CrH   c                 d	    [        S)0 UD6n[        S)0 UD6nUR                  =(       d    UR                  SS5      =(       d    SnUR                  S5      n	 Ub  [	        X5      u  p  n
UbS  [        U[        R                  5      (       a4  [        [        [        U5      5      SL a  UR                  =(       d    SnUnO3Ub+  [        U[        R                  5      (       d  [        U5      nOUc  Sn[        U UUS9nUR                  SS5      S	L nUS
:X  Ga,  UR                   =(       dS    ["        R                   =(       d<    [$        R&                  " S5      =(       d    [$        R&                  " S5      =(       d    SnUR(                  =(       d7    ["        R(                  =(       d     [$        R&                  " SS5      =(       d    SnUR*                  =(       dD    ["        R*                  =(       d-    ["        R,                  =(       d    [$        R&                  " S5      n[.        R1                  UUUUUUR2                  US9nU$ US:X  Ga"  UR                   =(       d"    ["        R                   =(       d    [5        S5      nUR6                  =(       d"    ["        R6                  =(       d    [5        S5      nUR*                  =(       dK    ["        R*                  =(       d4    ["        R8                  =(       d    [5        S5      =(       d    [5        S5      nUR                  S0 5      nUb  UR                  SS5        O[5        S5        [:        R1                  UUUUUUR2                  UU	US9	nU$ US:X  a  UR                   =(       d    SnUR<                  =(       d"    ["        R<                  =(       d    [5        S5      nUR>                  =(       d"    ["        R>                  =(       d    [5        S5      nUR@                  =(       d    [5        S5      n[B        R1                  UUUUUUUUR2                  S9nU$ ["        RD                  RG                  S RI                  U5      S!U[        RJ                  " S"S#[        RL                  " S$S%S&9S'9S(9e! [
         a     GN0f = f! [
         a  nUeSnAff = f)*r   rD   rE   r   NFrF   )r   r*   r+   r   Tr&   rS   rT   rU   rV   rW   )rQ   file_content_requestrN   rO   rR   rX   rY   r'   rZ   r[   r\   r]   r+   r^   r_   )	rQ   rN   rO   r`   rR   rX   r   r   rK   r(   rG   ra   rb   rc   )rQ   r   rN   rf   rd   re   rR   rX   zmLiteLLM doesn't support {} for 'custom_llm_provider'. Supported providers are 'openai', 'azure', 'vertex_ai'.rg   rh   ri   r   rj   rk   rn   rr   ru   )'rw   r   rR   rz   r   r7   r|   r}   r~   r    r
   r   r   r   r   rv   rN   r   r   r   rY   rO   r   r   r   rX   r   r`   r   r   rd   re   rf   r   r   r   r   r   r   )r   rH   r%   r*   r+   r8   r   r   rR   r   _r   _file_content_requestrQ   rN   rY   rO   r?   r`   r   r   rf   r@   s                          rA   r   r     sz    N.880:6:!))VVZZ8I3-OVSVH%	 /?0,1 7EMM22&tC1D'EF%O"<<.3L"G GU]])K)KGnG_G 2'!!
 JJ6$>	(*  (( /##/99.// 99.// /   ,, ''992D9 	   '' /??/%%/ 99-.	  -99#%:!+77) : Hb Q !G+&//g73C3Cg~VfGgH++ 7&&7!"56   '' 3??3$$3 ""893 "/2  ),,\2>J%/6/0+88#!'+77%:2 9 
Hd O !K/&//52H.. 6))6!"45   // 7**7!"56 
 "1!C!C "~&H 0<<#%:!#50 2+77 = 	H.  $$44 H  O  O' 0 #2!MMFjk 5  g  		@  sR   AR R *GR D(R .CR 7AR 
RR RR 
R/(R**R/)r&   NN)NNN)r&   NNN)NNNN)@__doc__r/   r2   r   	functoolsr   typingr   r   r   r   r   r	   r
   r}   r   r   1litellm.litellm_core_utils.get_llm_provider_logicr   *litellm.litellm_core_utils.litellm_loggingr   ry    litellm.llms.azure.files.handlerr   &litellm.llms.custom_httpx.http_handlerr   r   *litellm.llms.custom_httpx.llm_http_handlerr   litellm.llms.openai.openair   r   r   $litellm.llms.vertex_ai.files.handlerr   litellm.types.llms.openair   r   r   r   r   litellm.types.routerlitellm.types.utilsr   litellm.utilsr   r   r   r    r   r   r   r   r   r.   r1   r   r   r   r   r   r   r   r   ru       rA   <module>r      sw     	  G G G   " N S @ P I N N E  # ,  +,  '( *, /1   OW.2+/(
(78( !!JK( DcN+	(
 c3h(( ( (V  Y].2+/n
n78n "'*S"TUn DcN+	n
 c3h(n YsC1A'ABBCn nb  7?.2+/	%% !23% DcN+% c3h(	% % %P  7?.2+/	oo !23o DcN+o c3h(	o o of  7?.2+/	%% !23% DcN+% c3h(	% sC#$% %P  7?.2+/	oo !23o DcN+o c3h(	o o of 6>!.2+/	% !23%c]% DcN+% c3h(	% %P 6>!.2+/	m !23mc]m DcN+m c3h(	m m`  DL.2+/	'' !?@' DcN+' c3h(	'  ' 'T    	.2+/]]C=] "g45s:;] DcN+] c3h(] %yc;U1U'VVW] ]r   