
    "d~              
          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
 d dlmZ d dlmZ d dlmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZ d dlm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z'  G d de(          Z) G d de
          Z*dej+        de,fdZ-dej.        de fdZ/dej.        de fdZ0dej.        de1fdZ2de1dej3        e1ef         dej3        e1e1f         dej4        e1e5f         fdZ6 ej7        d          Z8de1dej4        ej9        e1ej3        e1ef         f         fdZ: G d  d!          Z; G d" d#e;          Z< G d$ d%e;          Z= G d& d'e;          Z> G d( d)e;          Z? ej@        d*          ZA G d+ d,ejB        eA                   ZCd-ej.        ej+        gejD        f         dej.        ej+        gejB        f         fd.ZE G d/ d0          ZF G d1 d2          ZGdS )3    N)asynccontextmanager)Enum)is_async_callable)run_in_threadpool)CONVERTOR_TYPES	Convertor)URLHeadersURLPath)HTTPException)
Middleware)Request)PlainTextResponseRedirectResponse)ASGIAppLifespanReceiveScopeSend)	WebSocketWebSocketClosec                   T     e Zd ZdZdedej        eej        f         ddf fdZ xZ	S )NoMatchFoundz}
    Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)`
    if no matching route exists.
    namepath_paramsreturnNc                     d                     t          |                                                    }t                                          d| d| d           d S )N, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfr   r   params	__class__s       5D:\api_v1\venv\Lib\site-packages\starlette/routing.pyr#   zNoMatchFound.__init__   sZ    4 0 0 2 23344TdTT&TTTUUUUU    )
__name__
__module____qualname____doc__strtypingDictAnyr#   __classcell__)r&   s   @r'   r   r      sw         
VS Vv{3
?/K VPT V V V V V V V V V Vr(   r   c                       e Zd ZdZdZdZdS )Matchr         N)r)   r*   r+   NONEPARTIALFULL r(   r'   r3   r3   #   s        DGDDDr(   r3   objr   c                     t          j        dt                     t          | t          j                  r!| j        } t          | t          j                  !t          j        |           S )z~
    Correctly determines if an object is a coroutine function,
    including those wrapped in functools.partial objects.
    zViscoroutinefunction_or_partial is deprecated, and will be removed in a future release.)	warningswarnDeprecationWarning
isinstance	functoolspartialfuncinspectiscoroutinefunction)r:   s    r'   iscoroutinefunction_or_partialrE   )   sf    
 M	3  
 S)+
,
, h S)+
,
, &s+++r(   rB   c                 d     t                     dt          dt          dt          ddf fd}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    scopereceivesendr   Nc                    K   t          | ||          }r |           d {V }nt          |           d {V } || ||           d {V  d S N)rH   rI   )r   r   )rG   rH   rI   requestresponserB   is_coroutines        r'   appzrequest_response.<locals>.app?   s      %t<<< 	>!T']]******HH.tW========Hhugt,,,,,,,,,,,r(   )r   r   r   r   )rB   rO   rN   s   ` @r'   request_responserP   8   sY    
 %T**L- - - - - - - - - - - Jr(   c                 B     dt           dt          dt          ddf fd}|S )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    rG   rH   rI   r   Nc                 R   K   t          | ||          } |           d {V  d S rK   )r   )rG   rH   rI   sessionrB   s       r'   rO   zwebsocket_session.<locals>.appP   sA      E7>>>d7mmr(   )r   r   r   )rB   rO   s   ` r'   websocket_sessionrT   J   sD              Jr(   endpointc                 x    t          j        |           st          j        |           r| j        S | j        j        S N)rC   	isroutineisclassr)   r&   )rU   s    r'   get_namerZ   W   s;    "" !goh&?&? !  &&r(   pathparam_convertorsr   c                    t          |                                          D ]]\  }}d|z   dz   | v rN||         }|                    |          }|                     d|z   dz   |          } |                    |           ^| |fS )N{})r    items	to_stringreplacepop)r[   r\   r   keyvalue	convertors         r'   replace_paramsrg   ]   s    
 ;,,..// ! !
U9s?d""(-I''..E<<c	C77DOOC   r(   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}c                    |                      d           }d}d}t                      }d}i }t                              |           D ]}|                    d          \  }}	|	                    d          }	|	t          v sJ d|	 d            t          |	         }
|t          j        | ||	                                                   z  }|d	| d
|
j
         dz  }|| ||	                                         z  }|d|z  z  }||v r|                    |           |
