
    hXc                     j   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 	 ddlm Z! 	 ddl#m$Z$m%Z% dZ&dZ'd Z(d Z) G d de      Z G d d      Z* G d de+e*      Z, G d d      Z- e	j\                  e-        G d de	      Z/ G d d e/e*      Z0 G d! d"      Z1 e
j\                  e1        G d# d$      Z2 G d% d&e2      Z3 ej\                  e3        G d' d(ee2      Z4y# e"$ r dZ!Y w xY w# e"$ r  G d d      Z$e$Z%Y w xY w))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                       e Zd Zy)r   N)__name__
__module____qualname__     T/var/www/Befach/backend/env/lib/python3.12/site-packages/celery/utils/collections.pyr   r      s    r    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                     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'   )ms    r!   r+   r+   '   s5     !j,/0JJ#-a#9=@q@r    c                     | j                   }|j                         D cg c]  \  }}|	 |||       c}} | S c c}}w )zpIn place left precedent dictionary merge.

    Keeps values from `L`, if the value in `R` is :const:`None`.
    )__setitem__items)LRsetitemkvs        r!   r,   r,   /   s9     mmG wwy:tq!AMWQ]:H ;s   
<<c                   @    e Zd ZdZd Z eed      serddZyddZyy)r   z#Dict where insertion order matters.c                 F    t        t        | j                                     S N)nextiterkeysselfs    r!   _LRUkeyzOrderedDict._LRUkey=   s     D%&&r    move_to_endc                 F    |st        d      | j                  |      | |<   y )Nzno last=True on PyPy)NotImplementedErrorpop)r@   keylasts      r!   rB   zOrderedDict.move_to_endF   s$     ..DEE HHSMS	r    c                     | j                   |   }|d   }|d   }||d<   ||d<   | j                  }|r|d   }||d<   ||d<   |x|d<   |d<   y |d   }||d<   ||d<   |x|d<   |d<   y Nr   r   )_OrderedDict__map_OrderedDict__root)r@   rF   rG   link	link_prev	link_nextroot
first_nodes           r!   rB   zOrderedDict.move_to_endQ   s    --c2 G	 G	(	!(	!..7D"DG"DG(,,DGd1g!%aJ"DG(DG.22DGjmr    N)T)	r   r   r   __doc__rA   hasattr_OrderedDict_dict_is_orderedrB   r   r    r!   r   r   :   s(    -' </*3 0r    r   c                   &    e Zd ZdZd ZdeddfdZy)r"   z[Mixin for Mapping interface that adds attribute access.

    I.e., `d.key -> d[key]`).
    c                 n    	 | |   S # t         $ r$ t        t        |       j                  d|      w xY w)z`d.key -> d[key]`.z object has no attribute )KeyErrorAttributeErrortyper   )r@   r7   s     r!   __getattr__zAttributeDictMixin.__getattr__k   sK    	J7N 	J :&&))B1%HJ J	Js    -4rF   returnNc                     || |<   y)z"`d[key] = value -> d.key = value`.Nr   r@   rF   values      r!   __setattr__zAttributeDictMixin.__setattr__t   s    S	r    )r   r   r   rQ   rZ   strr_   r   r    r!   r"   r"   e   s     
Js d r    r"   c                       e Zd ZdZy)r#   z$Dict subclass with attribute access.N)r   r   r   rQ   r   r    r!   r#   r#   y   s    .r    r#   c                   x    e Zd ZdZdZd Zd Zd ZddZddZ	d Z
d	 Zd
 Zd ZeZd Zd ZeZd ZeZeZeZeZy)r'   z[Dict interface to attributes.

    `obj[k] -> obj.k`
    `obj[k] = val -> obj.k = val`
    Nc                 2    t         j                  | d|       y )Nobj)objectr_   )r@   rd   s     r!   __init__zDictAttribute.__init__   s    4,r    c                 .    t        | j                  |      S r;   )getattrrd   r@   rF   s     r!   rZ   zDictAttribute.__getattr__       txx%%r    c                 0    t        | j                  ||      S r;   setattrrd   r]   s      r!   r_   zDictAttribute.__setattr__   s    txxe,,r    c                 0    	 | |   S # t         $ r |cY S w xY wr;   rW   r@   rF   defaults      r!   getzDictAttribute.get   %    	9 	N	    c                     || vr|| |<   y y r;   r   rp   s      r!   
