§
    ÌtºfÕ–  ã                   óâ   — d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ	 d dl
mZ d dlmZmZmZ d dlmZmZ d dlmZmZ d dlmZ d	Zdd
„Zdd„Z G d„ de¦  «        Z G d„ d	e¦  «        Zdd„ZdS )é    N)Úpartial)ÚObservableMixin)Ú	parse_url)ÚComponentConfigÚSubscribeOptionsÚRegisterOptions)ÚSessionNotReadyÚApplicationError)Úcreate_authenticatorÚIAuthenticator)ÚSERID_TO_SERÚ	Componentc                 ó>  — |r || ¦  «         n$t          | t          ¦  «        st          d¦  «        ‚t          | t          ¦  «        �rTd| vrt          d¦  «        ‚| d         dvr(t          d                     | d         ¦  «        ¦  «        ‚|                      ¦   «         D ](}|dvr"t          d                     |¦  «        ¦  «        ‚Œ)| d         dk    rXd	D ](}|| vr"t          d
                     |¦  «        ¦  «        ‚Œ)dD ](}|| v r"t          d                     |¦  «        ¦  «        ‚Œ)dS | d         dk    rXdD ](}|| vr"t          d                     |¦  «        ¦  «        ‚Œ)dD ](}|| v r"t          d                     |¦  «        ¦  «        ‚Œ)dS J d¦   «         ‚dS )z9
    Check a WAMP connecting endpoint configuration.
    z'endpoint' must be a dictÚtypez)'type' required in endpoint configuration)ÚtcpÚunixzinvalid type "{}" in endpoint)r   ÚhostÚportÚpathÚtlsÚtimeoutÚversionz*Invalid key '{}' in endpoint configurationr   ©r   r   z&'{}' required in 'tcp' endpoint config)r   z''{}' not valid in 'tcp' endpoint configr   z('{}' required for 'unix' endpoint config)r   r   r   z('{}' not valid in 'unix' endpoint configFúshould not arrive hereN)Ú
isinstanceÚdictÚ
ValueErrorÚformatÚkeys)ÚendpointÚcheck_native_endpointÚks      úV/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/autobahn/wamp/component.pyÚ_validate_endpointr$   1   sQ  € ð ð 
ØÐ˜hÑ'Ô'Ð'Ð'Ý˜¥$Ñ'Ô'ð 
ÝØ'ñ
ô 
ð 	
õ �(�DÑ!Ô!ñ &3ð ˜Ð!Ð!åÐHÑIÔIÐIØ�FÔ ?Ð2Ð2ÝÐ<×CÒCÀHÈVÔDTÑUÔUÑVÔVÐVà—’‘”ð 	ð 	ˆAØÐUÐUÐUÝ Ø@×GÒGÈÑJÔJñô ð ð Vð
 �FÔ˜uÒ$Ð$Ø%ð ð �Ø˜HÐ$Ð$Ý$Ø@×GÒGÈÑJÔJñô ð ð %ð ð ð �Ø˜�=�=Ý$ØA×HÒHÈÑKÔKñô ð ð !ðð ð
 �fÔ Ò'Ð'Øð ð �Ø˜HÐ$Ð$Ý$ØB×IÒIÈ!ÑLÔLñô ð ð %ð -ð ð �Ø˜�=�=Ý$ØB×IÒIÈ!ÑLÔLñô ð ð !ðð ð 3Ð2Ñ2Ô2Ð2ðM&3ð &3ó    c                 ó 	  — t          |¦  «        t          k    r/t          d                     t          |¦  «        ¦  «        ¦  «        ‚g d¢}|                     ¦   «         D ](}||vr"t          d                     |¦  «        ¦  «        ‚Œ)d}d|v r;|d         dvr(t          d                     |d         ¦  «        ¦  «        ‚|d         }nd|d<   d|v r|dk    rt          d	¦  «        ‚|                     dd
¦  «        }|�h|                     ¦   «         D ](}|dvr"t          d                     |¦  «        ¦  «        ‚Œ)dD ](}||vr"t          d                     |¦  «        ¦  «        ‚Œ)t          ¦   «         }d|v rL|d         }t          |t          ¦  «        s/t          d                     t          |¦  «        ¦  «        ¦  «        ‚|                     d¦  «        }|dk    �r]dD ](}	|	|vr"t          d                     |	¦  «        ¦  «        ‚Œ)d|vr$t          |d         ¦  «        \  }
}}}}}d|||
dœ}n|d         }t          ||¦  «         d|v rt          d¦  «        ‚d|v rÁt          |d         t          t          f¦  «        st          d¦  «        ‚t          d„ |d         D ¦   «         ¦  «        st          d¦  «        ‚t          j        ¦   «         }|d         D ]F}||vr@t          d                     |d                     d„ |D ¦   «         ¦  «        ¦  «        ¦  «        ‚ŒG|                     ddd g¦  «        }�n|d!k    �rd|vrŽ|d                              d"¦  «        rt!          |d         ¦  «        \  }}}nF|d                              d#¦  «        rt          |d         ¦  «        \  }}}}}}nt#          ¦   «         ‚|d$k    rd$|d%œ}nd||d&œ}n|d         }d|v rt          d'¦  «        ‚|�t          d(¦  «        ‚d|v r;t          |d         t$          t$          f¦  «        st          d)¦  «        ‚|d         g}ndg}n
J d+¦   «         ‚i }d,D ]}	|	|v r||	         ||	<   Œt'          | f||                     dd
¦  «        |||||d-œ|¤ŽS ).a   
    Internal helper to insert defaults and create _Transport instances.

    :param transport: a (possibly valid) transport configuration
    :type transport: dict

    :returns: a _Transport instance

    :raises: ValueError on invalid configuration
    z<invalid type {} for transport configuration - must be a dict)r   Úurlr    Ú