||<   |                                }|rQd                    t          |                    }t          |          dk    rdnd}t!          d| d| d|            |r>| |d                             d          d         }|t          j        |          dz   z  }n"|t          j        | |d                   dz   z  }|| |d         z  }t          j        |          ||fS )a*  
    Given a path string, like: "/{username:str}",
    or a host string, like: "{subdomain}.mydomain.org", return a three-tuple
    of (regex, format, {param_name:convertor}).

    regex:      "/(?P<username>[^/]+)"
    format:     "/{username}"
    convertors: {"username": StringConvertor()}
    /^ r   r-   :zUnknown path convertor ''z(?P<>)z{%s}r   r4   szDuplicated param name z	 at path N$)
startswithsetPARAM_REGEXfinditergroupslstripr   reescapestartregexaddendr   sortedlen
ValueErrorsplitcompile)r[   is_host
path_regexpath_formatduplicated_paramsidxr\   match
param_nameconvertor_typerf   namesendinghostnames                 r'   compile_pathr   o   sM    //#&&&GJK
C%%d++  %*\\%%8%8"
N'..s33o---7n777 .--#N3	biS5;;==%8 9:::
<Z<<)/<<<<
tC%++--/00v
**)))!!*---'0$iikk R		&!23344-..22PPP%PP$PPQQQ 2:##C((+bi))C//

