Ë
    UV.jÉ  ã                  ó  — d Z ddlmZ ddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z m!Z!m"Z" ddl#m$Z$ ddl%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ 	 ddl0Z0 e ed«      «       ed«      k\  Z1	 ddl0m3Z3m4Z4  ed«      Z5e5jl                  e5jn                  cZ8Z7dZ9dZ:dZ;g d¢Z< ed d!«      Z=d"„ Z>d#„ Z? G d$„ d%e@«      ZAe
d&„ «       ZBd'„ ZC G d(„ d)«      ZD G d*„ d+eDe0jŠ                  «      ZF G d,„ d-eDe0jŽ                  j�                  «      ZI G d.„ d/e0jŽ                  j”                  «      ZK G d0„ d1e/j˜                  «      ZL G d2„ d3«      ZM G d4„ d5e/jœ                  «      ZN G d6„ d7e/jž                  «      ZOe4r  G d8„ d9e4j                   e0j¢                  «      ZR G d:„ d;eN«      ZS G d<„ d=eO«      ZTy# e2$ r dZ0dZ1Y �ŒFw xY w# e2$ r dZ4dZ3Y �ŒMw xY w)>a  Redis transport module for Kombu.

Features
========
* Type: Virtual
* Supports Direct: Yes
* Supports Topic: Yes
* Supports Fanout: Yes
* Supports Priority: Yes
* Supports TTL: No

Connection String
=================
Connection string has the following format:

.. code-block::

    redis://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]
    rediss://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]

To use sentinel for dynamic Redis discovery,
the connection string has following format:

.. code-block::

    sentinel://[USER:PASSWORD@]SENTINEL_ADDRESS[:PORT]

Transport Options
=================
* ``sep``
* ``ack_emulation``: (bool) If set to True transport will
  simulate Acknowledge of AMQP protocol.
* ``unacked_key``
* ``unacked_index_key``
* ``unacked_mutex_key``
* ``unacked_mutex_expire``
* ``visibility_timeout``
* ``unacked_restore_limit``
* ``fanout_prefix``
* ``fanout_patterns``
* ``global_keyprefix``: (str) The global key prefix to be prepended to all keys
  used by Kombu
* ``socket_timeout``
* ``socket_connect_timeout``
* ``socket_keepalive``
* ``socket_keepalive_options``
* ``queue_order_strategy``
* ``max_connections``
* ``health_check_interval``
* ``retry_on_timeout``
* ``priority_steps``
* ``client_name``: (str) The name to use when connecting to Redis server.
é    )ÚannotationsN)Úbisect)Ú
namedtuple)Úcontextmanager)Úversion)ÚEmpty)Útime)ÚVersion)Úpromise)ÚInconsistencyErrorÚVersionMismatch)Ú
get_logger)Úsymbol_by_name)Úregister_after_fork)Úbytes_to_str)ÚERRÚREADÚpoll)Úaccepts_argument)ÚdumpsÚloads)Úcached_property)Úcycle_by_name)Ú
_parse_urlé   )ÚvirtualÚredisz5.3.0)ÚCredentialProviderÚsentinelzkombu.transport.redisië  é   )r   é   é   é	   Úerror_classes_t)Úconnection_errorsÚchannel_errorsc                 óž  — ddl m}  t        | d«      r| j                  }n| j                  }t        t        j                  j                  t        t        j                  t        t        | j                  | j                  | j                   | j"                  fz   t        j                  j$                  || j&                  | j(                  fz   «      S )z$Return tuple of redis error classes.r   ©Ú
exceptionsÚInvalidData)r   r)   Úhasattrr*   Ú	DataErrorr$   r   Ú	Transportr%   r   ÚsocketÚerrorÚIOErrorÚOSErrorÚConnectionErrorÚBusyLoadingErrorÚAuthenticationErrorÚTimeoutErrorr&   ÚInvalidResponseÚResponseError)r)   r,   s     úWC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\kombu/transport/redis.pyÚget_redis_error_classesr9   €   s±   € å ô ˆz˜=Ô)Ø×*Ñ*‰	à×(Ñ(ˆ	ÜÜ	×	Ñ	×	,Ñ	,ÜÜ�L‰LÜÜØ×&Ñ&Ø×'Ñ'Ø×*Ñ*Ø×#Ñ#ð0%ñ 
%ô 
×	Ñ	×	)Ñ	)ØØ×&Ñ&Ø×$Ñ$ð-&ñ 
&óð ó    c                 ó&   — ddl m}  | j                  S )z1Return the redis ConnectionError exception class.r   r(   )r   r)   r2   r(   s    r8   Úget_redis_ConnectionErrorr<   š   s   € å Ø×%Ñ%Ð%r:   c                  ó   — e Zd ZdZy)Ú	MutexHeldz)Raised when another party holds the lock.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r:   r8   r>   r>       s   „ Ú3r:   r>   c              #  óf  K  — | j                  ||¬«      }d}	 |j                  d¬«      }|rd–— n
t        «       ‚	 |r	 |j                  «        yy# t        j
                  j                  $ r Y yw xY w# |r5	 |j                  «        w # t        j
                  j                  $ r Y w w xY ww xY w­w)zTAcquire redis lock in non blocking way.

    Raise MutexHeld if not successful.
    ©ÚtimeoutF)ÚblockingN)ÚlockÚacquirer>   Úreleaser   r)   ÚLockNotOwnedError)ÚclientÚnameÚexpirerI   Úlock_acquireds        r8   ÚMutexrQ   ¤   sµ   è ø€ ð �;‰;�t Vˆ;Ó,€DØ€MðØŸ™¨e˜Ó4ˆÙÜä“+Ðð ñ ðØ—‘•ð øô ×#Ñ#×5Ñ5ò áðûñ ðØ—‘•øÜ×#Ñ#×5Ñ5ò áðúð üsc   ‚B1™#A5 ½B1Á A ÁB1ÁA2Á/B1Á1A2Á2B1Á5B.Á9B
Â	B.Â
B*Â'B.Â)B*Â*B.Â.B1c                ó$   — | j                  «        y ©N)Ú_after_fork)Úchannels    r8   Ú_after_fork_cleanup_channelrV   »   s   € Ø×ÑÕr:   c                  óh   ‡ — e Zd ZdZg d¢Zdddœdddœdddœdddœd	œZd
„ Zˆ fd„Zˆ fd„Zdd„Z	ˆ xZ
S )ÚGlobalKeyPrefixMixina  Mixin to provide common logic for global key prefixing.

    Overriding all the methods used by Kombu with the same key prefixing logic
    would be cumbersome and inefficient. Hence, we override the command
    execution logic that is called by all commands.
    )ÚHDELÚHGETÚHLENÚHSETÚLLENÚLPUSHÚPUBLISHÚRPUSHÚRPOPÚSADDÚSREMÚSETÚSMEMBERSÚZADDÚZREMÚZREVRANGEBYSCOREr   N)Ú
args_startÚargs_endéÿÿÿÿé   r!   )ÚDELÚBRPOPÚEVALSHAÚWATCHc                ó”  — t        |«      }|j                  d«      }|| j                  v r| j                  t	        |d   «      z   |d<   nv|| j
                  v rh| j
                  |   d   }| j
                  |   d   }|dkD  r|d | ng }g }|�||d  }|||| D �cg c]  }| j                  t	        |«      z   ‘Œ c}z   |z   }|g|¢S c c}w )Nr   ri   rj   )ÚlistÚpopÚPREFIXED_SIMPLE_COMMANDSÚglobal_keyprefixÚstrÚPREFIXED_COMPLEX_COMMANDS)ÚselfÚargsÚcommandri   rj   Úpre_argsÚ	post_argsÚargs           r8   Ú_prefix_argsz!GlobalKeyPrefixMixin._prefix_argsá   sþ   € Ü�D‹zˆØ—(‘(˜1“+ˆà�d×3Ñ3Ñ3Ø×+Ñ+¬c°$°q±'«lÑ:ˆD�ŠGØ˜×6Ñ6Ñ6Ø×7Ñ7¸Ñ@ÀÑNˆJØ×5Ñ5°gÑ>¸zÑJˆHà,6¸ªN�t˜K˜ZÑ(ÀˆHØˆIàÐ#Ø   ˜O�	àà 
¨8Ñ4óá4�Cð ×%Ñ%¬¨C«Ó0Ø4ññ ð ñˆDð
 Ð˜$ÐÐùòs   ÂCc                óz   •— t        ‰| �  ||fi |¤Ž}|dk(  r#|r!|\  }}|t        | j                  «      d }||fS |S )zŸParse a response from the Redis server.

        Method wraps ``redis.parse_response()`` to remove prefixes of keys
        returned by redis command.
        rn   N©ÚsuperÚparse_responseÚlenru   )rx   Ú
connectionÚcommand_nameÚoptionsÚretÚkeyÚvalueÚ	__class__s          €r8   r‚   z#GlobalKeyPrefixMixin.parse_responseø   sU   ø€ ô ‰gÑ$ Z°ÑIÀÑIˆØ˜7Ò"¡sØ‰JˆC�Ø”c˜$×/Ñ/Ó0Ð1Ð2ˆCØ˜�:ÐØˆ
r:   c                ó@   •— t        ‰| �  | j                  |«      i |¤ŽS rS   ©r�   Úexecute_commandr~   ©rx   ry   ÚkwargsrŠ   s      €r8   r�   z$GlobalKeyPrefixMixin.execute_command  ó#   ø€ Ü‰wÑ&¨×(9Ñ(9¸$Ó(?ÐJÀ6ÑJÐJr:   c                ó^   — t        | j                  | j                  ||| j                  ¬«      S )N©ru   )ÚPrefixedRedisPipelineÚconnection_poolÚresponse_callbacksru   )rx   ÚtransactionÚ
shard_hints      r8   ÚpipelinezGlobalKeyPrefixMixin.pipeline  s0   € Ü$Ø× Ñ Ø×#Ñ#ØØØ!×2Ñ2ô
ð 	
r:   )TN)r@   rA   rB   rC   rt   rw   r~   r‚   r�   r˜   Ú__classcell__©rŠ   s   @r8   rX   rX   ¿   sO   ø„ ñò Ðð(  ¨TÑ2Ø !¨rÑ2Ø"#°Ñ3Ø !¨tÑ4ñ	!Ðò ô.ôK÷
r:   rX   c                  ó   — e Zd ZdZd„ Zd„ Zy)ÚPrefixedStrictRedisz@Returns a ``StrictRedis`` client that prefixes the keys it uses.c                óx   — |j                  dd«      | _        t        j                  j                  | g|¢­i |¤Ž y ©Nru   Ú )rs   ru   r   ÚRedisÚ__init__©rx   ry   r�   s      r8   r¡   zPrefixedStrictRedis.__init__  s2   € Ø &§
¡
Ð+=¸rÓ BˆÔÜ�‰×Ñ˜TÐ3 DÒ3¨FÓ3r:   c                óF   — t        | j                  fd| j                  i|¤ŽS )Nru   )ÚPrefixedRedisPubSubr”   ru   )rx   r�   s     r8   ÚpubsubzPrefixedStrictRedis.pubsub  s0   € Ü"Ø× Ñ ñ
à!×2Ñ2ð
ð ñ
ð 	
r:   N)r@   rA   rB   rC   r¡   r¥   rD   r:   r8   rœ   rœ     s   „ ÙJò4ó
r:   rœ   c                  ó   — e Zd ZdZd„ Zy)r“   a   Custom Redis pipeline that takes global_keyprefix into consideration.

    As the ``PrefixedStrictRedis`` client uses the `global_keyprefix` to prefix
    the keys it uses, the pipeline called by the client must be able to prefix
    the keys as well.
    c                óŒ   — |j                  dd«      | _        t        j                  j                  j
                  | g|¢­i |¤Ž y rž   )rs   ru   r   rM   ÚPipeliner¡   r¢   s      r8   r¡   zPrefixedRedisPipeline.__init__)  s8   € Ø &§
