o
    çûõjÃ�  ã                   @   sD  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
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d dlZd dlZd d
lmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z& ddlm'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@Z@ dZAdZBerÊd dlCZCddlDmEZE ee*e4de!dge=f ZFee=ge
e@ f ZGe*dde)i i ddd d e Hd¡ƒ
ZIG d!d"„ d"eJƒZKG d#d$„ d$eJƒZLeLƒ ZMejNdddd%�G d&d'„ d'ƒƒZOePe*eOB e4f ZQG d(d„ de#ƒZRdS ))é    N)ÚBaseEventLoop)Údeque)Ú	AwaitableÚCallableÚSequence)Úsuppress)Úescape)Ú
HTTPStatus)ÚLogger)ÚTYPE_CHECKINGÚAnyÚOptionalÚcast)Úunder_cached_propertyé   )ÚAbstractAccessLoggerÚAbstractStreamWriter)ÚBaseProtocol)ÚDEFAULT_CHUNK_SIZEÚceil_timeout)ÚHttpProcessingErrorÚHttpRequestParserÚHttpVersion10ÚRawRequestMessageÚStreamWriterÚWebSocketReader)ÚBadHttpMethod)Úaccess_loggerÚserver_logger)ÚEMPTY_PAYLOADÚStreamReader)Útcp_keepalive)ÚHTTPExceptionÚHTTPInternalServerError)ÚAccessLogger)ÚBaseRequest)ÚResponseÚStreamResponse)ÚRequestHandlerÚRequestPayloadErrorÚPayloadAccessErroré    )ÚServerr(   zasyncio.Task[None]ÚUNKNOWNú/TFc                   @   ó   e Zd ZdZdS )r)   zPayload parsing error.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r5   r5   úG/opt/steambot/venv/lib/python3.10/site-packages/aiohttp/web_protocol.pyr)   O   ó    r)   c                   @   r/   )r*   z-Payload was accessed after response was sent.Nr0   r5   r5   r5   r6   r*   S   r7   r*   )Úauto_attribsÚfrozenÚslotsc                   @   s&   e Zd ZU eed< eed< eed< dS )Ú_ErrInfoÚstatusÚexcÚmessageN)r1   r2   r3   ÚintÚ__annotations__ÚBaseExceptionÚstrr5   r5   r5   r6   r;   Z   s   
 r;   c                !       sê  e Zd ZdZdZddeeeejddddde	dd	d