biSTT
++c11
4:K:j!!;0@@@r(   c                       e Zd Zdedej        eef         fdZdedej	        de
fdZdedededd	fd
Zdedededd	fdZd	S )	BaseRouterG   r   c                     t                      rW   NotImplementedError)r$   rG   s     r'   matcheszBaseRoute.matches       !###r(   _BaseRoute__namer   c                     t                      rW   r   )r$   r   r   s      r'   url_path_forzBaseRoute.url_path_for   r   r(   rH   rI   Nc                 "   K   t                      rW   r   r$   rG   rH   rI   s       r'   handlezBaseRoute.handle   s      !###r(   c                 ~  K   |                      |          \  }}|t          j        k    r`|d         dk    r%t          dd          } ||||           d{V  n-|d         dk    r!t	                      } ||||           d{V  dS |                    |           |                     |||           d{V  dS )z
        A route may be used in isolation as a stand-alone ASGI app.
        This is a somewhat contrived case, as they'll almost always be used
        within a Router, but could be useful for some tooling and minimal apps.
        typehttp	Not Found  status_codeN	websocket)r   r3   r6   r   r   updater   )r$   rG   rH   rI   r   child_scoperM   websocket_closes           r'   __call__zBaseRoute.__call__   s       "\\%00{EJV}&&,[cJJJhugt4444444444v+--"0"2"2%oeWd;;;;;;;;;F[!!!kk%$///////////r(   )r)   r*   r+   r   r.   Tupler3   r   r-   r0   r   r   r   r   r   r   r9   r(   r'   r   r      s        $U $v|E5L'A $ $ $ $$3 $vz $g $ $ $ $$% $' $ $$ $ $ $ $0E 0G 04 0D 0 0 0 0 0 0r(   r   c                   
   e Zd Zdddddedej        dej        ej        e                  dej        e         ded	dfd
Z	de
d	ej        ee
f         fdZdedej        d	efdZde
deded	dfdZdej        d	efdZd	efdZdS )RouteNTmethodsr   include_in_schemar[   rU   r   r   r   r   c                j   |                     d          s
J d            || _        || _        |t          |          n|| _        || _        |}t          |t          j                  r!|j	        }t          |t          j                  !t          j        |          st          j        |          rt          |          | _        |dg}n|| _        |d | _        n4d |D             | _        d| j        v r| j                            d           t#          |          \  | _        | _        | _        d S )Nri    Routed paths must start with '/'GETc                 6    h | ]}|                                 S r9   )upper).0methods     r'   	<setcomp>z!Route.__init__.<locals>.<setcomp>   s     AAAvFLLNNAAAr(   HEAD)rs   r[   rU   rZ   r   r   r?   r@   rA   rB   rC   
isfunctionismethodrP   rO   r   r}   r   r   r   r\   )r$   r[   rU   r   r   r   endpoint_handlers          r'   r#   zRoute.__init__   sE    s##GG%GGGG	 *.,HX&&&D	!2#)9+<== 	5/4 )9+<== 	5.// 	 73CDT3U3U 	 '11DH '  DH?DLLAAAAADL$$  (((COPTCUCU@)4+@+@+@r(   rG   c                    |d         dk    r| j                             |d                   }|r|                                }|                                D ](\  }}| j        |                             |          ||<   )t          |                    di                     }|                    |           | j	        |d}| j
        r|d         | j
        vrt          j        |fS t          j        |fS t          j        i fS )Nr   r   r[   r   rU   r   r   )r   r   	groupdictr`   r\   convertdictgetr   rU   r   r3   r7   r8   r6   r$   rG   r   matched_paramsrd   re   r   r   s           r'   r   zRoute.matches   s   =F""O))%-88E 
3!&!2!2"0"6"6"8"8 T TJC*.*?*D*L*LU*S*SN3''"599]B#?#?@@"">222+/=UU< 3E(O4<$G$G =+55 :{22z2~r(   _Route__namer   c                 8   t          |                                          }t          | j                                                  }|| j        k    s||k    rt	          ||          t          | j        | j        |          \  }}|rJ t          |d          S )Nr   r[   protocolrt   r!   r\   r   r   rg   r   r   )r$   r   r   seen_paramsexpected_paramsr[   remaining_paramss          r'   r   zRoute.url_path_for   s    +**,,--d388::;;TY+"@"@v{333!/d3["
 "
 $###D62222r(   rH   rI   c                    K   | j         rg|d         | j         vrXdd                    | j                   i}d|v rt          d|          t          dd|          } ||||           d {V  d S |                     |||           d {V  d S )Nr   Allowr   rO   i  )r   headerszMethod Not Allowed)r   r   r   r   rO   )r$   rG   rH   rI   r   rM   s         r'   r   zRoute.handle	  s      < 
	1E(O4<??		$, 7 78G~~#WEEEE,(c7   (5'400000000000((5'400000000000r(   otherc                     t          |t                    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S rW   )r?   r   r[   rU   r   r$   r   s     r'   __eq__zRoute.__eq__  sI    ue$$ .	UZ'./. -		
r(   c                 ~    | j         j        }t          | j        pg           }| j        | j        }}| d|d|d|dS )N(path=, name=z
, methods=ro   )r&   r)   r   r   r[   r   )r$   
class_namer   r[   r   s        r'   __repr__zRoute.__repr__  sT    ^,
+,,Y	dQQDQQ4QQWQQQQr(   )r)   r*   r+   r-   r.   CallableOptionalListboolr#   r   r   r3   r   r0   r   r   r   r   r   r   r   r9   r(   r'   r   r      si        6:%)"&"V "V "V"V /"V
 S!12"V oc""V  "V 
"V "V "V "VHU v|E5L'A     33 3vz 3g 3 3 3 31% 1' 1 1$ 1 1 1 1
FJ 
4 
 
 
 
R# R R R R R Rr(   r   c            	           e Zd Zdddedej        dej        e         ddfdZdedej	        e
ef         fd	Zd
edej        defdZdedededdfdZdej        defdZdefdZdS )WebSocketRouteNr   r[   rU   r   r   c                   |                     d          s
J d            || _        || _        |t          |          n|| _        |}t          |t          j                  r!|j        }t          |t          j                  !t          j
        |          st          j        |          rt          |          | _        n|| _        t          |          \  | _        | _        | _        d S )Nri   r   )rs   r[   rU   rZ   r   r?   r@   rA   rB   rC   r   r   rT   rO   r   r   r   r\   )r$   r[   rU   r   r   s        r'   r#   zWebSocketRoute.__init__&  s     s##GG%GGGG	 *.,HX&&&D	#)9+<== 	5/4 )9+<== 	5.// 	 73CDT3U3U 	 (22DHH  DHCOPTCUCU@)4+@+@+@r(   rG   c                    |d         dk    r| j                             |d                   }|r|                                }|                                D ](\  }}| j        |                             |          ||<   )t          |                    di                     }|                    |           | j	        |d}t          j        |fS t          j        i fS )Nr   r   r[   r   r   )r   r   r   r`   r\   r   r   r   r   rU   r3   r8   r6   r   s           r'   r   zWebSocketRoute.matches:  s    =K''O))%-88E /!&!2!2"0"6"6"8"8 T TJC*.*?*D*L*LU*S*SN3''"599]B#?#?@@"">222+/=UUz;..z2~r(   _WebSocketRoute__namer   c                 8   t          |                                          }t          | j                                                  }|| j        k    s||k    rt	          ||          t          | j        | j        |          \  }}|rJ t          |d          S )Nr   r   r   )r$   r   r   r   r   r[   r   s          r'   r   zWebSocketRoute.url_path_forG  s    +**,,--d388::;;TY+"@"@v{333!/d3["
 "
 $###D;7777r(   rH   rI   c                 D   K   |                      |||           d {V  d S rW   rO   r   s       r'   r   zWebSocketRoute.handleT  4      hhugt,,,,,,,,,,,r(   r   c                 l    t          |t                    o| j        |j        k    o| j        |j        k    S rW   )r?   r   r[   rU   r   s     r'   r   zWebSocketRoute.__eq__W  s6    un-- 0	UZ'0/	
r(   c                 @    | j         j         d| j        d| j        dS )Nr   r   ro   )r&   r)   r[   r   r$   s    r'   r   zWebSocketRoute.__repr__^  s*    .)SSSSTYSSSSr(   )r)   r*   r+   r-   r.   r   r   r#   r   r   r3   r   r0   r   r   r   r   r   r   r   r   r9   r(   r'   r   r   %  s6       TXV V VV#)?V=C_S=QV	V V V V(U v|E5L'A    83 8vz 8g 8 8 8 8-% -' - -$ - - - -
FJ 
4 
 
 
 
T# T T T T T Tr(   r   c                   x   e Zd Z	 	 	 ddddedej        e         dej        ej        e                  dej        e         dej        ej        e	                  ddfd	Z
edej        e         fd
            Zdedej        eef         fdZdedej        defdZdedededdfdZdej        defdZdefdZdS )MountN)