¡
Ð+=¸rÓ BˆÔÜ�‰×Ñ×&Ñ& tÐ=¨dÒ=°fÓ=r:   N)r@   rA   rB   rC   r¡   rD   r:   r8   r“   r“   !  s   „ ñó>r:   r“   c                  ó@   ‡ — e Zd ZdZdZˆ fd„Zd„ Zˆ fd„Zˆ fd„Zˆ xZ	S )r¤   zCRedis pubsub client that takes global_keyprefix into consideration.)Ú	SUBSCRIBEÚUNSUBSCRIBEÚ
PSUBSCRIBEÚPUNSUBSCRIBEc                óR   •— |j                  dd«      | _        t        ‰| �  |i |¤Ž y rž   )rs   ru   r�   r¡   rŽ   s      €r8   r¡   zPrefixedRedisPubSub.__init__8  s)   ø€ Ø &§
¡
Ð+=¸rÓ BˆÔÜ‰Ñ˜$Ð) &Ó)r:   c                ó´   — t        |«      }|j                  d«      }|| j                  v r%|D �cg c]  }| j                  t	        |«      z   ‘Œ }}|g|¢S c c}w ©Nr   )rr   rs   ÚPUBSUB_COMMANDSru   rv   )rx   ry   rz   r}   s       r8   r~   z PrefixedRedisPubSub._prefix_args<  sl   € Ü�D‹zˆØ—(‘(˜1“+ˆà�d×*Ñ*Ñ*ñ  óá�Cð ×%Ñ%¬¨C«Ó0Øð ð ð
 Ð˜$ÐÐùòs   ¯Ac                ó–   •— t        ‰| �  |i |¤Ž}|€|S |�^}}}|g|D �cg c]  }|t        | j                  «      d ‘Œ c}¢|‘S c c}w )z Parse a response from the Redis server.

        Method wraps ``PubSub.parse_response()`` to remove prefixes of keys
        returned by redis command.
        Nr€   )	rx   ry   r�   r‡   Úmessage_typeÚchannelsÚmessagerU   rŠ   s	           €r8   r‚   z"PrefixedRedisPubSub.parse_responseH  su   ø€ ô ‰gÑ$ dÐ5¨fÑ5ˆØˆ;ØˆJð ,/Ñ(ˆ�x àð
áBJÓKÁ(°wˆg”c˜$×/Ñ/Ó0Ð1Ò2À(ÑKð
ð ð
ð 	
ùâKs   ¡Ac                ó@   •— t        ‰| �  | j                  |«      i |¤ŽS rS   rŒ   rŽ   s      €r8   r�   z#PrefixedRedisPubSub.execute_command^  r�   r:   )
r@   rA   rB   rC   r±   r¡   r~   r‚   r�   r™   rš   s   @r8   r¤   r¤   .  s(   ø„ ÙMð€Oô*ò
 ô
÷,Kð Kr:   r¤   c                  óÈ   ‡ — e Zd ZdZdZˆ fd„Zˆ fd„Zdd„Zˆ fd„Zdˆ fd„	Z	e
dd„«       Zdd	„Zdd
„Zdd„Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zˆ xZS )ÚQoSzRedis Ack Emulation.Tc                ó2   •— t        ‰| �  |i |¤Ž d| _        y r°   )r�   r¡   Ú_vrestore_countrŽ   s      €r8   r¡   zQoS.__init__g  s   ø€ Ü‰Ñ˜$Ð) &Ò)Ø ˆÕr:   c           
     ó´  •— |j                   }|d   |d   }}t        j                  d   dk\  r|t        «       ig}nt        «       |g}| j	                  «       5 } |j
                  | j                  g|¢­Ž j                  | j                  |t        |j                  ||g«      «      j                  «        t        ‰| �5  ||«       d d d «       y # 1 sw Y   y xY w)NÚexchangeÚrouting_keyr   r!   )Údelivery_infor   ÚVERSIONr	   Úpipe_or_acquireÚzaddÚunacked_index_keyÚhsetÚunacked_keyr   Ú_rawÚexecuter�   Úappend)	rx   rµ   Údelivery_tagÚdeliveryÚEXÚRKÚ	zadd_argsÚpiperŠ   s	           €r8   rÇ   z
QoS.appendk  s¼   ø€ Ø×(Ñ(ˆØ˜*Ñ% x°Ñ'>ˆBˆä�=‰=˜Ñ˜qÒ à&¬«Ð/Ð0‰Iä› Ð.ˆIà×!Ñ!Ô# tØˆD�I‰I�d×,Ñ,Ð9¨yÒ9ß‘�d×&Ñ&¨Ü˜WŸ\™\¨2¨rÐ2Ó3ó5ç‘”Ü‰G‰N˜7 LÔ1÷ $×#Ñ#ús   ÁA-CÃCc                óâ   — | j                   j                  |«      5 }| j                  D ]  }| j                  ||¬«       Œ 	 d d d «       | j                  j	                  «        y # 1 sw Y   Œ$xY w)N©rM   )rU   Úconn_or_acquireÚ
_deliveredÚrestore_by_tagÚclear)rx   rM   Útags      r8   Úrestore_unackedzQoS.restore_unacked|  sW   € Ø�\‰\×)Ñ)¨&Ô1°VØ—”�Ø×#Ñ# C°Ð#Õ7ñ '÷ 2ð 	�‰×ÑÕ÷ 2Ð1ús   œ%A%Á%A.c                ób   •— | j                  |«      j                  «        t        ‰| �  |«       y rS   )Ú_remove_from_indicesrÆ   r�   Úack)rx   rÈ   rŠ   s     €r8   rØ   zQoS.ack‚  s&   ø€ Ø×!Ñ! ,Ó/×7Ñ7Ô9Ü‰‰�LÕ!r:   c                óŽ   •— |r| j                  |d¬«       n| j                  |«      j                  «        t        ‰| �  |«       y ©NT)Úleftmost)rÒ   r×   rÆ   r�   rØ   )rx   rÈ   ÚrequeuerŠ   s      €r8   Úrejectz
QoS.reject†  s<   ø€ ÙØ×Ñ °tÐÕ<à×%Ñ% lÓ3×;Ñ;Ô=Ü‰‰�LÕ!r:   c              #  óž   K  — |r|–— y | j                   j                  |«      5 }|j                  «       –— d d d «       y # 1 sw Y   y xY w­wrS   )rU   rÐ   r˜   )rx   rÍ   rM   s      r8   rÀ   zQoS.pipe_or_acquire�  s:   è ø€ áØ‹Jà—‘×-Ñ-¨fÔ5¸Ø—o‘oÓ'Ò'÷ 6×5Ñ5üs   ‚#A¥A¸	AÁA
ÁAc                ó¼   — | j                  |«      5 }|j                  | j                  |«      j                  | j                  |«      cd d d «       S # 1 sw Y   y xY wrS   )rÀ   ÚzremrÂ   ÚhdelrÄ   )rx   rÈ   rÍ   s      r8   r×   zQoS._remove_from_indices•  sD   € Ø×!Ñ! $Ô'¨4Ø—9‘9˜T×3Ñ3°\ÓBß™˜T×-Ñ-¨|Ó<÷ (×'Ò'ús   ’6AÁAc           
     óø  — | xj                   dz  c_         | j                   dz
  |z  ry | j                  j                  «       5 }t        «       | j                  z
  }	 t        || j                  | j                  «      5  |j                  | j                  |d|xr ||d¬«      }|xs g D ]  \  }}| j                  ||«       Œ 	 d d d «       d d d «       y # 1 sw Y   ŒxY w# t        $ r Y Œ w xY w# 1 sw Y   y xY w)Nr   r   T)ÚstartÚnumÚ
withscores)rº   rU   rÐ   r	   Úvisibility_timeoutrQ   Úunacked_mutex_keyÚunacked_mutex_expireÚzrevrangebyscorerÂ   rÒ   r>   )	rx   rã   rä   ÚintervalrM   ÚceilÚvisiblerÔ   Úscores	            r8   Úrestore_visiblezQoS.restore_visibleš  sõ   € Ø×Ò Ñ!ÕØ× Ñ  1Ñ$¨Ò0ØØ�\‰\×)Ñ)Ô+¨vÜ“6˜D×3Ñ3Ñ3ˆDð	Ü˜6 4×#9Ñ#9Ø×4Ñ4õ6à$×5Ñ5Ø×.Ñ.°°aØ!šm e°Àð 6ó G�Gð '.¢m°¢m™
˜˜UØ×+Ñ+¨C°Õ8ñ '4÷6÷ ,Ð+÷6ð 6ûô ò Ùðú÷ ,Ð+úsC   ÁC0Á!C!Á=ACÃC!ÃC	ÃC!Ã!	C-Ã*C0Ã,C-Ã-C0Ã0C9c                ó°   ‡ ‡‡— ˆˆ ˆfd„}‰ j                   j                  |«      5 }|j                  |‰ j                  «       d d d «       y # 1 sw Y   y xY w)Nc                óö   •— | j                  ‰j                  ‰«      }| j                  «        ‰j                  ‰| «       |r8t	        t        |«      «      \  }}}‰j                  j                  |||| ‰«       y y rS   )ÚhgetrÄ   Úmultir×   r   r   rU   Ú_do_restore_message)rÍ   ÚpÚMrÊ   rË   rÛ   rx   rÔ   s        €€€r8   Úrestore_transactionz/QoS.restore_by_tag.<locals>.restore_transaction­  sh   ø€ Ø—	‘	˜$×*Ñ*¨CÓ0ˆAØ�J‰JŒLØ×%Ñ% c¨4Ô0ÙÜ!¤,¨q£/Ó2‘	��2�rØ—‘×0Ñ0°°B¸¸DÀ(ÕKð r:   )rU   rÐ   r–   rÄ   )rx   rÔ   rM   rÛ   rö   s   `` ` r8   rÒ   zQoS.restore_by_tag«  sB   ú€ ö	Lð �\‰\×)Ñ)¨&Ô1°VØ×ÑÐ2°D×4DÑ4DÔE÷ 2×1Ñ1ús   ¦AÁAc                ó.   — | j                   j                  S rS   )rU   rÄ   ©rx   s    r8   rÄ   zQoS.unacked_key¸  s   € à�|‰|×'Ñ'Ð'r:   c                ó.   — | j                   j                  S rS   )rU   rÂ   rø   s    r8   rÂ   zQoS.unacked_index_key¼  ó   € à�|‰|×-Ñ-Ð-r:   c                ó.   — | j                   j                  S rS   )rU   rç   rø   s    r8   rç   zQoS.unacked_mutex_keyÀ  rú   r:   c                ó.   — | j                   j                  S rS   )rU   rè   rø   s    r8   rè   zQoS.unacked_mutex_expireÄ  s   € à�|‰|×0Ñ0Ð0r:   c                ó.   — | j                   j                  S rS   )rU   ræ   rø   s    r8   ræ   zQoS.visibility_timeoutÈ  s   € à�|‰|×.Ñ.Ð.r:   rS   ©F©NN)r   é
   r   )NF)r@   rA   rB   rC   Úrestore_at_shutdownr¡   rÇ   rÕ   rØ   rÝ   r   rÀ   r×   rî   rÒ   r   rÄ   rÂ   rç   rè   ræ   r™   rš   s   @r8   r¸   r¸   b  s­   ø„ ÙàÐô!ô2ó" ô"õ"ð ò(ó ð(ó=ó
