
    Fg                       S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	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  S SKJrJr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 J!r!J"r"J#r#J$r$  S SK%J&r&  S SK'r'S SK(r(S SK)J*r+  S SK,r,S SK-J.r.  S SK/J0r0J1r1  S SK2J3r3J4r4J5r5J6r6  S SK7J8r8J9r9  S SK:J;r;J<r<  S SK=J>r>J?r?J@r@JArAJBrB  S SKCJDrDJ*r*  S SKEJFrFJGrGJHrHJIrI  S SKJJKrK  S SKLJMrM  \ (       a  S SKNJOrOJPrPJQrQ  S SKRJSrS  S SKTJUrU  \R                  " 5       rWSrX " S S5      rY\." 5        " S S5      5       rZ " S S\[5      r\SGS  jr]        SHS! jr^SIS" jr_      SJS# jr`          SKS$ jra        SLS% jrbSMS& jrc " S' S(\65      rd\" S)S*9 " S+ S,5      5       re\ " S- S.5      5       rf " S/ S0\[5      rg " S1 S2\[5      rh " S3 S45      ri " S5 S65      rjSNS7 jrkSOS8 jrlSPS9 jrmSQS: jrnSRS; jroSSS< jrp " S= S>5      rqSTS? jrrSUS@ jrs\ SV       SWSA jj5       rtSXSB jru\SXSC j5       rv  SV       SYSD jjrw " SE SF5      rxg)Z    )annotationsN)deque)AsyncGeneratorCallable)AbstractAsyncContextManagerAsyncExitStackasynccontextmanager)	dataclass)datetime)Path)NamedTemporaryFile_TemporaryFileWrapper)TYPE_CHECKINGAnyBinaryIOOptionalUnion)urlparse)document)MultipartParserparse_options_header)FormDataHeadersMutableHeaders
UploadFile)MultiPartExceptionMultipartPart)PlainTextResponseResponse)ASGIAppMessageReceiveScopeSend)processing_utilsutils)BlocksConfigDictMediaStreamChunkPredictBodyPredictBodyInternal)Error)SessionState)BlockFunctionBlocksBlocksConfig	EventData)Appz/gradio_apic                  t    \ rS rSrSrS rS rS rS rSS jr	SS	 jr
S
 rS rS rSS jrSS jrSS jrSrg)Obj=   z
Using a class to convert dictionaries into objects. Used by the `Request` class.
Credit: https://www.geeksforgeeks.org/convert-nested-python-dictionary-to-object/
c                    U R                   R                  U5        UR                  5        H7  u  p#[        U[        [
        45      (       a  [        U5      n[        XU5        M9     g N)__dict__updateitems
isinstancedictlistr4   setattr)selfdict_keyvalues       c/Users/admin/workspace/ai/PDFMathTranslate/myenv/lib/python3.13/site-packages/gradio/route_utils.py__init__Obj.__init__C   sJ    U#++-JC%$..E
Du% (    c                     U R                   U   $ r7   r8   )r?   items     rC   __getitem__Obj.__getitem__J   s    }}T""rF   c                     X R                   U'   g r7   rH   r?   rI   rB   s      rC   __setitem__Obj.__setitem__M   s    #drF   c              #     #    U R                   R                  5        H0  u  p[        U[        5      (       a  U[	        U5      4v   M+  X4v   M2     g 7fr7   )r8   r:   r;   r4   r<   )r?   rA   rB   s      rC   __iter__Obj.__iter__P   sB     ----/JC%%%DK((l"	 0s   AAc                    XR                   ;   a  gU R                   R                  5        H!  n[        U[        5      (       d  M  X;   d  M!    g   g)NTF)r8   valuesr;   r4   rM   s      rC   __contains__Obj.__contains__W   s?    == ]]))+E%%%$- , rF   Nc                .    X;   a  U R                   U   $ U$ r7   rH   r?   rI   defaults      rC   getObj.get_   s    <==&&rF   c                6    U R                   R                  5       $ r7   )r8   keysr?   s    rC   r]   Obj.keysd   s    }}!!##rF   c                6    U R                   R                  5       $ r7   )r8   rT   r^   s    rC   rT   
Obj.valuesg   s    }}##%%rF   c                6    U R                   R                  5       $ r7   )r8   r:   r^   s    rC   r:   	Obj.itemsj   s    }}""$$rF   c                ,    [        U R                  5      $ r7   strr8   r^   s    rC   __str__Obj.__str__m       4==!!rF   c                ,    [        U R                  5      $ r7   re   r^   s    rC   __repr__Obj.__repr__p   ri   rF   c                F    X;   a  U R                   R                  U5      $ U$ r7   )r8   poprX   s      rC   rn   Obj.pops   s!    <==$$T**rF    )returnboolr7   )rq   rf   )__name__
__module____qualname____firstlineno____doc__rD   rJ   rN   rQ   rU   rZ   r]   rT   r:   rg   rk   rn   __static_attributes__rp   rF   rC   r4   r4   =   sC    
&#$#
$&%""rF   r4   c                  Z    \ rS rSrSr   S
     SS jjrS rSS jrSS jrSS jr	S	r
