o
    ›¨ÊhXc  ã                   @   sÞ  d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZmZmZmZ d
dlmZmZ d
dlmZ zddlm Z! W n e"ye   dZ!Y nw z
ddl#m$Z$m%Z% W n e"y‚   G dd„ dƒZ$e$Z%Y nw dZ&dZ'dd„ Z(dd„ Z)G dd„ deƒZG dd„ dƒZ*G dd„ de+e*ƒZ,G dd„ dƒZ-e	 .e-¡ G dd „ d e	ƒZ/G d!d"„ d"e/e*ƒZ0G d#d$„ d$ƒZ1e
 .e1¡ G d%d&„ d&ƒZ2G d'd(„ d(e2ƒZ3e .e3¡ G d)d*„ d*ee2ƒZ4dS )+z8Custom maps, sets, sequences, and other data structures.é    N)ÚOrderedDict)Údeque)ÚCallableÚMappingÚMutableMappingÚ
MutableSetÚSequence)ÚheapifyÚheappopÚheappush)ÚchainÚcount)ÚEmpty)ÚAnyÚDictÚIterableÚListé   )ÚfirstÚuniq)Ú
match_case)Úreversed_dict)Ú
LazyObjectÚLazySettingsc                   @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© r   r   úJ/var/www/html/env/lib/python3.10/site-packages/celery/utils/collections.pyr      s    r   )ÚAttributeDictMixinÚAttributeDictÚ	BufferMapÚChainMapÚConfigurationViewÚDictAttributeÚ	EvictableÚ
LimitedSetÚMessagebufferr   Úforce_mappingÚlpmergezK<{name}({size}): maxlen={0.maxlen}, expires={0.expires}, minlen={0.minlen}>c                 C   s*   t | ttfƒr
| j} t | tƒst| ƒS | S )z?Wrap object into supporting the mapping interface if necessary.)Ú
isinstancer   r   Ú_wrappedr   r$   ©Úmr   r   r   r(   '   s   r(   c                    s    | j ‰ ‡ fdd„| ¡ D ƒ | S )zpIn place left precedent dictionary merge.

    Keeps values from `L`, if the value in `R` is :const:`None`.
    c                    s"   g | ]\}}|d urˆ ||ƒ‘qS ©Nr   )Ú.0ÚkÚv©Úsetitemr   r   Ú
<listcomp>6   s   " zlpmerge.<locals>.<listcomp>)Ú__setitem__Úitems)ÚLÚRr   r2   r   r)   /   s   r)   c                   @   sB   e Zd ZdZdd„ Zeedƒserd
dd„Zd	S d
dd„Zd	S d	S )r   z#Dict where insertion order matters.c                 C   s   t t|  ¡ ƒƒS r.   )ÚnextÚiterÚkeys©Úselfr   r   r   Ú_LRUkey=   s   zOrderedDict._LRUkeyÚmove_to_endTc                 C   s   |st dƒ‚|  |¡| |< d S )Nzno last=True on PyPy)ÚNotImplementedErrorÚpop)r=   ÚkeyÚlastr   r   r   r?   F   s   zOrderedDict.move_to_endc                 C   sŒ   | j | }|d }|d }||d< ||d< | j}|r0|d }||d< ||d< | |d< |d< d S |d }||d< ||d< | |d< |d< d S ©Nr   r   )Ú_OrderedDict__mapÚ_OrderedDict__root)r=   rB   rC   ÚlinkÚ	link_prevÚ	link_nextÚrootÚ
first_noder   r   r   r?   Q   s   
N)T)	r   r   r   Ú__doc__r>   ÚhasattrÚ_OrderedDictÚ_dict_is_orderedr?   r   r   r   r   r   :   s    
òr   c                   @   s*   e Zd ZdZdd„ Zdeddfdd„ZdS )	r   z[Mixin for Mapping interface that adds attribute access.

    I.e., `d.key -> d[key]`).
    c                 C   s2   z| | W S  t y   tt| ƒj›d|›�ƒ‚w )z`d.key -> d[key]`.z object has no attribute )ÚKeyErrorÚAttributeErrorÚtyper   )r=   r0   r   r   r   Ú__getattr__k   s   
