
    6i6s                       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	m
Z
mZmZ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mZ d dlmZ d d	lmZmZ d d
lmZ d dlm Z m!Z! d dl"m#Z#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.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8  G d de9      Z: G d de      Z;	 	 	 	 d/dZ<	 	 	 	 d0dZ=d1dZ>	 	 	 	 	 	 	 	 d2dZ? ej                  d      ZA	 	 	 	 d3dZB G d d      ZC G d d eC      ZD G d! d"eC      ZE G d# d$eC      ZF G d% d&eC      ZG ed'      ZH G d( d)eeH         ZI	 	 	 	 d4d*ZJ G d+ d,      ZK G d- d.      ZLy)5    )annotationsN)	AwaitableCallable
Collection	GeneratorSequence)AbstractAsyncContextManagerAbstractContextManagerasynccontextmanager)Enum)Pattern)AnyTypeVar)wrap_app_handling_exceptions)get_route_pathis_async_callable)run_in_threadpool)CONVERTOR_TYPES	Convertor)URLHeadersURLPath)HTTPException)
Middleware)Request)PlainTextResponseRedirectResponseResponse)ASGIAppLifespanReceiveScopeSend)	WebSocketWebSocketClosec                  $     e Zd ZdZd 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.
    c                    dj                  t        |j                                     }t        |   d| d| d       y )N, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfnamepath_paramsparams	__class__s       D/var/www/files/kim/lib/python3.12/site-packages/starlette/routing.pyr.   zNoMatchFound.__init__#   s=    4 0 0 2345dV>&QSTU    )r0   strr1   zdict[str, Any]returnNone)__name__
__module____qualname____doc__r.   __classcell__)r3   s   @r4   r'   r'      s    
V Vr5   r'   c                      e Zd ZdZdZdZy)Matchr         N)r9   r:   r;   NONEPARTIALFULL r5   r4   r?   r?   (   s    DGDr5   r?   c                b    t        |       r| nt        j                  t        |       dfd}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    c                t   K   t        | ||      dfd} t        |      | ||       d {    y 7 w)Nc                Z   K           d {   } || ||       d {    y 7 7 wNrE   )scopereceivesendresponsefrequests       r4   appz*request_response.<locals>.app.<locals>.app<   s.     wZ'H5'4000 (0s   +'+)++rJ   r"   rK   r!   rL   r#   r7   r8   )r   r   )rJ   rK   rL   rP   rO   rN   s       @r4   rP   zrequest_response.<locals>.app9   s8     %$/	1 9*38NNNs   ,868rQ   )r   	functoolspartialr   )funcrP   rN   s     @r4   request_responserU   .   s2     "$'Y->->?PRV-W O Jr5   c                     d fd}|S )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    c                v   K   t        | ||      dfd} t        |      | ||       d {    y 7 w)N)rK   rL   c                2   K           d {    y 7 wrI   rE   )rJ   rK   rL   rT   sessions      r4   rP   z+websocket_session.<locals>.app.<locals>.appP   s     w-s   rQ   )r$   r   )rJ   rK   rL   rP   rY   rT   s       @r4   rP   zwebsocket_session.<locals>.appM   s8     E7>	  9*38NNNs   -979rQ   rE   )rT   rP   s   ` r4   websocket_sessionrZ   E   s    O Jr5   c                D    t        | d| j                  j                        S )Nr9   )getattrr3   r9   )endpoints    r4   get_namer^   X   s    8Z););)D)DEEr5   c                    t        |j                               D ]O  \  }}d|z   dz   | v s||   }|j                  |      }| j                  d|z   dz   |      } |j	                  |       Q | |fS )N{})r+   items	to_stringreplacepop)pathparam_convertorsr1   keyvalue	convertors         r4   replace_paramsrk   \   s    
 ;,,./ !