g)Requesty   a  
A Gradio request object that can be used to access the request headers, cookies,
query parameters and other information about the request from within the prediction
function. The class is a thin wrapper around the fastapi.Request class. Attributes
of this class include: `headers`, `client`, `query_params`, `session_hash`, and `path_params`. If
auth is enabled, the `username` attribute can be used to get the logged in user. In some environments,
the dict-like attributes (e.g. `requests.headers`, `requests.query_params`) of this class are automatically
converted to to dictionaries, so we recommend converting them to dictionaries before accessing
attributes for consistent behavior in different environments.
Example:
    import gradio as gr
    def echo(text, request: gr.Request):
        if request:
            print("Request headers dictionary:", dict(request.headers))
            print("Query parameters:", dict(request.query_params))
            print("IP address:", request.client.host)
            print("Gradio session hash:", request.session_hash)
        return text
    io = gr.Interface(echo, "textbox", "textbox").launch()
Demos: request_ip_headers
Nc                4    Xl         X l        X0l        X@l        g)a<  
Can be instantiated with either a fastapi.Request or by manually passing in
attributes (needed for queueing).
Parameters:
    request: A fastapi.Request
    username: The username of the logged in user (if auth is enabled)
    session_hash: The session hash of the current session. It is unique for each page load.
N)requestusernamesession_hashkwargs)r?   r}   r~   r   r   s        rC   rD   Request.__init__   s       (4&,rF   c                    [        U[        5      (       a-  [        R                  " [        R                  " U5      [
        S9$ U$ )N)object_hook)r;   r<   jsonloadsdumpsr4   )r?   ds     rC   dict_to_objRequest.dict_to_obj   s-    a::djjm==HrF   c                    U R                   (       a%  U R                  [        U R                   U5      5      $  U R                  U   nU R                  U5      $ ! [         a  n[        SU S35      UeS nAff = f)Nz#'Request' object has no attribute '')r}   r   getattrr   KeyErrorAttributeError)r?   nameobjkes       rC   __getattr__Request.__getattr__   sy    <<##GDLL$$?@@kk$'
 ##C((	  $9$qAs   A 
A7"A22A7c                l   U R                   R                  [        [        U S0 5      5      [        [        U S0 5      5      [        [        U S0 5      5      [        [        U S0 5      5      [        U S0 5      =(       a    U R                  R
                  [        U S0 5      =(       a    U R                  R                  S.[        U SS5      S	.5        [        U S
5      =n(       a%   [        R                  " U5        XR                   S'   S U l        U R                  $ ! [        R                   a     N)f = f)Nheadersquery_paramscookiespath_paramsclient)hostporturl )r   r   r   r   r   r   staterequest_state)r   r9   r<   r   r   r   r   hasattrpickler   PicklingErrorr}   r8   )r?   r   s     rC   __getstate__Request.__getstate__   s   i <= $WT>2%F Gi <=#GD-$DE#D(B7LDKK<L<L#D(B7LDKK<L<L tUB/
	
 $D'22=2]+/<O, }} '' s   %$D D32D3c                N    UR                  SS 5      =n(       a  X l        Xl        g )Nr   )rn   r   r8   )r?   r   r   s      rC   __setstate__Request.__setstate__   s"    !IIot<<=<&JrF   )r8   r   r}   r   r   r~   )NNN)r}   zfastapi.Request | Noner~   
str | Noner   r   )r   rf   )rq   dict[str, Any])r   r   )rs   rt   ru   rv   rw   rD   r   r   r   r   rx   rp   rF   rC   rz   rz   y   sG    0 +/##'	-'- - !	-*
).rF   rz   c                      \ rS rSrSrg)FnIndexInferError   rp   Nrs   rt   ru   rv   rx   rp   rF   rC   r   r          rF   r   c                J   UR                   (       a0  U R                  UR                      nUR                  R                  nOU R                  nUR                  c<  Ub+  UR                  5        H  nUR                  U:X  d  M  Us  $    [        SU 35      eXBR                     $ )Nz-Could not infer function index for API name: )r   state_holderblocks_configfnsfn_indexrT   api_namer   )blocksr   bodysession_stater   fns         rC   get_fnr      s    ++D,=,=>))--jj}}jjl;;(*I #  ;H:F
 	
 ==!!rF   c                .   UR                   (       a  U R                  /U l        U R                  (       a>  U R                  (       a  [        X#S9/nU$ [        X R                  U R                  S9n U$ Uc  [        S5      e[        X#U R                  S9nU$ )N)r~   r}   )r~   r}   r   z0request must be provided if body.request is None)cancelsr   datar}   batchedrz   
ValueError)r   r   r~   r}   
gr_requests        rC   compile_gr_requestr      s     
zz&&'	||<<!8EFJ  !!<<dFWFWJ  ?OPPT=N=N

 rF   c                @   UR                   n[        USS 5      nUbe  U R                  U   nUc  S nXE4$ X R                  ;   a   S nU R                  R	                  U5        XE4$ U R
                  R                  U5      n XE4$ [        U R                  5       5      nS nXE4$ )Nr   )	event_idr   r   iterators_to_resetremove	iteratorsrZ   r,   
get_blocks)appr   r   r   r   iterators         rC   restore_session_stater     s    }}H46L((6 H "" ///H""))(3 "" }}((2H
 "" %S^^%56""rF   c                    SSK Jn  UR                  nU" U(       a  U R                  R	                  U5      OS UR
                  5      nU$ )Nr   r0   )gradio.helpersr1   