ÿÿzAttributeDictMixin.__getattr__rB   ÚreturnNc                 C   s   || |< dS )z"`d[key] = value -> d.key = value`.Nr   ©r=   rB   Úvaluer   r   r   Ú__setattr__t   ó   zAttributeDictMixin.__setattr__)r   r   r   rL   rS   ÚstrrW   r   r   r   r   r   e   s    	r   c                   @   s   e Zd ZdZdS )r    z$Dict subclass with attribute access.N)r   r   r   rL   r   r   r   r   r    y   s    r    c                   @   s�   e Zd ZdZdZdd„ Zdd„ Zdd„ Zdd	d
„Zddd„Z	dd„ Z
dd„ Zdd„ Zdd„ ZeZdd„ Zdd„ ZeZdd„ ZeZeZeZeZdS )r$   z[Dict interface to attributes.

    `obj[k] -> obj.k`
    `obj[k] = val -> obj.k = val`
    Nc                 C   s   t  | d|¡ d S )NÚobj)ÚobjectrW   )r=   rZ   r   r   r   Ú__init__†   ó   zDictAttribute.__init__c                 C   ó   t | j|ƒS r.   )ÚgetattrrZ   ©r=   rB   r   r   r   rS   Š   rX   zDictAttribute.__getattr__c                 C   s   t | j||ƒS r.   ©ÚsetattrrZ   rU   r   r   r   rW   Ž   ó   zDictAttribute.__setattr__c                 C   ó"   z| | W S  t y   | Y S w r.   ©rP   ©r=   rB   Údefaultr   r   r   Úget’   ó
   
ÿzDictAttribute.getc                 C   s   || vr
|| |< d S d S r.   r   rf   r   r   r   Ú
setdefault™   s   ÿzDictAttribute.setdefaultc                 C   s&   zt | j|ƒW S  ty   t|ƒ‚w r.   )r_   rZ   rQ   rP   r`   r   r   r   Ú__getitem__ž   s
   ÿzDictAttribute.__getitem__c                 C   s   t | j||ƒ d S r.   ra   rU   r   r   r   r5   ¥   r]   zDictAttribute.__setitem__c                 C   r^   r.   )rM   rZ   r`   r   r   r   Ú__contains__©   rX   zDictAttribute.__contains__c                 C   s   t t| jƒƒS r.   )r:   ÚdirrZ   r<   r   r   r   Ú_iterate_keys­   rc   zDictAttribute._iterate_keysc                 C   ó   |   ¡ S r.   ©rn   r<   r   r   r   Ú__iter__²   ó   zDictAttribute.__iter__c                 c   s&   � |   ¡ D ]}|t| j|ƒfV  qd S r.   ©rn   r_   rZ   r`   r   r   r   Ú_iterate_items¶   s   €ÿzDictAttribute._iterate_itemsc                 c   s"   � |   ¡ D ]	}t| j|ƒV  qd S r.   rs   r`   r   r   r   Ú_iterate_values¼   s   €ÿzDictAttribute._iterate_valuesr.   )r   r   r   rL   rZ   r\   rS   rW   rh   rj   rk   r5   rl   rn   Úiterkeysrq   rt   Ú	iteritemsru   Ú
itervaluesr6   r;   Úvaluesr   r   r   r   r$   }   s*    