setdefaultzDictAttribute.setdefault   s    d?DI r    c                 `    	 t        | j                  |      S # t        $ r t        |      w xY wr;   )rh   rd   rX   rW   ri   s     r!   __getitem__zDictAttribute.__getitem__   s1    	 488S)) 	 3-	 s    -c                 2    t        | j                  ||       y r;   rl   r]   s      r!   r2   zDictAttribute.__setitem__   s    #u%r    c                 .    t        | j                  |      S r;   )rR   rd   ri   s     r!   __contains__zDictAttribute.__contains__   rj   r    c                 >    t        t        | j                              S r;   )r=   dirrd   r?   s    r!   _iterate_keyszDictAttribute._iterate_keys   s    CM""r    c                 "    | j                         S r;   r~   r?   s    r!   __iter__zDictAttribute.__iter__   s    !!##r    c              #   j   K   | j                         D ]  }|t        | j                  |      f  y wr;   r~   rh   rd   ri   s     r!   _iterate_itemszDictAttribute._iterate_items   s/     %%'Cwtxx--- (s   13c              #   f   K   | j                         D ]  }t        | j                  |        y wr;   r   ri   s     r!   _iterate_valueszDictAttribute._iterate_values   s*     %%'C$((C(( (s   /1r;   )r   r   r   rQ   rd   rf   rZ   r_   rr   rv   rx   r2   r{   r~   iterkeysr   r   	iteritemsr   
itervaluesr3   r>   valuesr   r    r!   r'   r'   }   sn     C-&- 
 &&# H$. I) !JEDFr    r'   c                       e 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d Zd Zd Zd ZeZddZd Zd Zed        Zd ZeZd Zd Z e Z!d Z"e"Z#d Z$e$Z%d Z&e Z'e"Z(e$Z)y)r%   z!Key lookup on a sequence of maps.Nr   c                     t        |xs i g      }| j                  j                  |j                  d      ||d   |dd  g        y )Nkey_tr   r   )r   mapschangesdefaults
_observers)list__dict__updaterr   )r@   r   kwargss      r!   rf   zChainMap.__init__   sK    DLRD!**W%G!"X 	 	
r    c                     t        |      }| j                  j                  d|       | j                  j                  d|       y rI   )r+   r   insertr   )r@   ds     r!   add_defaultszChainMap.add_defaults   s4    !Q"		Ar    c                 z    	  | j                   d   j                  |g| S # t        $ r t        d|      w xY w)Nr   z$Key not found in the first mapping: )r   rE   rW   rp   s      r!   rE   zChainMap.pop   sR    	@#499Q<##C2'22 	@6sg>@ @	@s   " :c                     t        |      r;   ro   ri   s     r!   __missing__zChainMap.__missing__   s    smr    c                 @    | j                   | j                  |      S |S r;   )r   ri   s     r!   _keyzChainMap._key   s    "&**"8tzz#AcAr    c                     | j                  |      }| j                  D ]	  }	 ||   c S  | j                  |      S # t        $ r Y (w xY wr;   )r   r   rW   r   )r@   rF   r   mappings       r!   rx   zChainMap.__getitem__   sS    yy~yyGt}$ !
 $$  s   ;	AAc                 @    || j                   | j                  |      <   y r;   r   r   r]   s      r!   r2   zChainMap.__setitem__       ',TYYs^$r    c                 t    	 | j                   | j                  |      = y # t        $ r t        d|      w xY w)Nz Key not found in first mapping: )r   r   rW   ri   s     r!   __delitem__zChainMap.__delitem__  s@    	GTYYs^, 	G=cWEFF	Gs    7c                 8    | j                   j                          y r;   r   clearr?   s    r!   r   zChainMap.clear	  s    r    c                 N    	 | | j                  |         S # t        $ r |cY S w xY wr;   )r   rW   rp   s      r!   rr   zChainMap.get  s.    			#'' 	N	s    $$c                 V    t         t               j                  | j                         S r;   )lensetunionr   r?   s    r!   __len__zChainMap.__len__  s    ;35;;		*++r    c                 "    | j                         S r;   r   r?   s    r!   r   zChainMap.__iter__  s    !!##r    c                 b    | j                        t        fd| j                  D              S )Nc              3   &   K   | ]  }|v  
 y wr;   r   ).0r0   rF   s     r!   	<genexpr>z(ChainMap.__contains__.<locals>.<genexpr>  s     /3!8/   )r   anyr   ri   s    `r!   r{   zChainMap.__contains__  s%    iin/TYY///r    c                 ,    t        | j                        S r;   )r   r   r?   s    r!   __bool__zChainMap.__bool__   s    499~r    c                 :    | j                  |      }|| vr|| |<   y y r;   )r   rp   s      r!   rv   zChainMap.setdefault%  s$    iind?DI r    c                 p     | j                   j                  |i |}| j                  D ]
  } ||i |  |S r;   )r   r   r   )r@   argsr   resultcallbacks        r!   r   zChainMap.update+  s=    $$$d5f5Hd%f% (r    c           	      t    dj                  | dj                  t        t        | j                                    S )Nz{0.__class__.__name__}({1})z, )formatjoinmapreprr   r?   s    r!   __repr__zChainMap.__repr__2  s.    ,33$))Cdii013 	3r    c                 :     | t        j                  |g|       S )z?Create a ChainMap with a single dict created from the iterable.)dictfromkeys)clsiterabler   s      r!   r   zChainMap.fromkeys7  s     4==1D122r    c                 x     | j                   | j                  d   j                         g| j                  dd   S rI   )	__class__r   copyr?   s    r!   r   zChainMap.copy=  s3    t~~diil//1BDIIabMBBr    c                 L    t        fdt        | j                        D         S )Nc              3   .   K   | ]  } |        y wr;   r   )r   r   ops     r!   r   z!ChainMap._iter.<locals>.<genexpr>H  s     :r!u:   )r   reversedr   )r@   r   s    `r!   _iterzChainMap._iterB  s     :htyy&9:;;r    c                 8    t        | j                  d             S )Nc                 "    | j                         S r;   )r>   )r   s    r!   <lambda>z(ChainMap._iterate_keys.<locals>.<lambda>L  s
    r    )r   r   r?   s    r!   r~   zChainMap._iterate_keysJ  s    DJJ1233r    c                       fd D        S )Nc              3   ,   K   | ]  }||   f  y wr;   r   r   rF   r@   s     r!   r   z*ChainMap._iterate_items.<locals>.<genexpr>Q  s     1Sd3i 1s   r   r?   s   `r!   r   zChainMap._iterate_itemsO  s    1D11r    c                       fd D        S )Nc              3   (   K   | ]	  }|     y wr;   r   r   s     r!   r   z+ChainMap._iterate_values.<locals>.<genexpr>V  s     *cS	*s   r   r?   s   `r!   r   zChainMap._iterate_valuesT  s    *T**r    c                 :    | j                   j                  |       y r;   )r   append)r@   r   s     r!   bind_tozChainMap.bind_toY  s    x(r    r;   )*r   r   r   rQ   r   r   r   r   r   rf   r   rE   r   r   rx   r2   r   r   rr   r   r   r{   r   __nonzero__rv   r   r   classmethodr   r   __copy__r   r~   r   r   r   r   r   r   r>   r3   r   r   r    r!   r%   r%      s    +EGHDJ	
@B%-G,$0
 K 3
 3 3
C H<4 H2 I+ !J) DEFr    r%   c                   Z     e Zd ZdZd fd	Zd Z fdZd Zd ZddZ	d Z
d	 Zd
 Z x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.
    c                     |g n|}t        |   |g|  | j                  j                  |r|j	                  d      dz   n||       y )N_)prefix_keys)superrf   r   r   rstrip)r@   r   r   r>   r   r   s        r!   rf   zConfigurationView.__init__o  sP    !)2x,8,/56==%+6 	 	