trigger_idr   rZ   
event_data)r   r   r1   targetr   s        rC   prepare_event_datar     sA     )__F,2  (J rF   c                  #    [        XS9u  pV[        UR                  U5      nUR                  n[	        USS 5      n	UR
                  n
UR                  (       + =(       a    UR                  nU(       a  U
/n
 [        R                  " 5          U R                  5       R                  UU
UUUU	UUSUR                  US9I S h  vN nS S S 5        WR                  SS 5      nUb  X`R                  U'   [        U[         5      (       a  Ue U(       a  US   S   US'   U$  N[! , (       d  f       N_= f! ["         a    Ub  U R                  R%                  U5      OS nUb_  ['        U5      nU R                  5       R(                  U	   R%                  U0 5      nUR+                  5        H  nUR-                  5         M     e f = f7f)N)r   r   r   T)block_fninputsr}   r   r   r   r   r   in_event_listenersimple_format	root_pathr   r   r   )r   r   r   r   r   r   r   batchr&   MatplotlibBackendManangerr   process_apir   rn   r   r;   r+   BaseExceptionrZ   idpending_streamsrT   
end_stream)r   r   r   r   r   r   r   r   r   r   r   batch_in_single_outoutputrun_idr   streams                   rC   call_process_apir   -  s     4GM#M$?$?FJ}}H46LYYF"ll*7rxx,,.>>+77"#!)!%"&"00# 8  F / ::j$/&.MM(#fe$$L % *vM? /.&  	2:2F3==$$X.D\F 00>BB62N  *002!!# 3	sJ   A5G8D1 5D DD AD1 	GD  
D.*D1 1BF??Gc                  ^  SU 4S jjnU(       a,  [         R                  " U5      (       a  UR                  S5      $ U" S5      nU(       a  SU 3O[        T R                  5      n[
        R                  " U5      nUR                  SS9n[        U5      R                  S5      nU" S5      S:X  a  UR                  SS	5      nUR                  S5      n[        U5      S
:  a  U(       d  US[        U5      *  nUR                  S5      n[
        R                  " U5      nU(       a  UR                  U:w  a  UR                  US9n[        U5      R                  S5      $ )a  
Gets the root url of the Gradio app (i.e. the public url of the app) without a trailing slash.

This is how the root_url is resolved:
1. If a user provides a `root_path` manually that is a full URL, it is returned directly.
2. If the request has an x-forwarded-host header (e.g. because it is behind a proxy), the root url is
constructed from the x-forwarded-host header. In this case, `route_path` is not used to construct the root url.
3. Otherwise, the root url is constructed from the request url. The query parameters and `route_path` are stripped off.
And if a relative `root_path` is provided, and it is not already the subpath of the URL, it is appended to the root url.

In cases (2) and (3), We also check to see if the x-forwarded-proto header is present, and if so, convert the root url to https.
And if there are multiple hosts in the x-forwarded-host or multiple protocols in the x-forwarded-proto, the first one is used.
c                   > TR                   R                  U 5      nU(       a"  UR                  S5      S   R                  5       $ g )N,r   )r   rZ   splitstrip)header_nameheader_valuer}   s     rC   get_first_header_value,get_root_url.<locals>.get_first_header_valueu  s<    **;7%%c*1-3355rF   /zx-forwarded-hosthttp://N)queryzx-forwarded-protohttpszhttps://r   )path)r   rf   )client_utilsis_http_url_likerstriprf   r   httpxURL	copy_withreplacelenr   )r}   
route_pathr   r   x_forwarded_hostroot_urls   `     rC   get_root_urlr   d  s/   " \229==$$-.@A/?)*+SEUHyy"H!!!-H8}##C(H12g=##Iz:""3'J
:#3.s:./s#Hyy"HX]]i/%%9%5x=$$rF   c                t     U R                  U5      $ ! [        [        4 a    U R                  S5      s $ f = f)Nlatin-1)decodeUnicodeDecodeErrorLookupError)srccodecs     rC   _user_safe_decoder    s9    %zz%  , %zz)$$%s    !77c                  N   ^  \ rS rSrSrSSSS.         SU 4S jjjrSrU =r$ )GradioUploadFilei  z UploadFile with a sha attribute.Nsizefilenamer   c                  > [         TU ]  XX4S9  [        R                  " 5       U l        U R                  R                  [        R                  5        g )Nr  )superrD   hashlibsha256shar9   r%   	hash_seed)r?   filer  r  r   	__class__s        rC   rD   GradioUploadFile.__init__  s<     	8M>>#(223rF   )r  )
r  r   r  
int | Noner  r   r   zHeaders | Nonerq   None)rs   rt   ru   rv   rw   rD   rx   __classcell__)r  s   @rC   r  r    sK    *  #"&
4
4 	
4
 
4  
4 

4 
4rF   r  T)frozenc                  *    \ rS rSr% S\S'   S\S'   Srg)FileUploadProgressUniti  rf   r  int
chunk_sizerp   Nrs   rt   ru   rv   __annotations__rx   rp   rF   rC   r  r    s    MOrF   r  c                  *    \ rS rSr% S\S'   S\S'   Srg)FileUploadProgressTrackeri  zdeque[FileUploadProgressUnit]r   rr   is_donerp   Nr  rp   rF   rC   r  r    s    ((MrF   r  c                      \ rS rSrSrg)!FileUploadProgressNotTrackedErrori  rp   Nr   rp   rF   rC   r   r     r   rF   r   c                      \ rS rSrSrg) FileUploadProgressNotQueuedErrori  rp   Nr   rp   rF   rC   r"  r"    r   rF   r"  c                  Z    \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
S	rg
)FileUploadProgressi  c                    0 U l         g r7   	_statusesr^   s    rC   rD   FileUploadProgress.__init__  s	    ?ArF   c                f    XR                   ;  a"  [        [        5       S5      U R                   U'   g g )NF)r'  r  r   r?   	upload_ids     rC   trackFileUploadProgress.track  s(    NN*(A%'5(QDNN9% +rF   c           	        XR                   ;  a  U R                  U5        U R                   U   R                  n[        U5      S:X  a%  UR	                  [        U[        U5      5      5        g UR                  5       nUR                  U:w  a%  UR	                  [        U[        U5      5      5        g UR	                  [        UUR                  [        U5      -   5      5        g )Nr   )	r'  r,  r   r   appendr  popleftr  r  )r?   r+  r  message_bytesqueue	last_units         rC   r/  FileUploadProgress.append  s    NN*JJy!y)//u:?LL/#m:LMNI!!X-3Hc->PQR* !,,s=/AArF   c                l    XR                   ;  a  U R                  U5        SU R                   U   l        g NT)r'  r,  r  r*  s     rC   set_doneFileUploadProgress.set_done  s)    NN*JJy!,0y!)rF   c                f    XR                   ;  a
  [        5       eU R                   U   R                  $ r7   )r'  r   r  r*  s     rC   r  FileUploadProgress.is_done  s*    NN*355~~i(000rF   c                >    XR                   ;   a  U R                   U	 g g r7   r&  r*  s     rC   stop_tracking FileUploadProgress.stop_tracking  s    &y) 'rF   c                    XR                   ;  a
  [        5       e U R                   U   R                  R                  5       $ ! [         a  n[        5       UeS nAff = fr7   )r'  r   r   rn   
IndexErrorr"  )r?   r+  es      rC   rn   FileUploadProgress.pop  sS    NN*355	<>>),226688 	<24!;	<s   &A 
AAAr&  Nrq   r  )r+  rf   )r+  rf   r  rf   r1  bytes)r+  rf   rq   r  )rs   rt   ru   rv   rD   r,  r/  r7  r  r<  rn   rx   rp   rF   rC   r$  r$    s'    BR&1
1
*<rF   r$  c                      \ rS rSrSrSrSSSSS.               SS jjrSS jrSS	 jrSS
 jr	SS jr
