o
    Þ­j•‰  ã                   @  s  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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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l%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z,m-Z- G dd„ de.ƒZ/G dd„ deƒZ0dIdd„Z1dJdd„Z2dKd d!„Z3dLd%d&„Z4dMd-d.„Z5e 6d/¡Z7dNd1d2„Z8G d3d4„ d4ƒZ9G d5d6„ d6e9ƒZ:G d7d8„ d8e9ƒZ;G d9d:„ d:e9ƒZ<G d;d<„ d<e9ƒZ=e >d=¡Z?G d>d?„ d?ej@e? ƒZAdOdCdD„ZBG dEdF„ dFƒZCG dGdH„ dHƒZDdS )Pé    )ÚannotationsN)Úasynccontextmanager)ÚEnum)Ú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                      s"   e Zd ZdZd
‡ fdd	„Z‡  ZS )ÚNoMatchFoundz}
    Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)`
    if no matching route exists.
    ÚnameÚstrÚpath_paramsúdict[str, typing.Any]ÚreturnÚNonec                   s0   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__© úN/var/www/html/CropPilot/venv/lib/python3.10/site-packages/starlette/routing.pyr'   !   s   zNoMatchFound.__init__)r   r   r   r   r    r!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   Ú__classcell__r,   r,   r*   r-   r      s    r   c                   @  s   e Zd ZdZdZdZdS )ÚMatchr   é   é   N)r.   r/   r0   ÚNONEÚPARTIALÚFULLr,   r,   r,   r-   r3   &   s    r3   Úobjú
typing.Anyr    Úboolc                 C  s4   t  dt¡ t| tjƒr| j} t| tjƒst | ¡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)r9   r,   r,   r-   Úiscoroutinefunction_or_partial,   s   ýÿ
rE   rB   úAtyping.Callable[[Request], typing.Awaitable[Response] | Response]r   c                   ó   d‡ fd	d
„}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    Úscoper   Úreceiver   Úsendr   r    r!   c                 “  s:   �t | ||ƒ‰ d‡‡ fd	d
„}t|ˆ ƒ| ||ƒI d H  d S )NrH   r   rI   r   rJ   r   r    r!   c                 “  s@   �t ˆ ƒrˆ ˆƒI d H }ntˆ ˆƒI d H }|| ||ƒI d H  d S ©N)r   r   )rH   rI   rJ   Úresponse)rB   Úrequestr,   r-   ÚappF   s
   €z*request_response.<locals>.app.<locals>.app©rH   r   rI   r   rJ   r   r    r!   )r   r   ©rH   rI   rJ   rN   ©rB   )rM   r-   rN   C   s   €zrequest_response.<locals>.appNrO   r,   ©rB   rN   r,   rQ   r-   Úrequest_response;   s   rS   ú4typing.Callable[[WebSocket], typing.Awaitable[None]]c                   rG   )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    rH   r   rI   r   rJ   r   r    r!   c                 “  s<   �t | ||d�‰ d‡‡ fd
d„}t|ˆ ƒ| ||ƒI d H  d S )N)rI   rJ   rH   r   rI   r   rJ   r   r    r!   c                 “  s   �ˆ ˆƒI d H  d S rK   r,   )rH   rI   rJ   )rB   Úsessionr,   r-   rN   ]   s   €z+websocket_session.<locals>.app.<locals>.apprO   )r   r   rP   rQ   )rU   r-   rN   Z   s   €zwebsocket_session.<locals>.appNrO   r,   rR   r,   rQ   r-   Úwebsocket_sessionR   s   rV   Úendpointú typing.Callable[..., typing.Any]r   c                 C  s"   t  | ¡s
t  | ¡r| jS | jjS rK   )rC   Ú	isroutineÚisclassr.   r+   )rW   r,   r,   r-   Úget_namee   s   r[   ÚpathÚparam_convertorsú dict[str, Convertor[typing.Any]]r   údict[str, str]útuple[str, dict[str, str]]c                 C  s^   t | ¡ ƒD ]$\}}d| d | v r*|| }| |¡}|  d| d |¡} | |¡ q| |fS )NÚ{Ú})r$   ÚitemsÚ	to_stringÚreplaceÚpop)r\   r]   r   ÚkeyÚvalueÚ	convertorr,   r,   r-   Úreplace_paramsk   s   

€rj   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}úAtuple[typing.Pattern[str], str, dict[str, Convertor[typing.Any]]]c                 C  s†  |   d¡ }d}d}tƒ }d}i }t | ¡D ]X}| d¡\}}	|	 d¡}	|	tv s0J d|	› d�ƒ‚t|	 }
|t | || 	¡ … ¡7 }|d	|› d
|
j
› d�7 }|| || 	¡ … 7 }|d| 7 }||v rf| |¡ |
||< | ¡ }q|r�d t|ƒ¡}t|ƒdkr€dnd}td|› d|› d| › �ƒ‚|r¦| |d…  d¡d }|t |¡d 7 }n|t | |d… ¡d 7 }|| |d… 7 }t |¡||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_typeri   ÚnamesÚendingÚhostnamer,   r,   r-   Úcompile_path}   s>   


ÿ

r’   c                   @  s4   e Zd Zddd„Zddd„Zddd„Zddd„ZdS )Ú	BaseRouterH   r   r    útuple[Match, Scope]c                 C  ó   t ƒ ‚rK   ©ÚNotImplementedError)r(   rH   r,   r,   r-   Úmatches¸   ó   zBaseRoute.matchesr   r   r   r:   r   c                K  r•   rK   r–   )r(   r   r   r,   r,   r-   Úurl_path_for»   r™   zBaseRoute.url_path_forrI   r   rJ   r   r!   c                 Ã  s   �t ƒ ‚rK   r–   ©r(   rH   rI   rJ   r,   r,   r-   Úhandle¾   s   €zBaseRoute.handlec                 Ã  s’   �|   |¡\}}|tjkr8|d dkr$tddd�}||||ƒI dH  dS |d dkr6tƒ }||||ƒI dH  dS | |¡ |  |||¡I dH  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(   rH   rI   rJ   rŒ   Úchild_scoperL   Úwebsocket_closer,   r,   r-   Ú__call__Á   s   €
ý
zBaseRoute.__call__N©rH   r   r    r”   ©r   r   r   r:   r    r   rO   )r.   r/   r0   r˜   rš   rœ   r§   r,   r,   r,   r-   r“   ·   ó
    


r“   c                   @  sT   e Zd Zdddddœd)dd„Zd*dd„Zd+dd„Zd,d"d#„Zd-d%d&„Zd.d'd(„ZdS )/ÚRouteNT)Úmethodsr   Úinclude_in_schemaÚ
middlewarer\   r   rW   rX   r¬   úlist[str] | Noner   ú
str | Noner­   r;   r®   ú"typing.Sequence[Middleware] | Noner    r!   c                C  s  |  d¡s	J dƒ‚|| _|| _|d u rt|ƒn|| _|| _|}t|tjƒr.|j	}t|tjƒs%t
 |¡s8t
 |¡rEt|ƒ| _|d u rDdg}n|| _|d urat|ƒD ]\}}	}
||	d| ji|
¤Ž| _qP|d u rid | _ndd„ |D ƒ| _d| jv r|| j d¡ t|ƒ\| _| _| _d S )Nrl   ú Routed paths must start with '/'ÚGETrN   c                 S  s   h | ]}|  ¡ ’qS r,   )Úupper)Ú.0Úmethodr,   r,   r-   Ú	<setcomp>ù   s    z!Route.__init__.<locals>.<setcomp>ÚHEAD)rv   r\   rW   r[   r   r­   r?   r@   rA   rB   rC   Ú
isfunctionÚismethodrS   rN   Úreversedr¬   r€   r’   rˆ   r‰   r]   )r(   r\   rW   r¬   r   r­   r®   Úendpoint_handlerÚclsÚargsÚkwargsr,   r,   r-   r'   Ö   s0   
ÿ
€
zRoute.__init__rH   r   r”   c           	      C  sª   |d dkrPt |ƒ}| j |¡}|rP| ¡ }| ¡ D ]\}}| j|  |¡||< qt| di ¡ƒ}| 	|¡ | j
|dœ}| jrK|d | jvrKtj|fS tj|fS tji fS )Nr�   rž   r   ©rW   r   r¶   )r   rˆ   rŒ   Ú	groupdictrc   r]   ÚconvertÚdictÚgetr¤   rW   r¬   r3   r7   r8   r6   ©	r(   rH   Ú
route_pathrŒ   Úmatched_paramsrg   rh   r   r¥   r,   r,   r-   r˜   ÿ   s   



zRoute.matchesr   r:   r   c                K  ó^   t | ¡ ƒ}t | j ¡ ƒ}|| jks||krt||ƒ‚t| j| j|ƒ\}}|r)J ‚t|dd�S )Nrž   ©r\   Úprotocol©rw   r%   r]   r   r   rj   r‰   r   ©r(   r   r   Úseen_paramsÚexpected_paramsr\   Úremaining_paramsr,   r,   r-   rš     ó   

ÿzRoute.url_path_forrI   r   rJ   r   c                 Ã  sv   �| j r/|d | j vr/dd | j ¡i}d|v rtd|d�‚tdd|d�}||||ƒI d H  d S |  |||¡I d H  d S )Nr¶   ÚAllowr"   rN   i•  )r¢   ÚheaderszMethod Not Allowed)r¬   r#   r   r   rN   )r(   rH   rI   rJ   rÒ   rL   r,   r,   r-   rœ     s   €ÿzRoute.handleÚotherc                 C  s.   t |tƒo| j|jko| j|jko| j|jkS rK   )r?   r«   r\   rW   r¬   ©r(   rÓ   r,   r,   r-   Ú__eq__+  s   

ÿ
þ
üzRoute.__eq__c                 C  s@   | j j}t| jp	g ƒ}| j| j}}|› d|›d|›d|›d�S )Nú(path=ú, name=z
, methods=rr   )r+   r.   r‚   r¬   r\   r   )r(   Ú
class_namer¬   r\   r   r,   r,   r-   Ú__repr__3  s   zRoute.__repr__)r\   r   rW   rX   r¬   r¯   r   r°   r­   r;   r®   r±   r    r!   r¨   r©   rO   ©rÓ   r:   r    r;   ©r    r   ©	r.   r/   r0   r'   r˜   rš   rœ   rÕ   rÙ   r,   r,   r,   r-   r«   Õ   s    ø
)


r«   c                   @  sP   e Zd Zdddœd%dd„Zd&dd„Zd'dd„Zd(dd„Zd)d!d"„Zd*d#d$„ZdS )+ÚWebSocketRouteN)r   r®   r\   r   rW   rX   r   r°   r®   r±   r    r!   c          	      C  sÆ   |  d¡s	J dƒ‚|| _|| _|d u rt|ƒn|| _|}t|tjƒr+|j}t|tjƒs"t	 
|¡s5t	 |¡r;t|ƒ| _n|| _|d urWt|ƒD ]\}}}||d| ji|¤Ž| _qFt|ƒ\| _| _| _d S )Nrl   r²   rN   )rv   r\   rW   r[   r   r?   r@   rA   rB   rC   r¹   rº   rV   rN   r»   r’   rˆ   r‰   r]   )	r(   r\   rW   r   r®   r¼   r½   r¾   r¿   r,   r,   r-   r'   ;  s   ÿzWebSocketRoute.__init__rH   r   r”   c           	      C  sŒ   |d dkrAt |ƒ}| j |¡}|rA| ¡ }| ¡ D ]\}}| j|  |¡||< qt| di ¡ƒ}| 	|¡ | j
|dœ}tj|fS tji fS )Nr�   r£   r   rÀ   )r   rˆ   rŒ   rÁ   rc   r]   rÂ   rÃ   rÄ   r¤   rW   r3   r8   r6   rÅ   r,   r,   r-   r˜   X  s   


zWebSocketRoute.matchesr   r:   r   c                K  rÈ   )Nr£   rÉ   rË   rÌ   r,   r,   r-   rš   g  rÐ   zWebSocketRoute.url_path_forrI   r   rJ   r   c                 Ã  ó   �|   |||¡I d H  d S rK   ©rN   r›   r,   r,   r-   rœ   t  ó   €zWebSocketRoute.handlerÓ   r;   c                 C  ó"   t |tƒo| j|jko| j|jkS rK   )r?   rÝ   r\   rW   rÔ   r,   r,   r-   rÕ   w  ó
   

ÿ
ýzWebSocketRoute.__eq__c                 C  s   | j j› d| j›d| j›d�S )NrÖ   r×   rr   )r+   r.   r\   r   ©r(   r,   r,   r-   rÙ   ~  s   zWebSocketRoute.__repr__)
r\   r   rW   rX   r   r°   r®   r±   r    r!   r¨   r©   rO   rÚ   rÛ   rÜ   r,   r,   r,   r-   rÝ   :  s    ú



rÝ   c                   @  sd   e Zd Z			d*ddœd+dd„Zed,dd„ƒZd-dd„Zd.dd„Zd/d"d#„Zd0d&d'„Z	d1d(d)„Z
dS )2ÚMountN©r®   r\   r   rN   úASGIApp | NoneÚroutesú!typing.Sequence[BaseRoute] | Noner   r°   r®   r±   r    r!   c          	      C  s¸   |dks|  d¡sJ dƒ‚|d us|d usJ dƒ‚| d¡| _|d ur'|| _nt|d�| _| j| _|d urJt|ƒD ]\}}}||d| ji|¤Ž| _q9|| _t| jd ƒ\| _	| _
| _d S )Nrn   rl   r²   z0Either 'app=...', or 'routes=' must be specified)rç   rN   z/{path:path})rv   Úrstripr\   Ú	_base_appÚRouterrN   r»   r   r’   rˆ   r‰   r]   )	r(   r\   rN   rç   r   r®   r½   r¾   r¿   r,   r,   r-   r'   ƒ  s    	ÿÿzMount.__init__úlist[BaseRoute]c                 C  ó   t | jdg ƒS ©Nrç   )Úgetattrrê   rã   r,   r,   r-   rç   ž  ó   zMount.routesrH   r   r”   c                 C  sÈ   |d dv r_|  dd¡}t|ƒ}| j |¡}|r_| ¡ }| ¡ D ]\}}| j|  |¡||< q d| d¡ }|d t	|ƒ … }	t
|  di ¡ƒ}
|
 |¡ |
|  d|¡||	 | jd	œ}tj|fS tji fS )
Nr�   ©rž   r£   Ú	root_pathrn   rl   r\   r   Úapp_root_path)r   ró   rò   rW   )rÄ   r   rˆ   rŒ   rÁ   rc   r]   rÂ   rf   rƒ   rÃ   r¤   rN   r3   r8   r6   )r(   rH   rò   rÆ   rŒ   rÇ   rg   rh   Úremaining_pathÚmatched_pathr   r¥   r,   r,   r-   r˜   ¢  s&   

ò

zMount.matchesr   r:   r   c          
   	   K  s(  | j d ur)|| j kr)d|v r)|d  d¡|d< t| j| j|ƒ\}}|s(t|d�S nf| j d u s6| | j d ¡r�| j d u r>|}n|t| j ƒd d … }| d¡}d|d< t| j| j|ƒ\}}|d urd||d< | j	phg D ]%}z|j
|fi |¤Ž}	t| d¡t|	ƒ |	jd�W   S  tyŽ   Y qiw t||ƒ‚)Nr\   rl   )r\   ro   r4   rn   rÉ   )r   r{   rj   r‰   r]   r   rv   rƒ   rÄ   rç   rš   ré   r   rÊ   r   )
r(   r   r   r\   rÏ   Úremaining_nameÚ
path_kwargÚpath_prefixÚrouteÚurlr,   r,   r-   rš   Ã  s:   
ÿ
ÿ


ÿÿÿ
zMount.url_path_forrI   r   rJ   r   c                 Ã  rÞ   rK   rß   r›   r,   r,   r-   rœ   ä  rà   zMount.handlerÓ   r;   c                 C  rá   rK   )r?   rä   r\   rN   rÔ   r,   r,   r-   rÕ   ç  râ   zMount.__eq__c                 C  ó2   | j j}| jpd}|› d| j›d|›d| j›d�S )Nrn   rÖ   r×   ú, app=rr   )r+   r.   r   r\   rN   ©r(   rØ   r   r,   r,   r-   rÙ   î  ó   
 zMount.__repr__)NNN)r\   r   rN   ræ   rç   rè   r   r°   r®   r±   r    r!   ©r    rì   r¨   r©   rO   rÚ   rÛ   ©r.   r/   r0   r'   Úpropertyrç   r˜   rš   rœ   rÕ   rÙ   r,   r,   r,   r-   rä   ‚  s    ûù

!
!
rä   c                   @  sX   e Zd Zd%d&d
d„Zed'dd„ƒZd(dd„Zd)dd„Zd*dd„Zd+d!d"„Z	d,d#d$„Z
dS )-ÚHostNÚhostr   rN   r   r   r°   r    r!   c                 C  s<   |  d¡r	J dƒ‚|| _|| _|| _t|ƒ\| _| _| _d S )Nrl   zHost must not start with '/')rv   r  rN   r   r’   Ú
host_regexÚhost_formatr]   )r(   r  rN   r   r,   r,   r-   r'   õ  s
   zHost.__init__rì   c                 C  rí   rî   )rï   rN   rã   r,   r,   r-   rç   ü  rð   zHost.routesrH   r   r”   c           
      C  s¤   |d dv rMt |d�}| dd¡ d¡d }| j |¡}|rM| ¡ }| ¡ D ]\}}| j|  |¡||< q&t	| di ¡ƒ}| 
|¡ || jd	œ}	tj|	fS tji fS )
Nr�   rñ   ©rH   r  rn   ro   r   r   )r   rW   )r   rÄ   r…   r  rŒ   rÁ   rc   r]   rÂ   rÃ   r¤   rN   r3   r8   r6   )
r(   rH   rÒ   r  rŒ   rÇ   rg   rh   r   r¥   r,   r,   r-   r˜      s   



zHost.matchesr   r:   r   c          	   	   K  sø   | j d ur&|| j kr&d|v r&| d¡}t| j| j|ƒ\}}|s%t||d�S nQ| j d u s3| | j d ¡rw| j d u r;|}n|t| j ƒd d … }t| j| j|ƒ\}}| jpTg D ]!}z|j	|fi |¤Ž}tt
|ƒ|j|d�W   S  tyv   Y qUw t||ƒ‚)Nr\   )r\   r  ro   r4   )r\   rÊ   r  )r   rf   rj   r  r]   r   rv   rƒ   rç   rš   r   rÊ   r   )	r(   r   r   r\   r  rÏ   rö   rù   rú   r,   r,   r-   rš     s.   

ÿÿ

ÿÿ
zHost.url_path_forrI   r   rJ   r   c                 Ã  rÞ   rK   rß   r›   r,   r,   r-   rœ   *  rà   zHost.handlerÓ   r;   c                 C  rá   rK   )r?   r  r  rN   rÔ   r,   r,   r-   rÕ   -  râ   zHost.__eq__c                 C  rû   )Nrn   z(host=r×   rü   rr   )r+   r.   r   r  rN   rý   r,   r,   r-   rÙ   4  rþ   zHost.__repr__rK   ©r  r   rN   r   r   r°   r    r!   rÿ   r¨   r©   rO   rÚ   rÛ   r   r,   r,   r,   r-   r  ô  s    



r  Ú_Tc                   @  s*   e Zd Zddd„Zddd„Zddd„ZdS )Ú_AsyncLiftContextManagerÚcmútyping.ContextManager[_T]c                 C  ó
   || _ d S rK   )Ú_cm)r(   r
  r,   r,   r-   r'   >  ó   
z!_AsyncLiftContextManager.__init__r    r  c                 Ã  s   �| j  ¡ S rK   )r  Ú	__enter__rã   r,   r,   r-   Ú
__aenter__A  s   €
z#_AsyncLiftContextManager.__aenter__Úexc_typeútype[BaseException] | NoneÚ	exc_valueúBaseException | NoneÚ	tracebackútypes.TracebackType | Noneúbool | Nonec                 Ã  s   �| j  |||¡S rK   )r  Ú__exit__)r(   r  r  r  r,   r,   r-   Ú	__aexit__D  s   €z"_AsyncLiftContextManager.__aexit__N)r
  r  )r    r  )r  r  r  r  r  r  r    r  )r.   r/   r0   r'   r  r  r,   r,   r,   r-   r	  =  s    

r	  Úlifespan_contextúStyping.Callable[[typing.Any], typing.Generator[typing.Any, typing.Any, typing.Any]]úEtyping.Callable[[typing.Any], typing.AsyncContextManager[typing.Any]]c                   s&   t  | ¡‰ t ˆ ¡d‡ fdd„ƒ}|S )NrN   r:   r    ú$_AsyncLiftContextManager[typing.Any]c                   s   t ˆ | ƒƒS rK   )r	  rß   ©Úcmgrr,   r-   ÚwrapperT  s   z+_wrap_gen_lifespan_context.<locals>.wrapper)rN   r:   r    r  )Ú
contextlibÚcontextmanagerr@   Úwraps)r  r   r,   r  r-   Ú_wrap_gen_lifespan_contextM  s   
r$  c                   @  s4   e Zd Zddd„Zddd„Zddd„Zddd„ZdS )Ú_DefaultLifespanÚrouterrë   c                 C  r  rK   )Ú_router)r(   r&  r,   r,   r-   r'   \  r  z_DefaultLifespan.__init__r    r!   c                 Ã  ó   �| j  ¡ I d H  d S rK   )r'  Ústartuprã   r,   r,   r-   r  _  ó   €z_DefaultLifespan.__aenter__Úexc_infoÚobjectc                 Ç  r(  rK   )r'  Úshutdown)r(   r+  r,   r,   r-   r  b  r*  z_DefaultLifespan.__aexit__r(   r  rN   c                 C  s   | S rK   r,   )r(   rN   r,   r,   r-   r§   e  s   z_DefaultLifespan.__call__N)r&  rë   ©r    r!   )r+  r,  r    r!   )r(   r  rN   r,  r    r  )r.   r/   r0   r'   r  r  r§   r,   r,   r,   r-   r%  [  rª   r%  c                   @  sè   e Zd Z						dPddœdQdd„ZdRdd„ZdSd"d#„ZdTd$d%„ZdTd&d'„ZdRd(d)„ZdRd*d+„Z	dRd,d-„Z
dUd/d0„Z	dVdWd5d6„Z	dVdXd8d9„Z			dYdZd?d@„Z	dVd[dBdC„Z			dYd\dEdF„ZdVd]dGdH„Zd^dLdM„Zd_dNdO„ZdS )`rë   NTrå   rç   rè   Úredirect_slashesr;   Údefaultræ   Ú
on_startupú7typing.Sequence[typing.Callable[[], typing.Any]] | NoneÚon_shutdownÚlifespanúLifespan[typing.Any] | Noner®   r±   r    r!   c                C  s  |d u rg nt |ƒ| _|| _|d u r| jn|| _|d u rg nt |ƒ| _|d u r)g nt |ƒ| _|s2|r?t dt	¡ |r?t d¡ |d u rIt
| ƒ| _n%t |¡rZt dt	¡ t|ƒ| _nt |¡rkt dt	¡ t|ƒ| _n|| _| j| _|r‹t|ƒD ]\}}	}
|| jg|	¢R i |
¤Ž| _qxd S d S )Nz¿The 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/.z€The `lifespan` parameter cannot be used with `on_startup` or `on_shutdown`. Both `on_startup` and `on_shutdown` will be ignored.zjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead)r$   rç   r/  Ú	not_foundr0  r1  r3  r<   r=   r>   r%  r  rC   Úisasyncgenfunctionr   Úisgeneratorfunctionr$  rN   Úmiddleware_stackr»   )r(   rç   r/  r0  r1  r3  r4  r®   r½   r¾   r¿   r,   r,   r-   r'   j  sN   üÿ
ýÿ
ýÿþzRouter.__init__rH   r   rI   r   rJ   r   c                 Ã  s^   �|d dkrt ƒ }||||ƒI d H  d S d|v rtdd�‚tddd�}||||ƒI d H  d S )Nr�   r£   rN   r    r¡   rŸ   )r   r   r   )r(   rH   rI   rJ   r¦   rL   r,   r,   r-   r6  ¨  s   €
zRouter.not_foundr   r   r   r:   r   c             	   K  s@   | j D ]}z|j|fi |¤ŽW   S  ty   Y qw t||ƒ‚rK   )rç   rš   r   )r(   r   r   rù   r,   r,   r-   rš   ·  s   
ÿ
zRouter.url_path_forc                 Ã  ó.   �| j D ]}t|ƒr|ƒ I dH  q|ƒ  qdS )z7
        Run any `.on_startup` event handlers.
        N)r1  r   ©r(   Úhandlerr,   r,   r-   r)  ¿  ó   €