middlewarer[   rO   routesr   r   r   c                   |dk    s|                     d          s
J d            ||
J d            |                    d          | _        ||| _        nt	          |          | _        | j        | _        |)t          |          D ]\  }} |dd| j        i|| _        || _        t          | j        dz             \  | _	        | _
        | _        d S )	Nrk   ri   r   z0Either 'app=...', or 'routes=' must be specified)r   rO   z/{path:path}r9   )rs   rstripr[   	_base_appRouterrO   reversedr   r   r   r   r\   )r$   r[   rO   r   r   r   clsoptionss           r'   r#   zMount.__init__c  s     rzzT__S11zz3UzzzOv11=  211KK$$	?&)DNN#6222DN>! ( 4 4 8 8W377487w77	COI&D
 D
@)4+@+@+@r(   c                 .    t          | j        dg           S Nr   )getattrr   r   s    r'   r   zMount.routes~  s    t~x444r(   rG   c                    |d         dv r&|d         }| j                             |          }|r|                                }|                                D ](\  }}| j        |                             |          ||<   )d|                    d          z   }|d t          |                    }t          |	                    di                     }	|	
                    |           |	                    dd          }
|	|	                    d|
          |
|z   || j        d	}t          j        |fS t          j        i fS )
Nr   r   r   r[   ri   r   	root_pathrk   app_root_path)r   r   r   r[   rU   )r   r   r   r`   r\   r   rc   r   r   r   r   rO   r3   r8   r6   )r$   rG   r[   r   r   rd   re   remaining_pathmatched_pathr   r   r   s               r'   r   zMount.matches  sK   =111=DO))$//E /!&!2!2"0"6"6"8"8 T TJC*.*?*D*L*LU*S*SN3''!$~'9'9&'A'A!A#$:s>':':&:$:;"599]B#?#?@@"">222!IIk266	#.%*YY	%J%J!*\!9* $  z;..z2~r(   _Mount__namer   c                    | j         ^|| j         k    rSd|v rO|d                             d          |d<   t          | j        | j        |          \  }}|st          |          S n| j         |                    | j         dz             r| j         |}n|t          | j                   dz   d          }|                    d          }d|d<   t          | j        | j        |          \  }}|||d<   | j	        pg D ][}	  |j
        |fi |}	t          |                    d          t          |	          z   |	j                  c S # t          $ r Y Xw xY wt          ||          )Nr[   ri   )r[   rl   r4   rk   r   )r   rx   rg   r   r\   r   rs   r   r   r   r   r   r-   r   r   )
r$   r   r   r[   r   remaining_name
path_kwargpath_prefixrouteurls
             r'   r   zMount.url_path_for  s   9 Vty%8%8V{=R=R"-f"5"<"<S"A"AK%3 $"7& &"D" $ *D))))*Y&"3"3DIO"D"Dy !' "(DI(:(<(<!=$00J"$K,: $"7- -)K) %+5 (*  ,%,^PP?OPPC"(//44s3xx?#,      $   D6;///s   >AE
EErH   rI   c                 D   K   |                      |||           d {V  d S rW   r   r   s       r'   r   zMount.handle  r   r(   r   c                 l    t          |t                    o| j        |j        k    o| j        |j        k    S rW   )r?   r   r[   rO   r   s     r'   r   zMount.__eq__  s6    ue$$ &	UZ'&EI%	
r(   c                 \    | j         j        }| j        pd}| d| j        d|d| j        dS )Nrk   r   r   , app=ro   )r&   r)   r   r[   rO   r$   r   r   s      r'   r   zMount.__repr__  B    ^,
yBSSDISSSSdhSSSSr(   )NNN)r)   r*   r+   r-   r.   r   r   Sequencer   r   r#   propertyr   r   r   r   r3   r   r0   r   r   r   r   r   r   r   r   r9   r(   r'   r   r   b  s        )->B%)
 DH
 
 

 _W%
 	 :;	

 oc"
 OFOJ$?@
 

 
 
 
6 5I. 5 5 5 X5U v|E5L'A    .03 0vz 0g 0 0 0 0B-% -' - -$ - - - -
FJ 
4 
 
 
 
T# T T T T T Tr(   r   c            	           e Zd Z	 ddededej        e         ddfdZedej	        e
         fd            Zdedej        eef         fd	Zd
edej        defdZdedededdfdZdej        defdZdefdZdS )HostNhostrO   r   r   c                     |                     d          r
J d            || _        || _        || _        t	          |          \  | _        | _        | _        d S )Nri   zHost must not start with '/')rs   r  rO   r   r   
host_regexhost_formatr\   )r$   r  rO   r   s       r'   r#   zHost.__init__  s]     ??3''GG)GGGG		COPTCUCU@)4+@+@+@r(   c                 .    t          | j        dg           S r   )r   rO   r   s    r'   r   zHost.routes  s    tx2...r(   rG   c                 *   |d         dv rt          |          }|                    dd                              d          d         }| j                            |          }|r|                                }|                                D ](\  }}| j        |                             |          ||<   )t          |                    di                     }|
                    |           || j        d	}	t          j        |	fS t          j        i fS )
Nr   r   rG   r  rk   rl   r   r   )r   rU   )r
   r   r   r  r   r   r`   r\   r   r   r   rO   r3   r8   r6   )