serializerÚserializersÚoptionsÚmax_retriesÚmax_retry_delayÚinitial_retry_delayÚretry_delay_growthÚretry_delay_jitterÚproxyÚheadersz&'{}' is not a valid configuration itemÚ	websocketr   )r2   Ú	rawsocketzInvalid transport type {}r0   z3proxy= only supported for type=websocket transportsNr   z Unknown key '{}' in proxy configzProxy config requires '{}'r*   zoptions must be a dict, not {}r1   )r'   zTransport requires '{}' keyr    r'   r   )r   r   r   r   r(   z5'serializer' is only for rawsocket; use 'serializers'r)   z''serializers' must be a list of stringsc                 óF   — g | ]}t          |t          t          f¦  «        ‘ŒS © )r   Ústr©Ú.0Úss     r#   ú
<listcomp>z%_create_transport.<locals>.<listcomp>¿   s6   € ð 7ð 7ð 7àõ ˜q¥3­ *Ñ-Ô-ð7ð 7ð 7r%   z-Invalid serializer '{}' (expected one of: {})z, c                 ó,   — g | ]}t          |¦  «        ‘ŒS r5   )Úreprr7   s     r#   r:   z%_create_transport.<locals>.<listcomp>É   s   € Ð&JÐ&JÐ&J°1¥t¨A¡w¤wÐ&JÐ&JÐ&Jr%   ÚcborÚjsonr3   ÚrsÚwsr   )r   r   )r   r   r   z5'serializers' is only for websocket; use 'serializer'z/'headers' not supported for rawsocket transportz'serializer' must be a stringFr   )r+   r,   r-   r.   r/   )Úkindr'   r    r)   r0   r*   r1   )r   r   r   r   r   ÚgetÚformaTr   Úparse_ws_urlr$   ÚlistÚtupleÚallr   ÚjoinÚ
startswithÚparse_rs_urlÚRuntimeErrorr6   Ú
_Transport)ÚindexÚ	transportr!   Úvalid_transport_keysr"   rA   r0   r*   r1   ÚkeyÚ	is_securer   r   Úresourcer   ÚparamsÚendpoint_configÚvalid_serializersÚserialÚserializer_configÚisSecureÚkws                         r#   Ú_create_transportrZ   j   s÷  € õ ˆI�„�$ÒÐÝÐW×^Ò^Õ_cÐdmÑ_nÔ_nÑoÔoÑpÔpÐpðð ð Ðð
 �^Š^ÑÔð ð ˆØÐ(Ð(Ð(ÝØ8×?Ò?ÀÑBÔBñô ð ð )ð
 €DØ�ÐÐØ�VÔÐ$>Ð>Ð>ÝÐ8×?Ò?À	È&Ô@QÑRÔRÑSÔSÐSØ˜Ô ˆˆà'ˆ	�&Ñà�)ÐÐ ¨Ò 3Ð 3ÝØAñ
ô 
ð 	
ð �MŠM˜' 4Ñ(Ô(€EØÐØ—’‘”ð 	ð 	ˆAØÐ(Ð(Ð(Ý Ø6×=Ò=¸aÑ@Ô@ñô ð ð )ð "ð 	ð 	ˆAØ˜ˆ~ˆ~Ý Ø0×7Ò7¸Ñ:Ô:ñô ð ð õ
 ‰fŒf€GØ�IÐÐØ˜IÔ&ˆÝ˜'¥4Ñ(Ô(ð 	ÝØ0×7Ò7½¸W¹¼ÑFÔFñô ð ð �mŠm˜IÑ&Ô&€Gàˆ{ÒÑØð 	Lð 	LˆCØ˜)Ð#Ð#Ý Ð!>×!EÒ!EÀcÑ!JÔ!JÑKÔKÐKð $ð ˜YÐ&Ð&Ý<HÈÐSXÔIYÑ<ZÔ<ZÑ9ˆI�t˜T 8¨T°6àØØØ ð	ð ˆOˆOð (¨
Ô3ˆOÝ˜Ð0EÑFÔFÐFà˜9Ð$Ð$ÝÐTÑUÔUÐUØ˜IÐ%Ð%Ý˜i¨Ô6½½u¸ÑFÔFð LÝ Ð!JÑKÔKÐKÝð 7ð 7à& }Ô5ð7ñ 7ô 7ñ 8ô 8ð Lõ !Ð!JÑKÔKÐKÝ ,Ô 1Ñ 3Ô 3ÐØ# MÔ2ð ð �ØÐ!2Ð2Ð2Ý$ØG×NÒNØ"Ø ŸIšIÐ&JÐ&JÐ8IÐ&JÑ&JÔ&JÑKÔKñô ñô ð ð 3ð &ŸMšM¨-¸&À&Ð9IÑJÔJÐÑà	�Ò	Ñ	Ø˜YÐ&Ð&Ø˜Ô×*Ò*¨4Ñ0Ô0ð %å'3°I¸eÔ4DÑ'EÔ'EÑ$�˜$  Ø˜5Ô!×,Ò,¨TÑ2Ô2ð %å?KÈIÐV[ÔL\Ñ?]Ô?]Ñ<�˜$  h°°f°få"‘n”nÐ$Ø�vŠ~ˆ~ð #Ø ð#ð #��ð "Ø Ø ð#ð #��ð (¨
Ô3ˆOØ˜IÐ%Ð%ÝÐTÑUÔUÐUØÐÝÐNÑOÔOÐOà˜9Ð$Ð$Ý˜i¨Ô5½½S°zÑBÔBð BÝ Ð!@ÑAÔAÐAØ!*¨<Ô!8Ð 9ÐÐà!' ÐÐð 	/Ð.Ñ.Ô.Ð.à	€Bð<ð %ð %ˆà�)ÐÐØ ”nˆBˆs‰GøåØð
àØ�MŠM˜% Ñ&Ô&Ø Ø%ØØØð
ð 
ð ð
ð 
ð 
r%   c                   óH   — e Zd ZdZ	 	 	 	 	 	 	 	 dd„Zd„ Zd	„ Zd
„ Zd„ Zd„ Z	dS )rL   z@
    Thin-wrapper for WAMP transports used by a Connection.
    éÿÿÿÿé,  ç      ø?çš™™™™™¹?Nc                 ól  — |€t          ¦   «         }|| _        || _        || _        || _        || _        || _        || _        | j        dk    r"t          |¦  «        dk    rt          d¦  «        ‚|| _
        || _        || _        |	| _        |
| _        || _        d| _        |                      ¦   «          dS )z	
        Nr3   é   z5'rawsocket' transport requires exactly one serializerF)r   Úidxr   r'   r    r*   r1   r)   Úlenr   r+   r,   r-   r.   r/   r0   Ú_permanent_failureÚreset)Úselfrb   rA   r'   r    r)   r+   r,   r-   r.   r/   r0   r*   r1   s                 r#   Ú__init__z_Transport.__init__  sÄ   € ð ˆ?Ý‘f”fˆGØˆŒàˆŒ	ØˆŒØ ˆŒØˆŒØˆŒà&ˆÔØŒ9˜Ò#Ð#­¨KÑ(8Ô(8¸AÒ(=Ð(=ÝØGñô ð ð 'ˆÔØ.ˆÔØ#6ˆÔ Ø"4ˆÔØ"4ˆÔØˆŒ