r    c                 p    | j                   }|r&|j                  |      s||z   n|}t        ||      |fS |fS r;   )r   
startswithr   )r@   rF   r   pkeys       r!   _to_keyszConfigurationView._to_keysx  s=    '*~~f'=6C<3DdF+S00tr    c                 b   | j                        }t        |   }|| j                  rt	        fd| j                  D              ndz   D ]  }	  ||      c S  	 | j                        S # t
        $ r Y ,w xY w# t
        $ r( t        |      dkD  rt         dj                  |        w xY w)Nc              3   .   K   | ]  } |        y wr;   r   )r   frF   s     r!   r   z0ConfigurationView.__getitem__.<locals>.<genexpr>  s     1af1r   r   r   z)Key not found: {0!r} (with prefix: {0!r}))	r   r   rx   r   tuplerW   r   r   r   )r@   rF   r>   getitemr7   r   s    `   r!   rx   zConfigurationView.__getitem__  s    }}S!'%59ZZ1djj11RIAqz!I	##C((	  
  	4y1}F?FFMO O		s   A.A= .	A:9A:=1B.c                 @    || j                   | j                  |      <   y r;   r   r]   s      r!   r2   zConfigurationView.__setitem__  r   r    c                 .     t        d  fd|D              S )Nc              3   @   K   | ]  }j                  |        y wr;   )rr   r   s     r!   r   z*ConfigurationView.first.<locals>.<genexpr>  s     :cDHHSM:s   )r   )r@   r>   s   ` r!   r   zConfigurationView.first  s    T:T:;;r    c                 0    	 | |   S # t         $ r |cY S w xY wr;   ro   rp   s      r!   rr   zConfigurationView.get  rs   rt   c                 8    | j                   j                          y)z&Remove all changes, but keep defaults.Nr   r?   s    r!   r   zConfigurationView.clear  s     	r    c                 b    | j                  |      t        fd| j                  D              S )Nc              3   H   K   | ]  t        fd D                yw)c              3   &   K   | ]  }|v  
 y wr;   r   )r   r7   r0   s     r!   r   z;ConfigurationView.__contains__.<locals>.<genexpr>.<genexpr>  s     ,!qAv,r   N)r   )r   r0   r>   s    @r!   r   z1ConfigurationView.__contains__.<locals>.<genexpr>  s     @3,t,,@s   ")r   r   r   )r@   rF   r>   s     @r!   r{   zConfigurationView.__contains__  s&    }}S!@dii@@@r    c                     |j                   d   }|j                   d   }| j                   j                  |||j                   d   |j                   d   |g|z          y )Nr   r   r   r   )r   r   r   r   r   )r   r   )r@   otherr   r   s       r!   	swap_withzConfigurationView.swap_with  s]    ..+>>*-..)>>(+X% 	 	