r$   c                   @   s  e Zd ZdZdZdZdZdZdZdd„ Z	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd4dd„Zdd„ Zdd„ Zdd„ Zdd„ ZeZd4d d!„Zd"d#„ Zd$d%„ Zed&d'„ ƒZd(d)„ ZeZd*d+„ Zd,d-„ Z e Z!d.d/„ Z"e"Z#d0d1„ Z$e$Z%d2d3„ Z&e Z'e"Z(e$Z)dS )5r"   z!Key lookup on a sequence of maps.Nr   c                 O   s:   t |pi gƒ}| jj| d¡||d |dd … g d� d S )NÚkey_tr   r   )rz   ÚmapsÚchangesÚdefaultsÚ
_observers)ÚlistÚ__dict__Úupdaterh   )r=   r{   Úkwargsr   r   r   r\   Ó   s   

ûzChainMap.__init__c                 C   s(   t |ƒ}| j d|¡ | j d|¡ d S rD   )r(   r}   Úinsertr{   )r=   Údr   r   r   Úadd_defaultsÞ   s   zChainMap.add_defaultsc                 G   s8   z| j d j|g|¢R Ž W S  ty   td|›�ƒ‚w )Nr   z$Key not found in the first mapping: )r{   rA   rP   rf   r   r   r   rA   ä   s   ÿÿzChainMap.popc                 C   s   t |ƒ‚r.   re   r`   r   r   r   Ú__missing__ì   rr   zChainMap.__missing__c                 C   s   | j d ur
|   |¡S |S r.   )rz   r`   r   r   r   Ú_keyð   ó   zChainMap._keyc              	   C   s@   |   |¡}| jD ]}z|| W   S  ty   Y qw |  |¡S r.   )r‡   r{   rP   r†   )r=   rB   r‡   Úmappingr   r   r   rk   ô   s   

ÿ
zChainMap.__getitem__c                 C   ó   || j |  |¡< d S r.   ©r|   r‡   rU   r   r   r   r5   þ   ó   zChainMap.__setitem__c                 C   s2   z
| j |  |¡= W d S  ty   td|›�ƒ‚w )Nz Key not found in first mapping: )r|   r‡   rP   r`   r   r   r   Ú__delitem__  s
   ÿzChainMap.__delitem__c                 C   s   | j  ¡  d S r.   ©r|   Úclearr<   r   r   r   r�   	  rc   zChainMap.clearc                 C   s(   z| |   |¡ W S  ty   | Y S w r.   )r‡   rP   rf   r   r   r   rh     s
   ÿzChainMap.getc                 C   s   t tƒ j| jŽ ƒS r.   )ÚlenÚsetÚunionr{   r<   r   r   r   Ú__len__  r]   zChainMap.__len__c                 C   ro   r.   rp   r<   r   r   r   rq     s   zChainMap.__iter__c                    s"   |   ˆ ¡‰ t‡ fdd„| jD ƒƒS )Nc                 3   s   � | ]}ˆ |v V  qd S r.   r   )r/   r-   ©rB   r   r   Ú	<genexpr>  ó   € z(ChainMap.__contains__.<locals>.<genexpr>)r‡   Úanyr{   r`   r   r”   r   rl     ó   