ð #(ˆÔà�
Š
‰Œˆˆˆr%   c                 óH   — d| _         d| _        d| _        | j        | _        dS )zP
        set connection failure rates and retry-delay to initial values
        r   N)Úconnect_attemptsÚconnect_sucessesÚconnect_failuresr-   Úretry_delay©rf   s    r#   re   z_Transport.reset5  s-   € ð !"ˆÔØ !ˆÔØ !ˆÔØÔ3ˆÔÐÐr%   c                 ó   — d| _         dS )z¸
        Mark this transport as failed, meaning we won't try to connect to
        it any longer (that is: can_reconnect() will always return
        False afer calling this).
        TN)rd   rm   s    r#   Úfailedz_Transport.failed>  s   € ð #'ˆÔÐÐr%   c                 óT   — | j         rdS | j        dk    rdS | j        | j        dz   k     S )NFr\   Tra   )rd   r+   ri   rm   s    r#   Úcan_reconnectz_Transport.can_reconnectF  s;   € ØÔ"ð 	Ø�5ØÔ˜rÒ!Ð!Ø�4ØÔ$ tÔ'7¸!Ñ';Ò;Ð;r%   c                 ó<  — | j         dk    rdS | j        dk    r"| j         | j        dz   k    rt          d¦  «        ‚| j        | j        z  | _        t          j        | j        | j        | j        z  ¦  «        | _        | j        | j        k    r| j        | _        | j        S )Nr   r\   ra   zmax reconnects reached)	ri   r+   rK   rl   r.   ÚrandomÚnormalvariater/   r,   rm   s    r#   Ú
next_delayz_Transport.next_delayM  s¤   € ØÔ  AÒ%Ð%à�1ØÔ Ò#Ð#¨Ô(=ÀÔAQÐTUÑAUÒ(UÐ(UÝÐ7Ñ8Ô8Ð8à#Ô/°$Ô2IÑIˆDÔÝ%Ô3°DÔ4DÀdÔFVÐY]ÔYpÑFpÑqÔqˆDÔØÔ $Ô"6Ò6Ð6Ø#'Ô#7�Ô ØÔ#Ð#r%   c                 óx   — t          | j        t          ¦  «        r| j        d         S t          | j        ¦  «        S )zF
        returns a human-readable description of the endpoint
        r   )r   r    r   r<   rm   s    r#   Údescribe_endpointz_Transport.describe_endpointZ  s5   € õ �d”m¥TÑ*Ô*ð 	)Ø”= Ô(Ð(Ý�D”MÑ"Ô"Ð"r%   )r\   r]   r^   r^   r_   NNN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__rg   re   ro   rq   ru   rw   r5   r%   r#   rL   rL     s˜   € € € € € ðð ð
  Ø!$Ø%(Ø$'Ø$'ØØØð&ð &ð &ð &ðP4ð 4ð 4ð'ð 'ð 'ð<ð <ð <ð$ð $ð $ð#ð #ð #ð #ð #r%   rL   c                   ór   — e Zd ZdZdZ	 dd„Zdd„Z	 	 dd„Zd„ Zdd	„Z	d
„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r   z‚
    A WAMP application component. A component holds configuration for
    (and knows how to create) transports and sessions.
    NFc                 óP   ‡ ‡‡‡— ‰�t          ‰t          ¦  «        sJ ‚ˆˆˆ ˆfd„}|S )a[  
        A decorator as a shortcut for subscribing during on-join

        For example::

            @component.subscribe(
                "some.topic",
                options=SubscribeOptions(match='prefix'),
            )
            def topic(*args, **kw):
                print("some.topic({}, {}): event received".format(args, kw))
        Nc                 óF   •‡ — ˆˆ ˆˆfd„}‰                      d|¦  «         ‰ S )Nc                 ó6   •— |                       ‰‰‰‰¬¦  «        S )N)Útopicr*   Úcheck_types)Ú	subscribe)ÚsessionÚdetailsr�   Úfnr*   r€   s     €€€€r#   Údo_subscriptionz?Component.subscribe.<locals>.decorator.<locals>.do_subscriptionƒ  s!   ø€ Ø×(Ò(¨°5À'ÐWbÐ(ÑcÔcÐcr%   rH   ©Úon)r…   r†   r�   r*   rf   r€   s   ` €€€€r#   Ú	decoratorz&Component.subscribe.<locals>.decorator�  sM   øø€ ðdð dð dð dð dð dð dð dà�GŠG�F˜OÑ,Ô,Ð,ØˆIr%   )r   r   )rf   r€   r*   r�   r‰   s   ```` r#   r‚   zComponent.subscriber  sP   øøøø€ ð ˆ¥*¨WÕ6FÑ"GÔ"Gˆˆˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð Ðr%   c                 óP   ‡ ‡‡‡— ‰�t          ‰t          ¦  «        sJ ‚ˆˆˆ ˆfd„}|S )aZ  
        A decorator as a shortcut for registering during on-join

        For example::

            @component.register(
                "com.example.add",
                options=RegisterOptions(invoke='roundrobin'),
            )
            def add(*args, **kw):
                print("add({}, {}): event received".format(args, kw))
        Nc                 óF   •‡ — ˆˆ ˆˆfd„}‰                      d|¦  «         ‰ S )Nc                 ó6   •— |                       ‰‰‰‰¬¦  «        S )N)Ú	procedurer*   r�   )Úregister)rƒ   r„   r�   r…   r*   Úuris     €€€€r#   Údo_registrationz>Component.register.<locals>.decorator.<locals>.do_registrationš  s!   ø€ Ø×'Ò'¨°cÀ7ÐXcÐ'ÑdÔdÐdr%   rH   r‡   )r…   r�   r�   r*   rf   r�   s   ` €€€€r#   r‰   z%Component.register.<locals>.decorator˜  sM   øø€ ðeð eð eð eð eð eð eð eà�GŠG�F˜OÑ,Ô,Ð,ØˆIr%   )r   r   )rf   r�   r*   r�   r‰   s   ```` r#   rŽ   zComponent.register‰  sO   øøøø€ ð ˆ¥*¨WµoÑ"FÔ"Fˆˆˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð Ðr%   Úrealm1c	                 ó¢  — |                       g d¢¦  «         |�t          |¦  «        st          d¦  «        ‚|| _        |�t          |¦  «        st          d¦  «        ‚|| _        |€d}t          |t          t          f¦  «        r|}	d|	dœ}