œddde
jdedededee dedededededededededef ‡ fdd„Zdefdd „Zeded! fd"d#„ƒZedeeeeeef B eeef B d$B fd%d&„ƒZedeeeeeef B eeef B d$B fd'd(„ƒZedefd)d*„ƒZded,ed$B dd$fd-d.„Zd/e
jdd$f‡ fd0d1„Zd2e d$B dd$f‡ fd3d4„Z!	$dfd5e"d6e#g d$f d$B dd$fd7d8„Z$dgd9d:„Z%d;e&dd$fd<d=„Z'dgd>d?„Z(d@edd$fdAdB„Z)dgdCdD„Z*dgdEdF„Z+dGe,dHe-dIed$B dd$fdJdK„Z.dLe/dMe/dd$fdNdO„Z0dLe/dMe/dd$fdPdQ„Z1dgdRdS„Z2dGe,dTed$B dUe#e,ge3e- f dee-ef fdVdW„Z4dgdXdY„Z5dGe,dZe-dTed$B dee-ef fd[d\„Z6	]	$	$dhdGe,d^ed2e d$B d_ed$B de-f
d`da„Z7dbe8de#e,ge3e- f fdcdd„Z9‡  Z:S )ir(   aO  HTTP protocol implementation.

    RequestHandler handles incoming HTTP request. It reads request line,
    request headers and request payload and calls handle_request() method.
    By default it always returns with 404 response.

    RequestHandler handles errors in incoming request, like bad
    status line, bad headers or incomplete payload. If any error occurs,
    connection gets closed.

    keepalive_timeout -- number of seconds before closing an idle connection.

    tcp_keepalive -- TCP keep-alive is on, default is on

    debug -- enable debug mode

    logger -- custom logger object

    access_log_class -- custom class for access_logger

    access_log -- custom logging object

    access_log_format -- access log format string

    loop -- Optional event loop

    max_line_size -- Optional maximum header line size

    max_field_size -- Optional maximum header field size

    max_headers -- Optional maximum header size

    timeout_ceil_threshold -- Optional value to specify
                              threshold to ceil() timeout
                              values

    )"Úmax_field_sizeÚmax_headersÚmax_line_sizeÚ_request_countÚ
_keepaliveÚ_managerÚ_request_handlerÚ_request_factoryÚ_tcp_keepaliveÚ_next_keepalive_close_timeÚ_keepalive_handleÚ_keepalive_timeoutÚ_lingering_timeÚ	_messagesÚ_max_msg_queue_sizeÚ_msg_queue_resume_sizeÚ_message_tailÚ_read_bufsizeÚ_handler_waiterÚ_waiterÚ_task_handlerÚ_payload_parserÚ_data_received_cbÚloggerÚdebugÚ
access_logr   Ú_closeÚ_force_closeÚ_current_requestÚ_timeout_ceil_thresholdÚ_request_in_progressÚ_logging_enabledÚ_cachei.  TFiþ  é€   g      $@é   )Úkeepalive_timeoutr!   rZ   Úaccess_log_classr\   Úaccess_log_formatr[   rE   rD   rC   Úlingering_timeÚread_bufsizeÚauto_decompressÚtimeout_ceil_thresholdÚmanagerr,   Úlooprf   r!   rZ   rg   r\   rh   r[   rE   rD   rC   ri   rj   rk   rl   c                   sH  t | _t d | _|| _t| |||
||t|t d�	}tƒ  ||¡ d| _d| _	d | _
|| _|j| _|j| _|
| _|| _|| _|| _d| _d | _|| _t|ƒ| _tƒ | _d| _d | _d | _d | _d | _d | _ d| _!zt|ƒ| _!W n t"t#fyx   Y nw || _$|	| _%|| _&|r�|||ƒ| _'| j'j(| _)nd | _'d| _)d| _*d| _+d| _,i | _-d S )	Né   )rE   rC   rD   Úpayload_exceptionrk   Úmax_msg_queue_sizer   Tg        ó    re   F).ÚMAX_MSG_QUEUE_SIZErQ   rR   rT   r   r)   ÚsuperÚ__init__rF   rG   r_   rH   Úrequest_handlerrI   Úrequest_factoryrJ   rE   rD   rC   rK   rL   rM   rN   ÚfloatrO   r   rP   rS   rY   rV   rU   rW   rX   r`   Ú	TypeErrorÚ
ValueErrorrZ   r[   r\   r   Úenabledrb   r]   r^   ra   rc   )Úselfrm   rn   rf   r!   rZ   rg   r\   rh   r[   rE   rD   rC   ri   rj   rk   rl   Úparser©Ú	__class__r5   r6   ru   °   sp   
÷
ÿÿ
zRequestHandler.__init__Úreturnc                 C   s    d  | jj| jd urd¡S d¡S )Nz<{} {}>Ú	connectedÚdisconnected)Úformatr   r1   Ú	transport©r|   r5   r5   r6   Ú__repr__
  s   þþzRequestHandler.__repr__zssl.SSLContextc                 C   ó   | j du rdS | j  d¡S )zReturn SSLContext if available.NÚ
sslcontext©r„   Úget_extra_infor…   r5   r5   r6   Ússl_context  s
   
ÿÿ
ýzRequestHandler.ssl_contextNc                 C   r‡   )zReturn peername if available.NÚpeernamer‰   r…   r5   r5   r6   rŒ     ó
   