SS jrSS jrSS jrSS jrSS jrSrg)GradioMultiPartParseri  a  Vendored from starlette.MultipartParser.

Thanks starlette!

Made the following modifications
    - Use GradioUploadFile instead of UploadFile
    - Use NamedTemporaryFile instead of SpooledTemporaryFile
    - Compute hash of data as the request is streamed

i   i  N)	max_files
max_fieldsr+  upload_progressc                   Xl         X l        X0l        X@l        / U l        XPl        X`l        SU l        SU l        Xpl	        SU l
        SU l        [        5       U l        SU l        / U l        / U l        / U l        g )Nr   rF   r   )r   r   rF  rG  r:   r+  rH  _current_files_current_fieldsmax_file_size_current_partial_header_name_current_partial_header_valuer   _current_part_charset_file_parts_to_write_file_parts_to_finish_files_to_close_on_error)r?   r   r   rF  rG  r+  rH  rL  s           rC   rD   GradioMultiPartParser.__init__  sy     "$?A
". *36)47**_GI!:<"EG%rF   c                "    [        5       U l        g r7   )r   rO  r^   s    rC   on_part_begin#GradioMultiPartParser.on_part_begin  s    *_rF   c                l   XU nU R                   bE  U R                   R                  U R                  U R                  R                  R
                  U5        U R                  R                  c   U R                  =R                  U-  sl        g U R                  R                  U R                  U45        g r7   )rH  r/  r+  rO  r  r  r   rQ  )r?   r   startendr1  s        rC   on_part_data"GradioMultiPartParser.on_part_data  s    3+  ''""''00
 ""*##}4#%%,,d.@.@--PQrF   c           	        U R                   R                  cc  U R                  R                  U R                   R                  [        U R                   R                  [        U R                  5      5      45        g U R                  R                  U R                   5        U R                  R                  U R                   R                  U R                   R                  45        g r7   )
rO  r  r:   r/  
field_namer  r   rf   rP  rR  r^   s    rC   on_part_end!GradioMultiPartParser.on_part_end*  s    ""*JJ&&11%d&8&8&=&=s4==?QR &&--d.@.@A JJt11<<d>P>P>U>UVWrF   c                2    U =R                   XU -  sl         g r7   )rM  r?   r   rY  rZ  s       rC   on_header_field%GradioMultiPartParser.on_header_field9  s    ))T_<)rF   c                2    U =R                   XU -  sl         g r7   )rN  rb  s       rC   on_header_value%GradioMultiPartParser.on_header_value<  s    **do=*rF   c                    U R                   R                  5       nUS:X  a  U R                  U R                  l        U R                  R
                  R                  XR                  45        SU l         SU l        g )Ns   content-dispositionrF   )rM  lowerrN  rO  content_dispositionitem_headersr/  )r?   fields     rC   on_header_end#GradioMultiPartParser.on_header_end?  sk    11779**595W5WD2''..667	
 -0)-0*rF   c           	     @   [        U R                  R                  =(       d    S5      u  p [        US   [	        U R
                  5      5      U R                  l        SU;   a  U =R                  S-  sl	        U R                  U R                  :  a  [        SU R                   S35      e[        US   [	        U R
                  5      5      n[        SS	9nU R                  R                  U5        [        US
U[        U R                  R                   S9S9U R                  l        g U =R$                  S-  sl        U R$                  U R&                  :  a  [        SU R&                   S35      eS U R                  l        g ! [         a  n[        S5      UeS nAff = f)NrF   s   namez=The Content-Disposition header field "name" must be provided.s   filename   z+Too many files. Maximum number of files is .F)deleter   )raw)r  r  r  r   z-Too many fields. Maximum number of fields is )r   rO  rj  r  rf   rP  r^  r   r   rJ  rF  r   rS  r/  r  r   rk  r  rK  rG  )r?   _optionsr@  r  tempfiles         rC   on_headers_finished)GradioMultiPartParser.on_headers_finishedI  sz   )$*<*<*P*P*WTWX
	,= #dmm"4-D) '!1$""T^^3(A$..AQQRS  ))=s4==?QRH)7H))00:&6!D$6$6$C$CD	'D#   A% ##doo5(CDOOCTTUV  '+D#3  	$O	s   1F 
FFFc                    g r7   rp   r^   s    rC   on_endGradioMultiPartParser.on_endj  s    rF   c           	       #    [        U R                  S   5      u  pUR                  SS5      n[        U[        5      (       a  UR                  S5      nX0l         US   nU R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                   S.n[#        XF5      n U R$                    S h  vN nUR'                  U5        U R(                   H  u  pU	R*                  (       d   eU	R*                  R'                  U
5      I S h  vN   U	R*                  R,                  R/                  U
5        [0        R2                  " U	R*                  R*                  R4                  5      R6                  U R8                  :  d  M  U R:                  b%  U R:                  R=                  U R>                  5        [        SU R8                   S	35      e   U R@                   H9  n	U	R*                  (       d   eU	R*                  RC                  S
5      I S h  vN   M;     U R(                  RE                  5         U R@                  RE                  5         GM  ! [         a  n[        S5      UeS nAff = f GN GNf Nc
 OZ! [         aM  nU RF                   H6  nURI                  5         [K        UR4                  5      RM                  5         M8     UeS nAff = fURO                  5         U R:                  b%  U R:                  R=                  U R>                  5        [Q        U RR                  5      $ 7f)NzContent-Types   charsetzutf-8r   s   boundaryzMissing boundary in multipart.)rV  r[  r_  rc  rf  rm  rw  rz  z+File size exceeded maximum allowed size of z bytes.r   )*r   r   rZ   r;   rC  r   rP  r   r   rV  r[  r_  rc  rf  rm  rw  rz  r   r   writerQ  r  r  r9   osstatr   st_sizerL  rH  r7  r+  rR  seekclearrS  closer   unlinkfinalizer   r:   )r?   rt  paramscharsetboundaryr@  	callbacksparserchunkpartr   excr  s                rC   parseGradioMultiPartParser.parsem  s    (n)EF	**Z1gu%%nnY/G	Nk*H "// --++#33#33!//#'#;#;kk	
	 !5	#{{ 3eU# #'";";JD99$9))//$///IIMM((.wwtyy~~223;;d>P>PP//; 0099$..I0I$J\J\I]]de  #< !66D99$9))..+++ 7 ))//1**002Q  	N$%EFAM	N&3 0 ,'  +, " 	55

TYY&&( 6 I	 	+  ))$..9

##s   AMI5 !A&MJ JJJAJ 0J1A3J (BJ 5J6?J 5
J?JJMJJ J J M
K4'AK//K44AM)rP  rK  rJ  rO  rM  rN  rR  rQ  rS  r   r:   rG  rL  rF  r   r+  rH  )r   r   r   zAsyncGenerator[bytes, None]rF  Union[int, float]rG  r  r+  r   rH  zFileUploadProgress | NonerL  zint | floatrq   r  rB  )r   rC  rY  r  rZ  r  rq   r  )rq   r   )rs   rt   ru   rv   rw   rL  rD   rV  r[  r_  rc  rf  rm  rw  rz  r  rx   rp   rF   rC   rE  rE    s    	  M (,(, $59HH ,H
 %H &H H 3H #H 
H:-RX=>1+B<$rF   rE  c                V    [        XSS9 H  u  p#[        R                  " X#5        M     g )NF)strict)zipshutilmove)filesdestinationsr  dests       rC   move_uploaded_files_to_cacher    s!    %e<
D =rF   c                n    U R                  S5      nUb  X!:w  a  XS'   [        R                  " XU5      n U $ )z
Updates the root "key" in the config dictionary to the new root url. If the
root url has changed, all of the urls in the config that correspond to component
file urls are updated to use the new root url.
root)rZ   r%   add_root_url)configr  previous_roots      rC   update_root_in_configr    s;     JJv&M 5v!..v]KMrF   c                >    SS jn[         R                  " U US 5      $ )zK
Updates the example values in the api_info dictionary to use a public url
c                    U R                  S5      nUbF  [        R                  " U5      (       a+  [        R                  " US   5      (       a  U $ U S   S   US'   U $ )Nparameter_defaultr   example_input)rZ   r   is_file_obj_with_urlr   )	file_dictdefault_values     rC   _add_root_url>update_example_values_to_use_public_url.<locals>._add_root_url  sf    !&9:$)J)J*
 *
 ,,]5-ABB   $-_#=e#DM% rF   c                :    [        U [        5      =(       a    SU ;   $ )Nr  )r;   r<   )r   s    rC   <lambda>9update_example_values_to_use_public_url.<locals>.<lambda>  s    *Q%B*=*BBrF   )r  r<   )r   traverse)api_infor  s     rC   'update_example_values_to_use_public_urlr    s%    
   B rF   c                h    [         R                  " U R                  5       UR                  5       5      $ r7   )hmaccompare_digestencode)input_passwordcorrect_passwords     rC   compare_passwords_securelyr    s(    ~4468H8O8O8QRRrF   c                6    Sn[         R                  " X5      SL$ )zThis regex matches strings that start with a scheme (one or more characters not including colon, slash, or space)
followed by ://, or start with just //, \/, /\, or \ as they are interpreted as SMB paths on Windows.
z0^(?:[a-zA-Z][a-zA-Z0-9+\-.]*://|//|\\\\|\\/|/\\)N)rematch)stringpatterns     rC   starts_with_protocolr    s     BG88G$D00rF   c                    U (       d  gSU ;  a  SU -   n  [        U 5      R                  =(       d    S$ ! [         a     gf = f)z
Returns the hostname of a given url, or an empty string if the url cannot be parsed.
Examples:
    get_hostname("https://www.gradio.app") -> "www.gradio.app"
    get_hostname("localhost:7860") -> "localhost"
    get_hostname("127.0.0.1") -> "127.0.0.1"
r   z://r   )r   hostname	Exception)r   s    rC   get_hostnamer    sG     C#o}%%++ s   3 
A A c                      \ rS rSr S     SS jjrSS jrSS jr          SS jr        SS jrSS jr	\
SS j5       rS	rg
)CustomCORSMiddlewarei  c                   Xl         SU l        SR                  U R                  5      [        S5      SS.U l        SS0U l        / SQU l        U(       a  [        R                  " S5      b  U R                  R                  S	5        g g )
N)DELETEGETHEADOPTIONSPATCHPOSTPUTz, iX  true)zAccess-Control-Allow-MethodszAccess-Control-Max-Age Access-Control-Allow-Credentialsr  )	localhostz	127.0.0.1z0.0.0.0GRADIO_LOCAL_DEV_MODEnull)
r   all_methodsjoinrf   preflight_headerssimple_headerslocalhost_aliasesr~  getenvr/  )r?   r   strict_corss      rC   rD   CustomCORSMiddleware.__init__  s}    
 W,0IId6F6F,G&)#h06"

  B6J!Fbii(?@L ""))&1	 MrF   c                d  #    US   S:w  a  U R                  XU5      I S h  vN   g [        US9nUR                  S5      nUc  U R                  XU5      I S h  vN   g US   S:X  a'  SU;   a!  U R                  US9nU" XU5      I S h  vN   g U R	                  XX4S9I S h  vN   g  N NP N" N7f)	Ntypehttpscopeoriginmethodr  zaccess-control-request-method)request_headers)r   r   rZ   preflight_responsesimple_response)r?   r  receivesendr   r  responses          rC   __call__CustomCORSMiddleware.__call__  s     =F"((54000&X&>((54000?i',Kw,V..w.GH54000""54"QQQ 1
 1 1QsE   B0B(7B0B*/B0	B,
B0"B.#B0*B0,B0.B0c                    [        U R                  5      nUS   nU R                  U5      (       a  X2S'   UR                  S5      nUb  XBS'   [	        SSUS9$ )NOriginAccess-Control-Allow-Originzaccess-control-request-headerszAccess-Control-Allow-HeadersOK   )status_coder   )r<   r  is_valid_originrZ   r   )r?   r  r   r  requested_headerss        rC   r  'CustomCORSMiddleware.preflight_response  sf    t--. *005;12+//0PQ(6G23 3HHrF   c                   #    [         R                  " U R                  X4S9nU R                  XU5      I S h  vN   g  N7f)N)r  r  )	functoolspartial_sendr   )r?   r  r  r  r  s        rC   r  $CustomCORSMiddleware.simple_response'  s1        $Xhhut,,,s   5?=?c                ,  #    US   S:w  a  U" U5      I S h  vN   g UR                  S/ 5        [        US9nUR                  U R                  5        US   nU R	                  U5      (       a  U R                  XE5        U" U5      I S h  vN   g  Nx N7f)Nr  zhttp.response.startr   r  r  )
setdefaultr   r9   r  r  allow_explicit_origin)r?   messager  r  r   r  s         rC   r  CustomCORSMiddleware._send-  s      6?33w-9b) w/t**+ *00&&w77m   	s"   BBA2B
BBBc                    US   nUS   n[        U5      n[        U5      nX@R                  ;  =(       d    XPR                  ;   $ )Nr  Host)r  r  )r?   r  r  r   	host_nameorigin_names         rC   r  $CustomCORSMiddleware.is_valid_origin;  sN     *v& &	"6* 333 5444	
rF   c                .    XS'   U R                  S5        g )Nr  r  )add_vary_header)r   r  s     rC   r  *CustomCORSMiddleware.allow_explicit_originF  s    17-.)rF   )r  r   r  r  r  N)T)r   r    r  rr   rq   r  )r  r#   r  r"   r  r$   rq   r  )r  r   rq   r   )
r  r#   r  r"   r  r$   r  r   rq   r  )r  r!   r  r$   r  r   rq   r  )r  r   rq   rr   )r   r   r  rf   rq   r  )rs   rt   ru   rv   rD   r  r  r  r  r  staticmethodr  rx   rp   rF   rC   r  r    s     !22 2 
	2*RI--%,-48-KR-	-&*=D		
 * *rF   r  c           	     >   [        5       nU R                  R                  5        H'  nUR                  [	        US[        5       5      5        M)     U R
                   H  n[        5       nU H  nXb;   a  M
   [        U5      n[        R                  " UR                  5       R                  5      nUb&  [        R                  " 5       U-
  R                  U:  a)  [        R                  " U5        UR                  U5        M  M     XE-  nM     g! [          a     M  f = f)zGDelete files that are older than age. If age is None, delete all files.keep_in_cacheN)setr   rT   r9   r   temp_file_setsr   r   fromtimestamplstatst_ctimenowsecondsr~  r   addFileNotFoundError)	r   agedont_delete	componenttemp_set	to_remover  	file_pathmodified_times	            rC   delete_files_created_by_appr  L  s    %K]]))+	79osuEF ,)) E	D" J	 ( 6 6y7H7Q7Q R;8<<>M#A"J"JS"PIIdOMM$' #Q  	 * % s   6B	D
DDc                   #     [         R                  " U5      I Sh  vN   [        R                  R	                  [
        U R                  5       U5      I Sh  vN   M[   NA N7f)zVStartup task to delete files created by the app based on time since last modification.N)asynciosleepanyio	to_threadrun_syncr  r   r   	frequencyr  s      rC   delete_files_on_scheduler  c  sQ     
mmI&&&oo&&')93
 	
 	
 &	
s!   A#A:A#A!A#!A#c                  #    [         R                  " [        XU5      5        S7v   [        U R	                  5       SS9  g7f)zKA context manager that triggers the startup and shutdown events of the app.N)r  )r  create_taskr  r  r   r  s      rC   _lifespan_handlerr   l  s1     
 0EF	 0d;s   ?Ac                   #     U R                   R                  5         [        R                  " S5      I Sh  vN   M:   N7f)z&Delete all expired state every second.rp  N)r   delete_all_expired_stater  r  r   s    rC   _delete_stater$  v  s4     
113mmA s   5A >A c               T   #    [         R                  " [        U 5      5        S7v   g7f)z9When the server launches, regularly delete expired state.N)r  r  r$  r#  s    rC   _delete_state_handlerr&  }  s      c*+	s   &(c                2   ^ ^^ [         SUUU 4S jj5       nU$ )zWReturn a context manager that applies _lifespan_handler and user_lifespan if it exists.c                 >#    [        5        IS h  vN nUR                  [        U 5      5      I S h  vN   T(       a+  T(       a$  UR                  [        U TT5      5      I S h  vN   Tb  UR                  T" U 5      5      I S h  vN   S 7v   S S S 5      IS h  vN   g  N Np N@ N  N! , IS h  vN  (       d  f       g = f7fr7   )r   enter_async_contextr&  r   )r   stackr  r  user_lifespans     rC   _handler)create_lifespan_handler.<locals>._handler  s     !##u++,A#,FGGGS//0A#yRU0VWWW(//c0BCCC $##GWC $###sx   CB#CB-B%1B-&B''!B-B)		B-CB+C%B-'B-)B-+C-C3B64C Cr   r2   )r	   )r+  r  r  r,  s   ``` rC   create_lifespan_handlerr/    s#        OrF   c                  2    \ rS rSrSSS jjrS	S jrS rSrg)
MediaStreami  Nc                d    / U l         S U l        SU l        SU l        SU l        SU l        Xl        g )NFr   ze#EXTM3U
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
   )segmentscombined_fileendedsegment_indexplaylistmax_durationdesired_output_format)r?   r:  s     rC   rD   MediaStream.__init__  s8    02)-
 E%:"rF   c                   #    U(       d  g [        [        R                  " 5       5      nU R                  R	                  SU0UE5        [        U R                  US   5      S-   U l        g 7f)Nr   durationrp  )rf   uuiduuid4r4  r/  maxr9  )r?   r   
