o
    [h(                     @   sv   d dl Z d dlmZ G dd dZG dd deZG dd deZG d	d
 d
eZ	G dd deZ
G dd deZdS )    N)Mappingc                   @   sb   e Zd ZdZd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dd ZdS )
OrderedSetz?
    A set which keeps the ordering of the inserted items.
    Nc                 C   s   t |pd| _ d S )N )dictfromkeys)selfiterabler   r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/utils/datastructures.py__init__
      zOrderedSet.__init__c                 C   s   d | j |< d S Nr   r   itemr   r   r	   add   s   zOrderedSet.addc                 C   s   | j |= d S r   r   r   r   r   r	   remove   s   zOrderedSet.removec                 C   s&   z|  | W d S  ty   Y d S w r   )r   KeyErrorr   r   r   r	   discard   s
   zOrderedSet.discardc                 C   
   t | jS r   )iterr   r   r   r   r	   __iter__      
zOrderedSet.__iter__c                 C   r   r   )reversedr   r   r   r   r	   __reversed__   r   zOrderedSet.__reversed__c                 C   s
   || j v S r   r   r   r   r   r	   __contains__   r   zOrderedSet.__contains__c                 C   r   r   )boolr   r   r   r   r	   __bool__"   r   zOrderedSet.__bool__c                 C   r   r   )lenr   r   r   r   r	   __len__%   r   zOrderedSet.__len__c                 C   s,   | j r
tt| j nd}| jj d| dS )N ())r   reprlist	__class____qualname__r   datar   r   r	   __repr__(   s   zOrderedSet.__repr__r   )__name__
__module__r&   __doc__r
   r   r   r   r   r   r   r   r   r)   r   r   r   r	   r      s    
r   c                   @   s   e Zd ZdS )MultiValueDictKeyErrorN)r*   r+   r&   r   r   r   r	   r-   -   s    r-   c                       s   e Zd ZdZd/ fdd	Z fddZ fddZ fd	d
Zdd Zdd Z	dd Z
dd Zd0ddZd1 fdd	Zd0ddZ fddZd0ddZd0dd Zd!d" Zd#d$ Z fd%d&Zd'd( Zd)d* Zd+d, Zd-d. Z  ZS )2MultiValueDicta  
    A subclass of dictionary customized to handle multiple values for the
    same key.

    >>> d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']})
    >>> d['name']
    'Simon'
    >>> d.getlist('name')
    ['Adrian', 'Simon']
    >>> d.getlist('doesnotexist')
    []
    >>> d.getlist('doesnotexist', ['Adrian', 'Simon'])
    ['Adrian', 'Simon']
    >>> d.get('lastname', 'nonexistent')
    'nonexistent'
    >>> d.setlist('lastname', ['Holovaty', 'Willison'])

    This class exists to solve the irritating problem raised by cgi.parse_qs,
    which returns a list for every key, even though most web forms submit
    single name-value pairs.
    r   c                    s   t  | d S r   )superr
   )r   Zkey_to_list_mappingr%   r   r	   r
   H   s   zMultiValueDict.__init__c                    s   d| j jt  f S )Nz<%s: %s>)r%   r*   r/   r)   r   r0   r   r	   r)   K   s   zMultiValueDict.__repr__c                    sJ   zt  |}W n ty   t|w z|d W S  ty$   g  Y S w )z|
        Return the last data value for this key, or [] if it's an empty list;
        raise KeyError if not found.
        )r/   __getitem__r   r-   