zChainMap.__contains__c                 C   ó
   t | jƒS r.   )r—   r{   r<   r   r   r   Ú__bool__   ó   
zChainMap.__bool__c                 C   s"   |   |¡}|| vr|| |< d S d S r.   )r‡   rf   r   r   r   rj   %  s   
ÿzChainMap.setdefaultc                 O   s0   | j j|i |¤Ž}| jD ]	}||i |¤Ž q|S r.   )r|   r�   r~   )r=   Úargsr‚   ÚresultÚcallbackr   r   r   r�   +  s   
zChainMap.updatec                 C   s   d  | d tt| jƒ¡¡S )Nz{0.__class__.__name__}({1})z, )ÚformatÚjoinÚmapÚreprr{   r<   r   r   r   Ú__repr__2  s   ÿzChainMap.__repr__c                 G   s   | t j|g|¢R Ž ƒS )z?Create a ChainMap with a single dict created from the iterable.)ÚdictÚfromkeys)ÚclsÚiterablerœ   r   r   r   r¥   7  s   zChainMap.fromkeysc                 C   s&   | j | jd  ¡ g| jdd … ¢R Ž S rD   )Ú	__class__r{   Úcopyr<   r   r   r   r©   =  s   &zChainMap.copyc                    s   t ‡ fdd„t| jƒD ƒŽ S )Nc                 3   s   � | ]}ˆ |ƒV  qd S r.   r   )r/   r„   ©Úopr   r   r•   H  r–   z!ChainMap._iter.<locals>.<genexpr>)r   Úreversedr{   )r=   r«   r   rª   r   Ú_iterB  s   zChainMap._iterc                 C   s   t |  dd„ ¡ƒS )Nc                 S   ro   r.   ©r;   )r„   r   r   r   Ú<lambda>L  s    z(ChainMap._iterate_keys.<locals>.<lambda>)r   r­   r<   r   r   r   rn   J  r]   zChainMap._iterate_keysc                    ó   ‡ fdd„ˆ D ƒS )Nc                 3   s   � | ]	}|ˆ | fV  qd S r.   r   ©r/   rB   r<   r   r   r•   Q  s   € z*ChainMap._iterate_items.<locals>.<genexpr>r   r<   r   r<   r   rt   O  r]   zChainMap._iterate_itemsc                    r°   )Nc                 3   s   � | ]}ˆ | V  qd S r.   r   r±   r<   r   r   r•   V  r–   z+ChainMap._iterate_values.<locals>.<genexpr>r   r<   r   r<   r   ru   T  r]   zChainMap._iterate_valuesc                 C   s   | j  |¡ d S r.   )r~   Úappend)r=   rž   r   r   r   Úbind_toY  s   zChainMap.bind_tor.   )*r   r   r   rL   rz   r|   r}   r{   r~   r\   r…   rA   r†   r‡   rk   r5   r�   r�   rh   r“   rq   rl   rš   Ú__nonzero__rj   r�   r£   Úclassmethodr¥   r©   Ú__copy__r­   rn   rv   rt   rw   ru   rx   r³   r;   r6   ry   r   r   r   r   r"   Ê   sP    



r"   c                       sh   e Zd ZdZd‡ fdd„	Zdd„ Z‡ fdd„Zd	d
„ Zdd„ Zddd„Z	dd„ Z
dd„ Zdd„ Z‡  ZS )r#   a�  A view over an applications configuration dictionaries.

    Custom (but older) version of :class:`collections.ChainMap`.

    If the key does not exist in ``changes``, the ``defaults``
    dictionaries are consulted.

    Arguments:
        changes (Mapping): Map of configuration changes.
        defaults (List[Mapping]): List of dictionaries containing
            the default configuration.
    Nc                    sJ   |d u rg n|}t ƒ j|g|¢R Ž  | jj|r| d¡d n||d� d S )NÚ_)ÚprefixÚ_keys)Úsuperr\   r€   r�   Úrstrip)r=   r|   r}   r;   r¸   ©r¨   r   r   r\   o  s   
þzConfigurationView.__init__c                 C   s4   | j }|r| |¡s|| n|}t||ƒ|fS |fS r.   )r¸   Ú
startswithr   )r=   rB   r¸   Úpkeyr   r   r   Ú_to_keysx  s
   zConfigurationView._to_keysc              	      s–   |   ˆ ¡}tƒ j}|| jrt‡ fdd„| jD ƒƒnd D ]}z||ƒW   S  ty.   Y qw z|  ˆ ¡W S  tyJ   t|ƒdkrItdj|Ž ƒ‚‚ w )Nc                 3   s   � | ]}|ˆ ƒV  qd S r.   r   )r/   Úfr”   r   r   r•   …  r–   z0ConfigurationView.__getitem__.<locals>.<genexpr>r   r   z)Key not found: {0!r} (with prefix: {0!r}))	r¿   rº   rk   r¹   ÚtuplerP   r†   r�   rŸ   )r=   rB   r;   Úgetitemr0   r¼   r”   r   rk   €  s&   
 ÿÿÿüzConfigurationView.__getitem__c                 C   rŠ   r.   r‹   rU   r   r   r   r5   “  rŒ   zConfigurationView.__setitem__c                    s   t d ‡ fdd„|D ƒƒS )Nc                 3   s   � | ]}ˆ   |¡V  qd S r.   )rh   r±   r<   r   r   r•   ™  s   € z*ConfigurationView.first.<locals>.<genexpr>)r   )r=   r;   r   r<   r   r   —  rˆ   zConfigurationView.firstc                 C   rd   r.   re   rf   r   r   r   rh   ›  ri   zConfigurationView.getc                 C   s   | j  ¡  dS )z&Remove all changes, but keep defaults.NrŽ   r<   r   r   r   r�   ¢  s   zConfigurationView.clearc                    s"   |   |¡‰ t‡ fdd„| jD ƒƒS )Nc                 3   s&   � | ]‰ t ‡ fd d„ˆD ƒƒV  qdS )c                 3   s   � | ]}|ˆ v V  qd S r.   r   )r/   r0   r,   r   r   r•   ª  r–   z;ConfigurationView.__contains__.<locals>.<genexpr>.<genexpr>N)r—   )r/   r®   r,   r   r•   ª  s   €$ z1ConfigurationView.__contains__.<locals>.<genexpr>)r¿   r—   r{   r`   r   r®   r   rl   §  r˜   zConfigurationView.__contains__c                 C   s@   |j d }|j d }| j j|||j d |j d |g| d� d S )Nr|   r}   rz   r¸   )r|   r}   rz   r¸   r{   )r€   r�   )r=   Úotherr|   r}   r   r   r   Ú	swap_with¬  s   