|
g}nt          |t          ¦  «        r|g}g | _        t          |¦  «        D ]S\  }}
t          |
¦  «        t          k    rd|
dœ}n|
}| j                             t          ||| j        ¦  «        ¦  «         ŒT|pi | _        |r|| _        || _        || _        d| _        d| _        d| _        d| _        dS )	a  
        :param main: After a transport has been connected and a session
            has been established and joined to a realm, this (async)
            procedure will be run until it finishes -- which signals that
            the component has run to completion. In this case, it usually
            doesn't make sense to use the ``on_*`` kwargs. If you do not
            pass a main() procedure, the session will not be closed
            (unless you arrange for .leave() to be called).

        :type main: callable taking two args ``reactor`` and ``ISession``

        :param transports: Transport configurations for creating
            transports. Each transport can be a WAMP URL, or a dict
            containing the following configuration keys:

                - ``type`` (optional): ``websocket`` (default) or ``rawsocket``
                - ``url``: the router URL
                - ``endpoint`` (optional, derived from URL if not provided):
                    - ``type``: "tcp" or "unix"
                    - ``host``, ``port``: only for TCP
                    - ``path``: only for unix
                    - ``timeout``: in seconds
                    - ``tls``: ``True`` or (under Twisted) an
                      ``twisted.internet.ssl.IOpenSSLClientComponentCreator``
                      instance (such as returned from
                      ``twisted.internet.ssl.optionsForClientTLS``) or
                      ``CertificateOptions`` instance.
                - ``max_retries``: Maximum number of reconnection attempts. Unlimited if set to -1.
                - ``initial_retry_delay``: Initial delay for reconnection attempt in seconds (Default: 1.0s).
                - ``max_retry_delay``: Maximum delay for reconnection attempts in seconds (Default: 60s).
                - ``retry_delay_growth``: The growth factor applied to the retry delay between reconnection attempts (Default 1.5).
                - ``retry_delay_jitter``: A 0-argument callable that introduces nose into the delay. (Default random.random)
                - ``serializer`` (only for raw socket): Specify an accepted serializer (e.g. 'json', 'msgpack', 'cbor', 'ubjson', 'flatbuffers')
                - ``serializers``: Specify list of accepted serializers
                - ``options``: tbd
                - ``proxy``: tbd

        :type transports: None or str or list

        :param realm: the realm to join
        :type realm: str

        :param authentication: configuration of authenticators
        :type authentication: dict

        :param session_factory: if None, ``ApplicationSession`` is
            used, otherwise a callable taking a single ``config`` argument
            that is used to create a new `ApplicationSession` instance.

        :param is_fatal: a callable taking a single argument, an
            ``Exception`` instance. The callable should return ``True`` if
            this error is "fatal", meaning we should not try connecting to
            the current transport again. The default behavior (on None) is
            to always return ``False``
        )ÚstartÚconnectrH   ÚreadyÚleaveÚ
disconnectÚconnectfailureNz%"is_fatal" must be a callable or Nonez""main" must be a callable if givenzws://127.0.0.1:8080/wsr2   )r   r'   F)Úset_valid_eventsÚcallabler   Ú	_is_fatalÚ_entryr   r6   r   Ú_transportsÚ	enumerater   ÚappendrZ   Ú_check_native_endpointÚ_authenticationÚsession_factoryÚ_realmÚ_extraÚ_delay_fÚ_done_fÚ_sessionÚ	_stopping)rf   ÚmainÚ
transportsÚconfigÚrealmÚextraÚauthenticationr¢   Úis_fatalr'   rN   rb   Ú
_transports                r#   rg   zComponent.__init__   s²  € ðr 	×Òðð ð ñ
	
ô 
	
ð 
	
ð Ð­°Ñ(:Ô(:ÐÝÐDÑEÔEÐEØ!ˆŒàÐ¥H¨T¡N¤NÐÝÐAÑBÔBÐBØˆŒð ÐØ1ˆJõ �j¥3­ *Ñ-Ô-ð 	&ØˆCð $Øðð ˆIð $˜ˆJˆJõ ˜
¥DÑ)Ô)ð 	&Ø$˜ˆJð ˆÔÝ'¨
Ñ3Ô3ð 	ð 	‰NˆC�å�I‰Œ¥#Ò%Ð%à'Ø$ðð �
�
ð
 '�
ØÔ×#Ò#Ý! # z°4Ô3NÑOÔOñô ð ð ð
  .Ð3°ˆÔàð 	3Ø#2ˆDÔ ØˆŒØˆŒàˆŒØˆŒØˆŒØˆŒˆˆr%   c                 óH   — | j         D ]}|                     ¦   «         r dS ŒdS )NTF)r�   rq   )rf   rN   s     r#   Ú_can_reconnectzComponent._can_reconnect  s9   € àÔ)ð 	ð 	ˆIØ×&Ò&Ñ(Ô(ð Ø�t�tðàˆur%   c                 óÆ  ‡ ‡‡‡‡‡‡	‡
— ‰ j         �5t          j        ¦   «         Šˆfd„}t          j        ‰ j         ||¦  «         ‰S t          j        ¦   «         ‰ _         ˆ fd„}t          j        ‰ j         ||¦  «         t	          j        ‰ j        ¦  «        Š
dgŠˆ fd„Šˆˆ ˆˆ	fd„Šˆˆˆ ˆˆ
fd„Š	‰                      d‰‰ ¦  «        }t          j        |‰	‰¦  «         ‰ j         S )	aˆ  
        This starts the Component, which means it will start connecting
        (and re-connecting) to its configured transports. A Component
        runs until it is "done", which means one of:

        - There was a "main" function defined, and it completed successfully;
        - Something called ``.leave()`` on our session, and we left successfully;
        - ``.stop()`` was called, and completed successfully;
        - none of our transports were able to connect successfully (failure);

        :returns: a Future/Deferred which will resolve (to ``None``) when we are
            "done" or with an error if something went wrong.
        Nc                 ó2   •— t          j        ‰| ¦  «         d S ©N)ÚtxaioÚresolve)ÚargÚds    €r#   Ú_cbzComponent._start.<locals>._cb;  s   ø€ Ý”˜a Ñ%Ô%Ð%Ð%Ð%r%   c                 ó   •— d‰_         | S )z}
            if the _done_f future is resolved (good or bad), we want to set it
            to None in our class
            N)r¦   )r¸   rf   s    €r#   Ú_resetz Component._start.<locals>._resetE  s   ø€ ð
  ˆDŒLØˆJr%   r   c                 óH  •— d ‰_         ‰j        rt          j        ‰j        d ¦  «         d S ‰j                             dt          j        | ¦  «        ¬¦  «         ‰j                             dt          j	        | ¦  «        ¬¦  «         t          j
        ‰j        | ¦  «         d S )NzInternal error {msg}©Úmsgú{tb}©Útb)r¥   r¨   r¶   r·   r¦   ÚlogÚinfoÚfailure_messageÚdebugÚfailure_format_tracebackÚreject)Úfailrf   s    €r#   ÚerrorzComponent._start.<locals>.errorU  s’   ø€ Ø ˆDŒMØŒ~ð 	1õ
 ”˜dœl¨DÑ1Ô1Ð1Ð1Ð1à”—’Ð4½%Ô:OÐPTÑ:UÔ:U�ÑVÔVÐVØ”—’˜v­%Ô*HÈÑ*NÔ*N�ÑOÔOÐOÝ”˜Tœ\¨4Ñ0Ô0Ð0Ð0Ð0r%   c                 ó¶   •‡‡— d ‰_         ˆˆˆ	fd„Šˆfd„Šˆˆfd„}ˆfd„}t          j        ‰j        ‰‰d         ¦  «        }t          j        |||¦  «         d S )Nc                 óÐ  •— ‰j                              dt          j        | ¦  «        ¬¦  «         ‰j                              dt          j        | ¦  «        ¬¦  «         t          | j        t          ¦  «        r4‰j                              d| j         	                    ¦   «         ¬¦  «         nÊt          | j        t          ¦  «        r/‰j                              dt          j        | ¦  «        ¬¦  «         n�‰                     | j        ¦  «        r9| j        j        d         d         \  }}}‰j                              d	|¬