ó"Fð ñ(ó ð(ð ñ.ó ð.ð ñ.ó ð.ð ñ1ó ð1ð ñ/ó ô/r:   r¸   c                  óš   — e Zd ZdZeez  ZdZdZd„ Z	d„ Z
d„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zed„ «       Zy)ÚMultiChannelPollerz%Async I/O poller for Redis transport.FNc                óz   — t        «       | _        i | _        i | _        t	        «       | _        t        «       | _        y rS   )ÚsetÚ	_channelsÚ_fd_to_chanÚ_chan_to_sockr   ÚpollerÚ
after_readrø   s    r8   r¡   zMultiChannelPoller.__init__Ø  s-   € ä›ˆŒàˆÔàˆÔä“fˆŒä›%ˆ�r:   c                ó@  — | j                   j                  «       D ]  }	 | j                  j                  |«       Œ  | j                  j                  «        | j                  j                  «        | j                   j                  «        y # t        t
        f$ r Y Œ�w xY wrS   )	r  Úvaluesr	  Ú
unregisterÚKeyErrorÚ
ValueErrorr  rÓ   r  )rx   Úfds     r8   ÚclosezMultiChannelPoller.closeä  s�   € Ø×$Ñ$×+Ñ+Ö-ˆBðØ—‘×&Ñ& rÕ*ð .ð
 	�‰×ÑÔØ×Ñ×ÑÔ Ø×Ñ× Ñ Õ"øô	 œjÐ)ò Ùðús   ŸBÂBÂBc                ó:   — | j                   j                  |«       y rS   )r  Úadd©rx   rU   s     r8   r  zMultiChannelPoller.addî  s   € Ø�‰×Ñ˜7Õ#r:   c                ó:   — | j                   j                  |«       y rS   )r  Údiscardr  s     r8   r  zMultiChannelPoller.discardñ  s   € Ø�‰×Ñ˜wÕ'r:   c                óz   — 	 | j                   j                  |j                  «       y # t        t        f$ r Y y w xY wrS   )r	  r  Ú_sockÚAttributeErrorÚ	TypeError©rx   r„   s     r8   Ú_on_connection_disconnectz,MultiChannelPoller._on_connection_disconnectô  s6   € ð	Ø�K‰K×"Ñ" :×#3Ñ#3Õ4øÜ¤	Ð*ò 	Ùð	ús   ‚%( ¨:¹:c                ó†  — |||f| j                   v r| j                  |||«       |j                  j                  €|j                  j	                  «        |j                  j                  }||f| j
                  |j                  «       <   || j                   |||f<   | j                  j                  || j                  «       y rS   )
r  Ú_unregisterr„   r  Úconnectr  Úfilenor	  ÚregisterÚ
eventflags)rx   rU   rM   ÚtypeÚsocks        r8   Ú	_registerzMultiChannelPoller._registerú  s§   € Ø�V˜TÐ" d×&8Ñ&8Ñ8Ø×Ñ˜W f¨dÔ3Ø×Ñ×"Ñ"Ð*Ø×Ñ×%Ñ%Ô'Ø× Ñ ×&Ñ&ˆØ+2°D¨/ˆ×Ñ˜Ÿ™›Ñ'Ø6:ˆ×Ñ˜G V¨TÐ2Ñ3Ø�‰×Ñ˜T 4§?¡?Õ3r:   c                óZ   — | j                   j                  | j                  |||f   «       y rS   )r	  r  r  )rx   rU   rM   r#  s       r8   r  zMultiChannelPoller._unregister  s&   € Ø�‰×Ñ˜t×1Ñ1°7¸FÀDÐ2IÑJÕKr:   c                óþ   — t        |dd «      €Ft        r |j                  j                  «       |_        n |j                  j                  d«      |_        |j                  j
                  d uxr |||f| j                  v S )Nr„   Ú_)ÚgetattrÚ"_REDIS_GET_CONNECTION_WITHOUT_ARGSr”   Úget_connectionr„   r  r  )rx   rU   rM   Úcmds       r8   Ú_client_registeredz%MultiChannelPoller._client_registered  sw   € Ü�6˜<¨Ó.Ð6Ý1Ø$*×$:Ñ$:×$IÑ$IÓ$K�Õ!à$*×$:Ñ$:×$IÑ$IÈ#Ó$N�Ô!Ø×!Ñ!×'Ñ'¨tÐ3ò =Ø˜& #Ð&¨$×*<Ñ*<Ð<ð	>r:   c                óÂ   — ||j                   df}| j                  ||j                   d«      sd|_         | j                  |Ž  |j                  s|j	                  «        yy)zEnable BRPOP mode for channel.rn   FN)rM   r-  Ú_in_pollr%  Ú_brpop_start)rx   rU   Úidents      r8   Ú_register_BRPOPz"MultiChannelPoller._register_BRPOP  sX   € à˜Ÿ™¨Ð0ˆØ×&Ñ& w°·±ÀÔHØ$ˆGÔØˆD�N‰N˜EÑ"Ø×ÒØ× Ñ Õ"ð  r:   c                óÀ   — | j                  ||j                  d«      s$d|_        | j                  ||j                  d«       |j                  s|j	                  «        yy)zEnable LISTEN mode for channel.ÚLISTENFN)r-  Ú	subclientÚ
_in_listenr%  Ú
_subscriber  s     r8   Ú_register_LISTENz#MultiChannelPoller._register_LISTEN  sR   € à×&Ñ& w°×0AÑ0AÀ8ÔLØ!&ˆGÔØ�N‰N˜7 G×$5Ñ$5°xÔ@Ø×!Ò!Ø×ÑÕ ð "r:   c                óÐ   — | j                   D ]W  }|j                  r+|j                  j                  «       r| j	                  |«       |j
                  sŒG| j                  |«       ŒY y rS   )r  Úactive_queuesÚqosÚcan_consumer2  Úactive_fanout_queuesr8  r  s     r8   Úon_poll_startz MultiChannelPoller.on_poll_start!  sN   € Ø—~”~ˆGØ×$Ò$Ø—;‘;×*Ñ*Ô,Ø×(Ñ(¨Ô1Ø×+Ó+Ø×%Ñ% gÕ.ñ &r:   c                ó‚   — || _         | j                  D ])  }|j                  j                  |j                  ¬«      c S  y ©N)rä   )r	  r  r;  rî   Úunacked_restore_limit)rx   r	  rU   s      r8   Úon_poll_initzMultiChannelPoller.on_poll_init)  s<   € ØˆŒØ—~”~ˆGØ—;‘;×.Ñ.Ø×1Ñ1ð /ó ò ñ &r:   c                óŽ   — | j                   D ]6  }|j                  sŒ|j                  j                  |j                  ¬«      c S  y r@  )r  r:  r;  rî   rA  r  s     r8   Úmaybe_restore_messagesz)MultiChannelPoller.maybe_restore_messages0  s>   € Ø—~”~ˆGØ×$Ó$à—{‘{×2Ñ2Ø×5Ñ5ð 3ó ò ñ &r:   c                ó°   — | j                   D ]G  }|j                  j                  d«      }|€Œ!t        t	        |dd «      «      sŒ8|j                  «        ŒI y )Nr5  Úcheck_health)r  Ú__dict__ÚgetÚcallabler)  rF  )rx   rU   rM   s      r8   Úmaybe_check_subclient_healthz/MultiChannelPoller.maybe_check_subclient_health8  sI   € Ø—~”~ˆGà×%Ñ%×)Ñ)¨+Ó6ˆFØÑ!Ü ¤¨°ÀÓ!FÕGØ×#Ñ#Õ%ñ &r:   c                ó†   — | j                   |   \  }}|j                  j                  «       r |j                  |   «        y y rS   )r  r;  r<  Úhandlers)rx   r   Úchanr#  s       r8   Úon_readablezMultiChannelPoller.on_readable@  s<   € Ø×%Ñ% fÑ-‰