üzRouter.startupc                 Ã  r:  )z8
        Run any `.on_shutdown` event handlers.
        N)r3  r   r;  r,   r,   r-   r-  É  r=  zRouter.shutdownc              	   Ã  s  �d}|  d¡}|ƒ I dH  zE|  |¡4 I dH š/}|dur,d|vr%tdƒ‚|d  |¡ |ddiƒI dH  d}|ƒ I dH  W d  ƒI dH  n1 I dH sMw   Y  W n# tyv   t ¡ }|rk|d	|d
œƒI dH  ‚ |d|d
œƒI dH  ‚ w |ddiƒI dH  dS )z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrN   NÚstatez:The server does not support "state" in the lifespan scope.r�   zlifespan.startup.completeTzlifespan.shutdown.failed)r�   Úmessagezlifespan.startup.failedzlifespan.shutdown.complete)rÄ   r  ÚRuntimeErrorr¤   ÚBaseExceptionr  Ú
format_exc)r(   rH   rI   rJ   ÚstartedrN   Úmaybe_stateÚexc_textr,   r,   r-   r4  Ó  s4   €
ÿ(÷€
ÿúzRouter.lifespanc                 Ã  s   �|   |||¡I dH  dS )z;
        The main entry point to the Router class.
        N)r9  r›   r,   r,   r-   r§   ð  s   €zRouter.__call__c                 Ã  sš  �|d dv s	J ‚d|vr| |d< |d dkr#|   |||¡I d H  d S d }| jD ]-}| |¡\}}|tjkrH| |¡ | |||¡I d H   d S |tjkrU|d u rU|}|}q(|d urk| |¡ | |||¡I d H  d S t|ƒ}	|d dkrÁ| j	rÁ|	dkrÁt