¦  «         n.‰j                              dt          j        | ¦  «        ¬¦  «         ‰j        €d}n‰                     | j        ¦  «        }|r4‰j                              d¦  «         ‰d                              ¦   «          t          j        d‰d ¦  «         d S )Nzcomponent failed: {error})rÊ   rÀ   rÁ   z{msg}r¾   z&Connection failed with OS error: {msg}r   zTLS failure: {reason})ÚreasonzConnection failed: {error}Fz"Error was fatal; failing transport)rÃ   rÆ   r¶   rÅ   rÇ   r   Úvaluer
   rÊ   Úerror_messageÚOSErrorrÄ   Ú_is_ssl_errorÚargsr›   ro   Ú
call_later)rÉ   Ússl_libÚssl_funcÚ
ssl_reasonr¯   rf   Útransport_candidateÚtransport_checks        €€€r#   Úhandle_connect_errorzGComponent._start.<locals>.attempt_connect.<locals>.handle_connect_errore  s¼  ø€ ð ”—’Ð:Å%ÔBWÐX\ÑB]ÔB]�Ñ^Ô^Ð^Ø”—’˜v­%Ô*HÈÑ*NÔ*N�ÑOÔOÐOõ ˜dœjÕ*:Ñ;Ô;ð Ø”H—N’N 7°´
×0HÒ0HÑ0JÔ0J�NÑKÔKÐKÐKå ¤
­GÑ4Ô4ð ð ”H—M’MÐ"JÕPUÔPeÐfjÑPkÔPk�MÑlÔlÐlÐlà×'Ò'¨¬
Ñ3Ô3ð ð 59´J´OÀAÔ4FÀqÔ4IÑ1�G˜X zØ”H—N’NÐ#:À:�NÑNÔNÐNÐNà”H—N’NØ4Ý#Ô3°DÑ9Ô9ð #ñ ô ð ð
 ”>Ð)Ø$�H�Hà#Ÿ~š~¨d¬jÑ9Ô9�HØð 4Ø”H—M’MÐ"FÑGÔGÐGØ'¨Ô*×1Ò1Ñ3Ô3Ð3åÔ   O°TÑ:Ô:Ð:Ø�r%   c                 ó¦   •‡ ‡— t          j        ¦   «         Š‰                     d‰‰ j        ¦  «        }t          j        |ˆˆ fd„ˆˆ fd„¦  «         ‰S )Nr˜   c                 ó.   •— t          j        ‰‰¦  «        S rµ   ©r¶   rÈ   ©Ú_Úchain_frÉ   s    €€r#   ú<lambda>zYComponent._start.<locals>.attempt_connect.<locals>.notify_connect_error.<locals>.<lambda>ž  ó   ø€ �eœl¨7°DÑ9Ô9€ r%   c                 ó.   •— t          j        ‰‰¦  «        S rµ   rÜ   rÝ   s    €€r#   rà   zYComponent._start.<locals>.attempt_connect.<locals>.notify_connect_error.<locals>.<lambda>Ÿ  rá   r%   )r¶   Úcreate_futureÚfirerÎ   Úadd_callbacks)rÉ   Ú	handler_frß   rf   s   ` @€r#   Únotify_connect_errorzGComponent._start.<locals>.attempt_connect.<locals>.notify_connect_error•  sj   øøø€ ÝÔ-Ñ/Ô/�ð
 !ŸIšIÐ&6¸¸d¼jÑIÔI�	ÝÔ#ØØ9Ð9Ð9Ð9Ð9Ø9Ð9Ð9Ð9Ð9ñô ð ð
 �r%   c                 óJ   •—  ‰| ¦  «        }t          j        |d ‰¦  «         d S rµ   )r¶   rå   )rÉ   Únotify_frÙ   rç   s     €€r#   Úconnect_errorz@Component._start.<locals>.attempt_connect.<locals>.connect_error£  s/   ø€ Ø/Ð/°Ñ5Ô5�ÝÔ# H¨dÐ4HÑIÔIÐIÐIÐIr%   c                 ó<   •— t          j        ‰j        d ¦  «         d S rµ   )r¶   r·   r¦   )Úxrf   s    €r#   Úsession_donez?Component._start.<locals>.attempt_connect.<locals>.session_done§  s   ø€ Ý”˜dœl¨DÑ1Ô1Ð1Ð1Ð1r%   r   )r¥   r¶   Ú	as_futureÚ_connect_oncerå   )
rÞ   rê   rí   Ú	connect_frÙ   rç   Úlooprf   r×   rØ   s
       @@€€€€r#   Úattempt_connectz)Component._start.<locals>.attempt_connectb  sÇ   øøø€ Ø ˆDŒMð.ð .ð .ð .ð .ð .ð .ð`ð ð ð ð ðJð Jð Jð Jð Jð Jð2ð 2ð 2ð 2ð 2õ œØÔ"ØÐ)¨!Ô,ñô ˆIõ Ô 	¨<¸ÑGÔGÐGÐGÐGr%   c                 óV  •— ‰j                              d¦  «         ‰                     ¦   «         s^d}‰j                              |¦  «         	 t	          |¦  «        ‚# t          $ r%}t          j        ‰j        |¦  «         Y d }~d S d }~ww xY w	 t          ‰	¦  «        }| 	                    ¦   «         r|‰d<   nŒ*| 
                    ¦   «         }‰j                              d|j        |j        |¬¦  «         t          j        |¦  «        ‰_        t          j        ‰j        ‰‰¦  «         d S )NzEntering re-connect loopz:Component failed: Exhausted all transport connect attemptsTr   zZtrying transport {transport_idx} ("{transport_url}") using connect delay {transport_delay})Útransport_idxÚtransport_urlÚtransport_delay)rÃ   rÆ   r²   rÄ   rK   r¶   rÈ   r¦   Únextrq   ru   Úwarnrb   r'   Úsleepr¥   rå   )