IndexErrorr   keylist_r0   r   r	   r2   N   s   
zMultiValueDict.__getitem__c                    s   t  ||g d S r   r/   __setitem__r   r5   valuer0   r   r	   r8   \   r   zMultiValueDict.__setitem__c                 C   s   |  dd |  D S )Nc                 S   s    g | ]\}}||d d  fqS r   r   .0kvr   r   r	   
<listcomp>`   s     z+MultiValueDict.__copy__.<locals>.<listcomp>)r%   listsr   r   r   r	   __copy___      zMultiValueDict.__copy__c              	   C   sJ   |   }||t| < t| D ]\}}t|t||t|| q|S r   )r%   idr   itemsr8   copydeepcopy)r   memoresultr5   r:   r   r   r	   __deepcopy__b   s   zMultiValueDict.__deepcopy__c                    s    i  j d fdd D iS )N_datac                    s   i | ]}|  |qS r   _getlist)r<   r=   r   r   r	   
<dictcomp>l   s    z/MultiValueDict.__getstate__.<locals>.<dictcomp>)__dict__r   r   r   r	   __getstate__k   s    zMultiValueDict.__getstate__c                 C   s:   | di }| D ]
\}}| || q
| j| d S )NrJ   )poprD   setlistrN   update)r   obj_dictr(   r=   r>   r   r   r	   __setstate__n   s   zMultiValueDict.__setstate__Nc                 C   s4   z| | }W n t y   | Y S w |g kr|S |S )z
        Return the last data value for the passed key. If key doesn't exist
        or value is an empty list, return `default`.
        )r   )r   r5   defaultvalr   r   r	   gett   s   zMultiValueDict.getFc                    sT   zt  |}W n ty   |du rg  Y S | Y S w |r(|dur&t|nd}|S )z
        Return a list of values for the key.

        Used internally to manipulate values list. If force_list is True,
        return a new copy of values.
        N)r/   r2   r   r$   )r   r5   rU   
force_listvaluesr0   r   r	   rL      s   zMultiValueDict._getlistc                 C   s   | j ||ddS )zn
        Return the list of values for the key. If key doesn't exist, return a
        default value.
        T)rX   rK   r   r5   rU   r   r   r	   getlist   s   zMultiValueDict.getlistc                    s   t  || d S r   r7   r4   r0   r   r	   rQ         zMultiValueDict.setlistc                 C   s   || vr|| |< | | S r   r   rZ   r   r   r	   
setdefault   s   zMultiValueDict.setdefaultc                 C   s*   || vr|d u r
g }|  || | |S r   )rQ   rL   )r   r5   Zdefault_listr   r   r	   setlistdefault   s
   
zMultiValueDict.setlistdefaultc                 C   s   |  || dS )z8Append an item to the internal list associated with key.N)r^   appendr9   r   r   r	   
appendlist   s   zMultiValueDict.appendlistc                 c   s    | D ]	}|| | fV  qdS )zu
        Yield (key, value) pairs, where value is the last item in the list
        associated with the key.
        Nr   r   r5   r   r   r	   rD      s   zMultiValueDict.itemsc                    s   t t  S )zYield (key, list) pairs.)r   r/   rD   r   r0   r   r	   r@      s   zMultiValueDict.listsc                 c   s    | D ]}| | V  qdS )z'Yield the last value on every key list.Nr   ra   r   r   r	   rY      s   zMultiValueDict.valuesc                 C   s
   t  | S )z%Return a shallow copy of this object.)rE   r   r   r   r	   rE      s   
zMultiValueDict.copyc                 O   s   t |dkrtdt | |rC|d }t|tr+| D ]\}}| || qnt|tr4| }|D ]\}}| |	| q6| D ]\}}| |	| qGdS )z.Extend rather than replace existing key lists.   z*update expected at most 1 argument, got %dr   N)
r   	TypeError
isinstancer.   r@   r^   extendr   rD   r_   )r   argskwargsargr5   Z
value_listr:   r   r   r	   rR      s   

zMultiValueDict.updatec                    s    fdd D S )z5Return current object as a dict with singular values.c                    s   i | ]}| | qS r   r   )r<   r5   r   r   r	   rM          z'MultiValueDict.dict.<locals>.<dictcomp>r   r   r   r   r	   r      s   zMultiValueDict.dict)r   r   )NF)r*   r+   r&   r,   r
   r)   r2   r8   rA   rI   rO   rT   rW   rL   r[   rQ   r]   r^   r`   rD   r@   rY   rE   rR   r   __classcell__r   r   r0   r	   r.   1   s.    	



	r.   c                   @   sZ   e Zd ZdZddddZdd ZeZeZeZeZ	eZ