ÿÿ
ýzRequestHandler.peernamec                 C   r‡   )zReturn sockname if available.NÚsocknamer‰   r…   r5   r5   r6   rŽ   $  r�   zRequestHandler.socknamec                 C   s   | j S ©N)rN   r…   r5   r5   r6   rf   /  s   z RequestHandler.keepalive_timeoutç      .@Útimeoutc              	   Ã   s˜  �d| _ | jdur| j ¡  | jr^| j ¡ | _z&t|ƒ4 I dH š | jI dH  W d  ƒI dH  n1 I dH s7w   Y  W n  tj	tj
fy]   d| _tjdkr[t ¡  }r[| ¡ r[‚ Y nw z@t|ƒ4 I dH š+ | jduru| j t 	¡ ¡ | jdurˆ| j ¡ sˆt | j¡I dH  W d  ƒI dH  n1 I dH s˜w   Y  W n tj	tj
fy»   tjdkr¹t ¡  }r¹| ¡ r¹‚ Y nw | jdurÆ| j ¡  |  ¡  dS )z±Do worker process exit preparations.

        We need to clean up everything and stop accepting requests.
        It is especially important for keep-alive connections.
        TN©é   é   )r^   rM   Úcancelra   Ú_loopÚcreate_futurerU   r   ÚasyncioÚCancelledErrorÚTimeoutErrorÚsysÚversion_infoÚcurrent_taskÚ
cancellingr_   Ú_cancelrW   ÚdoneÚshieldÚforce_close)r|   r‘   Útaskr5   r5   r6   Úshutdown3  sT   €

(ÿ€

ÿþ€ù	
€(û€

ÿþ€ú
	
zRequestHandler.shutdownr„   c                    sì   t ƒ  |¡ ttj|ƒ}| jrt|ƒ | jd usJ ‚| j | |¡ | j}| j	dkr;| 
¡ | j	 }|| _| || j¡| _tjdkrZt|tƒrOtj|  ¡ dd�}n"tj|  ¡ |dd�}ntjdkrjtj|  ¡ |dd�}n| |  ¡ ¡}|| _d S )Nr   ©r“   é   T©Úeager_start©rn   r¨   ©r“   é   )rt   Úconnection_mader   r˜   Ú	TransportrK   r!   rH   r–   rN   ÚtimerL   Úcall_atÚ_process_keepaliverM   r›   rœ   Ú
isinstancer   Úcreate_taskÚstartÚTaskrW   )r|   r„   Úreal_transportrn   Ú
close_timer£   r~   r5   r6   r¬   e  s&   




zRequestHandler.connection_mader=   c                    sÊ   | j d u rd S | j  | |¡ | j j}|  ¡  tƒ  |¡ d | _ d | _d | _d | _| jd ur2| j 	¡  | j
d urE|d u r?tdƒ}| j
 |¡ |rQ| jd urQ| j 	¡  d | _| jd urc| j ¡  d | _d S d S )NzConnection lost)rH   Úconnection_lostÚhandler_cancellationr¢   rt   rJ   rI   Ú_parserrM   r•   r_   ÚConnectionResetErrorrŸ   rW   rX   Úfeed_eof)r|   r=   r¸   r~   r5   r6   r·   ‚  s.   







þzRequestHandler.connection_lostr}   Údata_received_cbc                 C   sJ   | j d u sJ ‚|| _ || _| jr| j  | j¡ d| _| jr#|  ¡  d S d S ©Nrr   )rX   rY   rS   Ú	feed_dataÚ_buffer_pausedÚ_resume_reading_if_drained)r|   r}   r¼   r5   r5   r6   Ú
set_parser¢  s   ÿzRequestHandler.set_parserc                 C   s   d S r�   r5   r…   r5   r5   r6   Úeof_received³  s   zRequestHandler.eof_receivedÚdatac           
   
   C   s   | j s| jrd S | jd u r‹| js‹| jd usJ ‚z| j |¡\}}}W n! tyC } ztd||jd�t	fg}d}d}W Y d }~nd }~ww |D ]\}}|  j