rÞ   Úerr_msgÚerN   Údelayrò   rÊ   rf   r×   Útransport_gens
        €€€€€r#   rØ   z)Component._start.<locals>.transport_check°  sA  ø€ ØŒH�NŠNÐ5Ñ6Ô6Ð6à×&Ò&Ñ(Ô(ð ØV�Ø”—’˜gÑ&Ô&Ð&ðÝ& wÑ/Ô/Ð/øÝ#ð ð ð Ý”L ¤¨qÑ1Ô1Ð1Ø�F�F�F�F�Føøøøðøøøðå  Ñ/Ô/�	à×*Ò*Ñ,Ô,ð Ø-6Ð'¨Ñ*Øðð ×(Ò(Ñ*Ô*ˆEØŒH�MŠMØlØ'œmØ'œmØ %ð	 ñ ô ð õ "œK¨Ñ.Ô.ˆDŒMÝÔ ¤¨ÀÑFÔFÐFÐFÐFs   ÁA Á
BÁ&BÂBr“   )r¦   r¶   rã   rå   Ú	itertoolsÚcycler�   rä   )rf   rñ   rº   r¼   Ústart_frò   r¹   rÊ   r×   rØ   rý   s   ``   @@@@@@r#   Ú_startzComponent._start&  sx  øøøøøøøø€ ð$ Œ<Ð#ÝÔ#Ñ%Ô%ˆAð&ð &ð &ð &ð &õ Ô ¤¨c°3Ñ7Ô7Ð7ØˆHõ Ô*Ñ,Ô,ˆŒð	ð 	ð 	ð 	ð 	õ 	Ô˜DœL¨&°&Ñ9Ô9Ð9õ "œ¨Ô(8Ñ9Ô9ˆð  !˜cÐð	1ð 	1ð 	1ð 	1ð 	1ðL	Hð L	Hð L	Hð L	Hð L	Hð L	Hð L	Hð L	Hð\	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð@ —)’)˜G T¨4Ñ0Ô0ˆÝÔ˜G _°eÑ<Ô<Ð<ØŒ|Ðr%   c                 óf  — d| _         | j        r2| j                             ¦   «         r| j                             ¦   «         S | j        r$t          j        t
          j        | j        ¦  «        S t          j        | j	        ¦  «        st          j
        | j	        d ¦  «         t          j        d ¦  «        S )NT)r¨   r§   Úis_attachedr–   r¥   r¶   rî   ÚcancelÚ	is_calledr¦   r·   Úcreate_future_successrm   s    r#   ÚstopzComponent.stopÔ  sœ   € ØˆŒØŒ=ð 	@˜Tœ]×6Ò6Ñ8Ô8ð 	@Ø”=×&Ò&Ñ(Ô(Ð(ØŒ]ð 	@õ ”?¥5¤<°´Ñ?Ô?Ð?õ
 Œ˜tœ|Ñ,Ô,ð 	.ÝŒM˜$œ,¨Ñ-Ô-Ð-ÝÔ*¨4Ñ0Ô0Ð0r%   c                 ó>  ‡ ‡‡‡— ‰ j                              d‰j        ‰                     ¦   «         ¬¦  «         t	          j        ¦   «         Šˆˆˆ ˆfd„}‰xj        dz  c_        t	          j        ‰ j        ‰‰|‰¦  «        }ˆˆfd„}t	          j	        |d |¦  «         ‰S )NzWconnecting once using transport type "{transport_type}" over endpoint "{endpoint_desc}")Útransport_typeÚendpoint_descc                  ó�  •— t          ‰j        ‰j        ¦  «        } 	 ‰                     | ¦  «        x‰_        }‰j                             ¦   «         D ]R\  }}t          |t          ¦  «        r| 	                    |¦  «         Œ0t          |fi |¤Ž}| 	                    |¦  «         ŒS	 ‰|_        ˆ
ˆfd„}|                     d|¦  «         ˆ
ˆˆˆfd„}‰j        �|                     d|¦  «         ˆ
ˆfd„}|                     d|¦  «         |S # t          $ r/}t          j        |¦  «        }	t          j        ‰
|	¦  «         ‚ d }~ww xY w)Nc                 ó.  •— ‰j                              d|¬¦  «         t          j        ‰¦  «        sc|j        dv rt          j        ‰d ¦  «         d S t          j        t          |j        |j        ¦  «        ¦  «        }t          j	        ‰|¦  «         d S d S )Nz"session leaving '{details.reason}'©r„   )zwamp.close.normalzwamp.close.goodbye_and_out)
rÃ   rÄ   r¶   r  rÍ   r·   Úcreate_failurer
   ÚmessagerÈ   )rƒ   r„   ÚfÚdonerf   s      €€r#   Úon_leavezAComponent._connect_once.<locals>.create_session.<locals>.on_leave  s§   ø€ Ø”H—M’MØ<Ø 'ð "ñ ô ð õ !œ?¨4Ñ0Ô0ð 2Ø"œ>Ð-`Ð`Ð`Ý!œM¨$°Ñ5Ô5Ð5Ð5Ð5å %Ô 4Ý 0°´ÀÄÑ QÔ Qñ!ô !˜Aõ "œL¨¨qÑ1Ô1Ð1Ð1Ð1ð2ð 2r%   r–   c                 ó  •‡ — ‰                      ¦   «          ‰xj        dz  c_        ‰j                             d|¬¦  «         t	          j        ‰j        ‰‰ ¦  «        }ˆˆ fd„}ˆˆˆ fd„}t	          j        |||¦  «         d S )Nra   zsession on_join: {details}r  c                 óp   •— ‰j                              d¦  «         ˆfd„}t          j        d|¦  «         d S )NÚmain_successc                  óT   •— 	 ‰                       ¦   «          d S # t          $ r Y d S w xY wrµ   )r–   r	   )rƒ   s   €r#   r–   zeComponent._connect_once.<locals>.create_session.<locals>.on_join.<locals>.main_success.<locals>.leave'  s=   ø€ ð%Ø '§¢¡¤   øÝ#2ð %ð %ð %ð !%  ð%øøøs   ƒ ™