r    )NNNr;   )r   r   r   rQ   rf   r   rx   r2   r   rr   r   r{   r   __classcell__r   s   @r!   r&   r&   a  s6    
&-<
A


r    r&   c                       e Zd ZdZdZddZd Zd Zd ZddZ	d	 Z
d
 ZeZddZddedefdZd Zd Zd Zd Zd Zd Zd Zd ZeZed        Zy)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
       Nc                 (   |dn|| _         |dn|| _        |dn|| _        i | _        g | _        |r| j                  |       | j                   | j                  cxk\  rdk\  st        d       t        d      | j                  dk  rt        d      y )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   s        r!   rf   zLimitedSet.__init__  s    !>av!>av#Oq

KK{{dkk.Q.LN N /LN N<<!:;; r    c                     | j                   j                         D cg c]  }| c}| j                  dd t        | j                         yc c}w )z=Time consuming recreating of heap.  Don't run this too often.N)r  r   r  r
   )r@   entrys     r!   _refresh_heapzLimitedSet._refresh_heap  s;     -1JJ,=,=,?@5@

1

 As   	Ac                 X    | j                   | j                  k\  r| j                          y y r;   )_heap_overloadmax_heap_percent_overloadr  r?   s    r!   _maybe_refresh_heapzLimitedSet._maybe_refresh_heap	  s(    $"@"@@  Ar    c                 V    | j                   j                          g | j                  dd y)z)Clear all data, start from scratch again.N)r  r   r  r?   s    r!   r   zLimitedSet.clear  s!     	