ˆˆdØ�8‰8×ÑÔ!ØˆD�M‰M˜$ÑÕ!ð "r:   c                ó–   — |t         z  r| j                  |«      | fS |t        z  r$| j                  |   \  }}|j	                  |«       y y rS   )r   rN  r   r  Ú_poll_error)rx   r   ÚeventrM  r#  s        r8   Úhandle_eventzMultiChannelPoller.handle_eventE  sM   € Ø”4Š<Ø×#Ñ# FÓ+¨TÐ1Ð1Ø”SŠ[Ø×)Ñ)¨&Ñ1‰JˆD�$Ø×Ñ˜TÕ"ð r:   c                óà  — d| _         	 | j                  D ]W  }|j                  r+|j                  j	                  «       r| j                  |«       |j                  sŒG| j                  |«       ŒY | j                  j                  |«      }|rc|D ]^  \  }}| j                  ||«      }|sŒ d| _         | j                  r0	 | j                  j                  «       } |«        | j                  rŒ/y y  | j                  «        t        «       ‚# t        $ r Y y w xY w# d| _         | j                  r@	 | j                  j                  «       } |«        n# t        $ r Y w w xY w| j                  rŒ?w w xY w)NTF)Ú_in_protected_readr  r:  r;  r<  r2  r=  r8  r	  r   rR  r
  rs   r  rD  r   )	rx   ÚcallbackrG   rU   Úeventsr   rQ  r‡   Úfuns	            r8   rH  zMultiChannelPoller.getL  sH  € Ø"&ˆÔð	ØŸ>œ>�Ø×(Ò(Ø—{‘{×.Ñ.Ô0Ø×,Ñ,¨WÔ5Ø×/Ó/Ø×)Ñ)¨'Õ2ð *ð —[‘[×%Ñ% gÓ.ˆFÙÛ%+‘M�F˜EØ×+Ñ+¨F°EÓ:�CÚØð ',ˆDÔ#Ø—/’/ðØŸ/™/×-Ñ-Ó/�Cñ ”Eð —/•/ð &,ð ×'Ñ'Ô)Ü“'ˆMøô  ò Ùðûð	 ',ˆDÔ#Ø—/’/ðØŸ/™/×-Ñ-Ó/�Cñ •Eøô  ò Ùðúð —/•/ús[   ‰AD ÁAD Â)D Â>D	 Ã.D Ä		DÄDÄE-Ä-EÅE-Å	EÅE-ÅEÅE-Å+E-c                ó   — | j                   S rS   )r  rø   s    r8   ÚfdszMultiChannelPoller.fdsj  s   € à×ÑÐr:   rS   )r@   rA   rB   rC   r   r   r"  rT  r
  r¡   r  r  r  r  r%  r  r-  r2  r8  r>  rB  rD  rJ  rN  rR  rH  ÚpropertyrY  rD   r:   r8   r  r  Í  s‡   „ Ù/à˜‘€Jð Ðð €Jò
 ò#ò$ò(òò4òLò>ò#ò!ò/òòò&ò"ò
#óð< ñ ó ñ r:   r  c                  óœ  ‡ — e Zd ZdZeZdZdZdZdZdZ	dZ
dZdZdZi ZdZdZd	Zd
ZdZdZdZeZdZdZdZdZdZdZeZdZ dZ!dZ"dZ#dZ$dZ%dZ&e'jP                  jR                  dz   Z)e*re*jV                  ndZ,e*re*jZ                  ndZ.ˆ fd„Z/d„ Z0d„ Z1d„ Z2	 dBd„Z3dBˆ fd„	Z4d„ Z5ˆ fd„Z6d„ Z7ˆ fd„Z8d„ Z9d„ Z:d„ Z;d„ Z<d„ Z=d „ Z>d!„ Z?dCd"„Z@d#„ ZAd$„ ZBd%„ ZCd&„ ZDd'„ ZEd(„ ZFd)„ ZGd*„ ZHdBd+„ZId,„ ZJd-„ ZKd.„ ZLd/„ ZMd0„ ZNˆ fd1„ZOd2„ ZPd3„ ZQ	 	 dDd4„ZRd5„ ZSdBd6„ZTdBd7„ZUdBd8„ZVd9„ ZWeXdCd:„«       ZYeZd;„ «       Z[eZd<„ «       Z\e]d=„ «       Z^e]d>„ «       Z_d?„ Z`d@„ ZaeZdA„ «       Zbˆ xZcS )EÚChannelzRedis Channel.NFTz_kombu.binding.%sz/{db}.zÚunackedÚunacked_indexÚunacked_mutexi,  i  r   rŸ   Úround_robin)ÚsepÚack_emulationrÄ   rÂ   rç   rè   ræ   rA  Úfanout_prefixÚfanout_patternsru   Úsocket_timeoutÚsocket_connect_timeoutÚsocket_keepaliveÚsocket_keepalive_optionsÚqueue_order_strategyÚmax_connectionsÚhealth_check_intervalÚretry_on_timeoutÚpriority_stepsÚclient_namec                ón  •— t        ‰| �  |i |¤Ž | j                  st        j                  | _        d| _         t        | j                  «      «       | _        | j                  «       | _
        | j                  «       | _        t        «       | _        t        «       | _        i | _        | j"                  | j$                  dœ| _        | j(                  j*                  | _        | j,                  r,t/        | j,                  t0        «      r| j,                  | _        nd| _        	 | j4                  j7                  «        | j(                  j<                  j?                  | «       d| _        | j(                  j@                  | _         tB        �tC        | tD        «       y y # t8        $ r | j;                  «        ‚ w xY w)NF)rn   r4  rŸ   T)#r�   r¡   rb  r   r¸   Ú_registeredr   ri  Ú_queue_cycleÚ_get_clientÚClientÚ_get_response_errorr7   r  r=  Úauto_delete_queuesÚ_fanout_to_queueÚ_brpop_readÚ_receiverL  r„   Úbrpop_timeoutrc  Ú
isinstancerv   Úkeyprefix_fanoutrM   ÚpingÚ	ExceptionÚ_disconnect_poolsÚcycler  r%   r   rV   rŽ   s      €r8   r¡   zChannel.__init__Ü  s`  ø€ Ü‰Ñ˜$Ð) &Ò)à×!Ò!Ü—{‘{ˆDŒHØ ˆÔØDœM¨$×*CÑ*CÓDÓFˆÔØ×&Ñ&Ó(ˆŒØ!×5Ñ5Ó7ˆÔÜ$'£EˆÔ!Ü"%£%ˆÔØ "ˆÔØ"&×"2Ñ"2¸d¿m¹mÑLˆŒØ!Ÿ_™_×:Ñ:ˆÔà×ÒÜ˜$×,Ñ,¬cÔ2Ø(,×(:Ñ(:�Õ%ð %'ˆDÔ!ð	Ø�K‰K×ÑÔð
 	�‰×Ñ×!Ñ! $Ô'àˆÔð "&§¡×!BÑ!BˆÔäÐ*Ü Ô&AÕBð +øô ò 	Ø×"Ñ"Ô$Øð	ús   Ä F ÆF4c                ó$   — | j                  «        y rS   )r~  rø   s    r8   rT   zChannel._after_fork  s   € Ø×ÑÕ r:   c                óš   — | j                   }| j                  }d x| _        | _         |�|j                  «        |�|j                  «        y y rS   )Ú_poolÚ_async_poolÚ
disconnect)rx   ÚpoolÚ
async_pools      r8   r~  zChannel._disconnect_pools  sL   € Ø�z‰zˆØ×%Ñ%ˆ
à(,Ð,ˆÔ˜4œ:àÐØ�O‰OÔàÐ!Ø×!Ñ!Õ#ð "r:   c                óê   — | j                   |u rd | _         | j                  |u rd | _        | j                  r=| j                  j                  r&| j                  j                  j	                  |«       y y y rS   )r/  r6  r„   r  r  r  s     r8   r  z!Channel._on_connection_disconnect  sZ   € Ø�=‰=˜JÑ&Ø ˆDŒMØ�?‰?˜jÑ(Ø"ˆDŒOØ�?Š?˜tŸ™×4Ò4Ø�O‰O×!Ñ!×;Ñ;¸JÕGð  5ˆ?r:   c                óN  — 	 	 d|d   d<   d|d   d   d<   | j                  ||«      D ]O  }| j                  |d¬«      } |r|j                  n|j                  | j                  ||«      t        |«      «       ŒQ y # t         $ r Y Œpw xY w# t        $ r t        d|d¬	«       Y y w xY w)
NTÚheadersÚredeliveredÚ
propertiesr¾   F©ÚreversezCould not restore message: %r©Úexc_info)	r  Ú_lookupÚ_get_message_priorityÚlpushÚrpushÚ
_q_for_prir   r}  Úcrit)rx   Úpayloadr¼   r½   rÍ   rÛ   ÚqueueÚpris           r8   ró   zChannel._do_restore_message  s¹   € ð	JðØ48�˜	Ñ" =Ñ1ØHL�˜Ñ% oÑ6°}ÑEð Ÿ™ h°Ö<�Ø×0Ñ0°À%Ð0ÓH�à7™x�—’¨T¯Z©ZØ—O‘O E¨3Ó/´°w³õñ =øô ò Ùðûô ò 	JÜÐ0°'ÀD×Ið	Jús/   ƒA; –A$B
 Á;	BÂB
 ÂBÂB
 Â
B$Â#B$c                óê   •‡ ‡‡— ‰ j                   st        ‰‰ �	  |«      S |j                  Šˆˆ ˆfd„}‰ j	                  «       5 }|j                  |‰ j                  «       d d d «       y # 1 sw Y   y xY w)Nc                óö   •— | j                  ‰j                  ‰«      }| j                  «        | j                  ‰j                  ‰«       |r.t	        t        |«      «      \  }}}‰j                  |||| ‰«       y y rS   )rñ   rÄ   rò   rá   r   r   ró   )rÍ   ÚPrõ   rÊ   rË   rÛ   rx   rÔ   s        €€€r8   rö   z-Channel._restore.<locals>.restore_transaction2  sh   ø€ Ø—	‘	˜$×*Ñ*¨CÓ0ˆAØ�J‰JŒLØ�I‰I�d×&Ñ&¨Ô,ÙÜ!¤,¨q£/Ó2‘	��2�rØ×(Ñ(¨¨B°°D¸(ÕCð r:   )rb  r�   Ú_restorerÈ   rÐ   r–   rÄ   )rx   rµ   rÛ   rö   rM   rÔ   rŠ   s   ` `  @€r8   rœ  zChannel._restore-  s`   û€ Ø×!Ò!Ü‘7Ñ# GÓ,Ð,Ø×"Ñ"ˆö	Dð ×!Ñ!Ô# vØ×ÑÐ2°D×4DÑ4DÔE÷ $×#Ñ#ús   ÁA)Á)A2c                ó(   — | j                  |d¬«      S rÚ   )rœ  )rx   rµ   s     r8   Ú_restore_at_beginningzChannel._restore_at_beginning=  s   € Ø�}‰}˜W¨tˆ}Ó4Ð4r:   c                óâ   •— || j                   v r<| j                   |   \  }}| j                  j                  |«       || j                  |<   t	        ‰| �  |g|¢­i |¤Ž}| j                  «        |S rS   )Ú_fanout_queuesr=  r  rv  r�   Úbasic_consumeÚ_update_queue_cycle)rx   r—  ry   r�   r¼   r(  r‡   rŠ   s          €r8   r¡  zChannel.basic_consume@  su   ø€ Ø�D×'Ñ'Ñ'Ø×-Ñ-¨eÑ4‰KˆH�aØ×%Ñ%×)Ñ)¨%Ô0Ø.3ˆD×!Ñ! (Ñ+Ü‰gÑ# EÐ;¨DÒ;°FÑ;ˆð 	× Ñ Ô"Øˆ
r:   c                óâ   — | j                   }|ra|j                  j                  r:|j                  j                  j	                  t        | j                  |f«      «      S | j                  |«      S y rS   )r„   r  rT  r
  r  r   Ú_basic_cancel)rx   Úconsumer_tagr„   s      r8   Úbasic_cancelzChannel.basic_cancelT  sh   € ð
 —_‘_ˆ