r$   rG   r   r  r   r   rd   re   r   r   s
             r'   r   zHost.matches  s   =111E***G;;vr**0055a8DO))$//E /!&!2!2"0"6"6"8"8 T TJC*.*?*D*L*LU*S*SN3''"599]B#?#?@@"">222.9txPPz;..z2~r(   _Host__namer   c                 R   | j         V|| j         k    rKd|v rG|                    d          }t          | j        | j        |          \  }}|st          ||          S n| j         |                    | j         dz             r| j         |}n|t          | j                   dz   d          }t          | j        | j        |          \  }}| j        pg D ]F}	  |j	        |fi |}t          t          |          |j        |          c S # t          $ r Y Cw xY wt          ||          )Nr[   )r[   r  rl   r4   )r[   r   r  )r   rc   rg   r  r\   r   rs   r   r   r   r-   r   r   )	r$   r  r   r[   r  r   r   r  r  s	            r'   r   zHost.url_path_for  sq   9 Vty%8%8V{=R=R??6**D%3 $"7& &"D" $ 5Dt44445Y&"3"3DIO"D"Dy !' "(DI(:(<(<!=%3 $"7& &"D" *  ,%,^PP?OPPC"C3<dSSSSSS#   D6;///s   1D		
DDrH   rI   c                 D   K   |                      |||           d {V  d S rW   r   r   s       r'   r   zHost.handle  r   r(   r   c                 l    t          |t                    o| j        |j        k    o| j        |j        k    S rW   )r?   r  r  rO   r   s     r'   r   zHost.__eq__  s6    ud## &	UZ'&EI%	
r(   c                 \    | j         j        }| j        pd}| d| j        d|d| j        dS )Nrk   z(host=r   r  ro   )r&   r)   r   r  rO   r  s      r'   r   zHost.__repr__  r  r(   rW   )r)   r*   r+   r-   r   r.   r   r#   r
  r   r   r   r   r   r3   r   r0   r   r   r   r   r   r   r   r   r9   r(   r'   r  r    s\       DHV VV%V-3_S-AV	V V V V /I. / / / X/U v|E5L'A    03 0vz 0g 0 0 0 06-% -' - -$ - - - -
FJ 
4 
 
 
 
T# T T T T T Tr(   r  _Tc            	           e Zd Zdej        e         fdZdefdZdej        ej	        e
                  dej        e
         dej        ej                 dej        e         fdZd	S )
_AsyncLiftContextManagercmc                     || _         d S rW   )_cm)r$   r  s     r'   r#   z!_AsyncLiftContextManager.__init__  s    r(   r   c                 8   K   | j                                         S rW   )r  	__enter__r   s    r'   
__aenter__z#_AsyncLiftContextManager.__aenter__  s      x!!###r(   exc_type	exc_value	tracebackc                 >   K   | j                             |||          S rW   )r  __exit__)r$   r"  r#  r$  s       r'   	__aexit__z"_AsyncLiftContextManager.__aexit__  s"       x  9i@@@r(   N)r)   r*   r+   r.   ContextManagerr  r#   r!  r   TypeBaseExceptiontypesTracebackTyper   r'  r9   r(   r'   r  r    s        604    $" $ $ $ $A/&+m"<=A ?=1A ?5#67	A
 
	A A A A A Ar(   r  lifespan_contextc                     t          j        |           t          j                  dt          j        dt          ffd            }|S )NrO   r   c                 4    t           |                     S rW   )r  )rO   cmgrs    r'   wrapperz+_wrap_gen_lifespan_context.<locals>.wrapper*  s    'S		222r(   )