1r    c                 D   |xs t        j                         }|| j                  v r| j                  |       ||f}|| j                  |<   t	        | j
                  |       | j                  r4t        | j                        | j                  k\  r| j                          yyy)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  s       r!   addzLimitedSet.add  s|     %T^^%4::LLd 

4U#;;3tzz?dkk9JJL :;r    c                    |syt        |t              rF| j                  j                  |j                         | j	                          | j                          yt        |t              rp|j                         D ]\  \  }}t        |t        t        f      r|d   }t        |t              st        dt        |      d|       | j                  ||       ^ y|D ]  }| j                  |        y)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   r3   r   r   floatr  rY   r  )r@   r   rF   insertedrd   s        r!   r   zLimitedSet.update   s     eZ(JJekk* JJLt$!&Xh6'{H!(E2$>>,M(EF F h' "/  r    c                 \    | j                   j                  |d        | j                          y r;   )r  rE   r  r@   r  s     r!   r  zLimitedSet.discard:  s"     	

tT"  "r    c                 Z   |xs t        j                         }t        |t              r |       n|}| j                  rUt        | j                        | j                  kD  r3| j                          t        | j                        | j                  kD  r3| j                  rt        | j                        | j                  cxkD  rdk\  rdn y| j                  d   \  }}|| j                  z   |kD  ry| j                          t        | j                        | j                  cxkD  rdk\  r^y yyy)zCheck 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  rE   r  r   r  )r@   r  inserted_timer   s       r!   r  zLimitedSet.purgeA  s     %T^^%!#x0cec;;djj/DKK/
 djj/DKK/ <<djj/DKK414#'::a= q 4<</#5
	 djj/DKK414 r    rq   r[   c                     | j                   r6t        | j                         \  }}	 | j                  j                  |       |S |S # t        $ r Y nw xY w| j                   rT)z?Remove and return the oldest item, or :const:`None` when empty.)r  r   r  rE   rW   )r@   rq   r   r  s       r!   rE   zLimitedSet.popV  sZ    jjdjj)GAt

t$ 	  	 jjs   A 	AAc                 j    | j                   j                         D ci c]  \  }}||
 c}}S c c}}w )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
        )r  r   )r@   r  rF   s      r!   as_dictzLimitedSet.as_dictb  s-     48::3D3D3FG-(CXGGGs   /c                 4    | j                   |j                   k(  S r;   r  )r@   r   s     r!   __eq__zLimitedSet.__eq__r  s    zzU[[((r    c                 j    t         j                  | t        |       j                  t	        |             S )N)namesize)REPR_LIMITED_SETr   rY   r   r   r?   s    r!   r   zLimitedSet.__repr__v  s/    &&tDz**T ' 
 	
r    c                 V    d t        | j                  j                               D        S )Nc              3   &   K   | ]	  \  }}|  y wr;   r   )r   r   is      r!   r   z&LimitedSet.__iter__.<locals>.<genexpr>~  s     :da:s   )sortedr  r   r?   s    r!   r   zLimitedSet.__iter__|  s    :fTZZ%6%6%89::r    c                 ,    t        | j                        S r;   )r   r  r?   s    r!   r   zLimitedSet.__len__  s    4::r    c                     || j                   v S r;   r!  ri   s     r!   r{   zLimitedSet.__contains__  s    djj  r    c                 ~    | j                   | j                  | j                  | j                         | j                  ffS r;   )r   r   r  r  r   r?   s    r!   
__reduce__zLimitedSet.__reduce__  s6    ~~KKt||~t{{ D D 	Dr    c                 ,    t        | j                        S r;   )boolr  r?   s    r!   r   zLimitedSet.__bool__  s    DJJr    c                 x    t        | j                        dz  t        t        | j                        d      z  dz
  S )z5Compute how much is heap bigger than data [percents].d   r   )r   r  maxr  r?   s    r!   r
  zLimitedSet._heap_overload  s0     4::$s3tzz?A'>>DDr    )r   r   Nr   r;   )r   r   r   rQ   r  rf   r  r  r   r  r   r  	pop_valuer  r   rE   r  r"  r   r   r   r{   r.  r   r   propertyr
  r   r    r!   r)   r)     s    3j !#<$!