|ƒ}
|	 d¡r�|
d  d¡|
d< n|
d d |
d< | jD ]&}| |
¡\}}|tjkrÀt|
d�}tt|ƒd	�}||||ƒI d H   d S qš|  |||¡I d H  d S )
Nr�   )rž   r£   r4  r&  r4  rž   rl   r\   r  )rú   )r4  rç   r˜   r3   r8   r¤   rœ   r7   r   r/  rÃ   Úendswithré   r6   r   r   r   r0  )r(   rH   rI   rJ   rA   rù   rŒ   r¥   Úpartial_scoperÆ   Úredirect_scopeÚredirect_urlrL   r,   r,   r-   rN   ö  sJ   €


€




üz
Router.apprÓ   c                 C  s   t |tƒo
| j|jkS rK   )r?   rë   rç   rÔ   r,   r,   r-   rÕ   (  s   zRouter.__eq__r\   rN   r   r°   c                 C  ó   t |||d�}| j |¡ d S ©N)rN   r   )rä   rç   Úappend)r(   r\   rN   r   rù   r,   r,   r-   Úmount+  ó   zRouter.mountr  c                 C  rJ  rK  )r  rç   rL  )r(   r  rN   r   rù   r,   r,   r-   r  1  rN  zRouter.hostrW   rF   r¬   r¯   r­   c                 C  s"   t |||||d�}| j |¡ d S )N)rW   r¬   r   r­   )r«   rç   rL  )r(   r\   rW   r¬   r   r­   rù   r,   r,   r-   Ú	add_route7  s   ûzRouter.add_routerT   c                 C  rJ  )N)rW   r   )rÝ   rç   rL  )r(   r\   rW   r   rù   r,   r,   r-   Úadd_websocket_routeH  s   zRouter.add_websocket_routeútyping.Callablec                   s&   t  dt¡ d‡ ‡‡‡‡fd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)
        zŸThe `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   rQ  r    c                   s   ˆj ˆ| ˆˆˆ d� | S )N)r¬   r   r­   )rO  rQ   ©r­   r¬   r   r\   r(   r,   r-   Ú	decoratore  s   ûzRouter.route.<locals>.decoratorN©rB   rQ  r    rQ  ©r<   r=   r>   )r(   r\   r¬   r   r­   rS  r,   rR  r-   rù   Q  s   ý
zRouter.routec                   s"   t  dt¡ d‡ ‡‡fd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)
        z¯The `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   rQ  r    c                   s   ˆj ˆ| ˆ d� | S )N)r   )rP  rQ   ©r   r\   r(   r,   r-   rS    s   z)Router.websocket_route.<locals>.decoratorNrT  rU  )r(   r\   r   rS  r,   rV  r-   Úwebsocket_routeq  s   ýzRouter.websocket_routeÚ
event_typerB   útyping.Callable[[], typing.Any]c                 C  s4   |dv sJ ‚|dkr| j  |¡ d S | j |¡ d S )N)r)  r-  r)  )r1  rL  r3  )r(   rX  rB   r,   r,   r-   Úadd_event_handler…  s   zRouter.add_event_handlerc                   s    t  dt¡ d‡ ‡fdd„}|S )Nz“The `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   rQ  r    c                   s   ˆ  ˆ | ¡ | S rK   )rZ  rQ   ©rX  r(   r,   r-   rS  –  s   z"Router.on_event.<locals>.decoratorrT  rU  )r(   rX  rS  r,   r[  r-   Úon_event�  s   ýzRouter.on_event)NTNNNN)rç   rè   r/  r;   r0  ræ   r1  r2  r3  r2  r4  r5  r®   r±   r    r!   rO   r©   r.  rÚ   rK   )r\   r   rN   r   r   r°   r    r!   r  )NNT)r\   r   rW   rF   r¬   r¯   r   r°   r­   r;   r    r!   )r\   r   rW   rT   r   r°   r    r!   )
r\   r   r¬   r¯   r   r°   r­   r;   r    rQ  )r\   r   r   r°   r    rQ  )rX  r   rB   rY  r    r!   )rX  r   r    rQ  )r.   r/   r0   r'   r6  rš   r)  r-  r4  r§   rN   rÕ   rM  r  rO  rP  rù   rW  rZ  r\  r,   r,   r,   r-   rë   i  sF    ÷õ
>








2ÿÿ
úüû 

rë   )r9   r:   r    r;   )rB   rF   r    r   )rB   rT   r    r   )rW   rX   r    r   )r\   r   r]   r^   r   r_   r    r`   )r\   r   r    rk   )r  r  r    r  )EÚ
__future__r   r!  r@   rC   r|   r  ÚtypesÚtypingr<   r   Úenumr   Ú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   r3   rE   rS   rV   r[   rj   r†   rx   r’   r“   r«   rÝ   rä   r  ÚTypeVarr  ÚAsyncContextManagerr	  r$  r%  rë   r,   r,   r,   r-   Ú<module>   sR    






:eHr
F