contextlibcontextmanagerr@   wrapsr.   r0   r  )r-  r1  r0  s     @r'   _wrap_gen_lifespan_contextr5  %  sa     $%566D_T3VZ 3$< 3 3 3 3 3 3 Nr(   c                   B    e Zd ZddZddZdeddfdZd	ed
edefdZdS )_DefaultLifespanrouterr   c                     || _         d S rW   )_router)r$   r8  s     r'   r#   z_DefaultLifespan.__init__2  s    r(   r   Nc                 H   K   | j                                          d {V  d S rW   )r:  startupr   s    r'   r!  z_DefaultLifespan.__aenter__5  s2      l""$$$$$$$$$$$r(   exc_infoc                 H   K   | j                                          d {V  d S rW   )r:  shutdown)r$   r=  s     r'   r'  z_DefaultLifespan.__aexit__8  s2      l##%%%%%%%%%%%r(   r$   rO   c                     | S rW   r9   )r$   rO   s     r'   r   z_DefaultLifespan.__call__;  s    r(   )r8  r   r   N)	r)   r*   r+   r#   r!  objectr'  r  r   r9   r(   r'   r7  r7  1  s           % % % %& &D & & & &r  2      r(   r7  c                      e Zd Z	 	 	 	 	 	 d)dej        ej        e                  dedej        e         dej        ej        ej	                          dej        ej        ej	                          dej        e
ej                          d	dfd
Zdededed	dfdZdedej        d	efdZd*dZd*dZdededed	dfdZdededed	dfdZdej        d	efdZ	 d+dededej        e         d	dfdZ	 d+dededej        e         d	dfdZ	 	 	 d,dedej	        dej        ej        e                  dej        e         d ed	dfd!Z	 d+dedej	        dej        e         d	dfd"Z	 	 	 d,dedej        ej        e                  dej        e         d ed	ej	        f
d#Z	 d+dedej        e         d	ej	        fd$Zd%ed&ej	        d	dfd'Z d%ed	ej	        fd(Z!dS )-r   NTr   redirect_slashesdefault
on_startupon_shutdownlifespanr   c                 N   |g nt          |          | _        || _        || j        n|| _        |g nt          |          | _        |g nt          |          | _        |s|rt          j        dt                     |t          |           | _        d S t          j        |          r0t          j        dt                     t          |          | _        d S t          j        |          r0t          j        dt                     t!          |          | _        d S || _        d S )NzThe on_startup and on_shutdown parameters are deprecated, and they will be removed on version 1.0. Use the lifespan parameter instead. See more about it on https://www.starlette.io/lifespan/.zjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead)r    r   rD  	not_foundrE  rF  rG  r<   r=   r>   r7  r-  rC   isasyncgenfunctionr   isgeneratorfunctionr5  )r$   r   rD  rE  rF  rG  rH  s          r'   r#   zRouter.__init__@  s[    #NbbV 0)0t~~g * 2""Z8H8H!,!422${:K:K 	 	MK #	   .>t.D.DD!!!'11 	-MJ"  
 %8% %D!!! (22 
	-MJ"  
 %?% %D!!! %-D!!!r(   rG   rH   rI   c                    K   |d         dk    r#t                      } ||||           d {V  d S d|v rt          d          t          dd          } ||||           d {V  d S )Nr   r   rO   r   r   r   )r   r   r   )r$   rG   rH   rI   r   rM   s         r'   rJ  zRouter.not_foundq  s      =K'',..O!/%$777777777F
 E>>C0000(#FFFHhugt,,,,,,,,,,,r(   _Router__namer   c                 v    | j         D ]"}	  |j        |fi |c S # t          $ r Y w xY wt          ||          rW   )r   r   r   )r$   rN  r   r  s       r'   r   zRouter.url_path_for  si    [ 	 	E)u)&@@K@@@@@   6;///s   
((c                 r   K   | j         D ],}t          |          r |             d{V  " |             -dS )z7
        Run any `.on_startup` event handlers.
        N)rF  r   r$   handlers     r'   r<  zRouter.startup  sY        	 	G )) gii						 	r(   c                 r   K   | j         D ],}t          |          r |             d{V  " |             -dS )z8
        Run any `.on_shutdown` event handlers.
        N)rG  r   rQ  s     r'   r?  zRouter.shutdown  sZ       ' 	 	G )) gii						 	r(   c                 B  K   d}|                     d          } |             d{V  	 |                     |          4 d{V }|.d|vrt          d          |d                             |            |ddi           d{V  d} |             d{V  ddd          d{V  n# 1 d{V swxY w Y    |dd	i           d{V  dS # t          $ r@ t          j                    }|r |d
|d           d{V  n |d|d           d{V   w xY w)z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrO   Nstatez:The server does not support "state" in the lifespan scope.r   zlifespan.startup.completeTzlifespan.shutdown.completezlifespan.shutdown.failed)r   messagezlifespan.startup.failed)r   r-  RuntimeErrorr   r*  r$  
format_exc)r$   rG   rH   rI   startedrO   maybe_stateexc_texts           r'   rH  zRouter.lifespan  s>     
 ))E**gii	?,,S11 	  	  	  	  	  	  	 [*e++*X   'N))+666dF$?@AAAAAAAAAgii	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 $ $ <=>>>>>>>>>>>  	 	 	 +--H Ud$>8TTUUUUUUUUUUd$=(SSTTTTTTTTT	s1   C AB.C .
B88C ;B8<C A
Dc                   K   |d         dv sJ d|vr| |d<   |d         dk    r|                      |||           d{V  dS d}| j        D ]u}|                    |          \  }}|t          j        k    r5|                    |           |                    |||           d{V   dS |t          j        k    r||}|}v|4|                    |           |                    |||           d{V  dS |d         dk    r| j        r|d         dk    rt          |          }	|d         
                    d          r|	d                             d          |	d<   n|	d         dz   |	d<   | j        D ]m}|                    |	          \  }}|t          j        k    rCt          |		          }