U9s?d"(-I''.E<<c	C7DOOC ! r5   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}c                x   | j                  d       }d}d}t               }d}i }t        j                  |       D ]  }|j	                  d      \  }}	|	j                  d      }	|	t        v sJ d|	 d       t        |	   }
|t        j                  | ||j                                z  }|d	| d
|
j                   dz  }|| ||j                          z  }|d|z  z  }||v r|j                  |       |
||<   |j                         } |r@dj                  t        |            }t        |      dkD  rdnd}t!        d| d| d|        |r3| |d j#                  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   r6   :zUnknown path convertor ''z(?P<>)z{%s}r)   r@   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)rf   is_host
path_regexpath_formatduplicated_paramsidxrg   match
param_nameconvertor_typerj   namesendinghostnames                 r4   compile_pathr   n   s    //#&&GJK"%%
C%%d+ %*\\%%8"
N'..s30^4L^L\\]2^^0#N3	biiS5;;= 9::
ZL)//):!<<
tC%++-00v
**))!!*-'0$iik#& 		&!234-.20%	$PQQ:##C(+bii)C//
biiST
+c11
4:K::j!;0@@@r5   c                  ,    e Zd ZddZddZddZddZy)		BaseRoutec                    t               rI   NotImplementedError)r/   rJ   s     r4   matcheszBaseRoute.matches       !##r5   c                   t               rI   r   )r/   r0   r1   s      r4   url_path_forzBaseRoute.url_path_for   r   r5   c                   K   t               wrI   r   r/   rJ   rK   rL   s       r4   handlezBaseRoute.handle   s     !##s   c                X  K   | j                  |      \  }}|t        j                  k(  rM|d   dk(  r t        dd      } ||||       d{    y|d   dk(  rt	               } ||||       d{    y|j                  |       | j                  |||       d{    y7 W7 47 	w)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   r?   rB   r   r%   updater   )r/   rJ   rK   rL   r   child_scoperM   websocket_closes           r4   __call__zBaseRoute.__call__   s      "\\%0{EJJV}&,[cJugt444  v+-"0"2%eWd;;;[!kk%$/// 5 < 	0s6   A
B*B$$B*1B&2,B*B(B*&B*(B*NrJ   r"   r7   ztuple[Match, Scope]r0   r6   r1   r   r7   r   rQ   )r9   r:   r;   r   r   r   r   rE   r5   r4   r   r      s    $$$0r5   r   c                  b    e Zd Zddddd	 	 	 	 	 	 	 	 	 	 	 	 	 d
dZddZddZddZddZdd	Zy)RouteNT)methodsr0   include_in_schema
middlewarec                  |j                  d      sJ d       || _        || _        |t        |      n|| _        || _        |}t        |t        j                        r'|j                  }t        |t        j                        r't        j                  |      st        j                  |      rt        |      | _        |dg}n|| _        |/t        |      D ]!  \  }}	}
 || j                  g|	i |
| _        # |d | _        nL|D ch c]  }|j#                          c}| _        d| j                   v r| j                   j%                  d       t'        |      \  | _        | _        | _        y c c}w )Nrm    Routed paths must start with '/'GETHEAD)rw   rf   r]   r^   r0   r   
isinstancerR   rS   rT   inspect
isfunctionismethodrU   rP   reversedr   upperr   r   r   r   rg   )r/   rf   r]   r   r0   r   r   endpoint_handlerclsargskwargsmethods               r4   r.   zRoute.__init__   sW    s#G%GG#	 *.,HX&D	!2#)9+<+<=/44 )9+<+<=./73C3CDT3U'1DH '  DH!%-j%9 :!T6txx9$9&9: ?DL9@AvFLLNADL$  (COPTCU@)4+@	 Bs   E2c                   |d   dk(  rt        |      }| j                  j                  |      }|r|j                         }|j	                         D ]&  \  }}| j
                  |   j                  |      ||<   ( t        |j                  di             }|j                  |       | j                  |d}| j                  r#|d   | j                  vrt        j                  |fS t        j                  |fS t        j                  i fS )Nr   r   r1   r]   r1   r   )r   r   r   	groupdictrb   rg   convertdictgetr   r]   r   r?   rC   rD   rB   	r/   rJ   