segment_ids      rC   add_segmentMediaStream.add_segment  sV     &
dJ7$78 1 14
3CDqHs   A(A*c                    SU l         g r6  )r6  r^   s    rC   r   MediaStream.end_stream  s	    
rF   )r5  r:  r6  r9  r8  r7  r4  r7   )r:  r   )r   zMediaStreamChunk | None)rs   rt   ru   rv   rD   rB  r   rx   rp   rF   rC   r1  r1    s    ;IrF   r1  )r   r.   r   r   r   r)   rq   r-   )r   r*   r   r-   r~   zOptional[str]r}   zOptional[fastapi.Request])r   r2   r   r*   )r   r/   r   r*   rq   r1   )
r   r2   r   r*   r   zUnion[Request, list[Request]]r   r-   r   rf   )r}   zfastapi.Requestr   rf   r   r   rq   rf   )r  rC  r  rf   rq   rf   )r  	list[str]r  rF  rq   r  )r  r'   r  rf   rq   r'   )r  r   rq   r   )r  rf   r  rf   rq   rr   )r  rf   rq   rr   )r   rf   rq   rf   )r   r.   r  r  rq   r  )r   r2   r  r  r  r  rq   r  )rp  rp  )r   r2   r  r  r  r  rq   r   r.  )r+  z3Callable[[App], AbstractAsyncContextManager] | Noner  r  r  r  rq   z,Callable[[App], AbstractAsyncContextManager])y
__future__r   r  r  r  r  r   r~  r   r  r  	threadingr>  collectionsr   collections.abcr   r   
contextlibr   r   r	   dataclassesr
   python_dataclassr   pathlibr   rv  r   r   typingr   r   r   r   r   urllib.parser   r  fastapigradio_client.utilsr&   r   r   gradio_client.documentationr   python_multipart.multipartr   r   starlette.datastructuresr   r   r   r   starlette.formparsersr   r   starlette.responsesr   r   starlette.typesr    r!   r"   r#   r$   gradior%   gradio.data_classesr'   r(   r)   r*   gradio.exceptionsr+   gradio.state_holderr,   gradio.blocksr-   r.   r/   r   r1   gradio.routesr2   Lockconfig_lock
API_PREFIXr4   rz   r  r   r   r   r   r   r   r   r  r  r  r  r   r"  r$  rE  r  r  r  r  r  r  r  r  r  r   r$  r&  r/  r1  rp   rF   rC   <module>rb     s   "      	  	     4 W W 5   >  "   *  0 L R R C ; B B *  $ ,AA(! nn
9 9x 
X X Xv		 	"&
  '	6#0
 4	4
4 .4 		4
 4n+%+%*-+%:D+%+%\%4z 4    
   
		 		y 	/< /<dz$ z$z 

2S1$T* T*n.
 -.<	<<'*<< < 
 
 F 
 2	( rF   