'¦'r   )rÃ   rÆ   r¶   rÓ   )rÞ   r–   rf   rƒ   s     €€r#   r  zVComponent._connect_once.<locals>.create_session.<locals>.on_join.<locals>.main_success$  sK   ø€ ØœŸš ~Ñ6Ô6Ð6ð%ð %ð %ð %ð %õ Ô(¨¨EÑ2Ô2Ð2Ð2Ð2r%   c                 ó’   •— ‰j                              d| ¬¦  «         t          j        ‰| ¦  «         ‰                     ¦   «          d S )Nzmain_error: {err})Úerr)rÃ   rÆ   r¶   rÈ   r—   )r  r  rf   rƒ   s    €€€r#   Ú
main_errorzTComponent._connect_once.<locals>.create_session.<locals>.on_join.<locals>.main_error0  sF   ø€ ØœŸšÐ':À˜ÑDÔDÐDÝœ T¨3Ñ/Ô/Ð/Ø×*Ò*Ñ,Ô,Ð,Ð,Ð,r%   )re   rj   rÃ   rÆ   r¶   rî   rœ   rå   )	rƒ   r„   r¹   r  r  r  Úreactorrf   rN   s	   `    €€€€r#   Úon_joinz@Component._connect_once.<locals>.create_session.<locals>.on_join  s´   øø€ Ø—O’OÑ%Ô%Ð%ØÐ.Ô.°!Ñ3Ð.Ô.Ø”H—N’NÐ#?È�NÑQÔQÐQÝœ¨¬°W¸gÑFÔF�Að
3ð 
3ð 
3ð 
3ð 
3ð 
3ð-ð -ð -ð -ð -ð -ð -õ Ô'¨¨<¸ÑDÔDÐDÐDÐDr%   rH   c                 óÒ   •— ‰j                              d|¬¦  «         t          j        ‰¦  «        s5|s‰j                              d¦  «         d S t          j        ‰d ¦  «         d S d S )Nz,session on_disconnect: was_clean={was_clean})Ú	was_cleanzSession disconnected uncleanly)rÃ   rÆ   r¶   r  rø   r·   )rƒ   r  r  rf   s     €€r#   Úon_disconnectzFComponent._connect_once.<locals>.create_session.<locals>.on_disconnect;  s‹   ø€ Ø”H—N’NØFØ"+ð #ñ ô ð õ !œ?¨4Ñ0Ô0ð 6Ø(ð 6Ø œHŸMšMØ @ñô ð ð ð õ "œM¨$°Ñ5Ô5Ð5Ð5Ð5ð6ð 6r%   r—   )r   r£   r¤   r¢   r§   r¡   Úitemsr   r   Úadd_authenticatorr   Ú_parentrˆ   rœ   Ú	Exceptionr¶   r  rÈ   )Úcfgrƒ   Ú	auth_nameÚauth_configÚauthenticatorr  r  r  rû   r  r  r  rf   rN   s             €€€€r#   Úcreate_sessionz/Component._connect_once.<locals>.create_sessionð  sÆ  ø€ Ý! $¤+¨t¬{Ñ;Ô;ˆCðZØ*.×*>Ò*>¸sÑ*CÔ*CÐC�” Ø.2Ô.B×.HÒ.HÑ.JÔ.Jð Að AÑ*�I˜{Ý! +­~Ñ>Ô>ð AØ×1Ò1°+Ñ>Ô>Ð>Ð>å(<¸YÐ(VÐ(VÈ+Ð(VÐ(V˜Ø×1Ò1°-Ñ@Ô@Ð@Ð@ðAð& #'�”ð
2ð 2ð 2ð 2ð 2ð 2ð —
’
˜7 HÑ-Ô-Ð-ð
Eð Eð Eð Eð Eð Eð Eð Eð. ”;Ð*Ø—J’J˜v wÑ/Ô/Ð/ð
6ð 6ð 6ð 6ð 6ð 6ð —
’
˜<¨Ñ7Ô7Ð7ð �øõc ð ð ð õ Ô(¨Ñ+Ô+�Ý”˜T 1Ñ%Ô%Ð%Øøøøøðøøøs   �BD Ä
EÄ*E Å Era   c                 ó~   •— ‰xj         dz  c_         t          j        ‰¦  «        st          j        ‰| ¦  «         dS dS )a  
            this may seem redundant after looking at _connect_transport, but
            it will handle a case where something goes wrong in
            _connect_transport itself -- as the only connect our
            caller has is the 'done' future
            ra   N)rk   r¶   r  rÈ   )r  r  rN   s    €€r#   Úon_errorz)Component._connect_once.<locals>.on_errorU  sO   ø€ ð Ð&Ô&¨!Ñ+Ð&Ô&õ ”? 4Ñ(Ô(ð (Ý”˜T 3Ñ'Ô'Ð'Ð'Ð'ð(ð (r%   )