d7  _
| j ||f¡ qF| j}|rl|d url| ¡ sl| d ¡ | js{t| jƒ| jkr{|  ¡  || _|r‡|r‰|| _d S d S d S | jd u r±| jr±|r±|  j|7  _| js­t| jƒ| jkr¯|  ¡  d S d S d S |rÌ| jd ur¼|  ¡  | j |¡\}	}|	rÎ|  ¡  d S d S d S )Né�  ©r<   r=   r>   Frr   r   )r^   r]   rX   Ú	_upgradedr¹   r¾   r   r;   r>   r   rF   rP   ÚappendrV   r    Ú
set_resultr¿   ÚlenrQ   Ú_pause_reading_for_bufferrS   rT   rY   Úclose)
r|   rÃ   ÚmessagesÚupgradedÚtailr=   ÚmsgÚpayloadÚwaiterÚeofr5   r5   r6   Údata_received¶  sV   ÿ€û
ÿ
ÿÿü
ûzRequestHandler.data_receivedc                 C   sJ   | j rt| j ƒ| jkrd S | js|  d¡ t| jƒ| jkrd S |  ¡  d S r½   )rS   rÉ   rT   rÆ   rÓ   rP   rQ   Ú_resume_reading_for_bufferr…   r5   r5   r6   rÀ   ì  s   
z)RequestHandler._resume_reading_if_drainedÚvalc                 C   s$   || _ | jr| j ¡  d| _dS dS )zMSet keep-alive connection mode.

        :param bool val: new state.
        N)rG   rM   r•   )r|   rÕ   r5   r5   r6   Ú
keep_aliveú  s
   

þzRequestHandler.keep_alivec                 C   s   d| _ | jr| j ¡  dS dS )z�Close connection.

        Stop accepting new pipelining messages and close
        connection when handlers done processing messages.
        TN)r]   rV   r•   r…   r5   r5   r6   rË     s   ÿzRequestHandler.closec                 C   s8   d| _ | jr| j ¡  | jdur| j ¡  d| _dS dS )zForcefully close connection.TN)r^   rV   r•   r„   rË   r…   r5   r5   r6   r¢     s   



þzRequestHandler.force_closeÚrequestÚresponser®   c                 C   sF   | j r| jd ur!tr|d usJ ‚| j ||| j ¡ | ¡ d S d S d S r�   )rb   r   r   Úlogr–   r®   )r|   r×   rØ   r®   r5   r5   r6   Ú
log_access  s
   ýzRequestHandler.log_accessÚargsÚkwc                 O   s    | j r| jj |i |¤Ž d S d S r�   )r[   rZ   ©r|   rÛ   rÜ   r5   r5   r6   Ú	log_debug  s   ÿzRequestHandler.log_debugc                 O   s   | j j|i |¤Ž d S r�   )rZ   Ú	exceptionrÝ   r5   r5   r6   Úlog_exception#  s   zRequestHandler.log_exceptionc                 C   sj   d | _ | js	| jsd S | j}| ¡ }| j}||k r#| || j¡| _ d S | jr1| j 	¡ s3|  
¡  d S d S d S r�   )rM   r^   rG   r–   r®   rL   r¯   r°   rV   r    r¢   )r|   rn   Únowr¶   r5   r5   r6   r°   &  s   ÿz!RequestHandler._process_keepaliveÚ
start_timerv   c              
   Ã   sœ  �d| _ z¹zz|| _||ƒI d H }W d | _nd | _w W nw ty; } z|}|  |||¡I d H \}}W Y d }~ntd }~w tjyC   ‚  tjyn } z| jd|d� |  |d¡}|  |||¡I d H \}}W Y d }~nAd }~w t	y’ } z|  |d|¡}|  |||¡I d H \}}W Y d }~nd }~ww t
|ddƒrŸt dt¡ |  |||¡I d H \}}W d| _ | jd urº| j d ¡ ||fS d| _ | jd urÍ| j d ¡ w w )	NTzRequest handler timed out.©Úexc_infoiø  éô  Ú__http_exception__Fzlreturning HTTPException object is deprecated (#2415) and will be removed, please raise the exception instead)ra   r_   r"   Úfinish_responser˜   r™   rš   rÞ   Úhandle_errorÚ	ExceptionÚgetattrÚwarningsÚwarnÚDeprecationWarningrU   rÈ   )r|   r×   râ   rv   Úrespr=   Úresetr5   r5   r6   Ú_handle_request7  sL   €$€$€$€þü€
ü
ÿzRequestHandler._handle_requestc              
   Ã   s¸  �| j }| j}|dusJ ‚| j}d}| jdusJ ‚| jdus J ‚| j�sD| js<z| ¡ | _| jI dH  W d| _nd| _w | j 	¡ \}}| j
durM| j
 ¡  | jr\t| jƒ| jkr\|  ¡  | jrc| ¡ nd}| jd7  _t| |ƒ}t|tƒr~|  |¡}	t}n| j}	|  ||| || jpŽt |¡¡}