t          t          |
          
          } ||||           d{V   dS n|                     |||           d{V  dS )z;
        The main entry point to the Router class.
        r   )r   r   rH  r8  rH  Nr   r[   ri   r  )r  )rH  r   r   r3   r8   r   r   r7   rD  r   endswithr   r6   r	   r   r-   rE  )r$   rG   rH   rI   rA   r  r   r   partial_scoperedirect_scoperedirect_urlrM   s               r'   r   zRouter.__call__  s      V} AAAAA5  "E(O=J&&--w555555555F[ 
	, 
	,E "'u!5!5E;
""[)))ll5'4888888888%-''GO + LL'''..666666666F=F""t'<"vRUAUAU!%[[NV}%%c** F)7)?)F)Fs)K)Kv&&)7)?#)Ev&  %*]]>%B%B"{EJ&&#&^#<#<#<L/C4E4EFFFH"(5'4888888888FF	 ' ll5'400000000000r(   r   c                 L    t          |t                    o| j        |j        k    S rW   )r?   r   r   r   s     r'   r   zRouter.__eq__  s     %((HT[EL-HHr(   r[   rO   r   c                 ^    t          |||          }| j                            |           d S N)rO   r   )r   r   append)r$   r[   rO   r   r  s        r'   mountzRouter.mount  s4     d$///5!!!!!r(   r  c                 ^    t          |||          }| j                            |           d S rc  )r  r   rd  )r$   r  rO   r   r  s        r'   r  zRouter.host  s4     Ts...5!!!!!r(   rU   r   r   c                 b    t          |||||          }| j                            |           d S )N)rU   r   r   r   )r   r   rd  )r$   r[   rU   r   r   r   r  s          r'   	add_routezRouter.add_route  sE     /
 
 
 	5!!!!!r(   c                 ^    t          |||          }| j                            |           d S )N)rU   r   )r   r   rd  )r$   r[   rU   r   r  s        r'   add_websocket_routezRouter.add_websocket_route  s4     thTBBB5!!!!!r(   c                      t          j        dt                     dt          j        dt          j        f fd}|S )z
        We no longer document this decorator style API, and its usage is discouraged.
        Instead you should use the following approach:

        >>> routes = [Route(path, endpoint=...), ...]
        >>> app = Starlette(routes=routes)
        zThe `route` decorator is deprecated, and will be removed in version 1.0.0.Refer to https://www.starlette.io/routing/#http-routing for the recommended approach.rB   r   c                 <                         |            | S )Nr   )rh  )rB   r   r   r   r[   r$   s    r'   	decoratorzRouter.route.<locals>.decorator'  s4    NN"3     Kr(   r<   r=   r>   r.   r   )r$   r[   r   r   r   rm  s   ````` r'   r  zRouter.route  sr     	d	
 	
 	
	FO 	 	 	 	 	 	 	 	 	 	 	 r(   c                      t          j        dt                     dt          j        dt          j        f fd}|S )a  
        We no longer document this decorator style API, and its usage is discouraged.
        Instead you should use the following approach:

        >>> routes = [WebSocketRoute(path, endpoint=...), ...]
        >>> app = Starlette(routes=routes)
        zThe `websocket_route` decorator is deprecated, and will be removed in version 1.0.0. Refer to https://www.starlette.io/routing/#websocket-routing for the recommended approach.rB   r   c                 8                         |            | S )Nr   )rj  )rB   r   r[   r$   s    r'   rm  z)Router.websocket_route.<locals>.decoratorC  s#    $$T4d$;;;Kr(   rn  )r$   r[   r   rm  s   ``` r'   websocket_routezRouter.websocket_route3  sf     	`	
 	
 	
	FO 	 	 	 	 	 	 	 	 	 r(   
event_typerB   c                     |dv sJ |dk    r| j                             |           d S | j                            |           d S )N)r<  r?  r<  )rF  rd  rG  )r$   rr  rB   s      r'   add_event_handlerzRouter.add_event_handlerI  sZ     44444""O""4(((((##D)))))r(   c                 |     t          j        dt                     dt          j        dt          j        f fd}|S )NzThe `on_event` decorator is deprecated, and will be removed in version 1.0.0. Refer to https://www.starlette.io/lifespan/ for recommended approach.rB   r   c                 4                         |            | S rW   )rt  )rB   rr  r$   s    r'   rm  z"Router.on_event.<locals>.decoratorZ  s    "":t444Kr(   rn  )r$   rr  rm  s   `` r'   on_eventzRouter.on_eventS  s^    T	
 	
 	
	FO 	 	 	 	 	 	 	 	 r(   )NTNNNNrA  rW   )NNT)"r)   r*   r+   r.   r   r	  r   r   r   r   r   r0   r#   r   r   r   rJ  r-   r   r   r<  r?  rH  r   r   re  r  r   rh  rj  r  rq  rt  rw  r9   r(   r'   r   r   ?  s#        ?C!%,0HLIM ;?/- /-	 :;/- /- )	/-
 OFOFO$DE/- _V_V_%EF/- /(6:"67/- 
/- /- /- /-b-U -W -D -T - - - -03 0vz 0g 0 0 0 0      ?E ?G ?4 ?D ? ? ? ?:21E 21G 214 21D 21 21 21 21hIFJ I4 I I I I EI" ""%"-3_S-A"	" " " " EI" ""%"-3_S-A"	" " " " 6:%)"&" "" /" S!12	"
 oc""  " 