rÃ   rÄ   r   rw   r¶   rã   ri   rî   Ú_connect_transportrå   )rf   r  rN   r'  r¹   r)  r  s   ```   @r#   rï   zComponent._connect_onceä  sí   øøøø€ àŒ�Šð.à$œ>Ø#×5Ò5Ñ7Ô7ð	 	ñ 	
ô 	
ð 	
õ Ô"Ñ$Ô$ˆð\	ð \	ð \	ð \	ð \	ð \	ð \	ð \	ð| 	Ð"Ô" aÑ'Ð"Ô"åŒOØÔ#Ø�Y °ñ
ô 
ˆð
	(ð 	(ð 	(ð 	(ð 	(ð 	(õ 	Ô˜A˜t XÑ.Ô.Ð.àˆr%   c                 ó2   — |                       d|¦  «         dS )zò
        A decorator as a shortcut for listening for 'join' events.

        For example::

           @component.on_join
           def joined(session, details):
               print("Session {} joined: {}".format(session, details))
        rH   Nr‡   ©rf   r…   s     r#   r  zComponent.on_joine  s   € ð 	�Š�˜ÑÔÐÐÐr%   c                 ó2   — |                       d|¦  «         dS )zM
        A decorator as a shortcut for listening for 'leave' events.
        r–   Nr‡   r,  s     r#   r  zComponent.on_leaveq  ó   € ð 	�Š�˜ÑÔÐÐÐr%   c                 ó2   — |                       d|¦  «         dS )zO
        A decorator as a shortcut for listening for 'connect' events.
        r”   Nr‡   r,  s     r#   Ú
on_connectzComponent.on_connectw  s   € ð 	�Š�	˜2ÑÔÐÐÐr%   c                 ó2   — |                       d|¦  «         dS )zR
        A decorator as a shortcut for listening for 'disconnect' events.
        r—   Nr‡   r,  s     r#   r  zComponent.on_disconnect}  s   € ð 	�Š�˜bÑ!Ô!Ð!Ð!Ð!r%   c                 ó2   — |                       d|¦  «         dS )zM
        A decorator as a shortcut for listening for 'ready' events.
        r•   Nr‡   r,  s     r#   Úon_readyzComponent.on_readyƒ  r.  r%   c                 ó2   — |                       d|¦  «         dS )zV
        A decorator as a shortcut for listening for 'connectfailure' events.
        r˜   Nr‡   r,  s     r#   Úon_connectfailurezComponent.on_connectfailure‰  s   € ð 	�ŠÐ  "Ñ%Ô%Ð%Ð%Ð%r%   )NF)NNNr‘   NNNNrµ   )rx   ry   rz   r{   r¢   r‚   rŽ   rg   r²   r  r  rï   r  r  r0  r  r3  r5  r5   r%   r#   r   r   g  s  € € € € € ðð ð
 €Oððð ð ð ð.ð ð ð ð. W[ØEIð}ð }ð }ð }ð~ð ð ðlð lð lð lð\1ð 1ð 1ð ð ð ðB
ð 
ð 
ðð ð ðð ð ð"ð "ð "ðð ð ð&ð &ð &ð &ð &r%   c                 ó`  ‡ ‡‡
‡‡— t          |t          ¦  «        r|g}t          |¦  «        t          k    r/t	          d                     t          |¦  «        ¦  «        ¦  «        ‚|D ]F}t          |t          ¦  «        s/t	          d                     t          |¦  «        ¦  «        ¦  «        ‚ŒGt          j        ¦   «         Šˆfd„Šˆfd„Š
ˆ
ˆˆ fd„}g }|D ]"} ||¦  «        }|                     |¦  «         Œ#t          j	        |d¬¦  «        }‰rˆˆˆ fd„}	t          j
        ||	|	¦  «         |S )	aˆ  
    Internal helper. Use "run" method from autobahn.twisted.wamp or
    autobahn.asyncio.wamp

    This is the generic parts of the run() method so that there's very
    little code in the twisted/asyncio specific run() methods.

    This is called by react() (or run_until_complete() so any errors
    coming out of this should be handled properly. Logging will
    already be started.
    zB"components" must be a list of Component objects - encountered {0}zN"components" must be a list of Component objects - encountereditem of type {0}c                 ó8   •— ‰                      d| |¬¦  «         |S )Nz-Component '{c}' successfully completed: {arg})Úcr¸   ©rÆ   )Úcompr¸   rÃ   s     €r#   Úcomponent_successz_run.<locals>.component_success±  s!   ø€ Ø�	Š	ÐAÀTÈsˆ	ÑSÔSÐSØˆ
r%   c                 ó®   •— ‰                      d| t          j        |¦  «        ¬¦  «         ‰                     dt          j        |¦  «        ¬¦  «         d S )NzComponent '{c}' error: {msg})r8  r¿   zComponent error: {tb}rÁ   )rÊ   r¶   rÅ   rÆ   rÇ   )r:  r  rÃ   s     €r#   Úcomponent_failurez_run.<locals>.component_failureµ  sQ   ø€ Ø�	Š	Ð0°D½eÔ>SÐTUÑ>VÔ>Vˆ	ÑWÔWÐWØ�	Š	Ð)­eÔ.LÈQÑ.OÔ.Oˆ	ÑPÔPÐPð ˆtr%   c                 ó    •— t          j        | j        ‰¦  «        }t          j        |t	          ‰| ¦  «        t	          ‰| ¦  «        ¦  «         |S rµ   )r¶   rî   r“   rå   r   )r:  r¹   r=  r;  r  s     €€€r#   Úcomponent_startz_run.<locals>.component_start½  sS   ø€ õ ŒO˜DœJ¨Ñ0Ô0ˆÝÔØÝÐ% tÑ,Ô,ÝÐ% tÑ,Ô,ñ	
ô 	
ð 	
ð
 ˆr%   F)Úconsume_exceptionsc                 óJ   •— ‰                      d¦  «          ‰‰| ¦  «         d S )Nz&All components ended; stopping reactorr9  )r¸   Údone_callbackrÃ   r  s    €€€r#   Úall_donez_run.<locals>.all_doneÒ  s.   ø€ Ø�IŠIÐ>Ñ?Ô?Ð?ØˆM˜' 3Ñ'Ô'Ð'Ð'Ð'r%   )r   r   r   rE   r   r   r¶   Úmake_loggerrŸ   Úgatherrå   )r  Ú
componentsrB  r8  r?  Údlr:  r¹   Údone_drC  r=  r;  rÃ   s   ` `       @@@r#   Ú_runrI  �  s§  øøøøø€ õ �*�iÑ(Ô(ð "Ø �\ˆ
åˆJÑÔ�4ÒÐÝðß’6�$˜zÑ*Ô*Ñ+Ô+ñ
ô 
ð 	
ð
 ð ð ˆÝ˜!�YÑ'Ô'ð 	Ýð#ß#)¢6­$¨q©'¬'¡?¤?ñô ð ð	õ Ô
Ñ
Ô
€Cðð ð ð ð ðð ð ð ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 
€BØð ð ˆØˆO˜DÑ!Ô!ˆØ
�	Š	�!‰ŒˆˆÝŒ\˜"°Ð7Ñ7Ô7€Fàð 8ð	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(õ 	Ô˜F H¨hÑ7Ô7Ð7à€Mr%   rµ   )rþ   rs   Ú	functoolsr   r¶   Úautobahn.utilr   Úautobahn.websocket.utilr   rD   Úautobahn.rawsocket.utilrJ   Úautobahn.wamp.typesr   r   r   Úautobahn.wamp.exceptionr	   r
   Úautobahn.wamp.authr   r   Úautobahn.wamp.serializerr   Ú__all__r$   rZ   ÚobjectrL   r   rI  r5   r%   r#   ú<module>rT     s�  ðð8 Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð à €€€à )Ð )Ð )Ð )Ð )Ð )Ø =Ð =Ð =Ð =Ð =Ð =Ø =Ð =Ð =Ð =Ð =Ð =à RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ 1Ð 1Ð 1Ð 1Ð 1Ð 1ð ð ð
63ð 63ð 63ð 63ðr[ð [ð [ð [ð|X#ð X#ð X#ð X#ð X#�ñ X#ô X#ð X#ð~f&ð f&ð f&ð f&ð f&�ñ f&ô f&ð f&ðRGð Gð Gð Gð Gð Gr%   