4#
 I*
3 
# 
H )
;!D
  KE Er    r)   c                   :    e Zd ZdZeZd	dZdefdeddfdZd	dZ	y)
r(   z2Mixin for classes supporting the ``evict`` method.r[   Nc                 0    | j                  t               y)z&Force evict until maxsize is enforced.)rangeN)_evictr   r?   s    r!   evictzEvictable.evict  s    % r    r2  limitc                 v    	  ||      D cg c]  }| j                          c} y c c}w # t        $ r Y y w xY wr;   )_evict1
IndexError)r@   r;  r8  r   s       r!   r9  zEvictable._evict  s4    	%*5\2T\\^22 		s   
, ', , 	88c                     | j                   | j                  k  r
t               	 | j                          y # | j                  $ r t               w xY wr;   )_evictcountmaxsizer>  _pop_to_evictr   r?   s    r!   r=  zEvictable._evict1  sH    t||+,	 zz 	,	s	   6 A)r[   N)
r   r   r   rQ   r   r:  r8  intr9  r=  r   r    r!   r(   r(     s.    <E! #&U C t r    r(   c                   r    e Zd ZdZeZdefdZd Zd Zd Z	d Z
d Zd	 Zd
 ZdefdZd Zd Zed        Zy)r*   zA buffer of pending messages.Nc                    || _          ||xs g       | _        | j                  j                  | _        | j                  j                  | _        | j                  j                  | _        | j                  j                  | _	        y r;   )
rA  r  r   _appendpopleft_popr   _lenextend_extend)r@   rA  r   r   s       r!   rf   zMessagebuffer.__init__  s]    (.b)	yy''II%%	II%%	yy''r    c                 f    | j                  |       | j                  xr | j                          y  y r;   )rF  rA  r9  r  s     r!   putzMessagebuffer.put  s#    T&&r    c                 f    | j                  |       | j                  xr | j                          y  y r;   )rK  rA  r9  )r@   its     r!   rJ  zMessagebuffer.extend  s#    R&&r    c                 p    	 | j                         S # t        $ r |r|d   cY S | j                         w xY w)Nr   )rH  r>  r   r@   rq   s     r!   takezMessagebuffer.take  s;    	99; 	qz!**,	s    55c                 "    | j                         S r;   )rR  r?   s    r!   rB  zMessagebuffer._pop_to_evict      yy{r    c                 f    dt        |       j                   dt        |        d| j                   dS N<z: />)rY   r   r   rA  r?   s    r!   r   zMessagebuffer.__repr__  s0    4:&&'r#d)Adll^1EEr    c              #   R   K   	 	 | j                          # t        $ r Y y w xY wwr;   )rH  r>  r?   s    r!   r   zMessagebuffer.__iter__  s2     iik!   s   ' '	$'$'c                 "    | j                         S r;   )rI  r?   s    r!   r   zMessagebuffer.__len__  rT  r    r[   c                     || j                   v S r;   r  r  s     r!   r{   zMessagebuffer.__contains__  s    tyy  r    c                 ,    t        | j                        S r;   )r   r  r?   s    r!   __reversed__zMessagebuffer.__reversed__  s    		""r    c                      | j                   |   S r;   r]  )r@   indexs     r!   rx   zMessagebuffer.__getitem__  s    yyr    c                     t        |       S r;   r   r?   s    r!   r@  zMessagebuffer._evictcount  s     4yr    )r   r   r   rQ   r   r   rf   rM  rJ  rR  rB  r   r   r   r0  r{   r_  rx   r5  r@  r   r    r!   r*   r*     sb    'E)-U ('
'
F!D !#   r    r*   c                   x     e Zd ZdZeZeZdZdZdZ	d fd	Z
d Zd Zd Zd Zd	 Zd
 Zd Zd Zed        Z xZS )r$   zMap of buffers.Nr   c                     t         |           || _        d| _        |r| j	                  |       t        d | j                         D              | _        y )N  c              3   2   K   | ]  }t        |        y wr;   rc  )r   bufs     r!   r   z%BufferMap.__init__.<locals>.<genexpr>  s     :cS:s   )r   rf   rA  