ÙØ×Ñ×2Ò2Ø!×'Ñ'×2Ñ2×6Ñ6Ü˜D×.Ñ.°°Ó@óð ð ×%Ñ% lÓ3Ð3ð r:   c                óv  •— 	 | j                   |   }	 | j                  j                  |«       | j	                  |«       	 | j
                  |   \  }}| j                  j                  |«       t        ‰| �%  |«      }| j                  «        |S # t        $ r Y y w xY w# t        $ r Y Œiw xY w# t        $ r Y ŒJw xY wrS   )Ú_tag_to_queuer  r=  ÚremoveÚ_unsubscribe_fromr   rv  rs   r�   r¦  r¢  )rx   r¥  r—  r¼   r(  r‡   rŠ   s         €r8   r¤  zChannel._basic_cancela  sÊ   ø€ ð	Ø×&Ñ& |Ñ4ˆEð	*Ø×%Ñ%×,Ñ,¨UÔ3ð ×"Ñ" 5Ô)ð	Ø×-Ñ-¨eÑ4‰KˆH�aØ×!Ñ!×%Ñ% hÔ/ô ‰gÑ" <Ó0ˆØ× Ñ Ô"Øˆ
øô ò 	Ùð	ûô ò 	Ùð	ûô ò 	Ùð	ús4   ƒB “B Á -B, Â	BÂBÂ	B)Â(B)Â,	B8Â7B8c                ó–   — |r+| j                   rdj                  | j                  |d|g«      S dj                  | j                  |g«      S )NrŸ   Ú/)rd  Újoinr{  )rx   r¼   r½   s      r8   Ú_get_publish_topiczChannel._get_publish_topicu  sE   € Ù˜4×/Ò/Ø—7‘7˜D×1Ñ1°8¸SÀ+ÐNÓOÐOØ�w‰w˜×-Ñ-¨xÐ8Ó9Ð9r:   c                óJ   — | j                   |   \  }}| j                  ||«      S rS   )r   r®  )rx   r—  r¼   r½   s       r8   Ú_get_subscribe_topiczChannel._get_subscribe_topicz  s*   € Ø $× 3Ñ 3°EÑ :Ñˆ�+Ø×&Ñ& x°Ó=Ð=r:   c                ó   — | j                   D �cg c]  }| j                  |«      ‘Œ }}|sy | j                  }|j                  j                  €|j                  j                  «        |j                  | _        |j                  |«       y c c}w rS   )r=  r°  r5  r„   r  r  r6  Ú
psubscribe)rx   r—  ÚkeysÚcs       r8   r7  zChannel._subscribe~  s~   € à!×6Ò6ó8Ù6�Eð ×)Ñ)¨%Õ0Ø6ð 	ð 8áØØ�N‰NˆØ�<‰<×ÑÐ%Ø�L‰L× Ñ Ô"ØŸ,™,ˆŒØ	�‰�TÕùò8s   �Bc                óª   — | j                  |«      }| j                  }|j                  r*|j                  j                  r|j	                  |g«       y y y rS   )r°  r5  r„   r  Úunsubscribe)rx   r—  Útopicr´  s       r8   rª  zChannel._unsubscribe_from‰  sC   € Ø×)Ñ)¨%Ó0ˆØ�N‰NˆØ�<Š<˜AŸL™L×.Ò.Ø�M‰M˜5˜'Õ"ð /ˆ<r:   c                óÌ   — t        |d   «      dk(  r|d   dk(  rd|_        y t        |d   «      dk(  r|d   |d   |d   |d   f\  }}}}n|d   d |d   |d   f\  }}}}||||dœS )	Nr   r¶  rl   FÚpmessager   r!   )r#  ÚpatternrU   Údata)r   Ú
subscribed)rx   rM   Úrr#  rº  rU   r»  s          r8   Ú_handle_messagezChannel._handle_message�  s™   € Ü˜˜!™Ó Ò.°1°Q±4¸1²9Ø %ˆFÔØä˜˜!™Ó Ò+Ø+,¨Q©4°°1±°q¸±t¸Q¸q¹TÐ+AÑ(ˆD�'˜7¡Dà+,¨Q©4°°q¸±t¸Q¸q¹TÐ+AÑ(ˆD�'˜7 DàØØØñ	
ð 	
r:   c                óv  — | j                   }g }	 |j                  | j                  |«      «       |j                  �e|j                  j                  d¬«      rI|j                  | j                  |«      «       |j                  �|j                  j                  d¬«      rŒIt        |«      S # t        $ r Y Œ‡w xY w)Nr   rF   )r5  rÇ   Ú_receive_oner   r„   Úcan_readÚany)rx   r´  r‡   s      r8   rx  zChannel._receiveŸ  s    € Ø�N‰NˆØˆð	Ø�J‰J�t×(Ñ(¨Ó+Ô,ð �l‰lÐ&¨1¯<©<×+@Ñ+@ÈÐ+@Ô+KØ�J‰J�t×(Ñ(¨Ó+Ô,ð �l‰lÐ&¨1¯<©<×+@Ñ+@ÈÐ+@Õ+Kä�3‹xˆøô	 ò 	Ùð	ús   � B, Â,	B8Â7B8c                ól  — d }	 |j                  «       }t        |t        t
        f«      r¸| j                  ||«      }t        |d   «      j                  d«      rˆt        |d   «      }|d   rt|d   dk(  r|j                  d«      \  }}}	 t        t        |d   «      «      }|j!                  dd
«      d   }| j"                  j%                  || j&                  |   «       yy y y # | j                  $ r	 d | _        ‚ w xY w# t        t        f$ r& t        d|t        |«      d d	 d
¬«       t        «       ‚w xY w)Nr#  rµ   rU   r»  r   r¬  Ú.z&Cannot process event on channel %r: %si   r   rŽ  T)r‚   r%   r6  rz  rr   Útupler¾  r   ÚendswithÚ	partitionr   r  r  ÚwarningÚreprr   Úsplitr„   Ú_deliverrv  )rx   r´  Úresponser–  rU   r(  rµ   r¼   s           r8   rÀ  zChannel._receive_oneª  sK  € Øˆð	Ø×'Ñ'Ó)ˆHô �h¤¤u Ô.Ø×*Ñ*¨1¨hÓ7ˆGÜ˜G F™OÓ,×5Ñ5°iÔ@Ü& w¨yÑ'9Ó:�Ø˜6’?Ø˜q‘z SÒ(Ø(/×(9Ñ(9¸#Ó(>™˜˜1˜gð&Ü"'¬°W¸V±_Ó(EÓ"F˜ð
  'Ÿ}™}¨S°!Ó4°QÑ7�HØ—O‘O×,Ñ,Ø ×!6Ñ!6°xÑ!@ôBàð #ð Að /øð ×%Ñ%ò 	Ø"ˆDŒOØð	ûô &¤zÐ2ò &ÜÐ HØ '¬¨g«°u¸Ð)=ÈõKä#›g˜ð&ús   „C# Â