eZeZeZeZeZeZeZeZdS )	ImmutableLista0  
    A tuple-like object that raises useful errors when it is asked to mutate.

    Example::

        >>> a = ImmutableList(range(5), warning="You cannot mutate this.")
        >>> a[3] = '4'
        Traceback (most recent call last):
            ...
        AttributeError: You cannot mutate this.
    z"ImmutableList object is immutable.)warningc                O   s"   t j| g|R i |}||_|S r   )tuple__new__rl   )clsrl   rf   rg   r   r   r   r	   rn      s   zImmutableList.__new__c                 O   s
   t | jr   )AttributeErrorrl   )r   rf   rg   r   r   r	   complain   r   zImmutableList.complainN)r*   r+   r&   r,   rn   rq   __delitem__Z__delslice____iadd____imul__r8   Z__setslice__r_   re   insertrP   r   sortreverser   r   r   r	   rk      s"    rk   c                       s,   e Zd ZdZ fddZ fddZ  ZS )DictWrapperaG  
    Wrap accesses to a dictionary so that certain values (those starting with
    the specified prefix) are passed through a function before being returned.
    The prefix is removed before looking up the real value.

    Used by the SQL construction code to ensure that values are correctly
    quoted before being used.
    c                    s   t  | || _|| _d S r   )r/   r
   funcprefix)r   r(   ry   rz   r0   r   r	   r
     s   
zDictWrapper.__init__c                    s6   | | j}|| j}t |}|r| |S |S )z
        Retrieve the real value after stripping the prefix string (if
        present). If the prefix is present, pass the value through self.func
        before returning, otherwise return the raw value.
        )
startswithrz   removeprefixr/   r2   ry   )r   r5   Zuse_funcr:   r0   r   r	   r2     s   
zDictWrapper.__getitem__)r*   r+   r&   r,   r
   r2   rj   r   r   r0   r	   rx     s    	rx   c                   @   sT   e 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
edd ZdS )CaseInsensitiveMappinga  
    Mapping allowing case-insensitive key lookups. Original case of keys is
    preserved for iteration and string representation.

    Example::

        >>> ci_map = CaseInsensitiveMapping({'name': 'Jane'})
        >>> ci_map['Name']
        Jane
        >>> ci_map['NAME']
        Jane
        >>> ci_map['name']
        Jane
        >>> ci_map  # original case preserved
        {'name': 'Jane'}
    c                 C   s   dd |  |D | _d S )Nc                 S   s   i | ]\}}|  ||fqS r   lowerr;   r   r   r	   rM   1  s    z3CaseInsensitiveMapping.__init__.<locals>.<dictcomp>)_unpack_items_storer'   r   r   r	   r
   0  s   zCaseInsensitiveMapping.__init__c                 C   s   | j |  d S )Nrb   )r   r   ra   r   r   r	   r2   3  r\   z"CaseInsensitiveMapping.__getitem__c                 C   r   r   )r   r   r   r   r   r	   r   6  r   zCaseInsensitiveMapping.__len__c                 C   s.   t |todd |  D dd | D kS )Nc                 S      i | ]	\}}|  |qS r   r~   r;   r   r   r	   rM   :  s    z1CaseInsensitiveMapping.__eq__.<locals>.<dictcomp>c                 S   r   r   r~   r;   r   r   r	   rM   <  s    )rd   r   rD   )r   otherr   r   r	   __eq__9  s
   zCaseInsensitiveMapping.__eq__c                 C   s   dd | j  D S )Nc                 s   s    | ]\}}|V  qd S r   r   )r<   Zoriginal_keyr:   r   r   r	   	<genexpr>?  s    z2CaseInsensitiveMapping.__iter__.<locals>.<genexpr>)r   rY   r   r   r   r	   r   >  r   zCaseInsensitiveMapping.__iter__c                 C   s   t dd | j D S )Nc                 S   s   i | ]\}}||qS r   r   )r<   r5   r:   r   r   r	   rM   B  ri   z3CaseInsensitiveMapping.__repr__.<locals>.<dictcomp>)r#   r   rY   r   r   r   r	   r)   A  rB   zCaseInsensitiveMapping.__repr__c                 C   s   | S r   r   r   r   r   r	   rE   D  s   zCaseInsensitiveMapping.copyc                 c   s|    t | ttfr|  E d H  d S t| D ]&\}}t|dkr)td|t|t |d ts8td|d  |V  qd S )N   zDdictionary update sequence element #{} has length {}; 2 is required.r   z0Element key %r invalid, only strings are allowed)	rd   r   r   rD   	enumerater   
ValueErrorformatstr)r(   ielemr   r   r	   r   G  s    
z$CaseInsensitiveMapping._unpack_itemsN)r*   r+   r&   r,   r
   r2   r   r   r   r)   rE   staticmethodr   r   r   r   r	   r}     s    r}   )rE   collections.abcr   r   r   r-   r   r.   rm   rk   rx   r}   r   r   r   r	   <module>   s    ( ,%