bufmaxsizer   sumr3   total)r@   rA  r   ri  r   s       r!   rf   zBufferMap.__init__  sC    KK!:TZZ\::
r    c                     | j                  |      j                  |       | xj                  dz  c_        | j                  |       | j                  xr | j                          y  y )Nr   )_get_or_create_bufferrM  rk  rB   rA  r9  )r@   rF   r  s      r!   rM  zBufferMap.put  sK    ""3'++D1

a
&&r    c                     | j                  |      j                  |       | xj                  t        |      z  c_        | j                  xr | j                          y  y r;   )rm  rJ  rk  r   rA  r9  )r@   rF   rO  s      r!   rJ  zBufferMap.extend  sB    ""3'..r2

c"g
&&r    c                    d\  }}	 | |   }	 |j                         }| xj                  dz  c_        | j                  |       |r|r|d   S | j                         |S # | j                  $ r d}Y .w xY w# t        $ r d}Y ?w xY w)N)NFr   Tr   )rR  rk  rB   r   rW   )r@   rF   rq   r  throwrh  s         r!   rR  zBufferMap.take  s    !e	&s)C&xxz

a
   %qz!**, ::   	E	s"   A5 %A A21A25BBc                 Z    	 | |   S # t         $ r | j                         x}| |<   |cY S w xY wr;   )rW   _new_buffer)r@   rF   rh  s      r!   rm  zBufferMap._get_or_create_buffer3  s<    	9 	"..00C$s)J	s     **c                 :    | j                  | j                        S )N)rA  )Bufferri  r?   s    r!   rr  zBufferMap._new_buffer;  s    {{4??{33r    c                 B     | | j                            j                  | S r;   )rA   rR  rQ  s     r!   _LRUpopzBufferMap._LRUpop?  s     (tDLLN#(('22r    c                 R   t        d      D ]m  }| j                         }| |   }	 |j                          | xj                  dz  c_        t	        |      s| j                  |        y | j                  |        y  y # t        | j                  f$ r | j                  |       Y w xY w)Nr2  r   )	r8  rA   rR  rk  r   rE   rB   r>  r   )r@   r   rF   rh  s       r!   rB  zBufferMap._pop_to_evictC  s    sA,,.Cs)C
 

a
3xHHSM  $$S)# 
 

+ s   A==&B&%B&c                 h    dt        |       j                   d| j                   d| j                   dS rV  )rY   r   rk  rA  r?   s    r!   r   zBufferMap.__repr__X  s0    4:&&'r$**Qt||nAFFr    c                     | j                   S r;   )rk  r?   s    r!   r@  zBufferMap._evictcount\  s     zzr    )Nrf  )r   r   r   rQ   r*   rt  r   rA  rk  ri  rf   rM  rJ  rR  rm  rr  rv  rB  r   r5  r@  r   r   s   @r!   r$   r$     sa    FEGEJ;'',43*G  r    r$   )5rQ   r  collectionsr   rS   r   collections.abcr   r   r   r   r	   heapqr
   r   r   	itertoolsr   r   queuer   typingr   r   r   r   
functionalr   r   textr   __pypy__r   rT   ImportErrordjango.utils.functionalr   r   __all__r&  r+   r,   r"   r   r#   r'   registerr%   r&   r)   r(   r*   r$   r   r    r!   <module>r     sR   >  3  S S , , "  , , # :@ 
A(3, (3V (/D, /G GT    &T~ TnU
"4 U
p]E ]E@ 
  J  0CI CL   -  bY bY  
   Ls$   D D DDD21D2