" " " "$ RV" ""#)?":@/#:N"	" " " " 6:%)"&  S!12 oc"	
   
   B 7; %s3	   ,**%+_*	* * * *3 6?      r(   r   )Hr2  r@   rC   ry   r$  r+  r.   r<   r   enumr   starlette._utilsr   starlette.concurrencyr   starlette.convertorsr   r   starlette.datastructuresr	   r
   r   starlette.exceptionsr   starlette.middlewarer   starlette.requestsr   starlette.responsesr   r   starlette.typesr   r   r   r   r   starlette.websocketsr   r   	Exceptionr   r3   r0   r   rE   r   rP   rT   r-   rZ   r/   r   r   rg   r   ru   Patternr   r   r   r   r   r  TypeVarr  AsyncContextManagerr  	Generatorr5  r7  r   r9   r(   r'   <module>r     s
            				        * * * * * *       . . . . . . 3 3 3 3 3 3 ; ; ; ; ; ; ; ; : : : : : : : : : : . . . . . . + + + + + + & & & & & & C C C C C C C C C C C C C C C C C C C C C C : : : : : : : :V V V V V9 V V V    D   ,
 ,t , , , ,6? w    $
FO 
 
 
 
 
'v '3 ' ' ' '
k#y.1 S#X& \#t)	    bjOPP7A
7A\&.#v{3	>'BBC7A 7A 7A 7At0 0 0 0 0 0 0 0<[R [R [R [R [RI [R [R [R|:T :T :T :T :TY :T :T :TzeT eT eT eT eTI eT eT eTPET ET ET ET ET9 ET ET ETP V^DA A A A Av9"= A A A 	ovzlF4D&DE	_fj\6#==>	 	 	 	       _ _ _ _ _ _ _ _ _ _r(   