�zt�z!|  |
||	¡}tjdkr¶t|tƒr­tj|dd�}ntj ||dd�}ntjdkrÄtj ||dd�}n| |¡}z	|I dH \}}W n" t!yô   |  "d¡ Y W W d|
_#| j$du rò|durò|  "d	¡ �nPw ~|�r|  "d
¡ W W d|
_#| j$du �r|du�r|  "d	¡ �n/t%|j&ƒ| _'| (¡ �s®| j)}| j�sœ|�rœ|  "d|¡ | ¡ }|| }zB| (¡ �sy||k �ryt*|| ƒ4 I dH š | +¡ I dH  W d  ƒI dH  n1 I dH �sfw   Y  | ¡ }| (¡ �sy||k �sCW n! tj,tj-f�y›   tjdk�r™t ¡  }�r™| .¡ �r™‚ Y nw | (¡ �s®| j�s®|  "d¡ |  /¡  | 0t1¡ W n< tj,�yÇ   |  "d¡ |  2¡  ‚  t3�yä } z| j4d|d� |  2¡  W Y d}~nd}~w t5�yð   |  2¡  ‚ w W d|
_#| j$du �r|du�r|  "d	¡ nd|
_#| j$du �r|du�r|  "d	¡ w w w | j'�r@| j6�s@| j�s@| ¡ | }|| _7| j8du �r?| 9|| j:¡| _8nn| jr$| j�sXd| _| j$du�rZ| j$ /¡  dS dS dS )a_  Process incoming request.

        It reads request line, request headers and request payload, then
        calls handle_request() method. Subclass has to override
        handle_request(). start() handles various exceptions in request
        or response handling. Connection is being closed always unless
        keep_alive(True) specified.
        Nr   r¥   Tr§   r©   rª   z&Ignored premature client disconnectionz'Ignored premature client disconnection.z(Ignored premature client disconnection 2z'Start lingering close timer for %s sec.r’   zUncompleted request.zUnhandled exceptionrã   );r–   rH   rN   rJ   rI   r^   rP   r—   rV   Úpopleftr¹   Úmessage_consumedr¿   rÉ   rR   rÀ   rb   r®   Úrequests_countr   r±   r;   Ú_make_error_handlerÚERRORrW   r˜   r�   rð   r›   rœ   r   r²   r´   ÚConnectionErrorrÞ   Ú_taskr„   ÚboolrÖ   rG   Úis_eofrO   r   Úreadanyr™   rš   rž   rË   Úset_exceptionÚ_PAYLOAD_ACCESS_ERRORr¢   ré   rà   rA   r]   rL   rM   r¯   r°   )r|   rn   rm   rf   rî   r>   rÐ   r³   Úwriterrv   r×   Úcoror£   rï   ri   rá   Úend_tÚtr=   r¶   r5   r5   r6   r³   b  s  €	


ÿ


û




6
€Æ
0
€Ñ
ÿ*þü€
ÿþ€ú	

€þ€
€þÿÿ€ �þ ýzRequestHandler.startrî   c              
   Ã   sÒ  �|  ¡  | jr†| js†| jdu r†| jdur†| j d¡ d| _| jr†z| j | j¡\}}}W n! tyN } zt	d||j
d�tfg}d}d}W Y d}~nd}~ww || _|| _|D ]\}}	|  jd7  _| j ||	f¡ qWt| jƒ| jkrx|  ¡  n| jr|  ¡  | jdu s†J ‚z|j}
W n- ty¸   |du rœ|  d¡ n|  d|›�¡ tƒ }t|j|j|j|jd	�}|j}
Y nw z|
|ƒI dH  | ¡ I dH  W n tyÝ   |  |||¡ |d
f Y S w |  |||¡ |dfS )a   Prepare the response and write_eof, then log access.

        This has to
        be called within the context of any exception so the access logger
        can get exception information. Returns True if the client disconnects
        prematurely.
        NFrÄ   rÅ   rr   r   z+Missing return statement on request handlerz3Web-handler should return a response instance, got )r<   ÚreasonÚtextÚheadersT) Ú_finishrÆ   rP   rX   r¹   Úset_upgradedrS   r¾   r   r;   r>   r   rF   rÇ   rÉ   rQ   rÊ   r¿   rÀ   rV   ÚprepareÚAttributeErrorrà   r#   r&   r<   r  r  r  Ú	write_eofrö   rÚ   )r|   r×   rî   râ   rÌ   rÍ   rÎ   Ú	parse_excrÏ   rÐ   Úprepare_methr=   r5   r5   r6   rç   ü  sz   €
