ó
    Rì?gœû  ã                   ó  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKJrJr  SSKJr  SSKJr  SSKJrJrJr  SSKJr  SSKrSSKJrJrJrJrJrJrJrJ r J!r!  SS	K"J#r#  \RH                  (       a
  SS
KJ%r%J&r&J'r'  \ " SSS9r(\RR                  \RT                  \RV                  \RX                  4r-\." \S5      (       a&  \-\R^                  \R`                  \Rb                  4-  r-\	Rd                  S:X  a  \-\Rf                  4-  r-\	Rd                  Ri                  S5      r5 " S S\65      r7 " S S\85      r9 " S S\85      r: " S S\;5      r< " S S\;5      r= " S S\=5      r> " S S\>5      r? " S S\=5      r@S \4S! jrAg)"aB  Utility classes to write to and read from non-blocking files and sockets.

Contents:

* `BaseIOStream`: Generic interface for reading and writing.
* `IOStream`: Implementation of BaseIOStream using non-blocking sockets.
* `SSLIOStream`: SSL-aware version of IOStream.
* `PipeIOStream`: Pipe-based IOStream implementation.
é    N)ÚFutureÚ"future_set_result_unless_cancelled)Úioloop)Úgen_log)Ússl_wrap_socketÚ_client_ssl_defaultsÚ_server_ssl_defaults)Úerrno_from_exception)	ÚUnionÚOptionalÚ	AwaitableÚCallableÚPatternÚAnyÚDictÚTypeVarÚTuple)ÚTracebackType)ÚDequeÚListÚTypeÚ_IOStreamTypeÚIOStream)ÚboundÚWSAECONNRESETÚdarwinÚwinc                   óB   ^ • \ rS rSrSrSS\\   SS4U 4S jjjrSrU =r	$ )	ÚStreamClosedErroréT   a«  Exception raised by `IOStream` methods when the stream is closed.

Note that the close callback is scheduled to run *after* other
callbacks on the stream (to allow for buffered data to be processed),
so you may see this error before you see the close callback.

The ``real_error`` attribute contains the underlying error that caused
the stream to close (if any).

.. versionchanged:: 4.3
   Added the ``real_error`` attribute.
NÚ
real_errorÚreturnc                 ó0   >• [         TU ]  S5        Xl        g )NzStream is closed)ÚsuperÚ__init__r!   )Úselfr!   Ú	__class__s     €Ú2/usr/lib/python3/dist-packages/tornado/iostream.pyr%   ÚStreamClosedError.__init__b   s   ø€ Ü‰ÑÐ+Ô,Ø$�ó    ©r!   ©N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚBaseExceptionr%   Ú__static_attributes__Ú__classcell__©r'   s   @r(   r   r   T   s%   ø† ññ% 8¨MÑ#:ð %Àd÷ %ö %r*   r   c                   ó   • \ rS rSrSrSrg)ÚUnsatisfiableReadErrorég   z„Exception raised when a read cannot be satisfied.

Raised by ``read_until`` and ``read_until_regex`` with a ``max_bytes``
argument.
© N©r-   r.   r/   r0   r1   r3   r9   r*   r(   r7   r7   g   s   † ñò 	r*   r7   c                   ó   • \ rS rSrSrSrg)ÚStreamBufferFullErroréq   z?Exception raised by `IOStream` methods when the buffer is full.r9   Nr:   r9   r*   r(   r<   r<   q   s   † ÜIr*   r<   c                   óv   • \ rS rSrSrSS jrS\4S jrSrS\	\
\\4   SS4S	 jrS
\S\4S jrS
\SS4S jrSrg)Ú_StreamBufferéu   z\
A specialized buffer that tries to avoid copies when large pieces
of data are encountered.
r"   Nc                 óT   • [         R                  " 5       U l        SU l        SU l        g ©Nr   )ÚcollectionsÚdequeÚ_buffersÚ
_first_posÚ_size©r&   s    r(   r%   Ú_StreamBuffer.__init__{   s'   € ô ×ÒÓð 	Œð ˆŒØˆ�
r*   c                 ó   • U R                   $ r,   )rG   rH   s    r(   Ú__len__Ú_StreamBuffer.__len__„   s   € Ø�z‰zÐr*   i   Údatac                 óÜ  • [        U5      nX R                  :”  a>  [        U[        5      (       d  [        U5      nU R                  R                  SU45        OUS:”  ay  U R                  (       a3  U R                  S   u  p4U=(       d    [        U5      U R                  :¬  nOSnU(       a'  U R                  R                  S[        U5      45        OWU-  nU =R                  U-  sl        g)zH
Append the given piece of data (should be a buffer-compatible object).
Tr   éÿÿÿÿFN)ÚlenÚ_large_buf_thresholdÚ
isinstanceÚ
memoryviewrE   ÚappendÚ	bytearrayrG   )r&   rM   ÚsizeÚ
is_memviewÚbÚnew_bufs         r(   rT   Ú_StreamBuffer.append‹   s·   € ô �4‹yˆØ×+Ñ+Ó+Ü˜d¤J×/Ñ/Ü! $Ó'�Ø�M‰M× Ñ  $¨ Õ.Ø�A‹XØ�}�}Ø $§¡¨bÑ 1‘�
Ø$×K¬¨A«°$×2KÑ2KÑ(K‘à�ÞØ—‘×$Ñ$ e¬Y°t«_Ð%=Õ>à�T‘	�à�
Š
�dÑŽ
r*   rV   c                 óð   • US:”  d   e U R                   S   u  p#U R                  nU(       a  [        R
                  " [        X4XA-    5      $ [        U5      XDU-    $ ! [         a    [        S5      s $ f = f)zY
Get a view over at most ``size`` bytes (possibly fewer) at the
current buffer position.
r   r*   )rE   Ú
IndexErrorrS   rF   ÚtypingÚcast)r&   rV   rW   rX   Úposs        r(   ÚpeekÚ_StreamBuffer.peek¡   sx   € ð
 �a‹xˆˆxð	#Ø ŸM™M¨!Ñ,‰MˆJð �o‰oˆÞÜ—;’;œz¨1°3±:Ð+>Ó?Ð?ä˜a“= ¨T¡zÐ2Ð2øô ó 	#Ü˜c“?Ò"ð	#ús   ŠA ÁA5Á4A5c                 óÖ  • SUs=:  a  U R                   ::  d   e   eU =R                   U-  sl         U R                  nU R                  nU(       a‹  US:”  a…  US   u  pE[        U5      U-
  U-
  nUS::  a$  UR	                  5         U[        U5      U-
  -  nSnO4U(       a  X!-  nSnO&X!-  n[
        R                  " [        U5      SU2	 SnSnU(       a  US:”  a  M…  US:X  d   eX l        g)z8
Advance the current buffer position by ``size`` bytes.
r   N)rG   rF   rE   rP   Úpopleftr]   r^   rU   )r&   rV   r_   ÚbuffersÚis_largerX   Úb_remains          r(   ÚadvanceÚ_StreamBuffer.advance²   sä   € ð �4Õ%˜4Ÿ:™:Ó%Ð%Ñ%Ð%Ð%Ø�
Š
�dÑ�
Ø�o‰oˆà—-‘-ˆÞ˜$ ›(Ø! !™*‰KˆHÜ˜1“v ‘} sÑ*ˆHØ˜1‹}Ø—‘Ô!Øœ˜A› ™Ñ$�Ø‘ÞØ‘�Ø‘à‘�Ü—K’K¤	¨1Ó-¨d¨s¨dÐ3Ø�Ø�ö ˜$ �(ð  �q‹yÐˆyØ�r*   )rE   rF   rG   ©r"   N)r-   r.   r/   r0   r1   r%   ÚintrK   rQ   r   ÚbytesrU   rS   rT   r`   rg   r3   r9   r*   r(   r?   r?   u   se   † ñô
ð˜ô ð
  Ðð˜5 ¨	°:Ð!=Ñ>ð À4ô ð,3˜ð 3 ô 3ð"˜Cð  D÷ r*   r?   c                   óf  • \ rS rSrSr   S@S\\   S\\   S\\   SS4S jjrS\\\	R                  4   4S	 jrSAS
 jrS\S\4S jrS\\\4   S\\   4S jrS\\   4S jr SBS\S\\   S\\   4S jjr SBS\S\\   S\\   4S jjrSCS\S\S\\   4S jjrSCS\S\S\\   4S jjrS\\   4S jrS\\\4   SS4S jrS\\/ S4      SS4S jr SCS\S\\\S\\   \\    4   4   SS4S  jjr!SAS! jr"S\4S" jr#S\4S# jr$S\4S$ jr%S%\SS4S& jr&SAS' jr'S(\\\	R                  4   S)\SS4S* jr(S\\   4S+ jr)SAS, jr*S\+4S- jr,S.\SS4S/ jr-SAS0 jr.S\\   4S1 jr/S2\SS4S3 jr0S\\   4S4 jr1S\\\24   S.\SS4S5 jr3SAS6 jr4S7\S\4S8 jr5SAS9 jr6SAS: jr7S;\SS4S< jr8S=\S\4S> jr9S?r:g)DÚBaseIOStreaméÏ   aš  A utility class to write to and read from a non-blocking file or socket.

We support a non-blocking ``write()`` and a family of ``read_*()``
methods. When the operation completes, the ``Awaitable`` will resolve
with the data read (or ``None`` for ``write()``). All outstanding
``Awaitables`` will resolve with a `StreamClosedError` when the
stream is closed; `.BaseIOStream.set_close_callback` can also be used
to be notified of a closed stream.

When a stream is closed due to an error, the IOStream's ``error``
attribute contains the exception object.

Subclasses must implement `fileno`, `close_fd`, `write_to_fd`,
`read_from_fd`, and optionally `get_fd_error`.

NÚmax_buffer_sizeÚread_chunk_sizeÚmax_write_buffer_sizer"   c                 ó>  • [         R                  R                  5       U l        U=(       d    SU l        [        U=(       d    SU R                  S-  5      U l        X0l        SU l        [        5       U l
        SU l        SU l        SU l        [        5       U l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        [2        R4                  " 5       U l        SU l        SU l        SU l        SU l        SU l         SU l!        g)a  `BaseIOStream` constructor.

:arg max_buffer_size: Maximum amount of incoming data to buffer;
    defaults to 100MB.
:arg read_chunk_size: Amount of data to read at one time from the
    underlying transport; defaults to 64KB.
:arg max_write_buffer_size: Amount of outgoing data to buffer;
    defaults to unlimited.

.. versionchanged:: 4.0
   Add the ``max_write_buffer_size`` parameter.  Changed default
   ``read_chunk_size`` to 64KB.
.. versionchanged:: 5.0
   The ``io_loop`` argument (deprecated since version 4.1) has been
   removed.
i  @i   é   Nr   F)"r   ÚIOLoopÚcurrentÚio_loopro   Úminrp   rq   ÚerrorrU   Ú_read_bufferÚ_read_buffer_sizeÚ_user_read_bufferÚ_after_user_read_bufferr?   Ú_write_bufferÚ_total_write_indexÚ_total_write_done_indexÚ_read_delimiterÚ_read_regexÚ_read_max_bytesÚ_read_bytesÚ_read_partialÚ_read_until_closeÚ_read_futurerC   rD   Ú_write_futuresÚ_close_callbackÚ_connect_futureÚ_ssl_connect_futureÚ_connectingÚ_stateÚ_closed)r&   ro   rp   rq   s       r(   r%   ÚBaseIOStream.__init__á   s  € ô, —}‘}×,Ñ,Ó.ˆŒØ.×;°)ˆÔô  # ?×#;°e¸T×=QÑ=QÐUVÑ=VÓWˆÔØ%:Ô"ØˆŒ
Ü%›KˆÔØ!"ˆÔØ!&ˆÔØ'+ˆÔ$Ü*›_ˆÔØ"#ˆÔØ'(ˆÔ$Ø#ˆÔØˆÔØ#ˆÔØˆÔØ"ˆÔØ!&ˆÔØ ˆÔä×ÒÓð 	Ôð  $ˆÔØ#ˆÔð
 $(ˆÔ Ø ˆÔØˆŒØˆ�r*   c                 ó   • [        5       e)z,Returns the file descriptor for this stream.©ÚNotImplementedErrorrH   s    r(   ÚfilenoÚBaseIOStream.fileno  s   € ä!Ó#Ð#r*   c                 ó   • [        5       e)zŸCloses the file underlying this stream.

``close_fd`` is called by `BaseIOStream` and should not be called
elsewhere; other users should call `close` instead.
r�   rH   s    r(   Úclose_fdÚBaseIOStream.close_fd  s   € ô "Ó#Ð#r*   rM   c                 ó   • [        5       e)zYAttempts to write ``data`` to the underlying file.

Returns the number of bytes written.
r�   ©r&   rM   s     r(   Úwrite_to_fdÚBaseIOStream.write_to_fd&  s   € ô
 "Ó#Ð#r*   Úbufc                 ó   • [        5       e)a‰  Attempts to read from the underlying file.

Reads up to ``len(buf)`` bytes, storing them in the buffer.
Returns the number of bytes read. Returns None if there was
nothing to read (the socket returned `~errno.EWOULDBLOCK` or
equivalent), and zero on EOF.

.. versionchanged:: 5.0

   Interface redesigned to take a buffer and return a number
   of bytes instead of a freshly-allocated object.
r�   ©r&   r›   s     r(   Úread_from_fdÚBaseIOStream.read_from_fd-  s   € ô "Ó#Ð#r*   c                 ó   • g)a  Returns information about any error on the underlying file.

This method is called after the `.IOLoop` has signaled an error on the
file descriptor, and should return an Exception (such as `socket.error`
with additional information, or None if no such information is
available.
Nr9   rH   s    r(   Úget_fd_errorÚBaseIOStream.get_fd_error<  s   € ð r*   ÚregexÚ	max_bytesc                 ó2  • U R                  5       n[        R                  " U5      U l        X l         U R                  5         U$ ! [         a4  n[        R                  " SU-  5        U R                  US9  Us SnA$ SnAf  UR                  S 5        e = f)a,  Asynchronously read until we have matched the given regex.

The result includes the data that matches the regex and anything
that came before it.

If ``max_bytes`` is not None, the connection will be closed
if more than ``max_bytes`` bytes have been read and the regex is
not satisfied.

.. versionchanged:: 4.0
    Added the ``max_bytes`` argument.  The ``callback`` argument is
    now optional and a `.Future` will be returned if it is omitted.

.. versionchanged:: 6.0

   The ``callback`` argument was removed. Use the returned
   `.Future` instead.

ú*Unsatisfiable read, closing connection: %s©Úexc_infoNc                 ó"   • U R                  5       $ r,   ©Ú	exception©Úfs    r(   Ú<lambda>Ú/BaseIOStream.read_until_regex.<locals>.<lambda>i  ó
   € ¨q¯{©{¬}r*   )Ú_start_readÚreÚcompiler�   r‚   Ú_try_inline_readr7   r   ÚinfoÚcloseÚadd_done_callback)r&   r£   r¤   ÚfutureÚes        r(   Úread_until_regexÚBaseIOStream.read_until_regexF  sŒ   € ð, ×!Ñ!Ó#ˆÜŸ:š: eÓ,ˆÔØ(Ôð	Ø×!Ñ!Ô#ð ˆøô &ó 	ä�LŠLÐEÈÑIÔJØ�J‰J ˆJÑ"Ø�Mûð	ð ×$Ñ$Ñ%<Ô=Øús   ³A Á
BÁ)A>Á8BÁ>BÚ	delimiterc                 ó  • U R                  5       nXl        X l         U R                  5         U$ ! [         a4  n[
        R                  " SU-  5        U R                  US9  Us SnA$ SnAf  UR                  S 5        e = f)a  Asynchronously read until we have found the given delimiter.

The result includes all the data read including the delimiter.

If ``max_bytes`` is not None, the connection will be closed
if more than ``max_bytes`` bytes have been read and the delimiter
is not found.

.. versionchanged:: 4.0
    Added the ``max_bytes`` argument.  The ``callback`` argument is
    now optional and a `.Future` will be returned if it is omitted.

.. versionchanged:: 6.0

   The ``callback`` argument was removed. Use the returned
   `.Future` instead.
r¦   r§   Nc                 ó"   • U R                  5       $ r,   rª   r¬   s    r(   r®   Ú)BaseIOStream.read_until.<locals>.<lambda>Œ  r°   r*   )	r±   r€   r‚   r´   r7   r   rµ   r¶   r·   )r&   r¼   r¤   r¸   r¹   s        r(   Ú
read_untilÚBaseIOStream.read_untilm  s   € ð( ×!Ñ!Ó#ˆØ(ÔØ(Ôð		Ø×!Ñ!Ô#ð ˆøô &ó 	ä�LŠLÐEÈÑIÔJØ�J‰J ˆJÑ"Ø�Mûð	Ø×$Ñ$Ñ%<Ô=Øús   ž0 °
Bº)A)Á#BÁ)BÚ	num_bytesÚpartialc                 óÒ   • U R                  5       n[        U[        R                  5      (       d   eXl        X l         U R                  5         U$ !   UR                  S 5        e = f)aú  Asynchronously read a number of bytes.

If ``partial`` is true, data is returned as soon as we have
any bytes to return (but never more than ``num_bytes``)

.. versionchanged:: 4.0
    Added the ``partial`` argument.  The callback argument is now
    optional and a `.Future` will be returned if it is omitted.

.. versionchanged:: 6.0

   The ``callback`` and ``streaming_callback`` arguments have
   been removed. Use the returned `.Future` (and
   ``partial=True`` for ``streaming_callback``) instead.

c                 ó"   • U R                  5       $ r,   rª   r¬   s    r(   r®   Ú)BaseIOStream.read_bytes.<locals>.<lambda>¨  r°   r*   )r±   rR   ÚnumbersÚIntegralrƒ   r„   r´   r·   )r&   rÂ   rÃ   r¸   s       r(   Ú
read_bytesÚBaseIOStream.read_bytes�  sh   € ð" ×!Ñ!Ó#ˆÜ˜)¤W×%5Ñ%5×6Ñ6Ð6Ð6Ø$ÔØ$Ôð	Ø×!Ñ!Ô#ð ˆøð	Ø×$Ñ$Ñ%<Ô=Øús   ¿A ÁA&c                 ó¨  • U R                  5       nU R                  n[        U5      nXE:¼  a<  [        U R                  5      SU USS& U R                  SU2	 U R                  U l        O!US:”  a  [        U R                  5      SS USU& SU l        Xl        X@l        XPl        X l         U R                  5         U$ !   UR                  S 5        e = f)a�  Asynchronously read a number of bytes.

``buf`` must be a writable buffer into which data will be read.

If ``partial`` is true, the callback is run as soon as any bytes
have been read.  Otherwise, it is run when the ``buf`` has been
entirely filled with read data.

.. versionadded:: 5.0

.. versionchanged:: 6.0

   The ``callback`` argument was removed. Use the returned
   `.Future` instead.

Nr   Tc                 ó"   • U R                  5       $ r,   rª   r¬   s    r(   r®   Ú(BaseIOStream.read_into.<locals>.<lambda>Õ  r°   r*   )r±   rz   rP   rS   ry   r|   r{   rƒ   r„   r´   r·   )r&   r›   rÃ   r¸   Úavailable_bytesÚns         r(   Ú	read_intoÚBaseIOStream.read_into¬  sá   € ð" ×!Ñ!Ó#ˆð ×0Ñ0ˆÜ�‹HˆØÓÜ × 1Ñ 1Ó2°2°AÐ6ˆC‘ˆFØ×!Ñ! " 1 "Ð%Ø+/×+<Ñ+<ˆDÕ(Ø˜qÓ Ü$.¨t×/@Ñ/@Ó$AÁ!Ð$DˆCÐ �Ð!ð
 "&ˆÔØÔØ!0ÔØÔØ$Ôð	Ø×!Ñ!Ô#ð ˆøð	Ø×$Ñ$Ñ%<Ô=Øús   Â*B< Â<Cc                 óê   • U R                  5       nU R                  5       (       a  U R                  U R                  5        U$ SU l         U R                  5         U$ !   UR                  S 5        e = f)aK  Asynchronously reads all data from the socket until it is closed.

This will buffer all available data until ``max_buffer_size``
is reached. If flow control or cancellation are desired, use a
loop with `read_bytes(partial=True) <.read_bytes>` instead.

.. versionchanged:: 4.0
    The callback argument is now optional and a `.Future` will
    be returned if it is omitted.

.. versionchanged:: 6.0

   The ``callback`` and ``streaming_callback`` arguments have
   been removed. Use the returned `.Future` (and `read_bytes`
   with ``partial=True`` for ``streaming_callback``) instead.

Tc                 ó"   • U R                  5       $ r,   rª   r¬   s    r(   r®   Ú/BaseIOStream.read_until_close.<locals>.<lambda>ó  r°   r*   )r±   ÚclosedÚ_finish_readrz   r…   r´   r·   ©r&   r¸   s     r(   Úread_until_closeÚBaseIOStream.read_until_closeÙ  so   € ð$ ×!Ñ!Ó#ˆØ�;‰;�=‰=Ø×Ñ˜d×4Ñ4Ô5ØˆMØ!%ˆÔð	Ø×!Ñ!Ô#ð ˆøð	Ø×$Ñ$Ñ%<Ô=Øús   ÁA ÁA2zFuture[None]c                 óæ  • U R                  5         U(       a¯  [        U[        5      (       a  [        U5      R                  S5      nU R                  b:  [        U R                  5      [        U5      -   U R                  :”  a  [        S5      eU R                  R                  U5        U =R                  [        U5      -  sl	        [        5       nUR                  S 5        U R                  R                  U R                  U45        U R                  (       dV  U R                  5         U R                  (       a%  U R                  U R                   R"                  5        U R%                  5         U$ )aâ  Asynchronously write the given data to this stream.

This method returns a `.Future` that resolves (with a result
of ``None``) when the write has been completed.

The ``data`` argument may be of type `bytes` or `memoryview`.

.. versionchanged:: 4.0
    Now returns a `.Future` if no callback is given.

.. versionchanged:: 4.5
    Added support for `memoryview` arguments.

.. versionchanged:: 6.0

   The ``callback`` argument was removed. Use the returned
   `.Future` instead.

ÚBz!Reached maximum write buffer sizec                 ó"   • U R                  5       $ r,   rª   r¬   s    r(   r®   Ú$BaseIOStream.write.<locals>.<lambda>  s
   € ¨1¯;©;¬=r*   )Ú_check_closedrR   rS   r^   rq   rP   r}   r<   rT   r~   r   r·   r‡   r‹   Ú_handle_writeÚ_add_io_staterv   ÚWRITEÚ_maybe_add_error_listener)r&   rM   r¸   s      r(   ÚwriteÚBaseIOStream.write÷  s  € ð( 	×ÑÔÞÜ˜$¤
×+Ñ+ä! $Ó'×,Ñ,¨SÓ1�à×*Ñ*Ñ6Ü˜×*Ñ*Ó+¬c°$«iÑ7¸$×:TÑ:TÓTä+Ð,OÓPÐPØ×Ñ×%Ñ% dÔ+Ø×#Ò#¤s¨4£yÑ0Õ#Ü“ˆØ× Ñ Ñ!8Ô9Ø×Ñ×"Ñ" D×$;Ñ$;¸VÐ#DÔEØ××Ø×ÑÔ Ø×!×!Ø×"Ñ" 4§<¡<×#5Ñ#5Ô6Ø×*Ñ*Ô,Øˆr*   Úcallbackc                 ó0   • Xl         U R                  5         g)a¿  Call the given callback when the stream is closed.

This mostly is not necessary for applications that use the
`.Future` interface; all outstanding ``Futures`` will resolve
with a `StreamClosedError` when the stream is closed. However,
it is still useful as a way to signal that the stream has been
closed while no other read or write is in progress.

Unlike other callback-based interfaces, ``set_close_callback``
was not removed in Tornado 6.0.
N)rˆ   râ   )r&   rå   s     r(   Úset_close_callbackÚBaseIOStream.set_close_callback!  s   € ð  (ÔØ×&Ñ&Õ(r*   r¨   zOptional[Type[BaseException]]c                 óÈ  • U R                  5       (       Gd,  U(       ak  [        U[        5      (       a  US   U l        OK[        U[        5      (       a  Xl        O/[
        R                  " 5       n[        U5      (       a
  US   U l        U R                  (       a#  SU l        U R                  U R                  5        O2U R                  b%   U R                  5       nUb  U R                  U5        U R                  b0  U R                   R#                  U R%                  5       5        SU l        U R'                  5         SU l        U R+                  5         g! [         a     Nqf = f)z»Close this stream.

If ``exc_info`` is true, set the ``error`` attribute to the current
exception from `sys.exc_info` (or if ``exc_info`` is a tuple,
use that instead of `sys.exc_info`).
é   FNT)rÕ   rR   Útuplerx   r2   Úsysr¨   Úanyr…   rÖ   rz   r†   Ú_find_read_posÚ_read_from_bufferr7   rŒ   rv   Úremove_handlerr’   r•   r�   Ú_signal_closed)r&   r¨   r_   s      r(   r¶   ÚBaseIOStream.close0  s  € ð& �{‰{�}Š}ÞÜ˜h¬×.Ñ.Ø!)¨!¡�D•JÜ ¬-×8Ñ8Ø!)•Jä"Ÿ|š|›~�HÜ˜8—}‘}Ø%-¨a¡[˜œ
Ø×%×%Ø).�Ô&Ø×!Ñ! $×"8Ñ"8Õ9Ø×"Ñ"Ñ.ð4Ø×-Ñ-Ó/�Cð ‘Ø×.Ñ.¨sÔ3Ø�{‰{Ñ&Ø—‘×+Ñ+¨D¯K©K«MÔ:Ø"�”Ø�M‰MŒOØˆDŒLØ×ÑÕøô .ó Ùðús   ÃE Å
E!Å E!c                 óî  • / nU R                   b"  UR                  U R                   5        S U l         XR                   VVs/ s H  u  p#UPM	     snn-  nU R                  R                  5         U R                  b"  UR                  U R                  5        S U l        U HK  nUR                  5       (       d"  UR                  [        U R                  S95         UR                  5         MM     U R                  b–  U R                  R                  5       (       dV  U R                  b&  U R                  R                  U R                  5        O#U R                  R                  [        5       5        U R                  R                  5         S U l        U R                  b.  U R                  nS U l        U R                  R                  U5        S U l        g s  snnf ! [        R                   a     GMS  f = f©Nr+   )r†   rT   r‡   Úclearr‰   ÚdoneÚset_exceptionr   rx   r«   ÚasyncioÚCancelledErrorrŠ   rˆ   rv   Úadd_callbackr}   )r&   ÚfuturesÚ_r¸   Úcbs        r(   rñ   ÚBaseIOStream._signal_closed`  s™  € ØˆØ×ÑÑ(Ø�N‰N˜4×,Ñ,Ô-Ø $ˆDÔØ×,?Ò,?Ô@Ò,?™y˜q“FÑ,?Ò@Ñ@ˆØ×Ñ×!Ñ!Ô#Ø×ÑÑ+Ø�N‰N˜4×/Ñ/Ô0Ø#'ˆDÔ ÛˆFØ—;‘;—=‘=Ø×$Ñ$Ô%6À$Ç*Á*Ñ%MÔNðØ× Ñ Ö"ñ ð ×#Ñ#Ñ/ð ×+Ñ+×0Ñ0×2Ñ2Ø—:‘:Ñ)Ø×,Ñ,×:Ñ:¸4¿:¹:ÕFà×,Ñ,×:Ñ:Ô;LÓ;NÔOØ×$Ñ$×.Ñ.Ô0Ø'+ˆDÔ$Ø×ÑÑ+Ø×%Ñ%ˆBØ#'ˆDÔ Ø�L‰L×%Ñ% bÔ)ð "ˆÕùóA Aøô ×)Ñ)ó Ûðús   ÁGÃGÇG4Ç3G4c                 ó   • U R                   SL$ )z=Returns ``True`` if we are currently reading from the stream.N)r†   rH   s    r(   ÚreadingÚBaseIOStream.reading‡  s   € à× Ñ ¨Ð,Ð,r*   c                 ó,   • [        U R                  5      $ )z;Returns ``True`` if we are currently writing to the stream.)Úboolr}   rH   s    r(   ÚwritingÚBaseIOStream.writing‹  s   € ä�D×&Ñ&Ó'Ð'r*   c                 ó   • U R                   $ )z/Returns ``True`` if the stream has been closed.)r�   rH   s    r(   rÕ   ÚBaseIOStream.closed�  s   € à�|‰|Ðr*   Úvaluec                 ó   • g)aŠ  Sets the no-delay flag for this stream.

By default, data written to TCP streams may be held for a time
to make the most efficient use of bandwidth (according to
Nagle's algorithm).  The no-delay flag requests that data be
written as soon as possible, even if doing so would consume
additional bandwidth.

This flag is currently defined only for TCP-based ``IOStreams``.

.. versionadded:: 3.1
Nr9   )r&   r  s     r(   Úset_nodelayÚBaseIOStream.set_nodelay“  s   € ð 	r*   c                 ó   • [        5       er,   r�   rH   s    r(   Ú_handle_connectÚBaseIOStream._handle_connect¢  s   € Ü!Ó#Ð#r*   ÚfdÚeventsc                 óŠ  • U R                  5       (       a  [        R                  " SU5        g  U R                  (       a  U R	                  5         U R                  5       (       a  g X R
                  R                  -  (       a  U R                  5         U R                  5       (       a  g X R
                  R                  -  (       a  U R                  5         U R                  5       (       a  g X R
                  R                  -  (       a;  U R                  5       U l        U R
                  R                  U R                  5        g U R
                  R                  nU R                  5       (       a  X0R
                  R                  -  nU R!                  5       (       a  X0R
                  R                  -  nX0R
                  R                  :X  a(  U R"                  S:X  a  X0R
                  R                  -  nX0R$                  :w  aO  U R$                  c   S5       eX0l        U R
                  R'                  U R)                  5       U R$                  5        g g ! [*         a2  n[        R,                  " SU-  5        U R                  US9   S nAg S nAf[.         a*  n[        R                  " SSS9  U R                  US9  e S nAff = f)NzGot events for closed stream %sr   z4shouldn't happen: _handle_events without self._stater¦   r§   z'Uncaught exception, closing connection.T)rÕ   r   Úwarningr‹   r  rv   ÚREADÚ_handle_readrá   rß   ÚERRORr¡   rx   rú   r¶   r   r  rz   rŒ   Úupdate_handlerr’   r7   rµ   Ú	Exception)r&   r  r  Ústater¹   s        r(   Ú_handle_eventsÚBaseIOStream._handle_events¥  sû  € Ø�;‰;�=‰=Ü�OŠOÐ=¸rÔBØð/	Ø××ð
 ×$Ñ$Ô&Ø�{‰{�}‰}ØØŸ™×)Ñ)×)Ø×!Ñ!Ô#Ø�{‰{�}‰}ØØŸ™×*Ñ*×*Ø×"Ñ"Ô$Ø�{‰{�}‰}ØØŸ™×*Ñ*×*Ø!×.Ñ.Ó0�”
ð —‘×)Ñ)¨$¯*©*Ô5ØØ—L‘L×&Ñ&ˆEØ�|‰|�~‰~ØŸ™×*Ñ*Ñ*�Ø�|‰|�~‰~ØŸ™×+Ñ+Ñ+�ØŸ™×*Ñ*Ó*¨t×/EÑ/EÈÓ/Jð
 Ÿ™×*Ñ*Ñ*�ØŸ™Ó#à—K‘KÑ+ðJàIóJØ+à#”Ø—‘×+Ñ+¨D¯K©K«M¸4¿;¹;ÕGð $øô &ó 	#Ü�LŠLÐEÈÑIÔJØ�J‰J ˆJÖ"ûÜó 	Ü�MŠMÐCÈdÒSØ�J‰J ˆJÑ"Øûð	ús?   ¯6I Á&AI Â)AI Ã,AI ÅDI É
KÉ(JÊKÊ%J=Ê=Kc                 ó  • U R                   b  U R                   nO4U R                  b  U R                  nOU R                  5       (       a  S nOSnSnU R                  5       (       d”  U R	                  5       S:X  a   U R                  5       $ Ub!  U R
                  U:¼  a   U R                  5       $ U R
                  U:¼  a$  U R                  5       nUb  U$ U R
                  S-  nU R                  5       (       d  M”  U R                  5       $ )Nr   rs   )rƒ   r‚   r   rÕ   Ú_read_to_bufferrz   rî   )r&   Útarget_bytesÚnext_find_posr_   s       r(   Ú_read_to_buffer_loopÚ!BaseIOStream._read_to_buffer_loopÚ  sý   € à×ÑÑ'Ø×+Ñ+‰LØ×!Ñ!Ñ-Ø×/Ñ/‰LØ�\‰\�^‰^ð  ‰LàˆLØˆØ—+‘+—-‘-ð ×#Ñ#Ó%¨Ó*Øð$ ×"Ñ"Ó$Ð$ð Ñ'¨D×,BÑ,BÀlÓ,RØð ×"Ñ"Ó$Ð$ð ×%Ñ%¨Ó6Ø×)Ñ)Ó+�Ø‘?Ø�JØ $× 6Ñ 6¸Ñ :�ð1 —+‘+—-“-ð2 ×"Ñ"Ó$Ð$r*   c                 ó
  •  U R                  5       nUb  U R                  U5        g g ! [         a    e [        R                   a    e [         a2  n[
        R                  " SU-  5        U R                  US9   S nAg S nAff = f)Nzerror on read: %sr§   )	r  r7   rø   rù   r  r   r  r¶   rï   )r&   r_   r¹   s      r(   r  ÚBaseIOStream._handle_read  s€   € ð		Ø×+Ñ+Ó-ˆCð ‰?Ø×"Ñ" 3Õ'ð øô &ó 	ØÜ×%Ñ%ó 	ØÜó 	Ü�OŠOÐ/°!Ñ3Ô4Ø�J‰J ˆJÑ"Üûð	ús   ‚( ¨(BÁ(A=Á=Bc                 óš   • U R                   b$  U R                  5         U R                   b   S5       e[        5       U l         U R                   $ )NzAlready reading)r†   rÞ   r   rH   s    r(   r±   ÚBaseIOStream._start_read  sJ   € Ø×ÑÑ(ð" ×ÑÔ Ø×$Ñ$Ñ,Ð?Ð.?Ó?Ð,Ü"›HˆÔØ× Ñ Ð r*   rV   c                 óX  • U R                   (       aM  U R                  =(       d
    [        5       U l        S U l        [	        U R                  5      U l        SU l         UnOU R                  U5      nU R                  b  U R                  nS U l        [        X25        U R                  5         g ©NF)
r{   r|   rU   ry   rP   rz   Ú_consumer†   r   râ   )r&   rV   Úresultr¸   s       r(   rÖ   ÚBaseIOStream._finish_read(  s‰   € Ø×!×!Ø $× <Ñ <× KÄ	ÃˆDÔØ+/ˆDÔ(Ü%(¨×):Ñ):Ó%;ˆDÔ"Ø%*ˆDÔ"Ø‰Fà—]‘] 4Ó(ˆFØ×ÑÑ(Ø×&Ñ&ˆFØ $ˆDÔÜ.¨vÔ>Ø×&Ñ&Õ(r*   c                 ó6  • U R                  5       nUb  U R                  U5        gU R                  5         U R                  5       nUb  U R                  U5        gU R	                  5       (       d*  U R                  [        R                  R                  5        gg)záAttempt to complete the current read operation from buffered data.

If the read can be completed without blocking, schedules the
read callback on the next IOLoop iteration; otherwise starts
listening for reads on the socket.
N)	rî   rï   rÞ   r  rÕ   rà   r   rt   r  ©r&   r_   s     r(   r´   ÚBaseIOStream._try_inline_read7  s‚   € ð ×!Ñ!Ó#ˆØ‰?Ø×"Ñ" 3Ô'ØØ×ÑÔØ×'Ñ'Ó)ˆØ‰?Ø×"Ñ" 3Ô'Øð �{‰{�}‰}Ø×ÑœvŸ}™}×1Ñ1Õ2ð r*   c                 óö  •    U R                   (       a#  [        U R                  5      U R                  S nO[	        U R
                  5      nU R                  U5      n Uc   AgUS:X  a  U R                  5          AgU R                   (       d!  U =R                  [        U5      SU -  sl        U =R                  U-  sl        AU R                  U R                  :”  a1  [        R                  " S5        U R                  5         [        S5      eU$ ! [        R                  [        [        4 a@  nU R                  U5      (       a  U R                  US9   SnAAgU R                  US9  e SnAff = f! Af = f)zóReads from the socket and appends the result to the read buffer.

Returns the number of bytes read.  Returns 0 if there is nothing
to read (i.e. the read returns EWOULDBLOCK or equivalent).  On
error closes the socket and raises an exception.
Nr§   r   z Reached maximum read buffer size)r{   rS   ry   rz   rU   rp   rž   Úsocketrx   ÚIOErrorÚOSErrorÚ_is_connresetr¶   ro   r   r<   )r&   r›   Ú
bytes_readr¹   s       r(   r  ÚBaseIOStream._read_to_bufferM  s`  € ð 	ØðØ×-×-Ü(¨×):Ñ):Ó;Ø ×2Ñ2Ð4ð™ô (¨×(<Ñ(<Ó=˜Ø!%×!2Ñ!2°3Ó!7�Jð ØÑ!Øñ ð ˜q“Ø—
‘
”Øñ ð ×)×)Ø×!Ò!¤Z°£_°[°jÐ%AÑAÕ!Ø×"Ò" jÑ0Õ"ð Ø×!Ñ! D×$8Ñ$8Ó8Ü�MŠMÐ<Ô=Ø�J‰JŒLÜ'Ð(JÓKÐKØÐøô7 Ÿ™¤g¬wÐ7ó 	à×)Ñ)¨!×,Ñ,ð Ÿ
™
¨A˜
Ñ.Û#ñ ð —J‘J¨�JÑ*Øûð	ûñ, úsH   ‚E5 „AD ÁE5 Á%E5 Á>AE5 ÄE2Ä2%E-ÅE5 ÅE-Å-E2Å2E5 Å5E8r_   c                 ó^   • S=U l         =U l        U l        SU l        U R	                  U5        g)zŸAttempts to complete the currently-pending read from the buffer.

The argument is either a position in the read buffer or None,
as returned by _find_read_pos.
NF)rƒ   r€   r�   r„   rÖ   r+  s     r(   rï   ÚBaseIOStream._read_from_buffer{  s4   € ð FJÐIˆÔÐI˜4Ô/°$Ô2BØ"ˆÔØ×Ñ˜#Õr*   c                 óZ  • U R                   b]  U R                  U R                   :¼  d!  U R                  (       a2  U R                  S:”  a"  [        U R                   U R                  5      nU$ U R                  bš  U R
                  (       aˆ  U R
                  R                  U R                  5      nUS:w  a7  [        U R                  5      nU R                  U R                  X#-   5        X#-   $ U R                  U R                  U R                  5        gU R                  b�  U R
                  (       a|  U R                  R                  U R
                  5      nUb.  UR                  5       nU R                  U R                  U5        U$ U R                  U R                  U R                  5        g)z¸Attempts to find a position in the read buffer that satisfies
the currently-pending read.

Returns a position in the buffer if the current read can be satisfied,
or None if it cannot.
Nr   rO   )rƒ   rz   r„   rw   r€   ry   ÚfindrP   Ú_check_max_bytesr�   ÚsearchÚend)r&   rÂ   ÚlocÚdelimiter_lenÚms        r(   rî   ÚBaseIOStream._find_read_pos…  sb  € ð ×ÑÑ'Ø×"Ñ" d×&6Ñ&6Ó6Ø×"×" t×'=Ñ'=ÀÓ'Aä˜D×,Ñ,¨d×.DÑ.DÓEˆIØÐØ×!Ñ!Ñ-ð × × Ø×'Ñ'×,Ñ,¨T×-AÑ-AÓB�Ø˜"“9Ü$'¨×(<Ñ(<Ó$=�MØ×)Ñ)¨$×*>Ñ*>ÀÑ@SÔTØÑ.Ð.Ø×%Ñ% d×&:Ñ&:¸D×<RÑ<RÔSð ð ×ÑÑ)Ø× × Ø×$Ñ$×+Ñ+¨D×,=Ñ,=Ó>�Ø‘=ØŸ%™%›'�CØ×)Ñ)¨$×*:Ñ*:¸CÔ@Ø�JØ×%Ñ% d×&6Ñ&6¸×8NÑ8NÔOØr*   c                 óp   • U R                   b)  X R                   :”  a  [        SXR                   4-  5      eg g )Nz&delimiter %r not found within %d bytes)r‚   r7   )r&   r¼   rV   s      r(   r8  ÚBaseIOStream._check_max_bytes¬  sC   € Ø×ÑÑ+°×7KÑ7KÓ0KÜ(Ø8Ø×2Ñ2Ð3ñ4óð ð 1LÐ+r*   c                 ó  •  [        U R                  5      nU(       d  OyUS:”  d   e [        (       a  SnU R                  U R                  R	                  U5      5      nUS:X  a  O2U R                  R                  U5        U =R                  U-  sl        M–  U R"                  (       a[  U R"                  S   u  pEX@R                  :”  a  g U R"                  R%                  5         ['        US 5        U R"                  (       a  MZ  g g ! [         a     Mz  [        R                  [        [        4 aU  nU R                  U5      (       d&  [        R                  " SU R                  5       U5        U R!                  US9   S nAg S nAff = f)Nr   i   zWrite error on %s: %sr§   )rP   r}   Ú_WINDOWSr™   r`   rg   r   ÚBlockingIOErrorr.  rx   r/  r0  r1  r   r  r’   r¶   r‡   rc   r   )r&   rV   rÂ   r¹   Úindexr¸   s         r(   rß   ÚBaseIOStream._handle_write³  sE  € ØÜ�t×)Ñ)Ó*ˆDÞØØ˜!“8ˆO�8ðß’8ð &�Dà ×,Ñ,¨T×-?Ñ-?×-DÑ-DÀTÓ-JÓK�	Ø “>ØØ×"Ñ"×*Ñ*¨9Ô5Ø×,Ò,°	Ñ9Õ,ñ% ð< ×!×!Ø ×/Ñ/°Ñ2‰MˆEØ×3Ñ3Ó3ØØ×Ñ×'Ñ'Ô)Ü.¨v°tÔ<ð ×!×!Ó!øô #ó ÚÜ—L‘L¤'¬7Ð3ó Ø×)Ñ)¨!×,Ñ,ô —O’OÐ$;¸T¿[¹[»]ÈAÔNØ—
‘
 A�
Ñ&Üûðús$   ¨=D Á&0D Ä
FÄFÄ0AF Æ Fr;  c                 óÊ   • US:X  a  gXR                   ::  d   e[        U R                  5      S U R                  5       nU =R                   U-  sl         U R                  S U2	 U$ )Nr   r*   )rz   rS   ry   Útobytes)r&   r;  rX   s      r(   r'  ÚBaseIOStream._consumeÙ  sf   € à�!‹8ØØ×,Ñ,Ó,Ð,Ð,ä˜×)Ñ)Ó*¨4¨CÐ0×9Ñ9Ó;ˆØ×Ò #Ñ%ÕØ×Ñ˜d˜s˜dÐ#Øˆr*   c                 óT   • U R                  5       (       a  [        U R                  S9eg rô   )rÕ   r   rx   rH   s    r(   rÞ   ÚBaseIOStream._check_closedä  s!   € Ø�;‰;�=‰=Ü#¨t¯z©zÑ:Ð:ð r*   c                 ó,  • U R                   b(  U R                   [        R                  R                  :X  a_  U R	                  5       (       dI  U R
                  S:X  a8  U R                  b*  U R                  [        R                  R                  5        g g g g g rB   )	rŒ   r   rt   r  rÕ   rz   rˆ   rà   r  rH   s    r(   râ   Ú&BaseIOStream._maybe_add_error_listenerè  su   € ð �;‰;Ñ $§+¡+´·±×1DÑ1DÓ"Dà—K‘K—M‘MØ×*Ñ*¨aÓ/Ø×(Ñ(Ñ4à×"Ñ"¤6§=¡=×#5Ñ#5Õ6ð 5ð 0ð "ð #Er*   r  c                 óÈ  • U R                  5       (       a  gU R                  cb  [        R                  R                  U-  U l        U R
                  R                  U R                  5       U R                  U R                  5        gU R                  U-  (       dI  U R                  U-  U l        U R
                  R                  U R                  5       U R                  5        gg)a·  Adds `state` (IOLoop.{READ,WRITE} flags) to our event handler.

Implementation notes: Reads and writes have a fast path and a
slow path.  The fast path reads synchronously from socket
buffers, while the slow path uses `_add_io_state` to schedule
an IOLoop callback.

To detect closed connections, we must have called
`_add_io_state` at some point, but we want to delay this as
much as possible so we don't have to set an `IOLoop.ERROR`
listener that will be overwritten by the next slow-path
operation. If a sequence of fast-path ops do not end in a
slow-path op, (e.g. for an @asynchronous long-poll request),
we must add the error handler.

TODO: reevaluate this now that callbacks are gone.

N)
rÕ   rŒ   r   rt   r  rv   Úadd_handlerr’   r  r  )r&   r  s     r(   rà   ÚBaseIOStream._add_io_state÷  s—   € ð& �;‰;�=‰=àØ�;‰;ÑÜ Ÿ-™-×-Ñ-°Ñ5ˆDŒKØ�L‰L×$Ñ$ T§[¡[£]°D×4GÑ4GÈÏÉÕUØ—‘˜u×$ØŸ+™+¨Ñ-ˆDŒKØ�L‰L×'Ñ'¨¯©«°t·{±{ÕCð %r*   Úexcc                 ót   • [        U[        R                  [        45      =(       a    [	        U5      [
        ;   $ )zVReturn ``True`` if exc is ECONNRESET or equivalent.

May be overridden in subclasses.
)rR   r.  rx   r/  r
   Ú_ERRNO_CONNRESET)r&   rP  s     r(   r1  ÚBaseIOStream._is_connreset  s/   € ô �sœVŸ\™\¬7Ð3Ó4÷ >Ü$ SÓ)Ô-=Ñ=ð	
r*   )r|   rˆ   r�   r‰   r‹   ry   rz   rƒ   r€   r†   r‚   r„   r�   r…   rŠ   rŒ   r   r~   r{   r}   r‡   rx   rv   ro   rq   rp   )NNNri   r,   )F);r-   r.   r/   r0   r1   r   rj   r%   r   r   Ú_Selectabler’   r•   rS   r™   rU   rž   r  r¡   rk   r   rº   rÀ   r  rÉ   rÐ   rØ   rã   r   rç   r2   r   r   r¶   rñ   r   r  rÕ   r
  r  r  r  r  r   r±   rÖ   r´   r  rï   rî   r   r8  rß   r'  rÞ   râ   rà   r1  r3   r9   r*   r(   rm   rm   Ï   s3  † ñð& *.Ø)-Ø/3ñ	7à! #™ð7ð " #™ð7ð  (¨™}ð	7ð
 
õ7ðr$˜˜c 6×#5Ñ#5Ð5Ñ6ô $ô$ð$ 
ð $¨sô $ð$  i°Ð&;Ñ <ð $ÀÈ#Áô $ð˜h yÑ1ô ð 8<ñ%Øð%Ø'/°¡}ð%à	�5Ñ	õ%ðP <@ñ!Øð!Ø+3°C©=ð!à	�5Ñ	õ!ñF Cð °$ð À9ÈUÑCSõ ñ8+˜Yð +°ð +À)ÈCÁ.õ +ðZ )¨EÑ"2ô ð<(˜%  zÐ 1Ñ2ð (°~ô (ðT)¨8°H¸RÀ¸XÑ4FÑ+Gð )ÈDô )ð4 ñ.àØØØØØ/Ø˜Ñ'Ø˜Ñ'ð)ñðñ	
ð.ð 
õ.ô`%"ðN-˜ô -ð(˜ô (ð˜ô ð ð ¨$ô ô$ð3  s¨F×,>Ñ,>Ð'>Ñ!?ð 3Èð 3ÐQUô 3ðj'% h¨s¡mô '%ôR(ð!˜Vô !ð.) ð )¨ô )ô3ð,, ¨#¡ô ,ð\ Sð ¨Tô ð% ¨¡ô %ðN¨%°°w°Ñ*?ð Àsð Ètô ô$=ðL	˜Cð 	 Eô 	ô;ô7ðD 3ð D¨4ô Dð:
 ð 
°4÷ 
r*   rm   c            
       óp  ^ • \ rS rSrSrS\R
                  S\S\SS4U 4S jjrS\\	\
R                  4   4S	 jrSS
 jrS\\   4S jrS\\\4   S\\	   4S jrS\S\	4S jr SS\S\S\\   SS4S jjr  SS\S\\\\\4   \R6                  4      S\\   S\S   4S jjrSS jrS\SS4S jrSr U =r!$ ) r   i  a!  Socket-based `IOStream` implementation.

This class supports the read and write methods from `BaseIOStream`
plus a `connect` method.

The ``socket`` parameter may either be connected or unconnected.
For server operations the socket is the result of calling
`socket.accept <socket.socket.accept>`.  For client operations the
socket is created with `socket.socket`, and may either be
connected before passing it to the `IOStream` or connected with
`IOStream.connect`.

A very simple (and broken) HTTP client using this class:

.. testcode::

    import socket
    import tornado

    async def main():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
        stream = tornado.iostream.IOStream(s)
        await stream.connect(("friendfeed.com", 80))
        await stream.write(b"GET / HTTP/1.0\r\nHost: friendfeed.com\r\n\r\n")
        header_data = await stream.read_until(b"\r\n\r\n")
        headers = {}
        for line in header_data.split(b"\r\n"):
            parts = line.split(b":")
            if len(parts) == 2:
                headers[parts[0].strip()] = parts[1].strip()
        body_data = await stream.read_bytes(int(headers[b"Content-Length"]))
        print(body_data)
        stream.close()

    if __name__ == '__main__':
        asyncio.run(main())

.. testoutput::
   :hide:

r.  ÚargsÚkwargsr"   Nc                 óh   >• Xl         U R                   R                  S5        [        TU ]  " U0 UD6  g r&  )r.  Úsetblockingr$   r%   )r&   r.  rV  rW  r'   s       €r(   r%   ÚIOStream.__init__J  s,   ø€ ØŒØ�‰×Ñ Ô&Ü‰Ò˜$Ð) &Ó)r*   c                 ó   • U R                   $ r,   )r.  rH   s    r(   r’   ÚIOStream.filenoO  s   € Ø�{‰{Ðr*   c                 óF   • U R                   R                  5         S U l         g r,   )r.  r¶   rH   s    r(   r•   ÚIOStream.close_fdR  s   € Ø�‰×ÑÔØˆ�r*   c                 óÈ   • U R                   R                  [         R                  [         R                  5      n[         R                  " U[
        R                  " U5      5      $ r,   )r.  Ú
getsockoptÚ
SOL_SOCKETÚSO_ERRORrx   ÚosÚstrerror)r&   Úerrnos     r(   r¡   ÚIOStream.get_fd_errorV  s<   € Ø—‘×&Ñ&¤v×'8Ñ'8¼&¿/¹/ÓJˆÜ�|Š|˜E¤2§;¢;¨uÓ#5Ó6Ð6r*   r›   c                 ó~   •  U R                   R                  U[        U5      5      A$ ! [         a     Ag f = f! Af = fr,   )r.  Ú	recv_intorP   rC  r�   s     r(   rž   ÚIOStream.read_from_fdZ  sA   € ð	Ø—;‘;×(Ñ(¨¬c°#«hÓ7ñ øô ó 	Øáð	ûñ ús   ‚$( ¨
6²9 µ6¶9 ¹<rM   c                 óH   •  U R                   R                  U5      A$ ! Af = fr,   )r.  Úsendr˜   s     r(   r™   ÚIOStream.write_to_fdb  s"   € ð	Ø—;‘;×#Ñ# DÓ)ñ ø‘ús   ‚ ž!r&   ÚaddressÚserver_hostnamezFuture[_IOStreamType]c                 óÂ  • SU l         [        5       n[        R                  " SU5      U l         U R
                  R                  U5        U R                  U R                  R                  5        U$ ! [         a     N3[
        R                   aN  nUc0  [        R                  " SU R
                  R                  5       U5        U R                  US9  Us SnA$ SnAff = f)a¤  Connects the socket to a remote address without blocking.

May only be called if the socket passed to the constructor was
not previously connected.  The address parameter is in the
same format as for `socket.connect <socket.socket.connect>` for
the type of socket passed to the IOStream constructor,
e.g. an ``(ip, port)`` tuple.  Hostnames are accepted here,
but will be resolved synchronously and block the IOLoop.
If you have a hostname instead of an IP address, the `.TCPClient`
class is recommended instead of calling this method directly.
`.TCPClient` will do asynchronous DNS resolution and handle
both IPv4 and IPv6.

If ``callback`` is specified, it will be called with no
arguments when the connection is completed; if not this method
returns a `.Future` (whose result after a successful
connection will be the stream itself).

In SSL mode, the ``server_hostname`` parameter will be used
for certificate validation (unless disabled in the
``ssl_options``) and SNI (if supported; requires Python
2.7.9+).

Note that it is safe to call `IOStream.write
<BaseIOStream.write>` while the connection is pending, in
which case the data will be written as soon as the connection
is ready.  Calling `IOStream` read methods before the socket is
connected works on some platforms but is non-portable.

.. versionchanged:: 4.0
    If no callback is given, returns a `.Future`.

.. versionchanged:: 4.2
   SSL certificates are validated by default; pass
   ``ssl_options=dict(cert_reqs=ssl.CERT_NONE)`` or a
   suitably-configured `ssl.SSLContext` to the
   `SSLIOStream` constructor to disable.

.. versionchanged:: 6.0

   The ``callback`` argument was removed. Use the returned
   `.Future` instead.

TzFuture[IOStream]NúConnect error on fd %s: %sr§   )r‹   r   r]   r^   r‰   r.  ÚconnectrC  rx   r   r  r’   r¶   rà   rv   rá   )r&   rm  rn  r¸   r¹   s        r(   rq  ÚIOStream.connectj  sº   € ð^  ˆÔÜ“ˆÜ%Ÿ{š{Ð+=¸vÓFˆÔð	Ø�K‰K×Ñ Ô(ð 	×Ñ˜4Ÿ<™<×-Ñ-Ô.Øˆøô ó 	ñ Ü�|‰|ó 	ð
 ‰~Ü—’Ð <¸d¿k¹k×>PÑ>PÓ>RÐTUÔVØ�J‰J ˆJÑ"Ø�Mûð	ús$   ¯A1 Á1
CÁ=CÂACÃCÃCÚserver_sideÚssl_optionsÚSSLIOStreamc                 óJ  • U R                   (       dU  U R                  (       dD  U R                  (       d3  U R                  (       d"  U R                  (       d  U R
                  (       a  [        S5      eUc  U(       a  [        nO[        nU R                  nU R                  R                  U5        SU l	        [        UUUUSS9nU R                  nSU l        [        5       n[        XBS9nUR!                  U5        Xgl        U R$                  Ul        U R&                  Ul        U$ )a  Convert this `IOStream` to an `SSLIOStream`.

This enables protocols that begin in clear-text mode and
switch to SSL after some initial negotiation (such as the
``STARTTLS`` extension to SMTP and IMAP).

This method cannot be used if there are outstanding reads
or writes on the stream, or if there is any data in the
IOStream's buffer (data in the operating system's socket
buffer is allowed).  This means it must generally be used
immediately after reading or writing the last clear-text
data.  It can also be used immediately after connecting,
before any reads or writes.

The ``ssl_options`` argument may be either an `ssl.SSLContext`
object or a dictionary of keyword arguments for the
`ssl.SSLContext.wrap_socket` function.  The ``server_hostname`` argument
will be used for certificate validation unless disabled
in the ``ssl_options``.

This method returns a `.Future` whose result is the new
`SSLIOStream`.  After this method has been called,
any other operation on the original stream is undefined.

If a close callback is defined on this stream, it will be
transferred to the new stream.

.. versionadded:: 4.0

.. versionchanged:: 4.2
   SSL certificates are validated by default; pass
   ``ssl_options=dict(cert_reqs=ssl.CERT_NONE)`` or a
   suitably-configured `ssl.SSLContext` to disable.
z+IOStream is not idle; cannot convert to SSLNF)rn  rs  Údo_handshake_on_connect)rt  )r†   r‡   r‰   r�   ry   r}   Ú
ValueErrorr	   r   r.  rv   rð   r   rˆ   r   ru  rç   rŠ   ro   rp   )r&   rs  rt  rn  r.  Úorig_close_callbackr¸   Ú
ssl_streams           r(   Ú	start_tlsÚIOStream.start_tls®  sð   € ðR ××Ø×"×"Ø×#×#Ø�|�|Ø× × Ø×!×!äÐJÓKÐKØÑÞÜ2‘ä2�à—‘ˆØ�‰×#Ñ# FÔ+ØˆŒÜ ØØØ+Ø#Ø$)ñ
ˆð #×2Ñ2ÐØ#ˆÔä“ˆÜ  ÑAˆ
Ø×%Ñ%Ð&9Ô:Ø)/Ô&Ø%)×%9Ñ%9ˆ
Ô"Ø%)×%9Ñ%9ˆ
Ô"Øˆr*   c                 ó†  •  U R                   R                  [         R                  [         R                  5      nWS:w  a�  [         R                  " U[        R                  " U5      5      U l        U R                  cA  [        R                  " SU R                   R                  5       [        R                  U   5        U R                  5         g U R                  b  U R                  nS U l
        [!        X05        SU l        g ! [         R                   a*  n[        U5      [        R                  :X  a  Sn S nAGNS nAff = f)Nr   rp  F)r.  r`  ra  rb  rx   r
   re  ÚENOPROTOOPTrc  rd  r‰   r   r  r’   Ú	errorcoder¶   r   r‹   )r&   Úerrr¹   r¸   s       r(   r  ÚIOStream._handle_connectú  sò   € ð	Ø—+‘+×(Ñ(¬×):Ñ):¼F¿O¹OÓLˆCð �!‹8ÜŸš c¬2¯;ª;°sÓ+;Ó<ˆDŒJð
 ×#Ñ#Ñ+Ü—’Ø0Ø—K‘K×&Ñ&Ó(Ü—O‘O CÑ(ôð
 �J‰JŒLØØ×ÑÑ+Ø×)Ñ)ˆFØ#'ˆDÔ Ü.¨vÔ<Ø ˆÕøô/ �|‰|ó 	ô $ AÓ&¬%×*;Ñ*;Ó;Ø�ÿùð		ús   ‚8D ÄE ÄD;Ä;E r  c                 óÎ  • U R                   b}  U R                   R                  [         R                  [         R                  4;   aD   U R                   R	                  [         R
                  [         R                  U(       a  SOS5        g g g ! [         R                   aD  nUR                  [        R                  :w  a  U R                  U5      (       d  e  S nAg  S nAg S nAff = f)Nrê   r   )r.  ÚfamilyÚAF_INETÚAF_INET6Ú
setsockoptÚIPPROTO_TCPÚTCP_NODELAYrx   re  ÚEINVALr1  )r&   r  r¹   s      r(   r
  ÚIOStream.set_nodelay  sª   € Ø�;‰;Ñ" t§{¡{×'9Ñ'9Ü�N‰NÜ�O‰Oð>
ó (
ð	Ø—‘×&Ñ&Ü×&Ñ&¬×(:Ñ(:Æ¹AÈAõð(
Ð"øô —<‘<ó ð —7‘7œeŸl™lÓ*°4×3EÑ3EÀa×3HÑ3HØô 4IÔ*ûð	ús   ÁAB ÂC$Â 5CÃC$)rˆ   r‰   r‹   rx   r.  ri   r,   )NN)"r-   r.   r/   r0   r1   r.  r   r%   r   rj   r   rT  r’   r•   r   r  r¡   rU   rS   rž   r™   r   Ústrrq  r  r   ÚsslÚ
SSLContextr   r{  r  r
  r3   r4   r5   s   @r(   r   r     sF  ø† ñ(ðT*˜vŸ}™}ð *°Sð *ÀCð *ÈD÷ *ð
˜˜c 6×#5Ñ#5Ð5Ñ6ô ôð7˜h yÑ1ô 7ð  i°Ð&;Ñ <ð ÀÈ#Áô ð 
ð ¨sô ð MQñBØðBØ&)ðBØ<DÀS¹MðBà	 õBðN HLØ)-ñ	JàðJð ˜e D¨¨c¨¡N°C·N±NÐ$BÑCÑDðJð " #™ð	Jð
 
�=Ñ	!õJôX!ð8 ð ¨$÷ ò r*   c                   ó*  ^ • \ rS rSrSrSrS\S\SS4U 4S jjrS\4U 4S jjr	S\4U 4S	 jjr
SS
 jrSS jrSU 4S jjrSU 4S jjr SS\S\\   SS4U 4S jjjrSU 4S jjrSS jrS\S\4S jrS\\\4   S\\   4S jrS\S\4U 4S jjrSrU =r$ )ru  i'  af  A utility class to write to and read from a non-blocking SSL socket.

If the socket passed to the constructor is already connected,
it should be wrapped with::

    ssl.SSLContext(...).wrap_socket(sock, do_handshake_on_connect=False, **kwargs)

before constructing the `SSLIOStream`.  Unconnected sockets will be
wrapped when `IOStream.connect` is finished.
NrV  rW  r"   c                 óH  >• UR                  S[        5      U l        [        TU ]  " U0 UD6  SU l        SU l        SU l        SU l         U R                  R                  5         U R                  U R                  R                  5        g! [        R                   a     gf = f)z•The ``ssl_options`` keyword argument may either be an
`ssl.SSLContext` object or a dictionary of keywords arguments
for `ssl.SSLContext.wrap_socket`
rt  TFN)Úpopr   Ú_ssl_optionsr$   r%   Ú_ssl_acceptingÚ_handshake_readingÚ_handshake_writingÚ_server_hostnamer.  Úgetpeernamerà   rv   rá   rx   )r&   rV  rW  r'   s      €r(   r%   ÚSSLIOStream.__init__5  s’   ø€ ð
 #ŸJ™J }Ô6JÓKˆÔÜ‰Ò˜$Ð) &Ò)Ø"ˆÔØ"'ˆÔØ"'ˆÔØ $ˆÔð	3Ø�K‰K×#Ñ#Ô%ð ×Ñ˜tŸ|™|×1Ñ1Õ2øô �|‰|ó 	Ùð	ús   Á
B
 Â
B!Â B!c                 óF   >• U R                   =(       d    [        TU ]	  5       $ r,   )r“  r$   r   ©r&   r'   s    €r(   r   ÚSSLIOStream.readingL  ó   ø€ Ø×&Ñ&×;¬%©'©/Ó*;Ð;r*   c                 óF   >• U R                   =(       d    [        TU ]	  5       $ r,   )r”  r$   r  r™  s    €r(   r  ÚSSLIOStream.writingO  r›  r*   c                 óò  •  SU l         SU l        U R                  R                  5         SU l        [
        R                  (       d   eU R                  5         g ! [
        R                   GaH  nUR                  S   [
        R                  :X  a  SU l          S nAg UR                  S   [
        R                  :X  a  SU l         S nAg UR                  S   [
        R                  [
        R                  4;   a  U R                  US9s S nA$ UR                  S   [
        R                  [
        R                   4;   ar   U R                  R#                  5       nO! [$         a    Sn Of = f[&        R(                  " SU R                  R+                  5       X!5        U R                  US9s S nA$ e S nAf[
        R,                   a  nU R                  US9s S nA$ S nAf[        R.                   ab  nU R1                  U5      (       d2  UR                  S   S[2        R4                  [2        R6                  4;   a  U R                  US9s S nA$ e S nAf[8         a  nU R                  US9s S nA$ S nAff = f)NFr   Tr§   z(not connected)zSSL Error on %s %s: %s)r“  r”  r.  Údo_handshaker’  rŒ  ÚHAS_SNIÚ_finish_ssl_connectÚSSLErrorrV  ÚSSL_ERROR_WANT_READÚSSL_ERROR_WANT_WRITEÚSSL_ERROR_EOFÚSSL_ERROR_ZERO_RETURNr¶   ÚSSL_ERROR_SSLÚSSL_ERROR_SYSCALLr–  r  r   r  r’   ÚCertificateErrorrx   r1  re  ÚEBADFÚENOTCONNÚAttributeError)r&   r€  Úpeers      r(   Ú_do_ssl_handshakeÚSSLIOStream._do_ssl_handshakeR  sò  € ð5	'Ø&+ˆDÔ#Ø&+ˆDÔ#Ø�K‰K×$Ñ$Ô&ð\ #(ˆDÔô —;—;Ð�;Ø×$Ñ$Õ&øôc �|‰|ô 	Ø�x‰x˜‰{œc×5Ñ5Ó5Ø*.�Ô'ÜØ—‘˜!‘¤× 8Ñ 8Ó8Ø*.�Ô'ÜØ—‘˜!‘¤×!2Ñ!2´C×4MÑ4MÐ NÓNØ—z‘z¨3�zÐ/Õ/Ø—‘˜!‘¤×!2Ñ!2´C×4IÑ4IÐ JÓJð-ØŸ;™;×2Ñ2Ó4‘DøÜ ó -Ø,’Dð-úä—’Ø,¨d¯k©k×.@Ñ.@Ó.BÀDôð —z‘z¨3�zÐ/Õ/ØûÜ×#Ñ#ó 	,ð
 —:‘: s�:Ð+Õ+ûÜ�|‰|ó 	ð ×!Ñ! #×&Ñ&¨#¯(©(°1©+ØÜ—‘Ü—‘ð:ó +ð
 —z‘z¨3�zÐ/Õ/ØûÜó 	,ð —:‘: s�:Ð+Õ+ûð		,ús�   ‚(A ÁI6Á.(F1Â(F1Ã?F1ÄI6Ä1F1Ä?EÅF1ÅE)Å&F1Å(E)Å)AF1Æ*I6Æ0F1Æ1I6ÇGÇI6ÇI6Ç3AIÉ	I6ÉIÉI6ÉI1É+I6É1I6c                 ó\   • U R                   b  U R                   nS U l         [        X5        g g r,   )rŠ   r   r×   s     r(   r¡  ÚSSLIOStream._finish_ssl_connect‹  s.   € Ø×#Ñ#Ñ/Ø×-Ñ-ˆFØ'+ˆDÔ$Ü.¨vÕ<ð 0r*   c                 óf   >• U R                   (       a  U R                  5         g [        TU ]  5         g r,   )r’  r®  r$   r  r™  s    €r(   r  ÚSSLIOStream._handle_read‘  s&   ø€ Ø××Ø×"Ñ"Ô$ØÜ‰ÑÕr*   c                 óf   >• U R                   (       a  U R                  5         g [        TU ]  5         g r,   )r’  r®  r$   rß   r™  s    €r(   rß   ÚSSLIOStream._handle_write—  s&   ø€ Ø××Ø×"Ñ"Ô$ØÜ‰ÑÕr*   rm  rn  úFuture[SSLIOStream]c                 ór   >• X l         [        TU ]	  U5      nUR                  S 5        U R	                  5       $ )Nc                 ó"   • U R                  5       $ r,   rª   r¬   s    r(   r®   Ú%SSLIOStream.connect.<locals>.<lambda>­  s
   € ¨¯©¬r*   )r•  r$   rq  r·   Úwait_for_handshake)r&   rm  rn  Úfutr'   s       €r(   rq  ÚSSLIOStream.connect�  s9   ø€ ð !0Ôô ‰g‰o˜gÓ&ˆØ×ÑÑ5Ô6Ø×&Ñ&Ó(Ð(r*   c                 óJ  >• [         TU ]  5         U R                  5       (       a  g U R                  R	                  U R
                  5        U R                  nUc   eS U l        [        U R
                  U R                  U R                  SSS9U l        U R                  U5        g )NF)rn  rw  rs  )r$   r  rÕ   rv   rð   r.  rŒ   r   r‘  r•  rà   )r&   Ú	old_stater'   s     €r(   r  ÚSSLIOStream._handle_connect°  s‹   ø€ ä‰ÑÔ!Ø�;‰;�=‰=Øð 	�‰×#Ñ# D§K¡KÔ0Ø—K‘Kˆ	ØÑ$Ð$Ð$ØˆŒÜ%Ø�K‰KØ×ÑØ ×1Ñ1Ø$)Øñ
ˆŒð 	×Ñ˜9Õ%r*   c                 ó˜   • U R                   b  [        S5      e[        5       =ol         U R                  (       d  U R	                  5         U$ )aö  Wait for the initial SSL handshake to complete.

If a ``callback`` is given, it will be called with no
arguments once the handshake is complete; otherwise this
method returns a `.Future` which will resolve to the
stream itself after the handshake is complete.

Once the handshake is complete, information such as
the peer's certificate and NPN/ALPN selections may be
accessed on ``self.socket``.

This method is intended for use on server-side streams
or after using `IOStream.start_tls`; it should not be used
with `IOStream.connect` (which already waits for the
handshake to complete). It may only be called once per stream.

.. versionadded:: 4.2

.. versionchanged:: 6.0

   The ``callback`` argument was removed. Use the returned
   `.Future` instead.

zAlready waiting)rŠ   ÚRuntimeErrorr   r’  r¡  r×   s     r(   rº  ÚSSLIOStream.wait_for_handshakeÌ  sC   € ð2 ×#Ñ#Ñ/ÜÐ0Ó1Ð1Ü,2«HÐ4ˆÔ)Ø×"×"Ø×$Ñ$Ô&Øˆr*   rM   c                 ó  • [        U5      S-	  (       a  [        U5      S S n U R                  R                  U5      A$ ! [        R
                   a-  nUR                  S   [        R                  :X  a   S nAAge S nAff = f! Af = f©Né   i   @r   )rP   rS   r.  rk  rŒ  r¢  rV  r¤  )r&   rM   r¹   s      r(   r™   ÚSSLIOStream.write_to_fdì  s}   € ô ˆt‹9˜�?Ü˜dÓ# I gÐ.ˆDð	Ø—;‘;×#Ñ# DÓ)ñ øô �|‰|ó 		Ø�v‰v�a‰yœC×4Ñ4Ó4ó ñ
 ð	 ûð		ûñ ús-   £? ¿B Á!A;Á4B Á:A;Á;B Â B ÂBr›   c                 óh  •  U R                   (       a   Ag [        U5      S-	  (       a  [        U5      S S n U R                  R	                  U[        U5      5      A$ ! [
        R                   a-  nUR                  S   [
        R                  :X  a   S nAAg e S nAf[         a     Ag f = f! Af = frÄ  )
r’  rP   rS   r.  rh  rŒ  r¢  rV  r£  rC  ©r&   r›   r¹   s      r(   rž   ÚSSLIOStream.read_from_fd  s¨   € ð	Ø×"×"ð ñ$ ô �3‹x˜2�~Ü  “o i¨Ð0�ð
Ø—{‘{×,Ñ,¨S´#°c³(Ó;ñ øô —<‘<ó ð —6‘6˜!‘9¤× 7Ñ 7Ó7Ûñ ð	 ûÜ"ó Øáðûñ úsE   ‚B. –!B. ¸$A ÁB+Á2!BÂB. ÂBÂB+Â'B. Â*B+Â+B. Â.B1r¹   c                 ó¤   >• [        U[        R                  5      (       a"  UR                  S   [        R                  :X  a  g[
        TU ]  U5      $ )Nr   T)rR   rŒ  r¢  rV  r¥  r$   r1  )r&   r¹   r'   s     €r(   r1  ÚSSLIOStream._is_connreset  s<   ø€ Ü�aœŸ™×&Ñ&¨1¯6©6°!©9¼×8IÑ8IÓ+IØÜ‰wÑ$ QÓ'Ð'r*   )r“  r”  r•  r’  rŠ   r‘  rŒ   r.  ri   r,   )r"   r¶  )r-   r.   r/   r0   r1   r.  r   r%   r  r   r  r®  r¡  r  rß   r   r   r‹  rq  r  rº  rS   rj   r™   r   rU   rž   r2   r1  r3   r4   r5   s   @r(   ru  ru  '  sÚ   ø† ñ	ð €Fð3˜cð 3¨Sð 3°T÷ 3ð.<˜÷ <ð<˜÷ <ô7'ôr=÷÷ ð @Dñ)Øð)Ø/7¸©}ð)à	÷)ð )÷&&ô8ð@ 
ð ¨sô ð.  i°Ð&;Ñ <ð ÀÈ#Áô ð4(˜}ð (°÷ (õ (r*   ru  c                   óŒ   ^ • \ rS rSrSrS\S\S\SS4U 4S jjrS\4S	 jrSS
 jr	S\
S\4S jrS\\\
4   S\\   4S jrSrU =r$ )ÚPipeIOStreami#  a=  Pipe-based `IOStream` implementation.

The constructor takes an integer file descriptor (such as one returned
by `os.pipe`) rather than an open file object.  Pipes are generally
one-way, so a `PipeIOStream` can be used for reading or writing but not
both.

``PipeIOStream`` is only available on Unix-based platforms.
r  rV  rW  r"   Nc                 óê   >• Xl         [        R                  " U R                   S5      U l        [        R
                  S:X  a  [        S5      e[        R                  " US5        [        TU ](  " U0 UD6  g )Nzr+Úwin32z(PipeIOStream is not supported on WindowsF)r  ÚioÚFileIOÚ_fiorì   ÚplatformÚAssertionErrorrc  Úset_blockingr$   r%   )r&   r  rV  rW  r'   s       €r(   r%   ÚPipeIOStream.__init__.  sX   ø€ ØŒÜ—I’I˜dŸg™g tÓ,ˆŒ	Ü�<‰<˜7Ó"ô !Ð!KÓLÐLÜ
�Š˜˜EÔ"Ü‰Ò˜$Ð) &Ó)r*   c                 ó   • U R                   $ r,   )r  rH   s    r(   r’   ÚPipeIOStream.fileno;  s   € Ø�w‰wˆr*   c                 ó8   • U R                   R                  5         g r,   )rÒ  r¶   rH   s    r(   r•   ÚPipeIOStream.close_fd>  s   € Ø�	‰	�‰Õr*   rM   c                 óT   •  [         R                  " U R                  U5      A$ ! Af = fr,   )rc  rã   r  r˜   s     r(   r™   ÚPipeIOStream.write_to_fdA  s"   € ð	Ü—8’8˜DŸG™G TÓ*ñ ø‘ús   ‚ $ ¤'r›   c                 óÞ   •  U R                   R                  U5      A$ ! [        [        4 a8  n[	        U5      [
        R                  :X  a  U R                  US9   S nAAg e S nAff = f! Af = f)Nr§   )rÒ  Úreadintor/  r0  r
   re  rª  r¶   rÈ  s      r(   rž   ÚPipeIOStream.read_from_fdI  si   € ð	Ø—9‘9×%Ñ% cÓ*ñ øô œÐ!ó 	Ü# AÓ&¬%¯+©+Ó5ð —
‘
 A�
Ñ&Ûñ ð ûð	ûñ ús,   ‚ žA&®,A!ÁA) Á A!Á!A&Á&A) Á)A,)rÒ  r  ri   )r-   r.   r/   r0   r1   rj   r   r%   r’   r•   rS   r™   r   rU   r   rž   r3   r4   r5   s   @r(   rÍ  rÍ  #  ss   ø† ñð*˜3ð * sð *°cð *¸d÷ *ð˜ô ôð 
ð ¨sô ð  i°Ð&;Ñ <ð ÀÈ#Á÷ ò r*   rÍ  r"   c                  ó*   • SS K n U R                  5       $ rB   )ÚdoctestÚDocTestSuite)rá  s    r(   Údoctestsrã  X  s   € Ûà×ÑÓ!Ð!r*   )Br1   rø   rC   re  rÐ  rÇ   rc  r.  rŒ  rì   r²   Útornado.concurrentr   r   Útornador   Útornado.logr   Útornado.netutilr   r   r	   Útornado.utilr
   r]   r   r   r   r   r   r   r   r   r   Útypesr   ÚTYPE_CHECKINGr   r   r   r   Ú
ECONNRESETÚECONNABORTEDÚEPIPEÚ	ETIMEDOUTrR  Úhasattrr   ÚWSAECONNABORTEDÚWSAETIMEDOUTrÓ  Ú
EPROTOTYPEÚ
startswithrB  r/  r   r  r7   r<   Úobjectr?   rm   r   ru  rÍ  rã  r9   r*   r(   Ú<module>rõ     s~  ðñ ó Û Û Û 	Û Û 	Û Û 
Û 
Û 	ç IÝ Ý ß WÑ WÝ -ã ÷
÷ 
õ 
õ  à	××ß(Ñ(á˜¨zÑ:€ð ×$Ñ$ e×&8Ñ&8¸%¿+¹+ÀuÇÁÐWÐ á
ˆ5�/×"Ñ"ØØ×ÑØ×ÑØ×Ñðñ Ðð ‡<�<�8Óð ˜×)Ñ)Ð+Ñ+Ðà�<‰<×"Ñ" 5Ó)€ô%˜ô %ô&	˜Yô 	ôJ˜Iô JôW�Fô WôtM
�6ô M
ô`Eˆ|ô EôPy(�(ô y(ôx2�<ô 2ðj"�#õ "r*   