C> Ã#C;Ã>5D3c           	     óØ  — |€| j                   }| j                  j                  t        | j                  «      «      }|sy | j
                  D ��cg c]  }|D ]  }| j                  ||«      ‘Œ Œ c}}|xs dgz   }| j                  j                  | _	        dg|¢}| j                  r| j                  j                  |«      } | j                  j                  j                  |Ž  y c c}}w )Nr   rn   )ry  rq  Úconsumerƒ   r:  rm  r”  rM   r„   r/  ru   r~   Úsend_command)rx   rG   Úqueuesr˜  r—  r³  Úcommand_argss          r8   r0  zChannel._brpop_startÃ  sÜ   € Øˆ?Ø×(Ñ(ˆGØ×"Ñ"×*Ñ*¬3¨t×/AÑ/AÓ+BÓCˆÙØØ7;×7JÒ7Jô %Ñ7J°Û#�Eð —‘  sÕ+Ø#ð ,Ð7Jò %Ø(/ª°1 ~ñ6ˆàŸ™×.Ñ.ˆŒàÐ' $Ð'ˆØ× Ò ØŸ;™;×3Ñ3°LÓAˆLà+ˆ�‰×Ñ×+Ñ+¨\Ò:ùó%s   Á C&c                ó  — 	 	  | j                   j                  | j                   j                  dfi |¤Ž}|r|\  }}t        |«      j                  | j                  d«      d   }| j                  j                  |«       | j                  j                  t        t        |«      «      |«       	 d | _        yt        «       ‚# | j                  $ r& | j                   j                  j	                  «        ‚ w xY w# d | _        w xY w)Nrn   r   r   T)rM   r‚   r„   r%   r„  r   Úrsplitra  rq  ÚrotaterË  r   r/  r   )rx   r†   Ú
dest__itemÚdestÚitems        r8   rw  zChannel._brpop_readÓ  sì   € ð	!ðØ7˜TŸ[™[×7Ñ7¸¿¹×8NÑ8NØ8?ñCà:AñC�
ñ Ø'‘
��dÜ# DÓ)×0Ñ0°·±¸1Ó=¸aÑ@�Ø×!Ñ!×(Ñ(¨Ô.Ø—‘×(Ñ(¬¬|¸DÓ/AÓ)BÀDÔIØð !ˆD�Mô “g�øð ×)Ñ)ò ð —‘×&Ñ&×1Ñ1Ô3Øð	ûð !ˆD�Mús#   ƒ2C  µA8C8 Â6
C8 Ã 5C5Ã5C8 Ã8	Dc                ó¤   — |dk(  r| j                   j                  «        y | j                  j                  | j                  j                  |«       y )Nr4  )r5  r‚   rM   r„   )rx   r#  r†   s      r8   rP  zChannel._poll_erroré  s8   € Ø�8ÒØ�N‰N×)Ñ)Õ+à�K‰K×&Ñ& t§{¡{×'=Ñ'=¸tÕDr:   c                óö   — | j                  «       5 }| j                  D ]D  }|j                  | j                  ||«      «      }|sŒ't	        t        |«      «      c cd d d «       S  t        «       ‚# 1 sw Y   y xY wrS   )rÐ   rm  Úrpopr”  r   r   r   )rx   r—  rM   r˜  r×  s        r8   Ú_getzChannel._getï  sd   € Ø×!Ñ!Ô# vØ×*Ô*�Ø—{‘{ 4§?¡?°5¸#Ó#>Ó?�ÚÜ ¤¨dÓ!3Ó4Ñ4÷	 $Ñ#Ø*ô “'ˆM÷ $Ð#ús   ‘3A/ÁA/Á$A/Á/A8c           	     óV  — | j                  «       5 }|j                  «       5 }| j                  D ]#  }|j                  | j	                  ||«      «      }Œ% |j                  «       }t        d„ |D «       «      cd d d «       cd d d «       S # 1 sw Y   nxY w	 d d d «       y # 1 sw Y   y xY w)Nc              3  óT   K  — | ]   }t        |t        j                  «      r|–— Œ" y ­wrS   )rz  ÚnumbersÚIntegral)Ú.0Úsizes     r8   Ú	<genexpr>z Channel._size.<locals>.<genexpr>ý  s'   è ø€ ð B©E DÜ(¨¬w×/?Ñ/?Ô@ô  ©Eùs   ‚&()rÐ   r˜   rm  Úllenr”  rÆ   Úsum)rx   r—  rM   rÍ   r˜  Úsizess         r8   Ú_sizezChannel._size÷  s�   € Ø×!Ñ!Ô# vØ—‘Ô" dØ×.Ô.�CØŸ9™9 T§_¡_°U¸CÓ%@ÓA‘Dð /àŸ™›�Üñ B©Eó Bó B÷	 #Ð"÷ $Ñ#ß"Ð"úÐ"÷ $×#Ñ#ús#   ‘B¢AB	Á6	BÂ	B	ÂBÂB(c                óP   — | j                  |«      }|r|› | j                  › |› �S |S rS   )Úpriorityra  )rx   r—  r˜  s      r8   r”  zChannel._q_for_pri   s/   € Ø�m‰m˜CÓ ˆÙØ�W˜TŸX™X˜J s eÐ,Ð,Øˆr:   c                ó>   — | j                   }|t        ||«      dz
     S )Nr   )rm  r   )rx   ÚnÚstepss      r8   rè  zChannel.priority  s$   € Ø×#Ñ#ˆØ”V˜E 1Ó%¨Ñ)Ñ*Ð*r:   c                óÊ   — | j                  |d¬«      }| j                  «       5 }|j                  | j                  ||«      t	        |«      «       ddd«       y# 1 sw Y   yxY w)zDeliver message.FrŒ  N)r‘  rÐ   r’  r”  r   )rx   r—  rµ   r�   r˜  rM   s         r8   Ú_putzChannel._put
  sN   € à×(Ñ(¨¸%Ð(Ó@ˆà×!Ñ!Ô# vØ�L‰L˜Ÿ™¨°Ó4´e¸G³nÔE÷ $×#Ñ#ús   ¤,AÁA"c                ó¤   — | j                  «       5 }|j                  | j                  ||«      t        |«      «       ddd«       y# 1 sw Y   yxY w)zDeliver fanout message.N)rÐ   Úpublishr®  r   )rx   r¼   rµ   r½   r�   rM   s         r8   Ú_put_fanoutzChannel._put_fanout  s?   € à×!Ñ!Ô# vØ�N‰NØ×'Ñ'¨°+Ó>Ü�g“ô÷ $×#Ñ#ús   ‘,AÁAc                ó@   — |r| j                   j                  |«       y y rS   )ru  r  )rx   r—  Úauto_deleter�   s       r8   Ú
_new_queuezChannel._new_queue  s   € ÙØ×#Ñ#×'Ñ'¨Õ.ð r:   c           
     ó\  — | j                  |«      j                  dk(  r!||j                  dd«      f| j                  |<   | j	                  «       5 }|j                  | j                  |fz  | j                  j                  |xs d|xs d|xs dg«      «       d d d «       y # 1 sw Y   y xY w)NÚfanoutÚ#Ú*rŸ   )	Útypeofr#  Úreplacer   rÐ   ÚsaddÚkeyprefix_queuera  r­  )rx   r¼   r½   rº  r—  rM   s         r8   Ú_queue_bindzChannel._queue_bind  s    € Ø�;‰;�xÓ ×%Ñ%¨Ò1ð ˜+×-Ñ-¨c°3Ó7ð*ˆD×Ñ Ñ&ð ×!Ñ!Ô# vØ�K‰K˜×,Ñ,°¨{Ñ:ØŸ™Ÿ™ {Ò'8°bØ'.¢}°"Ø',¢{°ð'4ó 5ô6÷ $×#Ñ#ús   ÁA	B"Â"B+c           
     ó  — | j                   j                  |«       | j                  |j                  d«      ¬«      5 }|j	                  | j
                  |fz  | j                  j                  |xs d|xs d|xs dg«      «       |j                  «       5 }| j                  D ]#  }	|j                  | j                  ||	«      «      }Œ% |j                  «        d d d «       d d d «       y # 1 sw Y   ŒxY w# 1 sw Y   y xY w)NrM   rÏ   rŸ   )ru  r  rÐ   rH  Úsremrû  ra  r­  r˜   rm  Údeleter”  rÆ   )
rx   r—  r¼   r½   rº  ry   r�   rM   rÍ   r˜  s
             r8   Ú_deletezChannel._delete)  sÖ   € Ø×Ñ×'Ñ'¨Ô.Ø×!Ñ!¨¯©°HÓ)=Ð!Ô>À&Ø�K‰K˜×,Ñ,°¨{Ñ:ØŸ™Ÿ™ {Ò'8°bØ'.¢}°"Ø',¢{°ð'4ó 5ô6ð —‘Ô" dØ×.Ô.�CØŸ;™; t§¡°u¸cÓ'BÓC‘Dð /à—‘”÷ #÷ ?Ð>÷
 #Ð"ú÷ ?Ð>ús%   ½AC6ÂAC*ÃC6Ã*C3	Ã/C6Ã6C?c           	     óD  — | j                  «       5 }|j                  «       5 }| j                  D ]#  }|j                  | j	                  ||«      «      }Œ% t        |j                  «       «      cd d d «       cd d d «       S # 1 sw Y   nxY w	 d d d «       y # 1 sw Y   y xY wrS   )rÐ   r˜   rm  Úexistsr”  rÂ  rÆ   )rx   r—  r�   rM   rÍ   r˜  s         r8   Ú
_has_queuezChannel._has_queue5  sy   € Ø×!Ñ!Ô# vØ—‘Ô" dØ×.Ô.�CØŸ;™; t§¡°u¸cÓ'BÓC‘Dð /ä˜4Ÿ<™<›>Ó*÷ #Ð"÷ $Ñ#ß"Ð"úÐ"÷ $×#Ñ#ús#   ‘B¢AB Á-	BÂ B		ÂBÂBc           	     ó(  — | j                   |z  }| j                  «       5 }|j                  |«      }|sg cd d d «       S |D �cg c]/  }t        t	        |«      j                  | j                  «      «      ‘Œ1 c}cd d d «       S c c}w # 1 sw Y   y xY wrS   )rû  rÐ   ÚsmembersrÅ  r   rÊ  ra  )rx   r¼   rˆ   rM   r  Úvals         r8   Ú	get_tablezChannel.get_table<  s„   € Ø×"Ñ" XÑ-ˆØ×!Ñ!Ô# vØ—_‘_ SÓ)ˆFÙð ÷ $Ñ#ñ IOÓOÉÀ”Eœ, sÓ+×1Ñ1°$·(±(Ó;Õ<ÈÑO÷ $Ñ#ùò P÷ $Ð#ús"    B¿BÁ4BÁ7BÂBÂBc                óv  — | j                  «       5 }|j                  «       5 }| j                  D ]4  }| j                  ||«      }|j	                  |«      j                  |«      }Œ6 |j                  «       }t        |d d d…   «      cd d d «       cd d d «       S # 1 sw Y   nxY w	 d d d «       y # 1 sw Y   y xY w)Nrl   )rÐ   r˜   rm  r”  rã  rÿ  rÆ   rä  )rx   r—  rM   rÍ   r˜  Úpriqrå  s          r8   Ú_purgezChannel._purgeF  s–   € Ø×!Ñ!Ô# vØ—‘Ô" dØ×.Ô.�CØŸ?™?¨5°#Ó6�DØŸ9™9 T›?×1Ñ1°$Ó7‘Dð /ð Ÿ™›�Ü˜5¡ 1 ™:“÷ #Ð"÷ $Ñ#ß"Ð"úÐ"÷ $×#Ñ#ús#   ‘B/¢A$BÂ	B/ÂB"	ÂB/Â/B8c                óÊ  •— d| _         | j                  r	 | j                  «        | j                  s•| j
                  j                  j                  | «       | j                  j                  d«      }|�3| j                  D ]$  }|| j                  v sŒ| j                  ||¬«       Œ& | j                  «        | j                  «        t        ‰| �A  «        y # t        $ r Y Œ»w xY w)NTrM   rÏ   )Ú_closingr/  rw  r   Úclosedr„   r  r  rG  rH  r   ru  Úqueue_deleter~  Ú_close_clientsr�   r  )rx   rM   r—  rŠ   s      €r8   r  zChannel.closeO  sÇ   ø€ ØˆŒØ�=Š=ðØ× Ñ Ô"ð �{Š{à�O‰O×!Ñ!×)Ñ)¨$Ô/ð —]‘]×&Ñ& xÓ0ˆFØÐ!Ø!×0Ô0�EØ × 7Ñ 7Ò7Ø×)Ñ)¨%¸Ð)Õ?ð 1ð ×"Ñ"Ô$Ø×ÑÔ!Ü‰‰�øô ò Ùðús   –C Ã	C"Ã!C"c                óº   — dD ]6  }	 | j                   |   }|j                  d c}|_        |j                  «        Œ8 y # t        t        | j
                  f$ r Y ŒVw xY w)N)rM   r5  )rG  r„   r„  r  r  r7   )rx   ÚattrrM   r„   s       r8   r  zChannel._close_clientsd  sa   € ã)ˆDðØŸ™ tÑ,�Ø06×0AÑ0AÀ4Ð-�
˜FÔ-Ø×%Ñ%Õ'ñ	 *øô
 œn¨d×.@Ñ.@ÐAò Ùðús   ‡3=½AÁAc                óì   — t        |t        j                  «      s2|r|dk(  rt        }n|j	                  d«      r|dd  }	 t        |«      }|S |S # t        $ r t        dj                  |«      «      ‚w xY w)Nr¬  r   z/Database is int between 0 and limit - 1, not {})rz  rÞ  rß  Ú