ûzConfigurationView.swap_with)NNNr.   )r   r   r   rL   r\   r¿   rk   r5   r   rh   r�   rl   rÄ   Ú__classcell__r   r   r¼   r   r#   a  s    	
r#   c                   @   sÂ   e Zd ZdZdZd+dd„Zdd„ Zd	d
„ Zdd„ Zd,dd„Z	dd„ Z
dd„ ZeZd,dd„Zd,dedefdd„Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ ZeZed)d*„ ƒZdS )-r&   a/  Kind-of Set (or priority queue) with limitations.

    Good for when you need to test for membership (`a in set`),
    but the set should not grow unbounded.

    ``maxlen`` is enforced at all times, so if the limit is reached
    we'll also remove non-expired items.

    You can also configure ``minlen``: this is the minimal residual size
    of the set.

    All arguments are optional, and no limits are enabled by default.

    Arguments:
        maxlen (int): Optional max number of items.
            Adding more items than ``maxlen`` will result in immediate
            removal of items sorted by oldest insertion time.

        expires (float): TTL for all items.
            Expired items are purged as keys are inserted.

        minlen (int): Minimal residual size of this set.
            .. versionadded:: 4.0

            Value must be less than ``maxlen`` if both are configured.

            Older expired items will be deleted, only after the set
            exceeds ``minlen`` number of items.

        data (Sequence): Initial data to initialize set with.
            Can be an iterable of ``(key, value)`` pairs,
            a dict (``{key: insertion_time}``), or another instance
            of :class:`LimitedSet`.

    Example:
        >>> s = LimitedSet(maxlen=50000, expires=3600, minlen=4000)
        >>> for i in range(60000):
        ...     s.add(i)
        ...     s.add(str(i))
        ...
        >>> 57000 in s  # last 50k inserted values are kept
        True
        >>> '10' in s  # '10' did expire and was purged from set.
        False
        >>> len(s)  # maxlen is reached
        50000
        >>> s.purge(now=time.monotonic() + 7200)  # clock + 2 hours
        >>> len(s)  # now only minlen items are cached
        4000
        >>>> 57000 in s  # even this item is gone now
        False
    é   r   Nc                 C   sŽ   |d u rdn|| _ |d u rdn|| _|d u rdn|| _i | _g | _|r(|  |¡ | j | j  kr7dks<tdƒ‚ tdƒ‚| jdk rEtdƒ‚d S )Nr   z:minlen must be a positive number, less or equal to maxlen.zexpires cannot be negative!)ÚmaxlenÚminlenÚexpiresÚ_dataÚ_heapr�   Ú
ValueError)r=   rÇ   rÉ   ÚdatarÈ   r   r   r   r\   ñ  s$   
ÿÿÿ
ÿzLimitedSet.__init__c                 C   s,   dd„ | j  ¡ D ƒ| jdd…< t| jƒ dS )z=Time consuming recreating of heap.  Don't run this too often.c                 S   s   g | ]}|‘qS r   r   )r/   Úentryr   r   r   r4     s    z,LimitedSet._refresh_heap.<locals>.<listcomp>N)rÊ   ry   rË   r	   r<   r   r   r   Ú_refresh_heap  s   zLimitedSet._refresh_heapc                 C   s   | j | jkr|  ¡  d S d S r.   )Ú_heap_overloadÚmax_heap_percent_overloadrÏ   r<   r   r   r   Ú_maybe_refresh_heap	  s   ÿzLimitedSet._maybe_refresh_heapc                 C   s   | j  ¡  g | jdd…< dS )z)Clear all data, start from scratch again.N)rÊ   r�   rË   r<   r   r   r   r�     s   
zLimitedSet.clearc                 C   sh   |pt  ¡ }|| jv r|  |¡ ||f}|| j|< t| j|ƒ | jr0t| jƒ| jkr2|  ¡  dS dS dS )z=Add a new item, or reset the expiry time of an existing item.N)	ÚtimeÚ	monotonicrÊ   Údiscardr   rË   rÇ   r�   Úpurge)r=   ÚitemÚnowrÎ   r   r   r   Úadd  s   