route_pathr   matched_paramsrh   ri   r1   r   s	            r4   r   zRoute.matches   s    =F"'.JOO))*5E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2+/==U<<E(O4<<$G ==+55 ::{22zz2~r5   c               $   t        |j                               }t        | j                  j                               }|| j                  k7  s||k7  rt	        ||      t        | j                  | j                  |      \  }}|rJ t        |d      S )Nr   rf   protocolrx   r,   rg   r0   r'   rk   r   r   r/   r0   r1   seen_paramsexpected_paramsrf   remaining_paramss          r4   r   zRoute.url_path_for   s    +**,-d3388:;499 >t[11!/0@0@$BWBWYd!e###D622r5   c                "  K   | j                   r`|d   | j                   vrOddj                  | j                         i}d|v rt        d|      t        dd|      } ||||       d {    y | j	                  |||       d {    y 7 !7 w)Nr   Allowr)   rP   i  )r   headerszMethod Not Allowed)r   r*   r   r   rP   )r/   rJ   rK   rL   r   rM   s         r4   r   zRoute.handle  s     <<E(O4<<?		$,, 78G~#WEE,-As\cd5'4000((5'4000 10s$   A'B)B*BBBBc                    t        |t              xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rI   )r   r   rf   r]   r   r/   others     r4   __eq__zRoute.__eq__  sR    ue$ .		UZZ'./. -		
r5   c                    | j                   j                  }t        | j                  xs g       }| j                  | j
                  }}| d|d|d|dS )N(path=, name=z
, methods=rs   )r3   r9   r   r   rf   r0   )r/   
class_namer   rf   r0   s        r4   __repr__zRoute.__repr__  sT    ^^,,
+,YY		dVD874(*WKqQQr5   )rf   r6   r]   Callable[..., Any]r   Collection[str] | Noner0   
str | Noner   boolr   Sequence[Middleware] | Noner7   r8   r   r   rQ   r   r   r7   r   r7   r6   	r9   r:   r;   r.   r   r   r   r   r   rE   r5   r4   r   r      s|     +/"&26'V'V %'V
 ('V 'V  'V 0'V 
'VR$	3	1
Rr5   r   c                  V    e Zd Zddd	 	 	 	 	 	 	 	 	 d	dZd
dZddZddZddZddZy)WebSocketRouteN)r0   r   c                   |j                  d      sJ d       || _        || _        |t        |      n|| _        |}t        |t        j                        r'|j                  }t        |t        j                        r't        j                  |      st        j                  |      rt        |      | _        n|| _        |/t        |      D ]!  \  }}} || j                  g|i || _        # t        |      \  | _        | _        | _        y )Nrm   r   )rw   rf   r]   r^   r0   r   rR   rS   rT   r   r   r   rZ   rP   r   r   r   r   rg   )	r/   rf   r]   r0   r   r   r   r   r   s	            r4   r.   zWebSocketRoute.__init__&  s     s#G%GG#	 *.,HX&D	#)9+<+<=/44 )9+<+<=./73C3CDT3U(2DH  DH!%-j%9 :!T6txx9$9&9: DPPTCU@)4+@r5   c                   |d   dk(  rt        |      }| j                  j                  |      }|r|j                         }|j	                         D ]&  \  }}| j
                  |   j                  |      ||<   ( t        |j                  di             }|j                  |       | j                  |d}t        j                  |fS t        j                  i fS )Nr   r   r1   r   )r   r   r   r   rb   rg   r   r   r   r   r]   r?   rD   rB   r   s	            r4   r   zWebSocketRoute.matchesC  s    =K''.JOO))*5E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2+/==Uzz;..zz2~r5   c               $   t        |j                               }t        | j                  j                               }|| j                  k7  s||k7  rt	        ||      t        | j                  | j                  |      \  }}|rJ t        |d      S )Nr   r   r   r   s          r4   r   zWebSocketRoute.url_path_forR  s    +**,-d3388:;499 >t[11!/0@0@$BWBWYd!e###D;77r5   c                F   K   | j                  |||       d {    y 7 wrI   rP   r   s       r4   r   zWebSocketRoute.handle]       hhugt,,,   !!c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rI   )r   r   rf   r]   r   s     r4   r   zWebSocketRoute.__eq__`  s9    %0pTYY%**5LpQUQ^Q^bgbpbpQppr5   c                h    | j                   j                   d| j                  d| j                  dS )Nr   r   rs   )r3   r9   rf   r0   r/   s    r4   r   zWebSocketRoute.__repr__c  s/    ..))*&WTYYMQRSSr5   )