DEFAULT_DBÚ
startswithÚintr  Úformat)rx   Úvhosts     r8   Ú_prepare_virtual_hostzChannel._prepare_virtual_hostn  s�   € Ü˜%¤×!1Ñ!1Ô2Ù˜E SšLÜ"‘Ø×!Ñ! #Ô&Ø˜a˜b˜	�ðÜ˜E›
�ð ˆˆuˆøô ò Ü ØE×LÑLØóóð ðús   Á A Á$A3c                ó   — |S rS   rD   )rx   rg  rh  Úparamss       r8   Ú_filter_tcp_connparamszChannel._filter_tcp_connparams}  s   € àˆr:   c                óÖ   — |rgt        |t        «      rt        |«      } |«       }t        |t        «      st	        d«      ‚||d<   |j                  dd «       |j                  dd «       y y )NzRCredential provider is not an instance of a redis.CredentialProvider or a subclassÚcredential_providerÚusernameÚpassword)rz  rv   r   r   r  rs   )rx   r  Ú
connparamsÚcredential_provider_clss       r8   Ú_process_credential_providerz$Channel._process_credential_provider�  sp   € ÙÜÐ-¬sÔ3Ü*8Ð9LÓ*MÐ'Ù&=Ó&?Ð#äÐ1Ô3EÔFÜ Øhóð ð 1DˆJÐ,Ñ-à�N‰N˜: tÔ,Ø�N‰N˜: tÕ,ð r:   c                ó®  ‡— | j                   j                  }|j                  xs d|j                  xs | j                   j                  |j
                  |j                  |j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  dœ}| j!                  |j"                  |«       | j$                  }t'        |d«      rW|g}t'        |d«      r|t)        |j*                  «      z  }|D ]  }t-        |j.                  d«      sŒ n |j1                  d«       |j2                  r+	 |j5                  |j2                  «       | j6                  |d<   |d   }d|v rÙt;        |«      \  }}	}	}
}}}|d	k(  ro | j<                  di |¤Ž} |j4                  t>        j@                  d
|z   dœfi |¤Ž |j1                  dd «       |j1                  dd «       |j1                  dd «       |
|d<   ||d<   |j1                  dd «      }| j!                  ||«       |j1                  dd «       |j1                  dd «       | jC                  |j1                  dd «      «      |d<   | Š|jE                  d«      xs | j$                  }|r G ˆfd„d|«      }|}||d<   |S # t8        $ r Y �ŒKw xY w)Nz	127.0.0.1)ÚhostÚportÚvirtual_hostr  r  rj  re  rf  rg  rh  rk  rl  rn  r¡   Ú	__bases__rk  Úconnection_classr$  z://r.   r¬  )r(  Úpathrf  rg  rh  r  r  r  r%  r&  Údbc                  ó"   •‡ — e Zd Zˆ ˆfd„Zˆ xZS )ú'Channel._connparams.<locals>.Connectionc                óZ   •— t        ‰| �  |Ž  ‰j                  r‰j                  | «       y y rS   )r�   r„  rp  r  )rx   ry   rŠ   rU   s     €€r8   r„  z2Channel._connparams.<locals>.Connection.disconnectÝ  s.   ø€ Ü‘GÑ&¨Ñ-ð ×*Ò*Ø×9Ñ9¸$Õ?ð +r:   )r@   rA   rB   r„  r™   )rŠ   rU   s   @€r8   Ú
Connectionr,  Ü  s   ù„ ÷@ñ @r:   r.  rD   )#r„   rM   Úhostnamer%  Údefault_portr&  Úuseridr  rj  re  rf  rg  rh  rk  rl  rn  r"  r  r(  r+   rr   r'  r   r¡   rs   ÚsslÚupdateÚconnection_class_sslr  r   r  r   ÚUnixDomainSocketConnectionr  rH  )rx   ÚasynchronousÚconninfor   Ú
conn_classÚclassesÚklassr$  Úschemer(  r  r  r)  Úqueryr  Úconnection_clsr.  rU   s                    @r8   Ú_connparamszChannel._connparams‘  sÓ  ø€ Ø—?‘?×)Ñ)ˆà×%Ñ%Ò4¨Ø—M‘MÒA T§_¡_×%AÑ%AØ$×1Ñ1Ø Ÿ™Ø ×)Ñ)Ø#×3Ñ3Ø"×1Ñ1Ø&*×&AÑ&AØ $× 5Ñ 5Ø(,×(EÑ(EØ%)×%?Ñ%?Ø $× 5Ñ 5Ø×+Ñ+ñ
ˆ
ð  	×)Ñ)¨(×*FÑ*FÈ
ÔSà×*Ñ*ˆ
ô �:˜zÔ*ð "�lˆGÜ�z ;Ô/Øœ4 
× 4Ñ 4Ó5Ñ5�Û �Ü# E§N¡NÐ4KÕLÙð !ð —‘Ð6Ô7à�<Š<ðØ×!Ñ! (§,¡,Ô/Ø15×1JÑ1J�
Ð-Ñ.ð ˜&Ñ!ˆØ�D‰=Ü<FÀtÓ<LÑ9ˆF�A�q˜( H¨d°EØ˜Ò!Ø8˜T×8Ñ8ÑF¸:ÑF�
Ø!�
×!Ñ!Ü(-×(HÑ(HØ $™Jñ#(ñ 2à+0ò2ð —‘Ð7¸Ô>Ø—‘Ð1°4Ô8Ø—‘Ð9¸4Ô@Ø%-ˆJ�zÑ"Ø%-ˆJ�zÑ"ð #(§)¡)Ð,AÀ4Ó"HÐØ×-Ñ-Ð.AÀ:ÔNà�N‰N˜6 4Ô(Ø�N‰N˜6 4Ô(Ø×5Ñ5Ø�N‰N˜>¨4Ó0ó2ˆ
�4Ñð ˆà�N‰NÐ-Ó.ò "Ø×!Ñ!ð 	ñ
 ö@˜^ô @ð (ˆNà)7ˆ
Ð%Ñ&àÐøôY ò Úðús   Å*K Ë	KËKc                óv   — |r| j                  | j                  ¬«      S | j                  | j                  ¬«      S )N)r”   )rs  r†  r…  )rx   r6  s     r8   Ú_create_clientzChannel._create_clienté  s/   € ÙØ—;‘;¨t¯©�;Ó?Ð?Ø�{‰{¨4¯9©9ˆ{Ó5Ð5r:   c                ó˜   — | j                  |¬«      }| j                  j                  |d   ¬«      | _        t        j                  di |¤ŽS )N©r6  r*  ©r*  rD   )r>  r{  r  r   ÚConnectionPool©rx   r6  r  s      r8   Ú	_get_poolzChannel._get_poolî  sI   € Ø×!Ñ!¨|Ð!Ó<ˆØ $× 5Ñ 5× <Ñ <ÀÀtÁÐ <Ó MˆÔÜ×#Ñ#Ñ- fÑ-Ð-r:   c                óæ   — t         j                  dk  rt        dj                  t         «      «      ‚| j                  r%t        j                  t        | j                  ¬«      S t         j                  S )N)r!   rl   r   zSRedis transport requires redis-py versions 3.2.0 or later. You have {0.__version__}r’   )	r   r¿   r   r  ru   Ú	functoolsÚpartialrœ   r    rø   s    r8   rr  zChannel._get_clientó  s_   € Ü�=‰=˜9Ò$Ü!ð+ß+1©6´%«=ó:ð :ð × Ò Ü×$Ñ$Ü#Ø!%×!6Ñ!6ôð ô
 �{‰{Ðr:   c              #  ó>   K  — |r|–— y | j                  «       –— y ­wrS   ©r@  ©rx   rM   s     r8   rÐ   zChannel.conn_or_acquire  s   è ø€ áØ‹Là×%Ñ%Ó'Ó'ùs   ‚c                ó\   — | j                   €| j                  «       | _         | j                   S rS   )r‚  rF  rø   s    r8   r…  zChannel.pool  s$   € à�:‰:ÐØŸ™Ó)ˆDŒJØ�z‰zÐr:   c                ó`   — | j                   €| j                  d¬«      | _         | j                   S )NTrB  )rƒ  rF  rø   s    r8   r†  zChannel.async_pool  s-   € à×ÑÐ#Ø#Ÿ~™~¸4˜~Ó@ˆDÔØ×ÑÐr:   c                ó&   — | j                  d¬«      S )z+Client used to publish messages, BRPOP etc.TrB  rK  rø   s    r8   rM   zChannel.client  s   € ð ×"Ñ"°Ð"Ó5Ð5r:   c                óF   — | j                  d¬«      }|j                  «       S )z1Pub/Sub connection used to consume fanout queues.TrB  )r@  r¥   rL  s     r8   r5  zChannel.subclient  s#   € ð ×$Ñ$°$Ð$Ó7ˆØ�}‰}‹Ðr:   c                óN   — | j                   j                  | j                  «       y rS   )rq  r3  r:  rø   s    r8   r¢  zChannel._update_queue_cycle  s   € Ø×Ñ× Ñ  ×!3Ñ!3Õ4r:   c                ó&   — ddl m} |j                  S )Nr   r(   )r   r)   r7   )rx   r)   s     r8   rt  zChannel._get_response_error"  s   € Ý$Ø×'Ñ'Ð'r:   c                ó\   — | j                   D �ch c]  }|| j                  vr|’Œ c}S c c}w )z<Set of queues being consumed from (excluding fanout queues).)Ú_active_queuesr=  )rx   r—  s     r8   r:  zChannel.active_queues&  s=   € ð $(×#6Ò#6ó ;Ñ#6˜%Ø × 9Ñ 9Ñ9ò Ð#6ñ ;ð 	;ùò ;s   �)rþ   rS   rÿ   )dr@   rA   rB   rC   r¸   Ú_clientÚ
_subclientr  Úsupports_fanoutrû  r{  ra  r/  r6  r   rb  rÄ   rÂ   rç   rè   rA  ræ   ÚPRIORITY_STEPSrm  re  rf  rg  rh  rl  rj  ÚDEFAULT_HEALTH_CHECK_INTERVALrk  rn  rc  rd  ru   ri  rƒ  r‚  r   r\  Úfrom_transport_optionsr   r.  r(  ÚSSLConnectionr4  r¡   rT   r~  r  ró   rœ  rž  r¡  r¦  r¤  r®  r°  r7  rª  r¾  rx  rÀ  r0  rw  rP  rÛ  ræ  r”  rè  rí  rð  ró  rü  r   r  r  r
  r  r  r  r  r"  r>  r@  rF  rr  r   rÐ   rZ  r…  r†  r   rM   r5  r¢  rt  r:  r™   rš   s   @r8   r\  r\  o  sg  ø„ Ùà
€Cà€GØ€JØ€HØ€OØ)€OØÐØ
€CØ€HØ€JØ€NØ€MØ€KØ'ÐØ'ÐØÐØ ÐØÐØ#€NØ€NØ!ÐØÐØ#ÐØÐØ€OØ9ÐØ€Kð €Mð €Oð
 Ðð4 )Ðà€KØ€Eð 	�‰×.Ñ.ð	ñ	ð ñ2 ,1�u×'Ò'°dÐÙ27˜5×.Ò.¸TÐô'CòR!ò
$òHð ,1óJõ"Fò 5ôò(4ôò(:ò
>ò	ò#ò
ò 	ò ó2;ò !ò,EòòBòò+òFòó/ò
6ò
ò+òPò'ôò*òð 7;Ø8<óò-ó Vóp6ó
.ò
ð ò(ó ð(ð ñó ðð
 ñ ó ð ð
 ñ6ó ð6ð ñó ðò
5ò(ð ñ;ó ô;r:   r\  c                  óÂ   ‡ — e Zd ZdZeZdZdZeZdZ	dZ
ej                  j                  j                  d eg d¢«      ¬«      Zer
 e«       \  ZZˆ fd„Zd	„ Zd
„ Zd„ Zˆ xZS )r-   zRedis Transport.Nr   r   T)Údirectr·  rõ  )r6  Úexchange_typec                ó    •— t         €t        d«      ‚t        ‰| �  |i |¤Ž t	        «       | _        | j                  �| j                  | _        y y )Nz)Missing redis library (pip install redis))r   ÚImportErrorr�   r¡   r  r  Úpolling_intervalry  rŽ   s      €r8   r¡   zTransport.__init__@  sQ   ø€ Üˆ=ÜÐIÓJÐJÜ‰Ñ˜$Ð) &Ò)ô (Ó)ˆŒ
à× Ñ Ð,Ø!%×!6Ñ!6ˆDÕð -r:   c                ó"   — t         j                  S rS   )r   Ú__version__rø   s    r8   Údriver_versionzTransport.driver_versionK  s   € Ü× Ñ Ð r:   c                óÌ  ‡‡‡‡‡‡	— | j                   Š‰j                  ‰j                  «       ‰j                  Š‰j                  Š| j
                  Š	ˆˆˆfd„}|‰_        ˆˆˆˆ	fd„Š‰j                  j                  ‰«       ‰j                  d‰j                  «       |j                  j                  j                  dt        «      }‰j                  |‰j                  «       y )Nc                óÄ   •— | j                   r‰j                  | j                   «       ‰j                  r	 ‰j                  j                  ‰«       y y # t        $ r Y y w xY wrS   )r  r©  rY  Úon_tickr  )r„   r  Úloopr>  s    €€€r8   Ú_on_disconnectz:Transport.register_with_event_loop.<locals>._on_disconnectU  sW   ø€ Ø×ÒØ—‘˜J×,Ñ,Ô-ð �yŠyðØ—L‘L×'Ñ'¨Õ6ð øô  ò Ùðús   ¶A Á	AÁAc                 ób   •—  ‰«        ‰j                   D � cg c]  }  ‰| ‰| «      ‘Œ c}  y c c} w rS   )rY  )r  Ú