ÿzLimitedSet.addc                 C   s°   |sdS t |tƒr| j |j¡ |  ¡  |  ¡  dS t |tƒrL| ¡ D ]&\}}t |tt	fƒr2|d }t |t
ƒsCtdt|ƒ›d|› �ƒ‚|  ||¡ q#dS |D ]}|  |¡ qNdS )z8Update this set from other LimitedSet, dict or iterable.Nr   z$Expecting float timestamp, got type z with value: )r*   r&   rÊ   r�   rÏ   rÖ   r¤   r6   rÁ   r   ÚfloatrÌ   rR   rÙ   )r=   rÃ   rB   ÚinsertedrZ   r   r   r   r�      s.   


ÿÿÿøÿzLimitedSet.updatec                 C   s   | j  |d ¡ |  ¡  d S r.   )rÊ   rA   rÒ   ©r=   r×   r   r   r   rÕ   :  s   zLimitedSet.discardc                 C   sÊ   |pt  ¡ }t|tƒr|ƒ n|}| jr't| jƒ| jkr'|  ¡  t| jƒ| jks| jrat| jƒ| j	  kr8dkrcn dS | j
d \}}|| j |krKdS |  ¡  t| jƒ| j	  kr^dks;dS  dS dS dS )zÁCheck oldest items and remove them if needed.

        Arguments:
            now (float): Time of purging -- by default right now.
                This can be useful for unit testing.
        r   N)rÓ   rÔ   r*   r   rÇ   r�   rÊ   rA   rÉ   rÈ   rË   )r=   rØ   Úinserted_timer·   r   r   r   rÖ   A  s   ÿ"$üÿzLimitedSet.purgerg   rT   c                 C   sD   | j r t| j ƒ\}}z	| j |¡ W |S  ty   Y nw | j s|S )z?Remove and return the oldest item, or :const:`None` when empty.)rË   r
   rÊ   rA   rP   )r=   rg   r·   r×   r   r   r   rA   V  s   ýÿüzLimitedSet.popc                 C   s   dd„ | j  ¡ D ƒS )a6  Whole set as serializable dictionary.

        Example:
            >>> s = LimitedSet(maxlen=200)
            >>> r = LimitedSet(maxlen=200)
            >>> for i in range(500):
            ...     s.add(i)
            ...
            >>> r.update(s.as_dict())
            >>> r == s
            True
        c                 S   s   i | ]\}}||“qS r   r   )r/   rÛ   rB   r   r   r   Ú