rf   r6   r]   r   r0   r   r   r   r7   r8   r   r   rQ   r   r   r   rE   r5   r4   r   r   %  s`      26VV %V
 V 0V 
V:	8-qTr5   r   c                  r    e Zd Z	 	 	 d
dd	 	 	 	 	 	 	 	 	 	 	 ddZedd       ZddZddZddZddZ	dd	Z
y)MountNr   c                  |dk(  s|j                  d      sJ d       |	|J d       |j                  d      | _        ||| _        nt	        |      | _        | j                  | _        |/t        |      D ]!  \  }}} || j
                  g|i || _        # || _        t        | j                  dz         \  | _	        | _
        | _        y )Nro   rm   r   z0Either 'app=...', or 'routes=' must be specified)routesz/{path:path})rw   rstriprf   	_base_appRouterrP   r   r0   r   r   r   rg   )	r/   rf   rP   r   r0   r   r   r   r   s	            r4   r.   zMount.__init__h  s     rzT__S1U3UU1&"4h6hh4KK$	?&)DN#62DN>>!%-j%9 :!T6txx9$9&9:	COPTPYPY\jPjCk@)4+@r5   c                0    t        | j                  dg       S Nr   )r\   r   r   s    r4   r   zMount.routes  s    t~~x44r5   c                F   |d   dv r|j                  dd      }t        |      }| j                  j                  |      }|r|j	                         }|j                         D ]&  \  }}| j                  |   j                  |      ||<   ( d|j                  d      z   }|d t        |        }	t        |j                  di             }
|
j                  |       |
|j                  d|      ||	z   | j                  d	}t        j                  |fS t        j                  i fS )
Nr   r   r   	root_pathro   rm   rf   r1   app_root_path)r1   r   r   r]   )r   r   r   r   r   rb   rg   r   re   r   r   r   rP   r?   rD   rB   )r/   rJ   r   r   r   r   rh   ri   remaining_pathmatched_pathr1   r   s               r4   r   zMount.matches  s   =11		+r2I'.JOO))*5E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T!$~'9'9&'A!A)*@S-@,@A"599]B#?@"">2#. &+YY	%J!*\!9 $  zz;..zz2~r5   c                  | j                   \|| j                   k(  rMd|v rI|d   j                  d      |d<   t        | j                  | j                  |      \  }}|st        |      S | j                   |j                  | j                   dz         r| j                   |}n|t        | j                         dz   d  }|j                  d      }d|d<   t        | j                  | j                  |      \  }}|||d<   | j                  xs g D ]I  }	  |j                  |fi |}	t        |j                  d      t        |	      z   |	j                        c S  t        ||      # t        $ r Y cw xY w)Nrf   rm   )rf   rp   r@   ro   r   )r0   r|   rk   r   rg   r   rw   r   r   r   r   r   r6   r   r'   )
r/   r0   r1   rf   r   remaining_name
path_kwargpath_prefixrouteurls
             r4   r   zMount.url_path_for  sy   99 TTYY%66[;P"-f"5"<"<S"AK%3D4D4DdF[F[]h%i"D"#D))YY$//$))c/"Byy !% "&c$))nq&8&:!;$0J"$K,:4;K;KTMbMbdo,p)K)%+5 (* ,%,,^P?OPC"(:(:3(?#c((JUXUaUabb 4-- $ s   AE&&	E21E2c                F   K   | j                  |||       d {    y 7 wrI   r   r   s       r4   r   zMount.handle  r   r   c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rI   )r   r   rf   rP   r   s     r4   r   zMount.__eq__  s6    %']DII,C]TYT]T]H]]r5   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nro   r   r   , app=rs   )r3   r9   r0   rf   rP   r/   r   r0   s      r4   r   zMount.__repr__  F    ^^,,
yyBVDII=xvdhh\QRSSr5   )NNN)rf   r6   rP   ASGIApp | Noner   Sequence[BaseRoute] | Noner0   r   r   r   r7   r8   r7   zlist[BaseRoute]r   r   rQ   r   r   r9   r:   r;   r.   propertyr   r   r   r   r   r   rE   r5   r4   r   r   g  s     #-1l 37ll l +	l
 l 0l 
l. 5 5B.6-^Tr5   r   c                  P    e Zd Zd	d
dZedd       ZddZddZddZddZ	ddZ
y)HostNc                    |j                  d      rJ d       || _        || _        || _        t	        |      \  | _        | _        | _        y )Nrm   zHost must not start with '/')rw   hostrP   r0   r   
host_regexhost_formatrg   )r/   r  rP   r0   s       r4   r.   zHost.__init__  sI    ??3'G)GG'		COPTCU@)4+@r5   c                0    t        | j                  dg       S r   )r\   rP   r   s    r4   r   zHost.routes  s    txx2..r5   c                   |d   dv rt        |      }|j                  dd      j                  d      d   }| j                  j	                  |      }|r|j                         }|j                         D ]&  \  }}| j                  |   j                  |      ||<   ( t        |j                  di             }|j                  |       || j                  d	}	t        j                  |	fS t        j                  i fS )
Nr   r   rJ   r  ro   rp   r   r1   )r1   r]   )r   r   r   r  r   r   rb   rg   r   r   r   rP   r?   rD   rB   )
r/   rJ   r   r  r   r   rh   ri   r1   r   s
             r4   r   zHost.matches  s    =11E*G;;vr*005a8DOO))$/E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2.9txxPzz;..zz2~r5   c                  | j                   W|| j                   k(  rHd|v rD|j                  d      }t        | j                  | j                  |      \  }}|st        ||      S | j                   |j                  | j                   dz         r| j                   |}n|t        | j                         dz   d  }t        | j                  | j                  |      \  }}| j                  xs g D ]8  }	  |j                  |fi |}t        t        |      |j                  |      c S  t        ||      # t        $ r Y Rw xY w)Nrf   )rf   r  rp   r@   )rf   r   r  )r0   re   rk   r  rg   r   rw   r   r   r   r6   r   r'   )	r/   r0   r1   rf   r  r   r  r  r  s	            r4   r   zHost.url_path_for  s5   99 TTYY%66[;P??6*D%3D4D4DdF[F[]h%i"D"#Dt44YY$//$))c/"Byy !% "&c$))nq&8&:!;%3D4D4DdF[F[]h%i"D"* ,%,,^P?OPC"C3<<dSS 4-- $ s   03D33	D?>D?c                F   K   | j                  |||       d {    y 7 wrI   r   r   s       r4   r   zHost.handle  r   r   c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rI   )r   r  r  rP   r   s     r4   r   zHost.__eq__   s6    %&\499

+B\txxSXS\S\G\\r5   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nro   z(host=r   r  rs   )r3   r9   r0   r  rP   r  s      r4   r   zHost.__repr__  r  r5   rI   r  r6   rP   r   r0   r   r7   r8   r  r   r   rQ   r   r   r  rE   r5   r4   r  r    s7    V / /..-]Tr5   r  _Tc                  4    e Zd ZddZddZ	 	 	 	 	 	 	 	 ddZy)_AsyncLiftContextManagerc                    || _         y rI   )_cm)r/   cms     r4   r.   z!_AsyncLiftContextManager.__init__  s	    r5   c                >   K   | j                   j                         S wrI   )r&  	__enter__r   s    r4   
__aenter__z#_AsyncLiftContextManager.__aenter__  s     xx!!##s   c                D   K   | j                   j                  |||      S wrI   )r&  __exit__)r/   exc_type	exc_value	tracebacks       r4   	__aexit__z"_AsyncLiftContextManager.__aexit__  s!      xx  9i@@s    N)r'  zAbstractContextManager[_T])r7   r"  )r-  ztype[BaseException] | Noner.  zBaseException | Noner/  ztypes.TracebackType | Noner7   zbool | None)r9   r:   r;   r.   r*  r0  rE   r5   r4   r$  r$    s<    $A,A (A .	A
 
Ar5   r$  c                n    t        j                  |       t        j                        dfd       }|S )Nc                &    t         |             S rI   )r$  )rP   cmgrs    r4   wrapperz+_wrap_gen_lifespan_context.<locals>.wrapper!  s    'S	22r5   )rP   r   r7   z_AsyncLiftContextManager[Any])
contextlibcontextmanagerrR   wraps)lifespan_contextr4  r3  s     @r4   _wrap_gen_lifespan_contextr9    s8     $$%56D__T3 3 Nr5   c                  ,    e Zd ZddZddZddZd	dZy)
_DefaultLifespanc                    || _         y rI   )_router)r/   routers     r4   r.   z_DefaultLifespan.__init__)  s	    r5   c                   K   y wrI   rE   r   s    r4   r*  z_DefaultLifespan.__aenter__,  	        c                   K   y wrI   rE   )r/   exc_infos     r4   r0  z_DefaultLifespan.__aexit__/  r@  rA  c                    | S rI   rE   )r/   rP   s     r4   r   z_DefaultLifespan.__call__2  s    r5   N)r>  r   )r7   r8   )rC  objectr7   r8   )r/   r"  rP   rE  r7   r"  )r9   r:   r;   r.   r*  r0  r   rE   r5   r4   r;  r;  (  s    r5   r;  c                      e Zd Z	 	 	 	 ddd	 	 	 	 	 	 	 	 	 	 	 ddZddZddZddZddZddZdd	Z	ddd
Z
dddZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZy)r   Nr   c                  |g n
t        |      | _        || _        || j                  n|| _        |t        |       | _        nt        j                  |      r+t        j                  dt               t        |      | _        nGt        j                  |      r+t        j                  dt               t        |      | _        n|| _        | j                  | _        |r0t#        |      D ]!  \  }}} || j                   g|i || _        # y y )Nzjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead)r+   r   redirect_slashes	not_founddefaultr;  r8  r   isasyncgenfunctionwarningswarnDeprecationWarningr   isgeneratorfunctionr9  rP   middleware_stackr   )	r/   r   rH  rJ  lifespanr   r   r   r   s	            r4   r.   zRouter.__init__7  s     #NbV 0)0t~~g3CD3ID!''1MMJ"
 %8$AD!((2MMv" %?x$HD!$,D! $%-j%9 T!T6(+D,A,A(SD(SF(S%T r5   c                   K   |d   dk(  rt               } ||||       d {    y d|v rt        d      t        dd      } ||||       d {    y 7 57 w)Nr   r   rP   r   r   r   )r%   r   r   )r/   rJ   rK   rL   r   rM   s         r4   rI  zRouter.not_found^  sl     =K',.O!%$777
 E>C00(#FHugt,,, 8 	-s!    AA/AAAAc                   | j                   D ]  }	  |j                  |fi |c S  t        ||      # t        $ r Y 1w xY wrI   )r   r   r'   )r/   r0   r1   r  s       r4   r   zRouter.url_path_form  sU    [[ 	E)u))$>+>>	
 4--   s   3	??c                6  K   d}|j                  d      } |        d{    	 | j                  |      4 d{   }|#d|vrt        d      |d   j                  |        |ddi       d{    d} |        d{    ddd      d{     |dd	i       d{    y7 7 q7 <7 -7 # 1 d{  7  sw Y   /xY w7 $# t        $ rA t        j                         }|r |d
|d       d{  7     |d|d       d{  7    w xY ww)z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrP   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   r8  RuntimeErrorr   BaseExceptionr/  
format_exc)r/   rJ   rK   rL   startedrP   maybe_stateexc_texts           r4   rQ  zRouter.lifespanu  s6    
 99U#i	?,,S1    [*e+*+ghh'N))+6F$?@AAAi      <=>>>% 	 
 B         ?  	 ++-H$>8TUUU  $=(STTT	s   DB+DC B-C 3B52B/3B5B1B5C B3C D%C
&D-C /B51B53C 5C;B><CC 
D-D9C<:DDDDc                F   K   | j                  |||       d{    y7 w)z;
        The main entry point to the Router class.
        N)rP  r   s       r4   r   zRouter.__call__  s       ##E7D999r   c                  K   |d   dv sJ d|vr| |d<   |d   dk(  r| j                  |||       d {    y d }| j                  D ]r  }|j                  |      \  }}|t        j                  k(  r.|j                  |       |j                  |||       d {     y |t        j                  k(  sl|o|}|}t |-|j                         |j                  |||       d {    y t        |      }	|d   dk(  r| j                  r|	dk7  rt        |      }
|	j                  d      r|
d   j                  d      |
d<   n|
d   dz   |
d<   | j                  D ]^  }|j                  |
      \  }}|t        j                  k7  s+t        |
      }t        t!        |      	      } ||||       d {     y  | j#                  |||       d {    y 7 7 B7 7 +7 w)
Nr   )r   r   rQ  r>  rQ  r   rm   rf   r  )r  )rQ  r   r   r?   rD   r   r   rC   r   rH  r   endswithr   rB   r   r   r6   rJ  )r/   rJ   rK   rL   rS   r  r   r   partial_scoper   redirect_scoperedirect_urlrM   s                r4   rP   z
Router.app  s    V} AAAA5 "E(O=J&--w555[[ 
	,E "'u!5E;

"[)ll5'4888%--'GO +
	,  LL'..666#E*
=F"t'<'<sAR!%[N""3')7)?)F)Fs)Kv&)7)?#)Ev& %*]]>%B"{EJJ&#&^#<L/C4EFH"5'4888 ll5'4000S 6 9 7  9 	1sk   1G#GA$G#GG#3G#6/G#%G&BG#.G#3G4G#G!G#G#G#G#!G#c                X    t        |t              xr | j                  |j                  k(  S rI   )r   r   r   r   s     r4   r   zRouter.__eq__  s!    %(HT[[ELL-HHr5   c                V    t        |||      }| j                  j                  |       y N)rP   r0   )r   r   append)r/   rf   rP   r0   r  s        r4   mountzRouter.mount  s"    d$/5!r5   c                V    t        |||      }| j                  j                  |       y re  )r  r   rf  )r/   r  rP   r0   r  s        r4   r  zRouter.host  s"    Ts.5!r5   c                Z    t        |||||      }| j                  j                  |       y )N)r]   r   r0   r   )r   r   rf  )r/   rf   r]   r   r0   r   r  s          r4   	add_routezRouter.add_route  s1     /
 	5!r5   c                V    t        |||      }| j                  j                  |       y )N)r]   r0   )r   r   rf  )r/   rf   r]   r0   r  s        r4   add_websocket_routezRouter.add_websocket_route  s$     thTB5!r5   )NTNN)r   r  rH  r   rJ  r  rQ  zLifespan[Any] | Noner   r   r7   r8   rQ   r   r   rI   )rf   r6   rP   r   r0   r   r7   r8   r!  )NNT)rf   r6   r]   3Callable[[Request], Awaitable[Response] | Response]r   r   r0   r   r   r   r7   r8   )rf   r6   r]   &Callable[[WebSocket], Awaitable[None]]r0   r   r7   r8   )r9   r:   r;   r.   rI  r   rQ  r   rP   r   rg  r  rj  rl  rE   r5   r4   r   r   6  s	    .2!%"& *.%T 37%T*%T %T  	%T '%T 0%T 
%TN-.?6:01dI"" +/"&"" F" (	"
 "  " 
"*  	"" 9" 	"
 
"r5   r   )rT   rm  r7   r   )rT   rn  r7   r   )r]   r   r7   r6   )rf   r6   rg   zdict[str, Convertor[Any]]r1   zdict[str, str]r7   ztuple[str, dict[str, str]])rf   r6   r7   z3tuple[Pattern[str], str, dict[str, Convertor[Any]]])r8  z)Callable[[Any], Generator[Any, Any, Any]]r7   z1Callable[[Any], AbstractAsyncContextManager[Any]])M
__future__r   r5  rR   r   r}   r/  typesrL  collections.abcr   r   r   r   r   r	   r
   r   enumr   r   typingr   r   starlette._exception_handlerr   starlette._utilsr   r   starlette.concurrencyr   starlette.convertorsr   r   starlette.datastructuresr   r   r   starlette.exceptionsr   starlette.middlewarer   starlette.requestsr   starlette.responsesr   r   r   starlette.typesr   r    r!   r"   r#   starlette.websocketsr$   r%   	Exceptionr'   r?   rU   rZ   r^   rk   r   ry   r   r   r   r   r   r  r"  r$  r9  r;  r   rE   r5   r4   <module>r     s   "    	    P P _ _    E > 3 ; : : . + & M M C C :V9 VD 
=.
0&F
/    	 bjjOP5A
5A85Ap0 0<^RI ^RB?TY ?TDaTI aTH;T9 ;T| T]A:2> A 	?	6	 u" u"r5   