add_readerr  Úcycle_poll_startrN  s    €€€€r8   r>  z9Transport.register_with_event_loop.<locals>.on_poll_startb  s+   ø€ ÙÔØ7<·y²yÓA±y°‰Z˜˜K¨Õ,°yÓAùÒAs   —,r   rk  )r  rB  r	  r>  rk  rN  r  rg  r  Úcall_repeatedlyrD  rM   Útransport_optionsrH  rY  rJ  )
rx   r„   rh  ri  rk  rk  r  rl  r>  rN  s
     `  @@@@@r8   Úregister_with_event_loopz"Transport.register_with_event_loopN  s¼   ý€ Ø—
‘
ˆØ×Ñ˜4Ÿ;™;Ô'Ø ×.Ñ.ÐØ—_‘_ˆ
Ø×&Ñ&ˆö
	ð +9ˆÔ'÷	Bð 	�‰×Ñ˜Ô'Ø×Ñ˜R ×!=Ñ!=Ô>Ø *× 1Ñ 1× CÑ C× GÑ GØ#Ü)ó!
Ðð 	×ÑØ!Ø×.Ñ.õ	
r:   c                ó:   — | j                   j                  |«       y)z1Handle AIO event for one of our file descriptors.N)r  rN  )rx   r   s     r8   rN  zTransport.on_readablep  s   € à�
‰
×Ñ˜vÕ&r:   )r@   rA   rB   rC   r\  ra  ry  ÚDEFAULT_PORTr0  Údriver_typeÚdriver_namer   r-   Ú
implementsÚextendÚ	frozensetr   r9   r%   r&   r¡   rd  ro  rN  r™   rš   s   @r8   r-   r-   -  sz   ø„ Ùà€GàÐØ€MØ€LØ€KØ€Kà×"Ñ"×-Ñ-×4Ñ4ØÙÒ =Ó>ð 5ó €Jñ
 Ù,CÓ,EÑ)Ð˜>ô	7ò!ò 
öD'r:   r-   c                  ó   — e Zd ZdZy)ÚSentinelManagedSSLConnectionzâConnect to a Redis server using Sentinel + TLS.

        Use Sentinel to identify which Redis server is the current master
        to connect to and when connecting to the Master server, use an
        SSL Connection.
        Nr?   rD   r:   r8   rx  rx  v  s   „ ñ	ð 	r:   rx  c                  ój   — e Zd ZdZej
                  dz   Zerej                  ndZere	ndZ
dd„Zdd„Zy)ÚSentinelChannela  Channel with explicit Redis Sentinel knowledge.

    Broker url is supposed to look like:

    .. code-block::

        sentinel://0.0.0.0:26379;sentinel://0.0.0.0:26380/...

    where each sentinel is separated by a `;`.

    Other arguments for the sentinel should come from the transport options
    (see `transport_options` of :class:`~kombu.connection.Connection`).

    You must provide at least one option in Transport options:
     * `master_name` - name of the redis group to poll

    Example:
    -------
    .. code-block:: python

        >>> import kombu
        >>> c = kombu.Connection(
             'sentinel://sentinel1:26379;sentinel://sentinel2:26379',
             transport_options={'master_name': 'mymaster'}
        )
        >>> c.connect()
    )Úmaster_nameÚmin_other_sentinelsÚsentinel_kwargsNc           	     óê  — | j                  |«      }|j                  «       }|j                  dd «       |j                  dd «       g }| j                  j                  j
                  D ]^  }t        |«      }|j                  dk(  sŒ|j                  xs | j                  j                  }|j                  |j                  |f«       Œ` |s|j                  |d   |d   f«       t        j                  |ft        | dd«      t        | dd «      dœ|¤Ž}t        | dd «      }|€t        d	«      ‚d
D �	ci c]  }	|	|v r|	||	   “Œ }
}	 |j                   |t"        j$                  fi |
¤Žj&                  S c c}	w )Nr$  r%  r   r|  r   r}  )r|  r}  r{  z1'master_name' transport option must be specified.)r  r  )r>  Úcopyrs   r„   rM   Úaltr   r;  r%  r0  rÇ   r/  r   ÚSentinelr)  r  Ú
master_forr   r    r”   )rx   r6  r   Úadditional_paramsÚ	sentinelsÚurlr%  Úsentinel_instr{  ÚkÚmaster_kwargss              r8   Ú_sentinel_managed_poolz&SentinelChannel._sentinel_managed_pool¨  s’  € Ø×%Ñ% lÓ3ˆ
à&ŸO™OÓ-Ðà×Ñ˜f dÔ+Ø×Ñ˜f dÔ+àˆ	Ø—?‘?×)Ñ)×-Ô-ˆCÜ˜S“/ˆCØ�z‰z˜ZÓ'Ø—x‘xÒ? 4§?¡?×#?Ñ#?�Ø× Ñ  #§,¡,°Ð!5Õ6ð	 .ñ Ø×Ñ˜j¨Ñ0°*¸VÑ2DÐEÔFä ×)Ñ)Øð!ä '¨Ð.CÀQÓ GÜ# DÐ*;¸TÓBñ!ð  ñ	!ˆô ˜d M°4Ó8ˆàÐÜØCóð ñ .ó
á-�°Ð6GÑ1Gð Ð  Ñ#Ñ#Ø-ð 	ð 
ð
 (ˆ}×'Ñ'ØÜ�K‰Kñ
ð ñ
÷ ‰/ð		ùò
s   Ä1E0c                ó�   — | j                  |¬«      }| j                  j                  |d   ¬«      | _        | j                  |«      S )NrB  r*  rC  )r>  r{  r  r‰  rE  s      r8   rF  zSentinelChannel._get_poolÓ  sF   € Ø×!Ñ!¨|Ð!Ó<ˆØ $× 5Ñ 5× <Ñ <ÀÀtÁÐ <Ó MˆÔØ×*Ñ*¨<Ó8Ð8r:   rþ   )r@   rA   rB   rC   r\  rZ  r   ÚSentinelManagedConnectionr(  rx  r4  r‰  rF  rD   r:   r8   rz  rz  ƒ  sH   „ ñð8 %×;Ñ;ð ?ñ Ðñ
 >F�x×9Ò9È4ÐÙ;CÑ7ÈÐó)ôV9r:   rz  c                  ó   — e Zd ZdZdZeZy)ÚSentinelTransportzRedis Sentinel Transport.ig  N)r@   rA   rB   rC   r0  rz  r\  rD   r:   r8   r�  r�  Ù  s   „ Ù#à€LØ�Gr:   r�  )UrC   Ú
__future__r   rH  rÞ  r.   r   Úcollectionsr   Ú
contextlibr   Úimportlib.metadatar   r—  r   r	   Úpackaging.versionr
   Úviner   Úkombu.exceptionsr   r   Ú	kombu.logr   Úkombu.utilsr   Úkombu.utils.compatr   Úkombu.utils.encodingr   Úkombu.utils.eventior   r   r   Úkombu.utils.functionalr   Úkombu.utils.jsonr   r   Úkombu.utils.objectsr   Úkombu.utils.schedulingr   Úkombu.utils.urlr   rŸ   r   r   r*  r`  r   r   ÚloggerÚcriticalrÈ  r•  rq  r  rY  rX  r$   r9   r<   r}  r>   rQ   rV   rX   r    rœ   rM   r¨   r“   ÚPubSubr¤   r¸   r  r\  r-   r‹  r[  rx  rz  r�  rD   r:   r8   Ú<module>r¢     s  ðñ4õl #ã Û Û Ý Ý "Ý %Ý &Ý Ý å %Ý ç @Ý  Ý &Ý 2Ý -ß /Ñ /Ý 3ß )Ý /Ý 0Ý &å ð.ÛÙ)0±¸Ó1AÓ)BÁgÈgÓFVÑ)VÐ&ð
ß2ñ 
Ð+Ó	,€Ø—‘ §¡€€€gà€Ø€
à "Ð â€áÐ.ð 1ó €ò(ò4&ô4�	ô 4ð ñó ðò,÷P
ñ P
ôf
Ð.°·±ô 
ô
>Ð0°%·,±,×2GÑ2Gô 
>ô1K˜%Ÿ,™,×-Ñ-ô 1Kôhh/ˆ'�+‰+ô h/÷V_ ñ _ ôD{
;ˆg�o‰oô {
;ô|E'�×!Ñ!ô E'ñP ô
Ø×.Ñ.Ø×Ñô
ôS9�gô S9ôl˜	õ øðE, ò .Ø€EØ)-Ó&ð.ûð ò Ø€HØÓðús$   ÂG+ Â2G; Ç+	G8Ç7G8Ç;	HÈH