<dictcomp>p  s    z&LimitedSet.as_dict.<locals>.<dictcomp>)rÊ   ry   r<   r   r   r   Úas_dictb  s   zLimitedSet.as_dictc                 C   s   | j |j kS r.   ©rÊ   )r=   rÃ   r   r   r   Ú__eq__r  rX   zLimitedSet.__eq__c                 C   s   t j| t| ƒjt| ƒd�S )N)ÚnameÚsize)ÚREPR_LIMITED_SETrŸ   rR   r   r�   r<   r   r   r   r£   v  s   ÿzLimitedSet.__repr__c                 C   s   dd„ t | j ¡ ƒD ƒS )Nc                 s   s   � | ]\}}|V  qd S r.   r   )r/   r·   Úir   r   r   r•   ~  r–   z&LimitedSet.__iter__.<locals>.<genexpr>)ÚsortedrÊ   ry   r<   r   r   r   rq   |  rˆ   zLimitedSet.__iter__c                 C   r™   r.   )r�   rÊ   r<   r   r   r   r“   €  r›   zLimitedSet.__len__c                 C   ó
   || j v S r.   rà   r`   r   r   r   rl   „  r›   zLimitedSet.__contains__c                 C   s   | j | j| j|  ¡ | jffS r.   )r¨   rÇ   rÉ   rß   rÈ   r<   r   r   r   Ú
__reduce__ˆ  s   ÿzLimitedSet.__reduce__c                 C   r™   r.   )ÚboolrÊ   r<   r   r   r   rš   �  r›   zLimitedSet.__bool__c                 C   s"   t | jƒd tt | jƒdƒ d S )z5Compute how much is heap bigger than data [percents].éd   r   )r�   rË   ÚmaxrÊ   r<   r   r   r   rÐ   ’  s   "zLimitedSet._heap_overload)r   r   Nr   r.   )r   r   r   rL   rÑ   r\   rÏ   rÒ   r�   rÙ   r�   rÕ   Ú	pop_valuerÖ   r   rA   rß   rá   r£   rq   r“   rl   rè   rš   r´   ÚpropertyrÐ   r   r   r   r   r&   ¹  s0    5


r&   c                   @   s@   e Zd ZdZeZddd„Zdefdeddfdd	„Zdd
d„Z	dS )r%   z2Mixin for classes supporting the ``evict`` method.rT   Nc                 C   s   | j td� dS )z&Force evict until maxsize is enforced.)ÚrangeN)Ú_evictr   r<   r   r   r   Úevict¡  s   zEvictable.evictrê   Úlimitc                    s2   z‡ fdd„||ƒD ƒ W d S  t y   Y d S w )Nc                    s   g | ]}ˆ   ¡ ‘qS r   )Ú_evict1)r/   r·   r<   r   r   r4   §  s    z$Evictable._evict.<locals>.<listcomp>)Ú
IndexError)r=   rñ   rî   r   r<   r   rï   ¥  s
   ÿzEvictable._evictc                 C   s8   | j | jkr	tƒ ‚z|  ¡  W d S  | jy   tƒ ‚w r.   )Ú_evictcountÚmaxsizeró   Ú_pop_to_evictr   r<   r   r   r   rò   «  s   ÿzEvictable._evict1)rT   N)
r   r   r   rL   r   rð   rî   Úintrï   rò   r   r   r   r   r%   œ  s    
r%   c                   @   s„   e Zd ZdZeZdefdd„Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdefdd„Zdd„ Zdd„ Zedd„ ƒZdS )r'   zA buffer of pending messages.Nc                 C   s@   || _ ||pg ƒ| _| jj| _| jj| _| jj| _| jj| _	d S r.   )
rõ   rÍ   r²   Ú_appendÚpopleftÚ_popr“   Ú_lenÚextendÚ_extend)r=   rõ   r§   r   r   r   r   r\   ¹  s   


zMessagebuffer.__init__c                 C   ó"   |   |¡ | jo|  ¡  d S  d S r.   )rø   rõ   rï   rÜ   r   r   r   ÚputÂ  r˜   zMessagebuffer.putc                 C   rþ   r.   )rý   rõ   rï   )r=   Úitr   r   r   rü   Ç  r˜   zMessagebuffer.extendc                 G   s2   z|   ¡ W S  ty   |r|d  Y S |  ¡ ‚w )Nr   )rú   ró   r   ©r=   rg   r   r   r   ÚtakeÌ  s   
ýzMessagebuffer.takec                 C   ro   r.   )r  r<   r   r   r   rö   Õ  rr   zMessagebuffer._pop_to_evictc                 C   s$   dt | ƒj› dt| ƒ› d| j› d�S ©Nú<z: ú/ú>)rR   r   r�   rõ   r<   r   r   r   r£   Ù  s   $zMessagebuffer.__repr__c                 c   s*   � 	 z|   ¡ V  W n
 ty   Y d S w qr.   )rú   ró   r<   r   r   r   rq   Ý  s   €ÿýzMessagebuffer.__iter__c                 C   ro   r.   )rû   r<   r   r   r   r“   å  rr   zMessagebuffer.__len__rT   c                 C   rç   r.   ©rÍ   rÜ   r   r   r   rl   é  s   
zMessagebuffer.__contains__c                 C   r™   r.   )r¬   rÍ   r<   r   r   r   Ú__reversed__ì  r›   zMessagebuffer.__reversed__c                 C   s
   | j | S r.   r  )r=   Úindexr   r   r   rk   ð  r›   zMessagebuffer.__getitem__c                 C   s   t | ƒS r.   ©r�   r<   r   r   r   rô   ô  s   zMessagebuffer._evictcount)r   r   r   rL   r   r   r\   rÿ   rü   r  rö   r£   rq   r“   ré   rl   r  rk   rí   rô   r   r   r   r   r'   ´  s     		r'   c                       s‚   e Zd ZdZeZeZdZdZdZ	d‡ fdd„	Z
dd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZ‡  ZS )r!   zMap of buffers.Nr   éè  c                    s@   t ƒ  ¡  || _d| _|r|  |¡ tdd„ |  ¡ D ƒƒ| _d S )Nr  c                 s   s   � | ]}t |ƒV  qd S r.   r
  )r/   Úbufr   r   r   r•     r–   z%BufferMap.__init__.<locals>.<genexpr>)rº   r\   rõ   Ú
bufmaxsizer�   Úsumr6   Útotal)r=   rõ   r§   r  r¼   r   r   r\     s   

zBufferMap.__init__c                 C   s@   |   |¡ |¡ |  jd7  _|  |¡ | jo|  ¡  d S  d S )Nr   )Ú_get_or_create_bufferrÿ   r  r?   rõ   rï   )r=   rB   r×   r   r   r   rÿ     s   
zBufferMap.putc                 C   s:   |   |¡ |¡ |  jt|ƒ7  _| jo|  ¡  d S  d S r.   )r  rü   r  r�   rõ   rï   )r=   rB   r   r   r   r   rü     s   zBufferMap.extendc                 G   s†   d\}}z| | }W n t y   d}Y n w z| ¡ }|  jd8  _W n | jy/   d}Y nw |  |¡ |rA|r=|d S |  ¡ ‚|S )N)NFTr   r   )rP   r  r  r   r?   )r=   rB   rg   r×   Úthrowr  r   r   r   r    s$   ÿÿ
zBufferMap.takec                 C   s2   z| | W S  t y   |  ¡  }| |< | Y S w r.   )rP   Ú_new_buffer)r=   rB   r  r   r   r   r  3  s   
þzBufferMap._get_or_create_bufferc                 C   s   | j | jd�S )N)rõ   )ÚBufferr  r<   r   r   r   r  ;  rc   zBufferMap._new_bufferc                 G   s   | |   ¡  j|Ž S r.   )r>   r  r  r   r   r   Ú_LRUpop?  r]   zBufferMap._LRUpopc              
   C   s†   t dƒD ]<}|  ¡ }| | }z| ¡  W n t| jfy%   |  |¡ Y qw |  jd8  _t|ƒs9|  |¡  d S |  |¡  d S d S )Nrê   r   )	rî   r>   r  ró   r   rA   r  r�   r?   )r=   r·   rB   r  r   r   r   rö   C  s   þ

ÿïzBufferMap._pop_to_evictc                 C   s"   dt | ƒj› d| j› d| j› d�S r  )rR   r   r  rõ   r<   r   r   r   r£   X  s   "zBufferMap.__repr__c                 C   s   | j S r.   )r  r<   r   r   r   rô   \  s   zBufferMap._evictcount)Nr  )r   r   r   rL   r'   r  r   rõ   r  r  r\   rÿ   rü   r  r  r  r  rö   r£   rí   rô   rÅ   r   r   r¼   r   r!   ý  s$    	r!   )5rL   rÓ   Úcollectionsr   rN   r   Úcollections.abcr   r   r   r   r   Úheapqr	   r
   r   Ú	itertoolsr   r   Úqueuer   Útypingr   r   r   r   Ú
functionalr   r   Útextr   Ú__pypy__r   rO   ÚImportErrorÚdjango.utils.functionalr   r   Ú__all__rä   r(   r)   r   r¤   r    r$   Úregisterr"   r#   r&   r%   r'   r!   r   r   r   r   Ú<module>   sR    ÿý+
J X 
a
F