
    +ji                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lm Z  d d
l!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+Z,d dl-Z-d dl.Z.d dl.m/Z/ e"rd dl0m1Z1 dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAdZBe/jC        e/jD        e/jE        e/jF        e/jG        gZH ejI        d          ZJ G d de&d          ZKdd"ZL eL            ZM G d# d$eN          ZO G d% d&eN          ZP G d' d(eN          ZQ G d) d*eN          ZR G d+ d,eSe          ZT G d- d.e          ZUe G d/ d0                      ZVe G d1 d2                      ZWe G d3 d4                      ZX e%d5eWeXz            ZYd6 ZZe G d7 d8                      Z[e G d9 d:                      Z\dd<Z]dd>Z^dd?Z_ddPZ`ddVZaddWZbddYZcdd[Zdd\ Zeddd`Zf	 dddcZgddeZhddgZiddjZjddmZkddoZlddqZmdddrZnddtZodddxZpddzZq	 	 	 ddd}ZrdddZsddZt	 	 dddZuddZv G d dew          ZxddZyg dZzezd         Z{ddZ|ddZ}ddZ~ddZddZddZddZddZdddZddZddZddZddZddZh dZddZddZddZddZdS )    )annotationsN)deque)Callable	Coroutine)	dataclassfield)datetime)Enum)Path)Lock)	TYPE_CHECKINGAnyLiteralNewType	TypedDictUnionget_args
get_originget_type_hints)
SpaceStage)ParameterInfozapi/predict/z
queue/joinz
queue/datauploadloginconfigzinfo?all_endpoints=Truezinfo?serialize=Falsez0https://gradio-space-api-fetcher-v2.hf.space/apiresetzhttps://hf.space/{}zheartbeat/{session_hash}cancelstatez[<>:"/\\|?*\x00-\x1f\x7f`$!{}]c                  t    e Zd ZU ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   dS )Messagestrmsgdict[str, Any]outputevent_idintrankfloatrank_eta
queue_sizeboolsuccess
list[dict]progress_dataloglevelN)__name__
__module____qualname____annotations__     W/home/wildlama/visual-decline/.venv/lib/python3.11/site-packages/gradio_client/utils.pyr   r   O   sp         HHHMMMIIIOOOOOOMMMHHHJJJJJr5   r   F)totalreturnr    c                     	 t          j        t          d                              d                                          } t          j        |           }|                    dd          }|S # t          $ r Y dS w xY w)Nzpackage.jsonutf-8version )	pkgutilget_datar0   decodestripjsonloadsget	Exception)package_json_datapackage_datar;   s      r6   get_package_versionrG   \   s    X~66==gFFLLNN 	 z"344""9b11   rrs   A*A- -
A;:A;c                      e Zd ZdZdS )TooManyRequestsErrorz.Raised when the API returns a 429 status code.Nr0   r1   r2   __doc__r4   r5   r6   rI   rI   k   s        88Dr5   rI   c                      e Zd ZdZdS )
QueueErrorzMRaised when the queue is full or there is an issue adding a job to the queue.NrJ   r4   r5   r6   rM   rM   q   s        WWDr5   rM   c                      e Zd ZdZdS )InvalidAPIEndpointErrorz(Raised when the API endpoint is invalid.NrJ   r4   r5   r6   rO   rO   w   s        22Dr5   rO   c                      e Zd ZdZdS )SpaceDuplicationErrorz:Raised when something goes wrong with a Space Duplication.NrJ   r4   r5   r6   rQ   rQ   }   s        DDDr5   rQ   c                  F    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdS )ServerMessage	send_hash
queue_full
estimation	send_dataprocess_startsprocess_generatingprocess_completedr.   progress	heartbeatzServer stopped unexpectedly.unexpected_errorclose_streamprocess_streamingN)r0   r1   r2   rT   rU   rV   rW   rX   rY   rZ   r.   r[   r\   server_stoppedr]   r^   r_   r4   r5   r6   rS   rS      sZ        IJJI%N-+
CHI3N)!L+r5   rS   c                  v    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZedd            ZddZedd            ZdS )Statusz'Status codes presented to client users.STARTINGJOINING_QUEUE
QUEUE_FULLIN_QUEUESENDING_DATA
PROCESSING	ITERATINGPROGRESSFINISHED	CANCELLEDLOGstatusr8   r%   c           
        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j	        t           j
        g
}|                    |           S )z'Order of messages. Helpful for testing.)rb   rc   rd   re   rf   rg   rh   rj   ri   rk   rl   index)rn   orders     r6   orderingzStatus.ordering   sW     O OOO
 {{6"""r5   otherc                Z    |                      |           |                      |          k     S N)rr   )selfrs   s     r6   __lt__zStatus.__lt__   s%    }}T""T]]5%9%999r5   r!   r    c                   t           j        t          j        t           j        t          j        t           j        t          j        t           j        t          j	        t           j
        t          j        t           j        t          j        t           j        t          j        t           j        t          j        t           j        t          j        t           j        t          j        i
|          S )zKMap the raw message from the backend to the status code presented to users.)rS   rT   rb   rd   rU   re   rV   rf   rW   rg   rX   rh   rY   ri   rZ   rk   r[   rj   r.   rm   r`   )r!   s    r6   msg_to_statuszStatus.msg_to_status   s     #V%9$f&7$fo#V%8(&*;,f.>+V_"FOvz(&/
  	r5   N)rn   rb   r8   r%   )rs   rb   )r!   r    r8   rb   )r0   r1   r2   rK   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   staticmethodrr   rw   ry   r4   r5   r6   rb   rb      s        11H#MJH!LJIHHI
C# # # \# : : : :    \  r5   rb   c                  Z    e Zd ZU ded<   ded<   ded<   ded<   ded<   edd            ZdS )ProgressUnit
int | Nonerp   length
str | Noneunitfloat | Noner[   descdatar,   r8   list[ProgressUnit]c                       fd|D             S )Nc                    g | ]q} |                     d           |                     d          |                     d          |                     d          |                     d                    rS )rp   r~   r   r[   r   )rp   r~   r   r[   r   rC   ).0dclss     r6   
<listcomp>z)ProgressUnit.from_msg.<locals>.<listcomp>   s     	
 	
 	
  CeeGnnuuXUU6]]z**UU6]]  	
 	
 	
r5   r4   )r   r   s   ` r6   from_msgzProgressUnit.from_msg   s0    	
 	
 	
 	
 	
 	
 	
 		
r5   N)r   r,   r8   r   )r0   r1   r2   r3   classmethodr   r4   r5   r6   r|   r|      sp         

 

 

 [

 

 

r5   r|   c                  v    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ed<   dZded<   dZded<   dS )StatusUpdateIUpdate message sent from the worker thread to the Job on the main thread.rb   coder}   r&   r)   r   etazbool | Noner+   zdatetime | Nonetimezlist[ProgressUnit] | Noner-   Nztuple[str, str] | Noner.   rn   zLiteral['status', 'output']type)r0   r1   r2   rK   r3   r.   r   r4   r5   r6   r   r      s         SSLLL,,,,"&C&&&&(0D000000r5   r   c                  D    e Zd ZU dZded<   ded<   dZded<   d	Zded
<   dS )OutputUpdater   	list[Any]outputsr*   r+   r#   zLiteral['output']r   FfinalN)r0   r1   r2   rK   r3   r   r   r4   r5   r6   r   r      sO         SSMMM&D&&&&Er5   r   Updatec            	     d    t          t          j        d d d d t          j                    d           S )N)r   r&   r)   r   r+   r   r-   )r   rb   rc   r	   nowr4   r5   r6   create_initial_status_updater      s6    _\^^   r5   c                  X    e Zd ZU dZ ee          Zded<    ee          Z	ded<   dS )	JobStatuszpThe job status.

    Keeps track of the latest status update and intermediate outputs (not yet implements).
    default_factoryr   latest_statusr   r   N)
r0   r1   r2   rK   r   r   r   r3   listr   r4   r5   r6   r   r     s[          
 #(%8T"U"U"UMUUUUt444G444444r5   r   c                      e Zd ZU dZded<   ded<   ded<   ded	<   d
Zded<   dZded<   d
Zded<   dZded<    e	e
j                  Zded<   dS )CommunicatorzKHelper class to help communicate between the worker thread and main thread.r   lockr   jobzCallable[..., tuple]prediction_processorr    	reset_urlFr*   should_cancelNr   r$   thread_completedict[str, str] | Nonerequest_headersr   zasyncio.Queue[Update]updates)r0   r1   r2   rK   r3   r   r$   r   r   r   asyncioQueuer   r4   r5   r6   r   r     s         UUJJJNNN....NNNMH!O!!!!-1O1111%*U7=%I%I%IGIIIIIIr5   r   r*   c                Z    t          | t                    sdS |                     d          S )zN
    Check if the given value is a string that looks like an HTTP(S) URL.
    F)zhttp://zhttps://)
isinstancer    
startswithpossible_urls    r6   is_http_url_liker   %  s0     lC(( u""#:;;;r5   r   c                (   ddi}	 t          j                    5 }t          j        | |          }|j        dk    r(|                    | |          j        cddd           S |j        cddd           S # 1 swxY w Y   dS # t          $ r Y dS w xY w)zb
    Probe the given URL to see if it responds with a 200 status code (to HEAD, then to GET).
    z
User-Agentz8gradio (https://gradio.app/; gradio-team@huggingface.co)headersi  NF)httpxClientheadstatus_coderC   
is_successrD   )r   r   clienthead_requests       r6   	probe_urlr   .  s    WXG\^^ 	+v :lGDDDL'3..zz,z@@K	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+  *		+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+
    uus@   B =A6B #A6)B 6A::B =A:>B 
BBc                f    t          j        d           t          |           ot          |           S )z3
    Check if the given string is a valid URL.
    z^is_valid_url should not be used. Use is_http_url_like() and probe_url(), as suitable, instead.)warningswarnr   r   r   s    r6   is_valid_urlr   =  s;     M	H   L))Ei.E.EEr5   r   httpx.Clientr   dict	hash_datahelpersse_urlsse_data_urlr   dict[str, str]cookiesr   
ssl_verifyexecutor%concurrent.futures.ThreadPoolExecutordict[str, Any] | Nonec
                   d|_         |	                    t          ||||          }
|	                    t          | |||||||	  	        }t          j                            |
|gt          j        j                  \  }}d|_         t          |          dk    r t          dt          |           d          |D ]}|
                                c S d S NF)return_whenT   zDid not expect z tasks to be done.)r   submitcheck_for_cancelstream_sse_v0
concurrentfutureswaitFIRST_COMPLETEDlen
ValueErrorresult)r   r   r   r   r   r   r   r   r   r   future_cancel
future_ssedone_futures                  r6   get_pred_from_sse_v0r   H  s     #FOO&'7J M 
 
J  %%	
#&6 &  GD! "F
4yyA~~H3t99HHHIII  }} r5   pending_messages_per_event dict[str, deque[Message | None]]r$   protocol'Literal['sse_v1', 'sse_v2', 'sse_v2.1']c                   d| _         |                    t          | |||          }|                    t          | |||          }	t          j                            ||	gt          j        j                  \  }
}d| _         t          |
          dk    r t          dt          |
           d          |
D ]/}|
                                }|r||                                c S d S r   )r   r   r   stream_sse_v1plusr   r   r   r   r   r   	exceptionr   )r   r   r   r   r$   r   r   r   r   r   r   r   r   r   s                 r6   get_pred_from_sse_v1plusr   o  s    #FOO&'7J M 6#=x J  %%	
#&6 &  GD! "F
4yyA~~H3t99HHHIII  $$&&	 	O}}	 r5   c                t   	 t          j        d           | j        5  | j        r	 d d d            n>| j        rt
          j                                        	 d d d            n# 1 swxY w Y   n| j        r%t          j
        | j        d| j        i|||           t
          j                                        )NT皙?r$   )rA   r   r   verify)r   sleepr   r   r   r   r   CancelledErrorr$   r   postr   )r   r   r   r   s       r6   r   r     s&   :
4[ 	: 	:# 	: 	: 	: 	: 	: 	: 	: % : (77999:	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	::  

fo.	
 	
 	
 	
 

+
+
-
--s   	A$%A$$A(+A(r"   c                >   	 |                      d||||          5 }|                                D ]}	|	                    d          }	t          |	          dk    r,|	                    d          rZt          j        |	dd                    }
|
d         t          j        t          j	        fv r|j
        5  d|
v }t          t                              |
d                   |
                    d	          |
                    d
d           |
                    d          t          j                    |
                    d          |r t"                              |
d                   nd           }|
                    di                               dg           }|rZ|j        t          j        k    rE	  |j        | }n# t,          $ r}|g}Y d }~nd }~ww xY w|j        j                            |           ||j        _        d d d            n# 1 swxY w Y   |j        rt8          j                                        |
d         dk    rt?          d          |
d         dk    rD|
d         }||_         | !                    |d|i||||          }|"                                 x|
d         dk    r|
d         c cd d d            S tG          d|	           	 d d d            n# 1 swxY w Y   tG          d          # t8          j        j        $ r  w xY w)NGET)paramsr   r   
r   data:   r!   r-   r)   r&   r+   r(   )r   r)   r&   r+   r   r   r-   r#   r   rU   z Queue is full! Please try again.rW   r$   )rA   r   r   rZ   zUnexpected message: z*Did not receive process_completed message.)$stream
iter_linesrstripr   r   rA   rB   rS   r.   r\   r   r   rb   ry   rC   r	   r   r|   r   r   rk   r   rD   r   r   appendr   r   r   r   r   rM   r$   r   raise_for_statusr   )r   r   r   r   r   r   r   r   responselineresphas_progressstatus_updater#   r   er$   reqs                     r6   r   r     s"   9]]  
 
 5	D  ++-- .D .D{{4((t99>>??7++ *D:d122h//DE{}'8-:Q&RRR  A A'6$'>(4!'!5!5d5k!B!B'+xx'='=!%&$!7!7$(HHY$7$7!) $ 4 4++&,*?*?_@U*V*V*V!%
) 
) 
) "&(B!7!7!;!;FB!G!G! >m&8FO&K&K-)D)Df)M#, - - -*+-"J.55f===3@
0)A A A A A A A A A A A A A A A* - B(0??AAAE{l22()KLLLe33#'
#3*2$kk(",h!L$!L)!L$+$+	 *   ,,....e(;;;#H~--g5	D 5	D 5	D 5	D 5	D 5	D 5	D 5	Dd < %%BD%B%BCCC].D5	D 5	D 5	D 5	D 5	D 5	D 5	D 5	D 5	D 5	D 5	D 5	D 5	D 5	D 5	Dl EFFF,   s   L BK,7C:H2
F=<H=
G	G	
HG	.HK,HK,HB(K,>L K, L ,K00L 3K04L L1Literal['sse_v1', 'sse_v2', 'sse_v2.1', 'sse_v3']c                   	 ||         }d }	 t          |          dk    r|                                }nt          j        d           >|| j        rt
          j                                        | j        5  d }|d         t          j
        k    r2|                    d          }|                    d          }	|r|	r||	f}t          t                              |d                   |                    d          |                    dd           |                    d	          t          j                    |                    d
          d|v r t"                              |d                   nd |          }
|                    di                               dg           }|d         t          j        k    rM|dv rI|t)          |          }n7t+          |          D ]'\  }}||         }t-          ||          }|||<   |||<   (|r|
j        t          j        k    r	  | j        | }n# t4          $ r}|g}Y d }~nd }~ww xY w| j        j                            |           | j                            tA          ||                    d	d                               |
| j        _!        | j                            |
           d d d            n# 1 swxY w Y   |d         t          j"        k    r||= |                    d	d          s(tG          |d         $                                          }n|d         }| j                            tA          |d|                    d	d                               |d         S |d         t          j%        k    rtM          d          # t
          j        j        $ r  w xY w)NTr   r   r!   r.   r/   r)   r&   r+   r(   r-   )r   r)   r&   r+   r   r   r-   r.   r#   r   )sse_v2zsse_v2.1sse_v3)r   r+   )r   r   r+   zServer stopped.)'r   popleftr   r   r   r   r   r   r   rS   r.   rC   r   rb   ry   r	   r   r|   r   rY   r   	enumerate
apply_diffr   rk   r   rD   r   r   r   r   
put_nowaitr   r   rZ   r   itemsr`   r   )r   r   r$   r   pending_messagespending_responses_for_diffsr!   log_messager.   r/   r  r#   ivalueprev_output
new_outputr   r  s                     r6   r   r     s;   O5h?&*#H	4#$$q((&..00
4   {f4{ (77999 ,9 ,9"u:!222''%..CGGG,,E 3u 3'*El ,--c%j99"ww|44..GGI..!
++&#-- #/"7"7O8L"M"M"M#! ! ! 2..2262>>u:!AAAh S G G
 3:6:6ll33(1&(9(9 3 3HAu*Ea*HK)3K)G)GJ=G7:(2F1II m0FOCC%!<!<f!E$ % % %"#%J&--f555N--$VSWWYPT=U=UVVV   ,9
())-888Y,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9Z 5z]<<<.x8wwy$// + "#h-"5"5"7"788FF ]F))  &" #	4 8 8     8}$U};;; !2333QH	4T ,   sc   A6N) 8F&K
H*)K*
I4H<7K<IBKN) KN) KB'N) 'N) )N?c                b    t          j        |           } d }|D ]\  }}} || |||          } | S )Nc                >   t          |          dk    r%|dk    r|S |dk    r| |z   S t          d|           | }t          t          |          dz
            D ]}|||                  }|d         }|dk    r|||<   n|dk    r||xx         |z  cc<   n|dk    r?t          |t                    r$|                    t          |          |           nH|||<   nB|dk    r*t          |t                    r|t          |          = n||= nt          d	|           | S )
Nr   replacer   zUnsupported action: r   adddeletezUnknown action: )r   r   ranger   r   insertr%   )targetpathactionr  currentr  	last_paths          r6   
apply_editzapply_diff.<locals>.apply_editH  sh   t99>>""8##~% !@!@!@AAAs4yy1}%% 	' 	'Ad1g&GGH	Y!&GIxI%'u__'4(( +s9~~u5555%*	""x'4(( 'C	NN++I&&888999r5   )copydeepcopy)objdiffr#  r   r  r  s         r6   r  r  E  sU    
-

C  B  $ 3 3ejdFE22Jr5   	file_pathdirr   c                8   t          |pt          j                              t          j        d          z  }|                    dd           |t          |           j        z  }t          j        | |           t          |
                                          S )N   Texist_okparents)r   tempfile
gettempdirsecrets	token_hexmkdirnameshutilcopy2r    resolve)r(  r)  	directorydests       r6   create_tmp_copy_of_filer:  t  s~    S1H/1122W5Fr5J5JJIOOT4O000tI++D
LD!!!t||~~r5   url_pathtokenc                   |t          j        |d           |rdd|z   ini }t          |pt          j                              t          j        d          z  }|                    dd           |t          |           j        z  }t          j
        d| |d	          5 }|                                 t          |d
          5 }|                                D ]}|                    |           	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          |                                          S )z0Kept for backwards compatibility for 3.x spaces.NTr-  AuthorizationBearer r+  r,  r   )r   follow_redirectswb)osmakedirsr   r/  r0  r1  r2  r3  r4  r   r   r   openiter_rawwriter    r7  )	r;  r<  r)  r   r8  r(  r   fchunks	            r6   download_tmp_copy_of_filerJ  |  s    
C$''''6;C	E 122GS1H/1122W5Fr5J5JJIOOT4O000DNN//I	x4
 
 
 	!!###)T"" 	a!**,,  	 	 	 	 	 	 	 	 	 	 	 	 	 	 		               y  ""###s6   !%D-D 4D D	DD	DDDfilenamec                   |                                  }|                    d          rdS |                    d          rdS t          j        |           d         }|*|                    dd                              dd	          }|S )
Nz.vttztext/vttz.webpz
image/webpr   zx-wavwavzx-flacflac)lowerendswith	mimetypes
guess_typer  )rK  filename_lowermimetypes      r6   get_mimetyperU    s    ^^%%Nv&& zw'' |#H--a0H##GU33;;HfMMOr5   encodingc                    |                      dd          } t          j        |           d         }|dk    rdS |d S t          j        |          }||                    d          r
|dd          }|S )Nz	audio/wavzaudio/x-wavr   z
audio/flacrN  .r   )r  rQ  rR  guess_extensionr   )rV  r   	extensions      r6   get_extensionr[    s    ];;H))!,D|v	t)$//I!5!5c!:!:abbM	r5   
file_types	list[str]c                x   t          |           }|D ]}|dk    r dS |                    d          rj|                    d                                          }t	          |           j                            d                                          }||k    r dS ||                    | d          r dS dS )NfileTrX  /F)rU  r   lstriprO  r   suffix)r(  r\  	mime_type	file_typefile_exts        r6   is_valid_filerf    s    Y''I 	 		44$$ 	!((--3355II-44S99??AAHH$$tt %"y';';yOOO'L'L"445r5   rH  
str | Pathc                   t          | d          5 }t          j        |                                          }t	          |d          }t          t	          |                     }d||ndz   dz   |z   	 cd d d            S # 1 swxY w Y   d S )Nrbr:   r   r<   ;base64,)rE  base64	b64encodereadr    rU  )rH  r_  encoded_string
base64_strrT  s        r6   encode_file_to_base64rp    s    	a 	
$)$))++6611
A''#/xxR9 	
		
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
s   A"B  BBurlc                    t          j        |           }|                                 t          j        |j                  }t          |d          }t          |           }d||ndz   dz   |z   S )Nr:   r   r<   rj  )r   rC   r   rk  rl  contentr    rU  )rq  r  rn  ro  rT  s        r6   encode_url_to_base64rt    so    9S>>D%dl33N^W--JC  Hx388<zIJVr5   r  c                z    t          |           } t          |           rt          |           S t          |           S ru   )r    r   rt  rp  )r  s    r6   encode_url_or_file_to_base64rv    s9    t99D *#D))) &&&r5   c              #     K   t                      }|rdd|z   ini }t          j        d| |          5 }|                                D ]}||z  }|V  	 d d d            n# 1 swxY w Y   |V  d S )Nr?  r@  r   r   )	bytearrayr   r   
iter_bytes)rq  r<  arrr   rr   s         r6   download_byte_streamr|    s      
++C6;C	E 122G	eS'	2	2	2 aLLNN 	 	D4KCJJJJ	               IIIIIs   !A!!A%(A%tuple[bytes, str | None]c                    t          |           }|                     dd          d         }t          j        |          |fS )N,r   r  )r[  rsplitrk  	b64decode)rV  rZ  r   s      r6   decode_base64_to_binaryr    s=    h''I??3""2&DD!!9,,r5      	max_bytesr%   c                   t           j                            |           \  }}t                              d|          }|r&dt                              d|dd                   z   }|s|rd}||z   } t          |                                           }||k    rP||k    rJt          |          dk    rn6|dd         }||z   } t          |                                           }||k    J| S )a  
    Strips invalid characters from a filename and ensures it does not exceed the maximum byte length.
    Only removes characters that are truly dangerous for file systems: path separators,
    null bytes, control characters, and shell-dangerous characters. Preserves all other
    characters including parentheses, brackets, unicode characters, etc.
    The filename may include an extension (in which case it is preserved exactly as is),
    or could be just a name without an extension.
    r<   rX  r   Nr_  r   r  )rC  r  splitext_FORBIDDEN_REsubr   encode)rK  r  r4  extfilename_lens        r6   !strip_invalid_filename_charactersr    s       **ID#R&&D
 3M%%b#abb'222  C czHx(())LiY&&4yyA~~9DczHx0011L Y&& Or5   original_namec                    d                     d | D                                           dd                                          S )zECleans up a Python parameter name to make the API info more readable.r<   c                B    g | ]}|                                 s|d v |S )z _)isalnum)r   chars     r6   r   z,sanitize_parameter_names.<locals>.<listcomp>
  s*    RRR$4<<>>RTT\\\\\r5    r   )joinr  rO  )r  s    r6   sanitize_parameter_namesr    s?     	RR-RRRSS	c			r5   str | Path | Noneprefixc                Z   t          |pt          j                              t          j        d          z  }|                    dd           t          |           \  }}|Y|Wt          |          j        }|}d|v r=|d|                    d                   }||                    d          dz   d          }|t          |          }|t          j
        d||          }nt          j
        d|d|z   |	          }|                    |           |                                 |S )
Nr+  Tr,  rX  r   r   F)r  r  r)  )r  r  rb  r)  )r   r/  r0  r1  r2  r3  r  r4  rp   r  NamedTemporaryFilerG  flush)	rV  r(  r)  r  r8  r   rZ  rK  file_objs	            r6   decode_base64_to_filer    sC    S1H/1122W5Fr5J5JJIOOT4O000-h77OD)	??'(??a(.."5"556F !4!4q!8!:!:;I26::.Y
 
 
 .?	
 
 
 NN4NNOr5   jsnstr | dict | listc                
   |t          j        |d           t          j        dd|d          }t	          | t
                    rt          j        |           } t          j        | |           |	                                 |S )NTr>  Fz.jsonzw+)r  rb  r)  mode)
rC  rD  r/  r  r   r    rA   rB   dumpr  )r  r)  r  s      r6   dict_or_str_to_json_filer  3  s    

C$''''*W#D  H #s jooIc8NNOr5   dict | listc                |    t          |           5 }t          j        |          cd d d            S # 1 swxY w Y   d S ru   )rE  rA   load)r(  rH  s     r6   file_to_jsonr  A  sz    	i Ay||                 s   155,  space_idtimeout_in_secondsc                   t           j                            |dt                    }	 t	          j        d|  dd|i|           d S # t          j        $ r1}t          dt          	                    |            d          |d }~ww xY w)	Ngradio_client)r<  library_namelibrary_versionz"https://huggingface.co/api/spaces/z
/sleeptimeseconds)rA   r   z>Could not set sleep timeout on duplicated Space. Please visit z5 to set a timeout manually to reduce billing charges.)
huggingface_hubutilsbuild_hf_headers__version__r   r   HTTPStatusErrorrQ   	SPACE_URLformat)r  r<  r  r   r  s        r6   set_space_timeoutr  I  s    
 #44$# 5  G


EEEE/0	
 	
 	
 	
 	
 	

     #CYM]M]^fMgMg C C C
 
 	s   A B,BBfuncr   r   c                p    t          j        j        t           j                                        | g|R i |S )a  
    Runs async functions in sync scopes. Can be used in any scope.

    Example:
        if inspect.iscoroutinefunction(block_fn.fn):
            predictions = utils.synchronize_async(block_fn.fn, *processed_input)

    Args:
        func:
        *args:
        **kwargs:
    )fsspecasynsyncget_loop)r  argskwargss      r6   synchronize_asyncr  e  s7     ;FK0022DJ4JJJ6JJJr5   c                      e Zd ZdS )APIInfoParseErrorN)r0   r1   r2   r4   r5   r6   r  r  u  s        Dr5   r  schemac                   d| v rdS d| v rdS d| v r| d         S |                      d          rdS |                      d          rdS |                      d          rdS |                      d          rdS d| vri S t          d|            )	Nconstenumr   $refoneOfanyOfallOfzCannot parse type for )rC   r  )r  s    r6   get_typer  y  s    &wv	6		f~	F		 Cv	G		 	Cw	G		 Cw	G		 Cw	v			 A A ABBBr5   )a-  Dict(path: str | None (Path to a local file), url: str | None (Publicly available url or base64 encoded image), size: int | None (Size of image in bytes), orig_name: str | None (Original filename), mime_type: str | None (mime type of image), is_stream: bool (Can always be set to False), meta: Dict())a-  dict(path: str | None (Path to a local file), url: str | None (Publicly available url or base64 encoded image), size: int | None (Size of image in bytes), orig_name: str | None (Original filename), mime_type: str | None (mime type of image), is_stream: bool (Can always be set to False), meta: dict())z`Dict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None)zqDict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None, is_stream: bool)zDict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None, is_stream: bool, meta: Dict())zdict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None, is_stream: bool, meta: dict())zdict(path: str, url: str | None, size: int | None, orig_name: str | None, mime_type: str | None, is_stream: bool, meta: dict(_type: Literal[gradio.FileData]))r  c                ~    t          | |                     d                    }|                    t          d          S )N$defsfilepath)_json_schema_to_python_typerC   r  CURRENT_FILE_DATA_FORMAT)r  type_s     r6   json_schema_to_python_typer    s2    '

70C0CDDE==1:>>>r5   c                4  
 | i k    rdS t          |           }|i k    rd|                     di           v rdS dS |dk    r5t          | d                             d          d                            S |dk    rd	S |d
k    rd| d
          dS |dk    r+dd                    d | d         D                       z   dz   S |dk    rdS |dk    rdS |dk    rdS |dk    rdS |dk    r|                     dg           }d|v r-d                    fd|d         D                       }d| dS d| v r-d                    fd| d         D                       }d| dS t          |          }d| dS |dk    r|                     d i           }t          | pi           rd!S d" 

fd#|                                D             }d$| v r=| d$         }t          |t                    r	|r|d%gz  }n|d&t          |           gz  }d                    |          }d'| d(S |d)v r)d*                    fd+| |         D                       }|S |d,k    r/d                    fd-| |         D                       }	d.|	 d}|S t          d/|            )0z/Convert the json schema into a python type hintr   rA   descriptionz str | float | bool | list | dictr  r`  r  nullNoner  zLiteral[]r  z, c                8    g | ]}d t          |          z   d z   S )')r    )r   vs     r6   r   z/_json_schema_to_python_type.<locals>.<listcomp>  s'    #O#O#O1C#a&&L3$6#O#O#Or5   integerr%   stringr    booleanr*   numberr'   arrayr  prefixItemsc                0    g | ]}t          |          S r4   r  r   r  defss     r6   r   z/_json_schema_to_python_type.<locals>.<listcomp>  s$    TTT!,Q55TTTr5   ztuple[c                0    g | ]}t          |          S r4   r  r  s     r6   r   z/_json_schema_to_python_type.<locals>.<listcomp>  s$    UUU!,Q55UUUr5   zlist[object
propertiesr  c                b    |                      d          rd|                      d           dndS )Nr  z ()r<   r   )r  s    r6   get_descz-_json_schema_to_python_type.<locals>.get_desc  s6    34553G3GO/m,,////ROr5   c                b    g | ]+\  }}|d k    | dt          |            |           ,S )r  : r  )r   nr  r  r  s      r6   r   z/_json_schema_to_python_type.<locals>.<listcomp>  sT     
 
 
1G|| GG/488G((1++GG||r5   additionalPropertieszstr, Anyzstr, zdict(r  )r  r  z | c                0    g | ]}t          |          S r4   r  r  s     r6   r   z/_json_schema_to_python_type.<locals>.<listcomp>  s$    WWWA6q$??WWWr5   r  c              3  8   K   | ]}t          |          V  d S ru   r  r  s     r6   	<genexpr>z._json_schema_to_python_type.<locals>.<genexpr>  s.      UU!4Q==UUUUUUr5   zAll[zCannot parse schema )
r  rC   r  splitr  _is_file_schemar  r   r*   r  )r  r  r  r  elementspropsdesadditional_propertiesr   r   r  s    `        @r6   r  r    s   ||uVE{{VZZr2222555	&*4v0D0DS0I0I"0M+NPTUUU	&v	'		,&/,,,,	&#O#Ov#O#O#OPPPSVV	
 
)		u	(		u	)		v	(		w	'		

7B''E!!yyTTTTu]?STTT H (H''''f$$yyUUUUvm?TUUU H (H''''25$??H&8&&&&	(		

<,,64:2.. 	:	P 	P 	P
 
 
 
 

 
 
 "V++$*+A$B!/66 ;P 
|#V78MtTTVV  iinns~~~	$	$	$zzWWWWPUWWWXX	'		yyUUUUve}UUUUUd~~~ ?v ? ?@@@r5   	type_hintc                F    	 t          |           S # t          $ r i cY S w xY wru   )_python_type_to_json_schemarD   )r  s    r6   python_type_to_json_schemar    s9    *9555   			s      c                   | t          d          u rddiS | t          u ri S | t          u rddiS | t          u rddiS | t          u rddiS | t
          u rddiS | t          u rdi d	S | t          u rd
i dS | t          u rdd
iS | t          u s	| t          u rd
ddS | t          u s	| t          u rdddS t          |           }|t          u r=t          |           }t!          |          dk    r
d|d         iS dt          |          iS |t"          u s.t%          |d          r|j        dk    st          |          dk    rqt          |           }t!          |          dk    rAt          d          |v r0t)          d |D                       }t+          |          }dddi|giS dd |D             iS |t          u r0t          |           }|sd
i dS |d         }d
t+          |          dS |t          u rut          |           }|sdd
iS t!          |          dk    r"|d         du rd
t+          |d                   dS d
d |D             t!          |          t!          |          dS |t          u s	|t          u r1t          |           }|sd
ddS |d         }d
dt+          |          dS |t          u rGt          |           }|sdi d	S |\  }}	|t          urt-          d           dt+          |	          d	}|S t/          j        |           r%t3          | t4                    rd! | D             }
d|
iS t/          j        |           rt%          | d"          ri }g }t7          |           }|                                D ]{\  }}t+          |          ||<   t%          | d#          r| j        r|                    |           Dt%          | d$          r| j        |         j         s|                    |           |d|d%}|r||d&<   |S i S )'z,Convert a Python type hint to a JSON schema.Nr   r  r  r  r  r  r  )r   r  r  )r   r  T)r   uniqueItemsbyte)r   r  r   r  r   r  r0   	UnionType|   c              3  <   K   | ]}|t          d           u|V  d S ru   )r   r   ts     r6   r  z._python_type_to_json_schema.<locals>.<genexpr>  s2      FFA!4::2E2Ea2E2E2E2EFFr5   r  r  c                ,    g | ]}t          |          S r4   r  r  s     r6   r   z/_python_type_to_json_schema.<locals>.<listcomp>   s!    HHHQ5a88HHHr5   .c                ,    g | ]}t          |          S r4   r  r  s     r6   r   z/_python_type_to_json_schema.<locals>.<listcomp>0  s!    JJJq7::JJJr5   )r   r  minItemsmaxItems)r   r  r  z0JSON Schema only supports string keys in objectsc                    g | ]	}|j         
S r4   )r  )r   items     r6   r   z/_python_type_to_json_schema.<locals>.<listcomp>M  s    888dtz888r5   r3   	__total____dataclass_fields__)r   r  required)!r   r   r    r%   r'   r*   r   r   tupleset	frozensetbytesrx  r   r   r   r   r   hasattrr0   nextr  r   inspectisclass
issubclassr
   r   r  r
  r   r  default)r  originliteral_valuestypes
other_typer  r  	item_typekey_type
value_typeenum_valuesr  r  hints
field_name
field_types                   r6   r  r    s"   DJJC	C!!C	""E!!D	""D "===D"---E  C9	11555EY)33 F333	""F!),,~!##^A.//^,,-- 	%FJ'' 	,2O{,J,Jv;;###u::??tDzzU22FFFFFFFJ0<<Fvv.788HH%HHHII~~	"" 	2#b111G	*Ei*P*PQQQ## 	%G$$u::??uQx3#.I%PQ(.S.STTTJJEJJJE

E

	
 
 	
 }})++	"" 	:#D999G	0;;
 
 	
 ~~	"" 	B$bAAA#*3OPPP$?
$K$K
 
 y!! %jD&A&A %88i888$$y!! gi9J&K&K 
y))&+kkmm 		, 		,"J
%@%L%LJz"y+.. ,& 0OOJ///I'=>>, 5jAI, 
+++"*== 	*!)F:Ir5   json_objis_rootCallable[..., bool]c                R    ||           r ||           S t          | t                    r2i }|                                 D ]\  }}t          |||          ||<   |S t          | t          t
          f          r-g }| D ]&}|                    t          |||                     '|S | S )zk
    Traverse a JSON object and apply a function to each element that satisfies the is_root condition.
    )r   r   r  traverser   r  r   r"  r  r#  new_objkeyr  r	  s          r6   r&  r&  h  s     wx tH~~	Hd	#	# "..** 	: 	:JC#E499GCLL	HtUm	,	,  	: 	:DNN8D$889999r5   'Callable[..., Coroutine[Any, Any, Any]]c                z  K    ||           r ||            d{V S t          | t                    r8i }|                                 D ]\  }}t          |||           d{V ||<    |S t          | t          t
          f          r3g }| D ],}|                    t          |||           d{V            -|S | S )zq
    Traverse a JSON object and apply a async function to each element that satisfies the is_root condition.
    N)r   r   r  async_traverser   r  r   r'  s          r6   r,  r,  |  s      wx T(^^#######	Hd	#	# "..** 	F 	FJC!/tW!E!EEEEEEEGCLL	HtUm	,	,  	F 	FDNNdG!D!DDDDDDDEEEEr5   api_infoc                J    t          | |                     di                     S )Nr  )_schema_contains_filerC   )r-  s    r6   value_is_filer0    s      8<<+D+DEEEr5   r  c                h    d| v r-| d                              d          d         }||v r||         S | S )z!Resolve a $ref to its definition.r  r`  r  )r  r  r  ref_names      r6   _resolve_refr4    sC    &>'',,R0t>!Mr5   dict | Nonec                   ||                      di           }|                      di           }d|vsd|vrdS t          |d         |          }|                     di           }d|v r!|d         }|                     d          d	k    S |                     d
i           }t          |t                    r|                     d          d	k    S dS )zYCheck if a schema directly represents a file type (has path + meta with gradio.FileData).Nr  r  r  metaF_typer  gradio.FileDatar  )rC   r4  r   r   )r  r  r  r7  
meta_propstype_schemameta_defaults          r6   r  r    s    |zz'2&&JJ|R((EUfE11uft,,D,++J* )w''+<<<88Ir**L,%% >((,===5r5   c                   t          | t                    s2t          | t                    rt          fd| D                       S dS d| v r=| d                             d          d         }|v rt          |                   S dS t          |           rdS t          fd|                                 D                       S )zARecursively check if a JSON schema contains a file type anywhere.c              3  8   K   | ]}t          |          V  d S ru   )r/  )r   r	  r  s     r6   r  z(_schema_contains_file.<locals>.<genexpr>  s.      LLT,T488LLLLLLr5   Fr  r`  r  Tc              3     K   | ]9\  }}|d k    t          |t          t          f          't          |          V  :dS )r  N)r   r   r   r/  )r   kr  r  s      r6   r  z(_schema_contains_file.<locals>.<genexpr>  sU        Aq<<Jq4,77< 	a&&<<< r5   )r   r   r   anyr  r/  r  r  r2  s    ` r6   r/  r/    s    fd## fd## 	MLLLLVLLLLLLu&>'',,R0t(h>>>uvt$$ t    LLNN     r5   c                    t          | t          t          f          oAt          |                                           o t          |                                           S )zp
    Check if the given value is a valid str or Path filepath on the local filesystem, e.g. "path/to/file".
    )r   r    r   existsis_file)ss    r6   is_filepathrF    sB     a#t%%P$q''..*:*:PtAww?P?PPr5   c                j    t          | t                    od| v ot          | d         t                    S )z
    Check if the given value is a valid FileData object dictionary in versions of Gradio<=4.20, e.g.
    {
        "path": "path/to/file",
    }
    r  )r   r   r    r   s    r6   is_file_objrI    s0     aM6Q;M:ai3M3MMr5   c                    t          | t                    oBd| v o>t          | d         t                    o#d| v o| d                             dd          dk    S )z
    Check if the given value is a valid FileData object dictionary in newer versions of Gradio
    where the file objects include a specific "meta" key, e.g.
    {
        "path": "path/to/file",
        "meta": {"_type: "gradio.FileData"}
    }
    r  r7  r8  r<   r9  )r   r   r    rC   rH  s    r6   is_file_obj_with_metarK    sh     	1d 	<aK	<qy#&&	< aK	< fIMM'2&&*;;r5   c                ^    t          |           od| v ot          | d         t                    S )a>  
    Check if the given value is a valid FileData object dictionary in newer versions of Gradio
    where the file objects include a specific "meta" key, and ALSO include a "url" key, e.g.
    {
        "path": "path/to/file",
        "url": "/file=path/to/file",
        "meta": {"_type: "gradio.FileData"}
    }
    rq  )rK  r   r    rH  s    r6   is_file_obj_with_urlrM    s.     !##P
Pz!E(C7P7PPr5   >   boxrowtabformtabsgroupr   columndatasetsidebartabitem	accordioninterpretationfilepath_or_urlc                0   t          |           }|ddid}t          |          r$i ||                    dd          d         |dS t          |                                          ri |d	t          |          j        iS t          d
| d          )Nr8  r9  )r  r7  r`  r   )maxsplitr  )	orig_namerq  r]  zFile z; does not exist on local filesystem and is not a valid URL.)r    r   r  r   rC  r4  r   )rZ  rE  r   s      r6   handle_filer^    s    OA):;<<D 
M$MQXXcAX%>%>r%B1MMMM	a		 
2$2T!WW\222RARRR
 
 	
r5   c                H    t          j        d           t          |           S )NzXfile() is deprecated and will be removed in a future version. Use handle_file() instead.)r   r   r^  )rZ  s    r6   r_  r_    s)    Mb   '''r5   parameters_infolist[ParameterInfo] | Noner  r  r  r   c                ,    G d dt                     }t          |          }| |rt          d          |S t          |          }||j        gt          |           |z
  z  z   }i }g }t          |           D ]\  }}	d|	v r'|||	d         <   |                    |	d                    n|                    d|            |	                    dd          r)||         |j        k    r|	                    d          ||<   |                                D ]F\  }
}|
|v r+||
         |k     rt          d	|
 d
          ||||
         <   4t          d	|
 d          |j        |v r0t          d||
                    |j                                      |S )Nc                      e Zd ZdZdS )!construct_args.<locals>._KeywordsNO_VALUEN)r0   r1   r2   re  r4   r5   r6   	_Keywordsrd    s        r5   rf  zzThis endpoint does not support key-word arguments Please click on 'view API' in the footer of the Gradio app to see usage.parameter_namez	argument parameter_has_defaultFparameter_defaultzParameter `zs` is already set as a positional argument. Please click on 'view API' in the footer of the Gradio app to see usage.zl` is not a valid key-word argument. Please click on 'view API' in the footer of the Gradio app to see usage.z)No value provided for required argument: )r
   r   r   r   re  r  r   rC   r  	TypeErrorrp   )r`  r  r  rf  _argsnum_argskwarg_arg_mappingkwarg_namesrp   
param_infor)  r  s               r6   construct_argsrp    s=       D    JJE 	 M   4yyHY'(C,@,@8,KLLEK&77 
? 
?zz))>Cj)9:;z*:;<<<<2522333NN2E::	?e	 222%>>*=>>E%Lllnn  
U### %00 [#  [  [  [   16',-- Pc  P  P  P   U""fEKKPYPbDcDc8dff
 
 	
 Lr5   r  httpx.Responsec           
     
   | j         dk    r|                                                     dg           }g }t          |          D ]~\  }}|                    dd          dk    r_|                    d          du rH|                    dd	|           }|                    d
| d|                    dd                      |                    dt          |           d           |rd                    |          S dS dS )z
    If the request is a 422 error and the detail contains a validation error message, return the message. Otherwise, return None.
    i  detail__type__r<   validateis_validFrg  
parameter_z- r  messager   z  parameter(s) failed validation:r   N)r   rA   rC   r  r   r  r   r  )r  rs  validation_messagesrp   
error_info
param_names         r6   extract_validation_messager|  O  s5    #"-- !*6!2!2 	 	E:z2..*<<NN:..%77'^^,<>R5>R>RSS
#**FFFz~~i'D'DFF   	""#)**LLL	
 	
 	
  	2990111! 	2 	2r5   )r8   r    )r8   r*   )r   r    r8   r*   )r   r   r   r   r   r   r   r   r   r    r   r    r   r   r   r   r   r*   r   r   r8   r   )r   r   r   r   r   r   r   r   r$   r    r   r   r   r*   r   r   r8   r   )r   r   r   r   r   r   r   r*   )r   r   r   r   r   r   r   r   r   r    r   r    r   r   r   r   r8   r"   )
r   r   r   r   r$   r    r   r  r8   r"   ru   )r(  r    r)  r   r8   r    )NN)r;  r    r<  r   r)  r   r8   r    )rK  r    r8   r   )rV  r    r8   r   )r(  r    r\  r]  r8   r*   )rH  rg  )rq  r    )r  rg  )rV  r    r8   r}  )r  )rK  r    r  r%   r8   r    )r  r    r8   r    )NNN)rV  r    r(  r   r)  r  r  r   )r  r  r)  r  )r(  rg  r8   r  )Nr  )r  r    r<  r   r  r%   )r  r   r8   r   )r  r   )r  r   r8   r    )r  r   r8   r   )r"  r   r  r   r#  r$  r8   r   )r"  r   r  r*  r#  r$  r8   r   )r-  r   r8   r*   )r  r   r  r   r8   r   )r  r   r  r5  r8   r*   )r  r   r8   r*   )rZ  rg  )r`  ra  r  r  r  r   r8   r   )r  rq  r8   r   )
__future__r   r   rk  concurrent.futuresr   r$  r  rA   rQ  rC  r=   rer1  r5  r/  r   r   collectionsr   collections.abcr   r   dataclassesr   r   r	   r  r
   pathlibr   	threadingr   typingr   r   r   r   r   r   r   r   r   fsspec.asynr  r   r  r   gradio_client.data_classesr   API_URL
SSE_URL_V0SSE_DATA_URL_V0SSE_URLSSE_DATA_URLWS_URL
UPLOAD_URL	LOGIN_URL
CONFIG_URLAPI_INFO_URLRAW_API_INFO_URLSPACE_FETCHER_URL	RESET_URLr  HEARTBEAT_URL
CANCEL_URLSTATE_COMPONENTNO_APP_FILECONFIG_ERRORBUILD_ERRORRUNTIME_ERRORPAUSEDINVALID_RUNTIMEcompiler  r   rG   r  rD   rI   rM   rO   rQ   r    rS   rb   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r:  rJ  rU  r[  rf  rp  rt  rv  r|  r  r  r  r  r  r  r  r  r   r  r  FILE_DATA_FORMATSr  r  r  r  r  r&  r,  r0  r4  r  r/  rF  rI  rK  rM  SKIP_COMPONENTSr^  r_  rp  r|  r4   r5   r6   <module>r     s`	   " " " " " "              				  				            / / / / / / / / ( ( ( ( ( ( ( (                        
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
          & & & & & & 9888888


	
	
() F 	!	*
 
<==
 
 
 
 
iu 
 
 
 
	 	 	 	 "!##	 	 	 	 	9 	 	 		 	 	 	 	 	 	 		 	 	 	 	i 	 	 		 	 	 	 	I 	 	 	, , , , ,C , , ,"1 1 1 1 1T 1 1 1h 
 
 
 
 
 
 
 
* 1 1 1 1 1 1 1 1         
<,6	7	7	 	 	 5 5 5 5 5 5 5 5 J J J J J J J J&< < < <   F F F F$ $ $ $N   @. . . .0C C C CLU U U Up' ' '^     @D$ $ $ $ $*	 	 	 	
 
 
 
   

 

 

 

   ' ' ' '    - - - -    >    !!	         F        !    8K K K K 	 	 	 	 	
 	 	 	C C C C*    -R0 ? ? ? ?
KA KA KA KA\   p p p pf   (   0F F F F       $   (Q Q Q QN N N N   $
Q 
Q 
Q 
Q  "

 

 

 

( ( ( (0 0 0 0f2 2 2 2 2 2r5   