
    h"                        S r SSKrSSKrSSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SS	KJrJrJrJrJrJr  SS
KJr  Sr\R.                  " S5      rSr " S S\5      r " S S\5      rg)zAMQP Channels.    N)defaultdict)Queue)ensure_promise   )spec)AbstractChannel)ChannelErrorConsumerCancelledMessageNackedRecoverableChannelErrorRecoverableConnectionErrorerror_for_code)queue_declare_ok_t)ChannelamqpzuRejecting message with delivery tag %r for reason of having no callbacks.
consumer_tag=%r exchange=%r routing_key=%r.c                       \ rS rSrSrg)VDeprecationWarning    N)__name__
__module____qualname____firstlineno____static_attributes__r       4D:\TimeStamps\venv\Lib\site-packages\amqp/channel.pyr   r      s    r   r   c                    
  ^ \ rS rSrSr\R                  " \R                  R                  S5      \R                  " \R                  R                  5      \R                  " \R                  R                  S5      \R                  " \R                  R                  S5      \R                  " \R                  R                  5      \R                  " \R                  R                  5      \R                  " \R                  R                  5      \R                  " \R                  R                   5      \R                  " \R                  R"                  5      \R                  " \R$                  R                   5      \R                  " \R$                  R"                  5      \R                  " \R$                  R                  S5      \R                  " \R$                  R                  S5      \R                  " \R$                  R&                  S5      \R                  " \R(                  R*                  S5      \R                  " \R(                  R,                  S5      \R                  " \R(                  R.                  S5      \R                  " \R(                  R0                  SS	S
9\R                  " \R(                  R2                  S5      \R                  " \R(                  R4                  SS	S
9\R                  " \R(                  R6                  5      \R                  " \R(                  R8                  5      \R                  " \R(                  R:                  SS	S
9\R                  " \R<                  R>                  5      \R                  " \R<                  R@                  5      \R                  " \R<                  RB                  5      \R                  " \RD                  RB                  5      \R                  " \R(                  RF                  S5      \R                  " \R(                  RH                  S5      1r%\% V Vs0 s H  oRL                  U_M     snn r%\R                  R                  \R                  R                  4r' S<U4S jjr(S=S jr)S r*S r+S r,  S>S jr-S r.S r/S r0S r1S r2S r3S r4   S?S jr5  S@S jr6  SAS jr7  SAS jr8  SAS jr9  SBS  jr:   SCS! jr;   SDS" jr<SES# jr=SFS$ jr>SGS% jr?S& r@S' rAS( rB    SHS) jrCS* rDSES+ jrES=S, jrFS- rG    SIS. jrH\HrIS/ rJ SJS0 jrKSKS1 jrLSKS2 jrMSLS3 jrNS4 rOS5 rPS6 rQS7 rRSKS8 jrSS9 rTS: rUS;rVU=rW$ s  snn f )Mr       a  AMQP Channel.

The channel class provides methods for a client to establish a
virtual connection - a channel - to a server and for both peers to
operate the virtual connection thereafter.

GRAMMAR::

    channel             = open-channel *use-channel close-channel
    open-channel        = C:OPEN S:OPEN-OK
    use-channel         = C:FLOW S:FLOW-OK
                        / S:FLOW C:FLOW-OK
                        / functional-class
    close-channel       = C:CLOSE S:CLOSE-OK
                        / S:CLOSE C:CLOSE-OK

Create a channel bound to a connection and using the specified
numeric channel_id, and open on the server.

The 'auto_decode' parameter (defaults to True), indicates
whether the library should attempt to decode the body
of Messages to a Unicode string if there's a 'content_encoding'
property for the message.  If there's no 'content_encoding'
property, or the decode raises an Exception, the message body
is left as plain bytes.
BsBBbslllssLbssT)contentLbsslBsssLbc                   > U(       a  UR                  U5        OUR                  5       n[        R                  SU5        [        TU ]  X5        SU l        SU l        [        5       U l	        0 U l
        0 U l        X0l        [        [        5      U l        [        5       U l        [#        U5      U l        SU l        U R(                  R*                  (       a  U R,                  U l        Sng )Nzusing channel_id: %sFT)	is_openactivereturned_messages	callbackscancel_callbackseventsno_ack_consumerson_open_confirm_selected)_claim_channel_id_get_free_channel_idAMQP_LOGGERdebugsuper__init__r*   r+   r   r,   r-   r.   auto_decoder   setr/   r0   r   r1   r2   
connectionconfirm_publishbasic_publish_confirmbasic_publish)selfr;   
channel_idr9   r1   	__slots__	__class__s         r   r8   Channel.__init__a   s    ((4#88:J0*=0!& "&!#& #%g. "'??**!%!;!;D

	r   c                 8    U R                   R                  X5      $ N)r1   then)r?   
on_successon_errors      r   rF   Channel.then   s    ||  66r   c                 
   U R                   R                  [        R                  R                  U R
                  [        R                  R                  U R                  [        R                  R                  U R                  [        R                  R                  U R                  [        R                  R                  U R                  [        R                  R                  U R                   [        R                  R"                  U R$                  [        R                  R&                  U R(                  [        R                  R*                  U R,                  [        R                  R.                  U R0                  0
5        g rE   )
_callbacksupdater   r   Close	_on_closeCloseOk_on_close_okFlow_on_flowOpenOk_on_open_okBasicCancel_on_basic_cancelCancelOk_on_basic_cancel_okDeliver_on_basic_deliverReturn_on_basic_returnAck_on_basic_ackNack_on_basic_nackr?   s    r   _setup_listenersChannel._setup_listeners   s    LLLL  $"3"3LLt}}LL!1!1JJt44JJ!9!9JJ 6 6JJt44JJNND..JJOOT00 
 	r   c                    [         R                  SU R                  5        SU l        U R                  Ssol        U R                  Sso l        U(       a8  UR
                  R                  US5         UR                  R                  U5        U R                  R                  5         U R                  R                  5         U R                  R                  5         U R                  R                  5         g! [         a     Nuf = f)zQTear down this object.

Best called after we've agreed to close with the server.
zClosed channel #%sFN)r5   r6   r@   r*   r;   channelspop_used_channel_idsremove
ValueErrorr-   clearr.   r/   r0   )r?   r@   r;   s      r   collectChannel.collect   s    
 	.@&*oot#
O&*oot#
O##J5,,33J? 	##%##%  s   2C6 6
DDc                 2    SU l         U R                  5         g )NF)r*   openrb   s    r   
_do_reviveChannel._do_revive   s    		r   c           	          U R                   c   SU l        SU l         gU R                   R                  c   SU l        SU l         gU R                  (       d   SU l        SU l         gSU l        U R	                  [
        R                  R                  UXUS   US   4[
        R                  R                  S9SU l        SU l         $ ! SU l        SU l         f = f)}  Request a channel close.

This method indicates that the sender wants to close the
channel. This may be due to internal conditions (e.g. a forced
shut-down) or due to an error handling a specific method, i.e.
an exception.  When a close is due to an exception, the sender
provides the class and method id of the method which caused
the exception.

RULE:

    After sending this method any received method except
    Channel.Close-OK MUST be discarded.

RULE:

    The peer sending this method MAY use a counter or timeout
    to detect failure of the other peer to respond correctly
    with Channel.Close-OK..

PARAMETERS:
    reply_code: short

        The reply code. The AMQ reply codes are defined in AMQ
        RFC 011.

    reply_text: shortstr

        The localised reply text.  This text can be logged as an
        aid to resolving issues.

    class_id: short

        failing method class

        When the close is provoked by a method exception, this
        is the class of the method.

    method_id: short

        failing method ID

        When the close is provoked by a method exception, this
        is the ID of the method.
NFTr   r   wait)	r;   
is_closingrf   r*   send_methodr   r   rM   rO   )r?   
reply_code
reply_text
method_sigargsigs        r   closeChannel.close   s    ^	#& $DO"DO ''/ $DO"DO << $DO"DO #DO##""FA
1F\\)) $  $DO"DO $DO"DOs   C C C 'AC Cc                     U R                  [        R                  R                  5        U R                  R
                  (       d"  U R                  5         [        XX44[        5      eg)rs   N)	rw   r   r   rO   r;   rv   rp   r   r	   )r?   rx   ry   class_id	method_ids        r   rN   Channel._on_close   sP    \ 	--.))OO (=|  *r   c                 $    U R                  5         g)a4  Confirm a channel close.

This method confirms a Channel.Close method and tells the
recipient that it is safe to release resources for the channel
and close the socket.

RULE:

    A peer that detects a socket closure without having
    received a Channel.Close-Ok handshake method SHOULD log
    the error.
N)rl   rb   s    r   rP   Channel._on_close_ok)  s     	r   c                     U R                  [        R                  R                  SU4[        R                  R                  S9$ )W  Enable/disable flow from peer.

This method asks the peer to pause or restart the flow of
content data. This is a simple flow-control mechanism that a
peer can use to avoid overflowing its queues or otherwise
finding itself receiving more messages than it can process.
Note that this method is not intended for window control.  The
peer that receives a request to stop sending content should
finish sending the current content, if any, and then wait
until it receives a Flow restart method.

RULE:

    When a new channel is opened, it is active.  Some
    applications assume that channels are inactive until
    started.  To emulate this behaviour a client MAY open the
    channel, then pause it.

RULE:

    When sending content data in multiple frames, a peer
    SHOULD monitor the channel for incoming methods and
    respond to a Channel.Flow as rapidly as possible.

RULE:

    A peer MAY use the Channel.Flow method to throttle
    incoming content data for internal reasons, for example,
    when exchanging data over a slower connection.

RULE:

    The peer that requests a Channel.Flow method MAY
    disconnect and/or ban a peer that does not respect the
    request.

PARAMETERS:
    active: boolean

        start/stop content frames

        If True, the peer starts sending content frames.  If
        False, the peer stops sending content frames.
r    rt   )rw   r   r   rQ   FlowOkr?   r+   s     r   flowChannel.flow8  s<    Z LLsVIDLL4G4G   
 	
r   c                 F    Xl         U R                  U R                   5        g)r   N)r+   
_x_flow_okr   s     r   rR   Channel._on_flowi  s    Z $r   c                 Z    U R                  [        R                  R                  SU45      $ )aL  Confirm a flow method.

Confirms to the peer that a flow command was received and
processed.

PARAMETERS:
    active: boolean

        current flow setting

        Confirms the setting of the processed flow method:
        True means the peer will start sending or continue
        to send content frames; False means it will not.
r    )rw   r   r   r   r   s     r   r   Channel._x_flow_ok  s%      3 3S6)DDr   c                     U R                   (       a  gU R                  [        R                  R                  SS[        R                  R
                  S9$ )a  Open a channel for use.

This method opens a virtual connection (a channel).

RULE:

    This method MUST NOT be called when the channel is already
    open.

PARAMETERS:
    out_of_band: shortstr (DEPRECATED)

        out-of-band settings

        Configures out-of-band transfers on this channel.  The
        syntax and meaning of this field will be formally
        defined at a later date.
Nr#   ) rt   )r*   rw   r   r   OpenrS   rb   s    r   ro   Channel.open  sC    & <<LLsE0C0C   
 	
r   c                 ^    SU l         U R                  U 5        [        R                  S5        g)zhSignal that the channel is ready.

This method signals to the client that the channel is ready
for use.
TzChannel openN)r*   r1   r5   r6   rb   s    r   rT   Channel._on_open_ok  s%     T.)r   c	                     U R                  [        R                  R                  USXX4USXg4	U(       a  SO[        R                  R                  S9  g)a  Declare exchange, create if needed.

This method creates an exchange if it does not already exist,
and if the exchange exists, verifies that it is of the correct
and expected class.

RULE:

    The server SHOULD support a minimum of 16 exchanges per
    virtual host and ideally, impose no limit except as
    defined by available resources.

PARAMETERS:
    exchange: shortstr

        RULE:

            Exchange names starting with "amq." are reserved
            for predeclared and standardised exchanges.  If
            the client attempts to create an exchange starting
            with "amq.", the server MUST raise a channel
            exception with reply code 403 (access refused).

    type: shortstr

        exchange type

        Each exchange belongs to one of a set of exchange
        types implemented by the server.  The exchange types
        define the functionality of the exchange - i.e. how
        messages are routed through it.  It is not valid or
        meaningful to attempt to change the type of an
        existing exchange.

        RULE:

            If the exchange already exists with a different
            type, the server MUST raise a connection exception
            with a reply code 507 (not allowed).

        RULE:

            If the server does not support the requested
            exchange type it MUST raise a connection exception
            with a reply code 503 (command invalid).

    passive: boolean

        do not create exchange

        If set, the server will not create the exchange.  The
        client can use this to check whether an exchange
        exists without modifying the server state.

        RULE:

            If set, and the exchange does not already exist,
            the server MUST raise a channel exception with
            reply code 404 (not found).

    durable: boolean

        request a durable exchange

        If set when creating a new exchange, the exchange will
        be marked as durable.  Durable exchanges remain active
        when a server restarts. Non-durable exchanges
        (transient exchanges) are purged if/when a server
        restarts.

        RULE:

            The server MUST support both durable and transient
            exchanges.

        RULE:

            The server MUST ignore the durable field if the
            exchange already exists.

    auto_delete: boolean

        auto-delete when unused

        If set, the exchange is deleted when all queues have
        finished using it.

        RULE:

            The server SHOULD allow for a reasonable delay
            between the point when it determines that an
            exchange is not being used (or no longer used),
            and the point when it deletes the exchange.  At
            the least it must allow a client to create an
            exchange and then bind a queue to it, with a small
            but non-zero delay between these two actions.

        RULE:

            The server MUST ignore the auto-delete field if
            the exchange already exists.

    nowait: boolean

        do not send a reply method

        If set, the server will not respond to the method. The
        client should not wait for a reply method.  If the
        server could not complete the method it will raise a
        channel or connection exception.

    arguments: table

        arguments for declaration

        A set of arguments for the declaration. The syntax and
        semantics of these arguments depends on the server
        implementation.  This field is ignored if passive is
        True.
r   FNrt   )rw   r   ExchangeDeclare	DeclareOk)	r?   exchangetypepassivedurableauto_deletenowait	argumentsr{   s	            r   exchange_declareChannel.exchange_declare  sK    v 	MM!!6+F'T]]%<%<	 	 	
r   c                     U R                  [        R                  R                  USXU4U(       a  SS9$ [        R                  R                  S9$ )aO  Delete an exchange.

This method deletes an exchange.  When an exchange is deleted
all queue bindings on the exchange are cancelled.

PARAMETERS:
    exchange: shortstr

        RULE:

            The exchange MUST exist. Attempting to delete a
            non-existing exchange causes a channel exception.

    if_unused: boolean

        delete only if unused

        If set, the server will only delete the exchange if it
        has no queue bindings. If the exchange has queue
        bindings the server does not delete it but raises a
        channel exception instead.

        RULE:

            If set, the server SHOULD delete the exchange but
            only if it has no queue bindings.

        RULE:

            If set, the server SHOULD raise a channel
            exception if the exchange is in use.

    nowait: boolean

        do not send a reply method

        If set, the server will not respond to the method. The
        client should not wait for a reply method.  If the
        server could not complete the method it will raise a
        channel or connection exception.
r   Nrt   )rw   r   r   DeleteDeleteOk)r?   r   	if_unusedr   r{   s        r   exchange_deleteChannel.exchange_deletew  sV    V MM  &1h6*J   
 	
%)]]%;%;   
 	
r   c           
          U R                  [        R                  R                  USXX4U4U(       a  SS9$ [        R                  R                  S9$ )a  Bind an exchange to an exchange.

RULE:

    A server MUST allow and ignore duplicate bindings - that
    is, two or more bind methods for a specific exchanges,
    with identical arguments - without treating these as an
    error.

RULE:

    A server MUST allow cycles of exchange bindings to be
    created including allowing an exchange to be bound to
    itself.

RULE:

    A server MUST not deliver the same message more than once
    to a destination exchange, even if the topology of
    exchanges and bindings results in multiple (even infinite)
    routes to that exchange.

PARAMETERS:
    reserved-1: short

    destination: shortstr

        Specifies the name of the destination exchange to
        bind.

        RULE:

            A client MUST NOT be allowed to bind a non-
            existent destination exchange.

        RULE:

            The server MUST accept a blank exchange name to
            mean the default exchange.

    source: shortstr

        Specifies the name of the source exchange to bind.

        RULE:

            A client MUST NOT be allowed to bind a non-
            existent source exchange.

        RULE:

            The server MUST accept a blank exchange name to
            mean the default exchange.

    routing-key: shortstr

        Specifies the routing key for the binding. The routing
        key is used for routing messages depending on the
        exchange configuration. Not all exchanges use a
        routing key - refer to the specific exchange
        documentation.

    no-wait: bit

    arguments: table

        A set of arguments for the binding. The syntax and
        semantics of these arguments depends on the exchange
        class.
r   Nrt   )rw   r   r   BindBindOkr?   destinationsourcerouting_keyr   r   r{   s          r   exchange_bindChannel.exchange_bind  s[    P MM[)D   
 	
 &*]]%9%9   
 	
r   c           
          U R                  [        R                  R                  USXX4U4U(       a  SS9$ [        R                  R                  S9$ )a  Unbind an exchange from an exchange.

RULE:

    If a unbind fails, the server MUST raise a connection
    exception.

PARAMETERS:
    reserved-1: short

    destination: shortstr

        Specifies the name of the destination exchange to
        unbind.

        RULE:

            The client MUST NOT attempt to unbind an exchange
            that does not exist from an exchange.

        RULE:

            The server MUST accept a blank exchange name to
            mean the default exchange.

    source: shortstr

        Specifies the name of the source exchange to unbind.

        RULE:

            The client MUST NOT attempt to unbind an exchange
            from an exchange that does not exist.

        RULE:

            The server MUST accept a blank exchange name to
            mean the default exchange.

    routing-key: shortstr

        Specifies the routing key of the binding to unbind.

    no-wait: bit

    arguments: table

        Specifies the arguments of the binding to unbind.
r   Nrt   )rw   r   r   UnbindUnbindOkr   s          r   exchange_unbindChannel.exchange_unbind  s[    f MM  &[)D   
 	
 &*]]%;%;   
 	
r   c           
          U R                  [        R                  R                  USXX4U4U(       a  SS9$ [        R                  R                  S9$ )a
  Bind queue to an exchange.

This method binds a queue to an exchange.  Until a queue is
bound it will not receive any messages.  In a classic
messaging model, store-and-forward queues are bound to a dest
exchange and subscription queues are bound to a dest_wild
exchange.

RULE:

    A server MUST allow ignore duplicate bindings - that is,
    two or more bind methods for a specific queue, with
    identical arguments - without treating these as an error.

RULE:

    If a bind fails, the server MUST raise a connection
    exception.

RULE:

    The server MUST NOT allow a durable queue to bind to a
    transient exchange. If the client attempts this the server
    MUST raise a channel exception.

RULE:

    Bindings for durable queues are automatically durable and
    the server SHOULD restore such bindings after a server
    restart.

RULE:

    The server SHOULD support at least 4 bindings per queue,
    and ideally, impose no limit except as defined by
    available resources.

PARAMETERS:
    queue: shortstr

        Specifies the name of the queue to bind.  If the queue
        name is empty, refers to the current queue for the
        channel, which is the last declared queue.

        RULE:

            If the client did not previously declare a queue,
            and the queue name in this method is empty, the
            server MUST raise a connection exception with
            reply code 530 (not allowed).

        RULE:

            If the queue does not exist the server MUST raise
            a channel exception with reply code 404 (not
            found).

    exchange: shortstr

        The name of the exchange to bind to.

        RULE:

            If the exchange does not exist the server MUST
            raise a channel exception with reply code 404 (not
            found).

    routing_key: shortstr

        message routing key

        Specifies the routing key for the binding.  The
        routing key is used for routing messages depending on
        the exchange configuration. Not all exchanges use a
        routing key - refer to the specific exchange
        documentation.  If the routing key is empty and the
        queue name is empty, the routing key will be the
        current queue for the channel, which is the last
        declared queue.

    nowait: boolean

        do not send a reply method

        If set, the server will not respond to the method. The
        client should not wait for a reply method.  If the
        server could not complete the method it will raise a
        channel or connection exception.

    arguments: table

        arguments for binding

        A set of arguments for the binding.  The syntax and
        semantics of these arguments depends on the exchange
        class.
r   Nrt   )rw   r   r   r   r   r?   queuer   r   r   r   r{   s          r   
queue_bindChannel.queue_bindH  sY    F JJOOVi@   
 	
 &*ZZ%6%6   
 	
r   c           	          U R                  [        R                  R                  USXX54U(       a  SS9$ [        R                  R                  S9$ )a	  Unbind a queue from an exchange.

This method unbinds a queue from an exchange.

RULE:

    If a unbind fails, the server MUST raise a connection exception.

PARAMETERS:
    queue: shortstr

        Specifies the name of the queue to unbind.

        RULE:

            The client MUST either specify a queue name or have
            previously declared a queue on the same channel

        RULE:

            The client MUST NOT attempt to unbind a queue that
            does not exist.

    exchange: shortstr

        The name of the exchange to unbind from.

        RULE:

            The client MUST NOT attempt to unbind a queue from an
            exchange that does not exist.

        RULE:

            The server MUST accept a blank exchange name to mean
            the default exchange.

    routing_key: shortstr

        routing key of binding

        Specifies the routing key of the binding to unbind.

    arguments: table

        arguments of binding

        Specifies the arguments of the binding to unbind.
r   Nrt   )rw   r   r   r   r   r   s          r   queue_unbindChannel.queue_unbind  sY    f JJv8   
 	
 &*ZZ%8%8   
 	
r   c	                     U R                  [        R                  R                  USXX4UXg45        U(       d.  [	        U R                  [        R                  R                  SS96 $ g)am  Declare queue, create if needed.

This method creates or checks a queue.  When creating a new
queue the client can specify various properties that control
the durability of the queue and its contents, and the level of
sharing for the queue.

RULE:

    The server MUST create a default binding for a newly-
    created queue to the default exchange, which is an
    exchange of type 'direct'.

RULE:

    The server SHOULD support a minimum of 256 queues per
    virtual host and ideally, impose no limit except as
    defined by available resources.

PARAMETERS:
    queue: shortstr

        RULE:

            The queue name MAY be empty, in which case the
            server MUST create a new queue with a unique
            generated name and return this to the client in
            the Declare-Ok method.

        RULE:

            Queue names starting with "amq." are reserved for
            predeclared and standardised server queues.  If
            the queue name starts with "amq." and the passive
            option is False, the server MUST raise a connection
            exception with reply code 403 (access refused).

    passive: boolean

        do not create queue

        If set, the server will not create the queue.  The
        client can use this to check whether a queue exists
        without modifying the server state.

        RULE:

            If set, and the queue does not already exist, the
            server MUST respond with a reply code 404 (not
            found) and raise a channel exception.

    durable: boolean

        request a durable queue

        If set when creating a new queue, the queue will be
        marked as durable.  Durable queues remain active when
        a server restarts. Non-durable queues (transient
        queues) are purged if/when a server restarts.  Note
        that durable queues do not necessarily hold persistent
        messages, although it does not make sense to send
        persistent messages to a transient queue.

        RULE:

            The server MUST recreate the durable queue after a
            restart.

        RULE:

            The server MUST support both durable and transient
            queues.

        RULE:

            The server MUST ignore the durable field if the
            queue already exists.

    exclusive: boolean

        request an exclusive queue

        Exclusive queues may only be consumed from by the
        current connection. Setting the 'exclusive' flag
        always implies 'auto-delete'.

        RULE:

            The server MUST support both exclusive (private)
            and non-exclusive (shared) queues.

        RULE:

            The server MUST raise a channel exception if
            'exclusive' is specified and the queue already
            exists and is owned by a different connection.

    auto_delete: boolean

        auto-delete queue when unused

        If set, the queue is deleted when all consumers have
        finished using it. Last consumer can be cancelled
        either explicitly or because its channel is closed. If
        there was no consumer ever on the queue, it won't be
        deleted.

        RULE:

            The server SHOULD allow for a reasonable delay
            between the point when it determines that a queue
            is not being used (or no longer used), and the
            point when it deletes the queue.  At the least it
            must allow a client to create a queue and then
            create a consumer to read from it, with a small
            but non-zero delay between these two actions.  The
            server should equally allow for clients that may
            be disconnected prematurely, and wish to re-
            consume from the same queue without losing
            messages.  We would recommend a configurable
            timeout, with a suitable default value being one
            minute.

        RULE:

            The server MUST ignore the auto-delete field if
            the queue already exists.

    nowait: boolean

        do not send a reply method

        If set, the server will not respond to the method. The
        client should not wait for a reply method.  If the
        server could not complete the method it will raise a
        channel or connection exception.

    arguments: table

        arguments for declaration

        A set of arguments for the declaration. The syntax and
        semantics of these arguments depends on the server
        implementation.  This field is ignored if passive is
        True.

Returns a tuple containing 3 items:
    the name of the queue (essential for automatically-named queues),
    message count and
    consumer count
r   T)returns_tupleN)rw   r   r   r   r   ru   r   )	r?   r   r   r   	exclusiver   r   r   r{   s	            r   queue_declareChannel.queue_declare  si    t 	JJK 	

 %tyy

$$D (1 (   r   c           	          U R                  [        R                  R                  USXX44U(       a  SS9$ [        R                  R                  S9$ )a  Delete a queue.

This method deletes a queue.  When a queue is deleted any
pending messages are sent to a dead-letter queue if this is
defined in the server configuration, and all consumers on the
queue are cancelled.

RULE:

    The server SHOULD use a dead-letter queue to hold messages
    that were pending on a deleted queue, and MAY provide
    facilities for a system administrator to move these
    messages back to an active queue.

PARAMETERS:
    queue: shortstr

        Specifies the name of the queue to delete. If the
        queue name is empty, refers to the current queue for
        the channel, which is the last declared queue.

        RULE:

            If the client did not previously declare a queue,
            and the queue name in this method is empty, the
            server MUST raise a connection exception with
            reply code 530 (not allowed).

        RULE:

            The queue must exist. Attempting to delete a non-
            existing queue causes a channel exception.

    if_unused: boolean

        delete only if unused

        If set, the server will only delete the queue if it
        has no consumers. If the queue has consumers the
        server does does not delete it but raises a channel
        exception instead.

        RULE:

            The server MUST respect the if-unused flag when
            deleting a queue.

    if_empty: boolean

        delete only if empty

        If set, the server will only delete the queue if it
        has no messages. If the queue is not empty the server
        raises a channel exception.

    nowait: boolean

        do not send a reply method

        If set, the server will not respond to the method. The
        client should not wait for a reply method.  If the
        server could not complete the method it will raise a
        channel or connection exception.

If nowait is False, returns the number of deleted messages.
r   Nrt   )rw   r   r   r   r   )r?   r   r   if_emptyr   r{   s         r   queue_deleteChannel.queue_delete  sY    J JJv(3   
 	
 &*ZZ%8%8   
 	
r   c                     U R                  [        R                  R                  USX4U(       a  SS9$ [        R                  R                  S9$ )a+  Purge a queue.

This method removes all messages from a queue.  It does not
cancel consumers.  Purged messages are deleted without any
formal "undo" mechanism.

RULE:

    A call to purge MUST result in an empty queue.

RULE:

    On transacted channels the server MUST not purge messages
    that have already been sent to a client but not yet
    acknowledged.

RULE:

    The server MAY implement a purge queue or log that allows
    system administrators to recover accidentally-purged
    messages.  The server SHOULD NOT keep purged messages in
    the same storage spaces as the live messages since the
    volumes of purged messages may get very large.

PARAMETERS:
    queue: shortstr

        Specifies the name of the queue to purge.  If the
        queue name is empty, refers to the current queue for
        the channel, which is the last declared queue.

        RULE:

            If the client did not previously declare a queue,
            and the queue name in this method is empty, the
            server MUST raise a connection exception with
            reply code 530 (not allowed).

        RULE:

            The queue must exist. Attempting to purge a non-
            existing queue causes a channel exception.

    nowait: boolean

        do not send a reply method

        If set, the server will not respond to the method. The
        client should not wait for a reply method.  If the
        server could not complete the method it will raise a
        channel or connection exception.

If nowait is False, returns a number of purged messages.
r   Nrt   )rw   r   r   PurgePurgeOk)r?   r   r   r{   s       r   queue_purgeChannel.queue_purge  sT    n JJfq%&8   
 	
%)ZZ%7%7   
 	
r   c                 Z    U R                  [        R                  R                  X1U45      $ )a  Acknowledge one or more messages.

This method acknowledges one or more messages delivered via
the Deliver or Get-Ok methods.  The client can ask to confirm
a single message or a set of messages up to and including a
specific message.

PARAMETERS:
    delivery_tag: longlong

        server-assigned delivery tag

        The server-assigned and channel-specific delivery tag

        RULE:

            The delivery tag is valid only within the channel
            from which the message was received.  I.e. a client
            MUST NOT receive a message on one channel and then
            acknowledge it on another.

        RULE:

            The server MUST NOT use a zero value for delivery
            tags.  Zero is reserved for client use, meaning "all
            messages so far received".

    multiple: boolean

        acknowledge multiple messages

        If set to True, the delivery tag is treated as "up to
        and including", so that the client can acknowledge
        multiple messages with a single method.  If set to
        False, the delivery tag refers to a single message.
        If the multiple field is True, and the delivery tag
        is zero, tells the server to acknowledge all
        outstanding messages.

        RULE:

            The server MUST validate that a non-zero delivery-
            tag refers to an delivered message, and raise a
            channel exception if this is not the case.
)rw   r   rU   r^   )r?   delivery_tagmultipler{   s       r   	basic_ackChannel.basic_ackQ  s*    \ JJNNF8$<
 	
r   c                     U R                   bi  U R                  R                  U5        U R                  [        R
                  R                  X1U4U(       a  SS9$ [        R
                  R                  S9$ g)ay  End a queue consumer.

This method cancels a consumer. This does not affect already
delivered messages, but it does mean the server will not send
any more messages for that consumer.  The client may receive
an arbitrary number of messages in between sending the cancel
method and receiving the cancel-ok reply.

RULE:

    If the queue no longer exists when the client sends a
    cancel command, or the consumer has been cancelled for
    other reasons, this command has no effect.

PARAMETERS:
    consumer_tag: shortstr

        consumer tag

        Identifier for the consumer, valid within the current
        connection.

        RULE:

            The consumer tag is valid only within the channel
            from which the consumer was created. I.e. a client
            MUST NOT create a consumer in one channel and then
            use it in another.

    nowait: boolean

        do not send a reply method

        If set, the server will not respond to the method. The
        client should not wait for a reply method.  If the
        server could not complete the method it will raise a
        channel or connection exception.
Nrt   )r;   r0   discardrw   r   rU   rV   rX   )r?   consumer_tagr   r{   s       r   basic_cancelChannel.basic_cancel  su    N ??&!!)),7##

!!6&+A#T $  )-)<)< $   'r   c                     U R                  U5      nU(       a	  U" U5        g[        U[        R                  R                  5      e)zCConsumer cancelled by server.

Most likely the queue was deleted.

N)_remove_tagr
   r   rU   rV   )r?   r   callbacks      r   rW   Channel._on_basic_cancel  s6     ##L1\"#L$**2C2CDDr   c                 &    U R                  U5        g rE   )r   r?   r   s     r   rY   Channel._on_basic_cancel_ok  s    &r   c                 r    U R                   R                  US 5        U R                  R                  US 5      $ rE   )r-   rg   r.   r   s     r   r   Channel._remove_tag  s/    <.$$((t<<r   c                    U R                  [        R                  R                  U
SXX4UXh4U(       a  SO[        R                  R                  SS9nU(       d  US   nOU(       a  U(       d  [        S5      eXpR                  U'   U	(       a  XR                  U'   U(       a  U R                  R                  U5        U(       d  U$ U$ )a5  Start a queue consumer.

This method asks the server to start a "consumer", which is a
transient request for messages from a specific queue.
Consumers last as long as the channel they were created on, or
until the client cancels them.

RULE:

    The server SHOULD support at least 16 consumers per queue,
    unless the queue was declared as private, and ideally,
    impose no limit except as defined by available resources.

PARAMETERS:
    queue: shortstr

        Specifies the name of the queue to consume from.  If
        the queue name is null, refers to the current queue
        for the channel, which is the last declared queue.

        RULE:

            If the client did not previously declare a queue,
            and the queue name in this method is empty, the
            server MUST raise a connection exception with
            reply code 530 (not allowed).

    consumer_tag: shortstr

        Specifies the identifier for the consumer. The
        consumer tag is local to a connection, so two clients
        can use the same consumer tags. If this field is empty
        the server will generate a unique tag.

        RULE:

            The tag MUST NOT refer to an existing consumer. If
            the client attempts to create two consumers with
            the same non-empty tag the server MUST raise a
            connection exception with reply code 530 (not
            allowed).

    no_local: boolean

        do not deliver own messages

        If the no-local field is set the server will not send
        messages to the client that published them.

    no_ack: boolean

        no acknowledgment needed

        If this field is set the server does not expect
        acknowledgments for messages.  That is, when a message
        is delivered to the client the server automatically and
        silently acknowledges it on behalf of the client.  This
        functionality increases performance but at the cost of
        reliability.  Messages can get lost if a client dies
        before it can deliver them to the application.

    exclusive: boolean

        request exclusive access

        Request exclusive consumer access, meaning only this
        consumer can access the queue.

        RULE:

            If the server cannot grant exclusive access to the
            queue when asked, - because there are other
            consumers active - it MUST raise a channel
            exception with return code 403 (access refused).

    nowait: boolean

        do not send a reply method

        If set, the server will not respond to the method. The
        client should not wait for a reply method.  If the
        server could not complete the method it will raise a
        channel or connection exception.

    callback: Python callable

        function/method called with each delivered message

        For each message delivered by the broker, the
        callable will be called with a Message object
        as the single argument.  If no callable is specified,
        messages are quietly discarded, no_ack should probably
        be set to True in that case.
r   NTru   r   z2Consumer tag must be specified when nowait is True)
rw   r   rU   Consume	ConsumeOkrj   r-   r.   r0   add)r?   r   r   no_localno_ackr   r   r   r   	on_cancelr{   ps               r   basic_consumeChannel.basic_consume  s    D JJ5)  TZZ%9%9  
  Q4LLD  (0|$2;!!,/!!%%l3Hr   c                     Xl         UUUUUS.Ul         U R                  U   nU" U5        g ! [         a.    [        R                  [        X!XE5        U R                  USS9   g f = f)N)r   r   redeliveredr   r   T)requeue)channeldelivery_infor-   KeyErrorr5   warning!REJECTED_MESSAGE_WITHOUT_CALLBACKbasic_reject)r?   r   r   r   r   r   msgfuns           r   r[   Channel._on_basic_deliverI  sx    ((& &
		...C H  	:1H lD9	:s   - 5A%$A%c                 (   U R                  [        R                  R                  USX4[        R                  R                  [        R                  R
                  /SS9nU(       a  [        U5      S:  a  U R                  " U6 $ U R                  " U6 $ )a  Direct access to a queue.

This method provides a direct access to the messages in a
queue using a synchronous dialogue that is designed for
specific types of application where synchronous functionality
is more important than performance.

PARAMETERS:
    queue: shortstr

        Specifies the name of the queue to consume from.  If
        the queue name is null, refers to the current queue
        for the channel, which is the last declared queue.

        RULE:

            If the client did not previously declare a queue,
            and the queue name in this method is empty, the
            server MUST raise a connection exception with
            reply code 530 (not allowed).

    no_ack: boolean

        no acknowledgment needed

        If this field is set the server does not expect
        acknowledgments for messages.  That is, when a message
        is delivered to the client the server automatically and
        silently acknowledges it on behalf of the client.  This
        functionality increases performance but at the cost of
        reliability.  Messages can get lost if a client dies
        before it can deliver them to the application.

Non-blocking, returns a amqp.basic_message.Message object,
or None if queue is empty.
r   Tr      )	rw   r   rU   GetGetOkGetEmptylen_on_get_empty
_on_get_ok)r?   r   r   r{   rets        r   	basic_getChannel.basic_get_  s{    J JJNNFQ$6**""DJJ$7$78  
 c#hl%%s++$$r   c                     g rE   r   )r?   
cluster_ids     r   r   Channel._on_get_empty  s    r   c                 ,    Xl         UUUUUS.Ul        U$ )N)r   r   r   r   message_count)r   r   )r?   r   r   r   r   r  r   s          r   r   Channel._on_get_ok  s'    (& &*
 
r   c	           
      B   U R                   (       d  [        S5      eU R                   R                  R                  S0 5      n	U	R                  SS5      (       a   U R                   R	                  SS9   U R                   R                  R                  U5         U R                  [        R                  R                  USX#XE4U5      sSSS5        $ ! [
        R                   a     Nuf = f! , (       d  f       g= f! [
        R                   a    [        S5      ef = f)	aC
  Publish a message.

This method publishes a message to a specific exchange. The
message will be routed to queues as defined by the exchange
configuration and distributed to any active consumers when the
transaction, if any, is committed.

When channel is in confirm mode (when Connection parameter
confirm_publish is set to True), each message is confirmed.
When broker rejects published message (e.g. due internal broker
constrains), MessageNacked exception is raised and
set confirm_timeout to wait maximum confirm_timeout second
for message to confirm.

PARAMETERS:
    exchange: shortstr

        Specifies the name of the exchange to publish to.  The
        exchange name can be empty, meaning the default
        exchange.  If the exchange name is specified, and that
        exchange does not exist, the server will raise a
        channel exception.

        RULE:

            The server MUST accept a blank exchange name to
            mean the default exchange.

        RULE:

            The exchange MAY refuse basic content in which
            case it MUST raise a channel exception with reply
            code 540 (not implemented).

    routing_key: shortstr

        Message routing key

        Specifies the routing key for the message.  The
        routing key is used for routing messages depending on
        the exchange configuration.

    mandatory: boolean

        indicate mandatory routing

        This flag tells the server how to react if the message
        cannot be routed to a queue.  If this flag is True, the
        server will return an unroutable message with a Return
        method.  If this flag is False, the server silently
        drops the message.

        RULE:

            The server SHOULD implement the mandatory flag.

    immediate: boolean

        request immediate delivery

        This flag tells the server how to react if the message
        cannot be routed to a queue consumer immediately.  If
        this flag is set, the server will return an
        undeliverable message with a Return method. If this
        flag is zero, the server will queue the message, but
        with no guarantee that it will ever be consumed.

        RULE:

            The server SHOULD implement the immediate flag.

    timeout: short

        timeout for publish

        Set timeout to wait maximum timeout second
        for message to publish.

    confirm_timeout: short

        confirm_timeout for publish in confirm mode

        When the channel is in confirm mode set
        confirm_timeout to wait maximum confirm_timeout
        second for message to confirm.

z basic_publish: connection closedcapabilitieszconnection.blockedFr   )timeoutNzbasic_publish: timed out)r;   r   client_propertiesgetdrain_eventssocketr	  	transporthaving_timeoutrw   r   rU   Publishr   )
r?   r   r   r   	mandatory	immediater	  confirm_timeoutr{   r  s
             r   _basic_publishChannel._basic_publish  s    v ,24 4 cc."5 	0%88,,Q,7	F**99'B''JJ&&yDc CB	 >>  CB
 ~~ 	F)*DEE	Fs<   C 5%C> /C-		C> C*)C*-
C;7C> ;C> > Dc                 `   UR                  SS 5      nS nU R                  (       d  SU l        U R                  5         U R                  " U0 UD6nU=(       d    UR	                  SS 5      nU R                  [        R                  R                  [        R                  R                  /UUS9  U$ )Nr  c                 T    U [         R                  R                  :X  a
  [        5       eg rE   )r   rU   r`   r   )methodargss     r   confirm_handler6Channel.basic_publish_confirm.<locals>.confirm_handler  s    (#o% )r   Tr	  )r   r	  )
rg   r2   confirm_selectr  r  ru   r   rU   r^   r`   )r?   r  kwargsr  r  r   r	  s          r   r=   Channel.basic_publish_confirm  s     **%6=	&
 %%%)D"!!!4262!@VZZ	4%@		4::>>4::??3*! 	 	# 
r   c                     U R                  [        R                  R                  XAX#4[        R                  R                  S9$ )aQ
  Specify quality of service.

This method requests a specific quality of service.  The QoS
can be specified for the current channel or for all channels
on the connection.  The particular properties and semantics of
a qos method always depend on the content class semantics.
Though the qos method could in principle apply to both peers,
it is currently meaningful only for the server.

PARAMETERS:
    prefetch_size: long

        prefetch window in octets

        The client can request that messages be sent in
        advance so that when the client finishes processing a
        message, the following message is already held
        locally, rather than needing to be sent down the
        channel.  Prefetching gives a performance improvement.
        This field specifies the prefetch window size in
        octets.  The server will send a message in advance if
        it is equal to or smaller in size than the available
        prefetch size (and also falls into other prefetch
        limits). May be set to zero, meaning "no specific
        limit", although other prefetch limits may still
        apply. The prefetch-size is ignored if the no-ack
        option is set.

        RULE:

            The server MUST ignore this setting when the
            client is not processing any messages - i.e. the
            prefetch size does not limit the transfer of
            single messages to a client, only the sending in
            advance of more messages while the client still
            has one or more unacknowledged messages.

    prefetch_count: short

        prefetch window in messages

        Specifies a prefetch window in terms of whole
        messages.  This field may be used in combination with
        the prefetch-size field; a message will only be sent
        in advance if both prefetch windows (and those at the
        channel and connection level) allow it. The prefetch-
        count is ignored if the no-ack option is set.

        RULE:

            The server MAY send less data in advance than
            allowed by the client's specified prefetch windows
            but it MUST NOT send more.

    a_global: boolean

        Defines a scope of QoS. Semantics of this parameter differs
        between AMQP 0-9-1 standard and RabbitMQ broker:

        MEANING IN AMQP 0-9-1:
            False:  shared across all consumers on the channel
            True:   shared across all consumers on the connection
        MEANING IN RABBITMQ:
            False:  applied separately to each new consumer
                    on the channel
            True:   shared across all consumers on the channel
rt   )rw   r   rU   QosQosOk)r?   prefetch_sizeprefetch_counta_globalr{   s        r   	basic_qosChannel.basic_qos!  s<    J JJNNFN$M!!   
 	
r   c                 Z    U R                  [        R                  R                  SU45      $ )a  Redeliver unacknowledged messages.

This method asks the broker to redeliver all unacknowledged
messages on a specified channel. Zero or more messages may be
redelivered.  This method is only allowed on non-transacted
channels.

RULE:

    The server MUST set the redelivered flag on all messages
    that are resent.

RULE:

    The server MUST raise a channel exception if this is
    called on a transacted channel.

PARAMETERS:
    requeue: boolean

        requeue the message

        If this field is False, the message will be redelivered
        to the original recipient.  If this field is True, the
        server will attempt to requeue the message,
        potentially then delivering it to an alternative
        subscriber.
r    )rw   r   rU   Recoverr?   r   s     r   basic_recoverChannel.basic_recoverk  s%    : 

 2 2C'DDr   c                 Z    U R                  [        R                  R                  SU45      $ )Nr    )rw   r   rU   RecoverAsyncr)  s     r   basic_recover_asyncChannel.basic_recover_async  s#    

 7 7wjIIr   c                 Z    U R                  [        R                  R                  X1U45      $ )a  Reject an incoming message.

This method allows a client to reject a message.  It can be
used to interrupt and cancel large incoming messages, or
return untreatable messages to their original queue.

RULE:

    The server SHOULD be capable of accepting and process the
    Reject method while sending message content with a Deliver
    or Get-Ok method.  I.e. the server should read and process
    incoming methods while sending output frames.  To cancel a
    partially-send content, the server sends a content body
    frame of size 1 (i.e. with no data except the frame-end
    octet).

RULE:

    The server SHOULD interpret this method as meaning that
    the client is unable to process the message at this time.

RULE:

    A client MUST NOT use this method as a means of selecting
    messages to process.  A rejected message MAY be discarded
    or dead-lettered, not necessarily passed to another
    client.

PARAMETERS:
    delivery_tag: longlong

        server-assigned delivery tag

        The server-assigned and channel-specific delivery tag

        RULE:

            The delivery tag is valid only within the channel
            from which the message was received.  I.e. a client
            MUST NOT receive a message on one channel and then
            acknowledge it on another.

        RULE:

            The server MUST NOT use a zero value for delivery
            tags.  Zero is reserved for client use, meaning "all
            messages so far received".

    requeue: boolean

        requeue the message

        If this field is False, the message will be discarded.
        If this field is True, the server will attempt to
        requeue the message.

        RULE:

            The server MUST NOT deliver the message to the
            same client within the context of the current
            channel.  The recommended strategy is to attempt
            to deliver the message to an alternative consumer,
            and if that is not possible, to move the message
            to a dead-letter queue.  The server MAY use more
            sophisticated tracking to hold the message on the
            queue and redeliver it to the same client at a
            later stage.
)rw   r   rU   Reject)r?   r   r   r{   s       r   r   Channel.basic_reject  s,    J JJvg'>
 	
r   c                     [        X[        R                  R                  [        5      nU R
                  R                  S5      nU(       d  UeU H  nU" XcXE5        M     g)a  Return a failed message.

This method returns an undeliverable message that was
published with the "immediate" flag set, or an unroutable
message published with the "mandatory" flag set. The reply
code and text provide information about the reason that the
message was undeliverable.

PARAMETERS:
    reply_code: short

        The reply code. The AMQ reply codes are defined in AMQ
        RFC 011.

    reply_text: shortstr

        The localised reply text.  This text can be logged as an
        aid to resolving issues.

    exchange: shortstr

        Specifies the name of the exchange that the message
        was originally published to.

    routing_key: shortstr

        Message routing key

        Specifies the routing key name specified when the
        message was published.
basic_returnN)r   r   rU   r\   r	   r/   r  )	r?   rx   ry   r   r   messageexchandlersr   s	            r   r]   Channel._on_basic_return  sP    B DJJ$5$5|
 ;;??>2I HSK9 !r   c                     U R                  [        R                  R                  [        R                  R                  S9$ )zCommit the current transaction.

This method commits all messages published and acknowledged in
the current transaction.  A new transaction starts immediately
after a commit.
rt   )rw   r   TxCommitCommitOkrb   s    r   	tx_commitChannel.tx_commit  ,     TWW5E5EFFr   c                     U R                  [        R                  R                  [        R                  R                  S9$ )zAbandon the current transaction.

This method abandons all messages published and acknowledged
in the current transaction.  A new transaction starts
immediately after a rollback.
rt   )rw   r   r:  Rollback
RollbackOkrb   s    r   tx_rollbackChannel.tx_rollback%  s.      0 0tww7I7IJJr   c                     U R                  [        R                  R                  [        R                  R                  S9$ )zSelect standard transaction mode.

This method sets the channel to use standard transactions.
The client must use this method at least once on a channel
before using the Commit or Rollback methods.
rt   )rw   r   r:  SelectSelectOkrb   s    r   	tx_selectChannel.tx_select.  r?  r   c                     U R                  [        R                  R                  SU4U(       a  SS9$ [        R                  R                  S9$ )ak  Enable publisher confirms for this channel.

Note: This is an RabbitMQ extension.

Can now be used if the channel is in transactional mode.

:param nowait:
    If set, the server will not respond to the method.
    The client should not wait for a reply method. If the
    server could not complete the method it will raise a channel
    or connection exception.
r    Nrt   )rw   r   ConfirmrF  rG  )r?   r   s     r   r  Channel.confirm_select7  sP     LLvi   
 	
%)\\%:%:   
 	
r   c                 @    U R                   S    H  nU" X5        M     g )Nr   r/   r?   r   r   r   s       r   r_   Channel._on_basic_ackI  s    K0H\, 1r   c                 @    U R                   S    H  nU" X5        M     g )N
basic_nackrN  rO  s       r   ra   Channel._on_basic_nackM  s    L1H\, 2r   )r2   r+   r9   r>   r-   r.   r@   r;   r/   rv   r*   r0   r1   r,   )NTNrE   )r   r   )r   r   r   )FFTFN	BssbbbbbF)FFBsbb)r   r   FNBsssbF)r   FNBsssF)r   FFFTFNBsbbbbbF)r   FFFBsbbb)r   FBsb)Fr(   )Fsb)
r   r   FFFFNNNBssbbbbF)r   r   FFNNBssbb)lBb)F)r(   )Xr   r   r   r   __doc__r   r  r   rM   rO   rQ   r   rS   r   r   r   r   r   r   r   rU   rV   rX   r   rZ   r   r   r!  	RecoverOkr\   r:  r<  rB  rG  rK  r^   r`   _METHODSrz   _ALLOWED_METHODS_WHEN_CLOSINGr8   rF   rc   rl   rp   r|   rN   rP   r   rR   r   ro   rT   r   r   r   r   r   r   r   r   r   r   r   rW   rY   r   r   r[   r   r   r   r  r>   r=   r%  r*  r.  r   r]   r=  rC  rH  r  r_   ra   r   __classcell__).0mrB   s   00@r   r   r       s   8 	DLL&&/DLL(()DLL%%s+DLL''-DLL''(DMM++,DMM**+DMM(()DMM**+DJJ%%&DJJ''(DJJ((%0DJJ''-DJJ&&,DJJ%%s+DJJ''-DJJ((#.DJJ&&>DJJ''-DJJ$$gt<DJJ$$%DJJ(()DJJ%%vt<DGG$$%DGG&&'DGG$$%DLL))*DJJNND)DJJOOT*;H> *22Aa2H 	DLL00%!
 =A&
P7&* =C?#B3j/
b.%`E"
4*b GLCG +@
D AF%.
` AC;CL
\ CE=E7
f :<8@g
R 9;:A7
r >C@E-7bH "$=B#I
V:
p0
d,\
E'= AF<A?C'CJ,+%Z
 <>AE'+%oFb #M( H
TE>JG
R(:LGKG
$-- -e? 3s   U3r   )r_  loggingr  collectionsr   r   r   viner   r   r   abstract_channelr   
exceptionsr	   r
   r   r   r   r   protocolr   __all__	getLoggerr5   r   DeprecationWarningr   r   r   r   r   <module>ro     sf       #    -) ) )
'% !	, 	o -o o -r   