ÿþ

ÿýúÿ
€ñ

ÿÿ
õþzRequestHandler.finish_responserå   r<   r>   c           
      C   s,  | j dkrt|tƒr| jjd|j|d� n	| jd|j|d� |jjdkr(t	dƒ‚d}|t
jkr‰t
jj› dt
jj› �}t
jj}d}| jr[ttƒ� t ¡ }W d  ƒ n1 sVw   Y  d	|j d
d¡v r|rpt|ƒ}d|› d�}d|› d|› d|› d�}d	}n
|rƒ|}|d | }t|||d�}	|	 ¡  |	S )z›Handle errors.

        Returns HTTP response with specific status code. Logs additional
        information. It always closes current connection.
        r   zError handling request from %srã   r   zMResponse is sent already, cannot send another response with the error messagez
text/plainú Nz	text/htmlÚAcceptÚ z<h2>Traceback:</h2>
<pre>z</pre>z<html><head><title>z</title></head><body>
<h1>z</h1>
z
</body></html>
z

)r<   r  Úcontent_type)rF   r±   r   rZ   r[   Úremoterà   rý   Úoutput_sizerö   r	   ÚINTERNAL_SERVER_ERRORÚvalueÚphraseÚdescriptionr   ré   Ú	tracebackÚ
format_excr  ÚgetÚhtml_escaper&   r¢   )
r|   r×   r<   r=   r>   ÚctÚtitlerÏ   Útbrî   r5   r5   r6   rè   R  sN   ÿÿÿ


ÿÿþýÿzRequestHandler.handle_errorÚerr_infoc                    s   dt dtf‡ ‡fdd„}|S )Nr×   r€   c                 “   s   �ˆ  | ˆ jˆ jˆ j¡S r�   )rè   r<   r=   r>   )r×   ©r  r|   r5   r6   Úhandler“  s   €ÿz3RequestHandler._make_error_handler.<locals>.handler)r%   r'   )r|   r  r  r5   r  r6   rô   �  s   z"RequestHandler._make_error_handler)r�   r�   )r€   N)rå   NN);r1   r2   r3   r4   Ú	__slots__r   r$   r   Ú
LOG_FORMATr   r˜   ÚAbstractEventLooprx   rø   r
   Útyper   rB   r?   ru   r†   r   r   r‹   ÚtuplerŒ   rŽ   Úpropertyrf   r¤   ÚBaseTransportr¬   rA   r·   r   r   rÁ   rÂ   ÚbytesrÓ   rÀ   rÖ   rË   r¢   r%   r'   rÚ   r   rÞ   rà   r°   r   rð   r³   rç   rè   r;   rô   Ú__classcell__r5   r5   r~   r6   r(   d   s   &+íþüúùø	÷
öõôóòñðïîíZ"þ
"þ
2#ýþý
ü

6



	ÿÿÿ
þ
þýü

û
+ ÿÿÿ

þYûþýüû
ú>ÿþ)Sr˜   Úasyncio.streamsr›   r  rë   Úasyncio.base_eventsr   Úcollectionsr   Úcollections.abcr   r   r   Ú
contextlibr   Úhtmlr   r  Úhttpr	   Úloggingr
   Útypingr   r   r   r   ÚattrÚyarlÚ	propcacher   Úabcr   r   Úbase_protocolr   Úhelpersr   r   r   r   r   r   r   r   Úhttp_exceptionsr   rÙ   r   r   Ústreamsr   r    Útcp_helpersr!   Úweb_exceptionsr"   r#   Úweb_logr$   Úweb_requestr%   Úweb_responser&   r'   Ú__all__rs   ÚsslÚ
web_serverr,   Ú_RequestFactoryÚ_RequestHandlerÚURLrõ   ré   r)   r*   rü   Úsr;   r#  Ú_MsgTyper(   r5   r5   r5   r6   Ú<module>   s~     ûùÿö