
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aø”  ã                   @   sô   d dl Z d dlmZmZ ddddddd	gZd
d„ Zdd„ Zdd„ Zdd„ Ze	ƒ Z
G dd„ dƒZG dd„ deƒZdZG dd„ deƒZG dd„ ded�ZG dd„ deeƒZdd„ ZG dd„ deƒZG dd„ deeƒZdd„ Zdd	„ Zd d!„ Zd"d#„ ZdS )$é    N)ÚMappingProxyTypeÚDynamicClassAttributeÚEnumMetaÚEnumÚIntEnumÚFlagÚIntFlagÚautoÚuniquec                 C   s   t | dƒpt | dƒpt | dƒS )z?
    Returns True if obj is a descriptor, False otherwise.
    Ú__get__Ú__set__Ú
__delete__)Úhasattr)Úobj© r   ú)/opt/alt/python38/lib64/python3.8/enum.pyÚ_is_descriptor   s
    
ÿýr   c                 C   sL   t | ƒdkoJ| dd… | dd…   ko.dkn  oJ| d dkoJ| d dkS )z=
    Returns True if a __dunder__ name, False otherwise.
    é   Né   éþÿÿÿÚ__Ú_éýÿÿÿ©Úlen©Únamer   r   r   Ú
_is_dunder   s    &ÿ
þ
ür   c                 C   sL   t | ƒdkoJ| d | d   ko&dkn  oJ| dd… dkoJ| dd… dkS )z;
    Returns True if a _sunder_ name, False otherwise.
    r   r   éÿÿÿÿr   é   r   r   r   r   r   r   Ú
_is_sunder!   s    ÿþür    c                 C   s   dd„ }|| _ d| _dS )z,
    Make the given class un-picklable.
    c                 S   s   t d|  ƒ‚d S )Nz%r cannot be pickled)Ú	TypeError©ÚselfÚprotor   r   r   Ú_break_on_call_reduce0   s    z6_make_class_unpicklable.<locals>._break_on_call_reducez	<unknown>N)Ú__reduce_ex__Ú
__module__)Úclsr%   r   r   r   Ú_make_class_unpicklable,   s    r)   c                   @   s   e Zd ZdZeZdS )r	   zP
    Instances are replaced with an appropriate value in Enum class suites.
    N)Ú__name__r'   Ú__qualname__Ú__doc__Ú
_auto_nullÚvaluer   r   r   r   r	   6   s   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )Ú	_EnumDictz«
    Track enum member order and ensure member names are not reused.

    EnumMeta will use the names found in self._member_names as the
    enumeration member names.
    c                    s&   t ƒ  ¡  g | _g | _g | _d| _d S )NF)ÚsuperÚ__init__Ú_member_namesÚ_last_valuesÚ_ignoreÚ_auto_called©r#   ©Ú	__class__r   r   r1   D   s
    
z_EnumDict.__init__c                    sd  t |ƒr”|dkrtdƒ‚|dkr<| jr.tdƒ‚t| d|ƒ nV|dkr’t|tƒr`| dd¡ ¡ }nt	|ƒ}|| _
t|ƒt| jƒ@ }|r’td	|f ƒ‚n¾t|ƒrª|d
kr¨d}n¨|| jkrÂtd| ƒ‚n�|| j
krÎn„t|ƒ�sR|| krôtd|| | f ƒ‚t|tƒ�r:|jtk�r4|  |dt| jƒ| jdd… ¡|_d| _|j}| j |¡ | j |¡ tƒ  ||¡ dS )zí
        Changes anything not dundered or not a descriptor.

        If an enum member name is used twice, an error is raised; duplicate
        values are not checked for.

        Single underscore (sunder) names are reserved.
        )Ú_order_Ú_create_pseudo_member_Ú_generate_next_value_Ú	_missing_Ú_ignore_z(_names_ are reserved for future Enum user;   z4_generate_next_value_ must be defined before membersÚ_generate_next_valuer=   ú,ú z-_ignore_ cannot specify already set names: %rÚ	__order__r9   zAttempted to reuse key: %rz%r already defined as: %rr   NT)r    Ú
ValueErrorr5   r!   ÚsetattrÚ
isinstanceÚstrÚreplaceÚsplitÚlistr4   Úsetr2   r   r   r	   r.   r-   r>   r   r3   Úappendr0   Ú__setitem__)r#   Úkeyr.   Úalreadyr7   r   r   rK   K   sT    	
ÿÿ


üz_EnumDict.__setitem__)r*   r'   r+   r,   r1   rK   Ú__classcell__r   r   r7   r   r/   =   s   r/   c                       sø   e Zd ZdZedd„ ƒZ‡ fdd„Zdd„ Zd/dddd	d
œdd„Zdd„ Z	‡ fdd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZdd„ Zdd „ Z‡ fd!d"„Zdddd	d
œd#d$„Zd0d%d&„Zd'd(„ Zed)d*„ ƒZed+d,„ ƒZed-d.„ ƒZ‡  ZS )1r   z
    Metaclass for Enum
    c                 C   s>   |   ||¡ tƒ }|  ||¡\}}|d k	r:t|dd ƒ|d< |S )Nr;   )Ú_check_for_existing_membersr/   Ú_get_mixins_Úgetattr)Úmetaclsr(   ÚbasesÚ	enum_dictÚmember_typeÚ
first_enumr   r   r   Ú__prepare__�   s      ÿzEnumMeta.__prepare__c              	      s  ˆ   dg ¡ d¡ ˆ d }|D ]}ˆ  |d ¡ q|  ||¡\‰}|  ˆ ˆ|¡\}}}	‡ fdd„ˆ jD ƒ}
ˆ jD ]
}ˆ |= qnˆ  dd ¡}t|
ƒddh@ }|r®td d 	|¡¡ƒ‚d	ˆ kr¾d
ˆ d	< t
ƒ  | ||ˆ ¡}g |_i |_ˆ|_dd„ | ¡ D ƒ}i |_dˆ k�r2ˆtk	�r2d}t‡fdd„|D ƒƒ�s2t|ƒ ˆ jD �]*}|
| }t|tƒ�sZ|f}n|}ˆtk�rn|f}|	�s�||ƒ}t|dƒ�sÆ||_n6||f|žŽ }t|dƒ�sÆˆtk�r¼||_n
ˆ|Ž |_|j}||_||_|j|Ž  |j ¡ D ]"\}}|j|jk�rì|} �q�qì|j |¡ ||k�r2t|||ƒ ||j|< z||j|< W n tk
�r`   Y nX �q8dD ]V}|ˆ k�r|�qjt||ƒ}tˆ|d ƒ}t||d ƒ}|d k	�rj||k�rjt|||ƒ �qjtd k	�rà|�rØ||_ tj|_|d k	�rt|t!ƒ�r| "dd¡ #¡ }||jk�rtdƒ‚|S )Nr=   c                    s   i | ]}|ˆ | “qS r   r   )Ú.0Úk)Ú	classdictr   r   Ú
<dictcomp>¯   s      z$EnumMeta.__new__.<locals>.<dictcomp>r9   ÚmroÚ zInvalid enum member name: {0}r?   r,   zAn enumeration.c                 S   s.   h | ]&}|j  ¡ D ]\}}t|tƒr|’qqS r   )Ú__dict__ÚitemsrD   r   )rX   ÚcrY   Úvr   r   r   Ú	<setcomp>È   s
    
þz#EnumMeta.__new__.<locals>.<setcomp>r&   )Ú__getnewargs_ex__Ú__getnewargs__r&   Ú
__reduce__c                 3   s   | ]}|ˆ j kV  qd S ©N)r^   ©rX   Úm)rU   r   r   Ú	<genexpr>ß   s     z#EnumMeta.__new__.<locals>.<genexpr>Ú_value_)Ú__repr__Ú__str__Ú
__format__r&   r@   z#member order does not match _order_)$Ú
setdefaultrJ   ÚpoprP   Ú
_find_new_r2   rI   rB   ÚformatÚjoinr0   Ú__new__Ú_member_names_Ú_member_map_Ú_member_type_r\   Ú_value2member_map_ÚobjectÚanyr)   rD   Útupler   rj   Ú_name_Ú__objclass__r1   r_   rC   r!   rQ   r   Ú__new_member__rE   rF   rG   )rR   r(   rS   rZ   ÚignorerL   rV   rs   Úsave_newÚuse_argsÚenum_membersr   r9   Úinvalid_namesÚ
enum_classÚdynamic_attributesÚmethodsÚmember_namer.   ÚargsÚenum_memberÚcanonical_memberÚclass_methodÚ
obj_methodÚenum_methodr7   )rZ   rU   r   rs   �   s¨      ÿ

ÿÿ













zEnumMeta.__new__c                 C   s   dS )z6
        classes/types should always be True.
        Tr   r6   r   r   r   Ú__bool__3  s    zEnumMeta.__bool__Nr   ©ÚmoduleÚqualnameÚtypeÚstartc                C   s*   |dkr|   | |¡S | j||||||d�S )a!  
        Either returns an existing member, or creates a new enum class.

        This method is used both when an enum class is given a value to match
        to an enumeration member (i.e. Color(3)) and for the functional API
        (i.e. Color = Enum('Color', names='RED GREEN BLUE')).

        When used for the functional API:

        `value` will be the name of the new class.

        `names` should be either a string of white-space/comma delimited names
        (values will start at `start`), or an iterator/mapping of name, value pairs.

        `module` should be set to the module this class is being created in;
        if it is not set, an attempt to find that module will be made, but if
        it fails the class will not be picklable.

        `qualname` should be set to the actual location this class can be found
        at in its module; by default it is set to the global scope.  If this is
        not correct, unpickling will fail in some circumstances.

        `type`, if set, will be mixed in as the first base class.
        NrŽ   )rs   Ú_create_)r(   r.   Únamesr�   r�   r‘   r’   r   r   r   Ú__call__9  s    úzEnumMeta.__call__c                 C   s:   t |tƒs$tdt|ƒj| jjf ƒ‚t || ƒo8|j| jkS )Nú3unsupported operand type(s) for 'in': '%s' and '%s')rD   r   r!   r‘   r+   r8   r{   ru   )r(   Úmemberr   r   r   Ú__contains__^  s    
 ÿÿzEnumMeta.__contains__c                    s(   || j krtd| j ƒ‚tƒ  |¡ d S )Nz%s: cannot delete Enum member.)ru   ÚAttributeErrorr*   r0   Ú__delattr__)r(   Úattrr7   r   r   rš   e  s    
zEnumMeta.__delattr__c                 C   s   ddddg| j  S )Nr8   r,   Ú__members__r'   ©rt   r6   r   r   r   Ú__dir__l  s    
ÿÿzEnumMeta.__dir__c                 C   s@   t |ƒrt|ƒ‚z| j| W S  tk
r:   t|ƒd‚Y nX dS )a=  
        Return the enum member matching `name`

        We use __getattr__ instead of descriptors or inserting into the enum
        class' __dict__ in order to support `name` and `value` being both
        properties for enum members (which live in the class' __dict__) and
        enum members themselves.
        N)r   r™   ru   ÚKeyError©r(   r   r   r   r   Ú__getattr__r  s    	zEnumMeta.__getattr__c                 C   s
   | j | S rf   ©ru   r    r   r   r   Ú__getitem__‚  s    zEnumMeta.__getitem__c                    s   ‡ fdd„ˆ j D ƒS )z6
        Returns members in definition order.
        c                 3   s   | ]}ˆ j | V  qd S rf   r¢   ©rX   r   ©r(   r   r   ri   ‰  s     z$EnumMeta.__iter__.<locals>.<genexpr>r�   r¥   r   r¥   r   Ú__iter__…  s    zEnumMeta.__iter__c                 C   s
   t | jƒS rf   )r   rt   r¥   r   r   r   Ú__len__‹  s    zEnumMeta.__len__c                 C   s
   t | jƒS )z¿
        Returns a mapping of member name->value.

        This mapping lists all enum members, including aliases. Note that this
        is a read-only view of the internal mapping.
        )r   ru   r¥   r   r   r   rœ   Ž  s    zEnumMeta.__members__c                 C   s
   d| j  S )Nz	<enum %r>)r*   r¥   r   r   r   rk   ˜  s    zEnumMeta.__repr__c                    s   ‡ fdd„t ˆ jƒD ƒS )z>
        Returns members in reverse definition order.
        c                 3   s   | ]}ˆ j | V  qd S rf   r¢   r¤   r¥   r   r   ri   Ÿ  s     z(EnumMeta.__reversed__.<locals>.<genexpr>)Úreversedrt   r¥   r   r¥   r   Ú__reversed__›  s    zEnumMeta.__reversed__c                    s0   | j  di ¡}||krtdƒ‚tƒ  ||¡ dS )a  
        Block attempts to reassign Enum members.

        A simple assignment to the class namespace only changes one of the
        several possible ways to get an Enum member from the Enum class,
        resulting in an inconsistent Enumeration.
        ru   zCannot reassign members.N)r^   Úgetr™   r0   Ú__setattr__)r(   r   r.   Ú
member_mapr7   r   r   r«   ¡  s    zEnumMeta.__setattr__c             
   C   s~  | j }|dkr| fn|| f}|  | |¡\}	}
| ||¡}t|tƒrR| dd¡ ¡ }t|ttfƒrÂ|rÂt|d tƒrÂ|g  }}g }t	|ƒD ]8\}}|
 
||||dd… ¡}| |¡ | ||f¡ qˆ|D ].}t|tƒrä|||  }}n|\}}|||< qÆ| ||||¡}|dk�rPzt d¡jd }W n* tttfk
�rN } zW 5 d}~X Y nX |dk�rdt|ƒ n||_|dk	�rz||_|S )a�  
        Convenience method to create a new Enum class.

        `names` can be:

        * A string containing member names, separated either with spaces or
          commas.  Values are incremented by 1 from `start`.
        * An iterable of member names.  Values are incremented by 1 from `start`.
        * An iterable of (member name, value) pairs.
        * A mapping of member name -> value pairs.
        Nr?   r@   r   r   r*   )r8   rP   rW   rD   rE   rF   rG   rz   rH   Ú	enumerater;   rJ   rs   ÚsysÚ	_getframeÚ	f_globalsr™   rB   rŸ   r)   r'   r+   )r(   Ú
class_namer”   r�   r�   r‘   r’   rR   rS   r   rV   rZ   Úoriginal_namesÚlast_valuesÚcountr   r.   Úitemr†   Úmember_valuerƒ   Úexcr   r   r   r“   ®  s<    
 







zEnumMeta._create_c                    sœ   t tj| ƒ}|rt |ƒ}n|}‡ fdd„| ¡ D ƒ}z|jdd„ d� W n$ tk
rn   |jdd„ d� Y nX | |||d�} t| _| | j	¡ | ||< | S )z[
        Create a new Enum subclass that replaces a collection of global constants
        c                    s    g | ]\}}ˆ |ƒr||f‘qS r   r   )rX   r   r.   ©Úfilterr   r   Ú
<listcomp>ô  s   þz&EnumMeta._convert_.<locals>.<listcomp>c                 S   s   | d | d fS )Nr   r   r   ©Útr   r   r   Ú<lambda>ú  ó    z$EnumMeta._convert_.<locals>.<lambda>)rL   c                 S   s   | d S ©Nr   r   r»   r   r   r   r½   ý  r¾   )r�   )
Úvarsr®   Úmodulesr_   Úsortr!   Ú_reduce_ex_by_namer&   Úupdaterœ   )r(   r   r�   r¹   ÚsourceÚmodule_globalsÚmembersr   r¸   r   Ú	_convert_ã  s     	

þzEnumMeta._convert_c                 O   s$   dd l }|jdtdd� | j||ŽS )Nr   zI_convert is deprecated and will be removed in 3.9, use _convert_ instead.r   )Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningrÈ   )r(   r‡   ÚkwargsrÊ   r   r   r   Ú_convert  s     ÿzEnumMeta._convertc                 C   s<   |D ]2}|j D ]&}t|tƒr|jrtd| |jf ƒ‚qqd S )Nz %s: cannot extend enumeration %r)Ú__mro__Ú
issubclassr   rt   r!   r*   )r±   rS   ÚchainÚbaser   r   r   rO   
  s    
ÿÿz$EnumMeta._check_for_existing_membersc                    sT   |st tfS ‡ fdd„}|d }t|tƒs2tdƒ‚||ƒp<t }|jrLtdƒ‚||fS )z¦
        Returns the type for creating enum members, and the first inherited
        enum class.

        bases: the tuple of bases that was given to __new__
        c                    s°   g }| D ]t}d }|j D ]d}|tkr&qqt|tƒrL|jtk	rz| |j¡  qqd|jkrvt|tƒrbq| |pl|¡  qq|}qqt|ƒdkrœtdˆ |f ƒ‚n|r¨|d S d S d S )Nrs   r   z%r: too many data types: %rr   )	rÏ   rx   rÐ   r   rv   rJ   r^   r   r!   )rS   Ú
data_typesrÑ   Ú	candidaterÒ   ©r±   r   r   Ú_find_data_type  s*    




z.EnumMeta._get_mixins_.<locals>._find_data_typer   zZnew enumerations should be created as `EnumName([mixin_type, ...] [data_type,] enum_type)`zCannot extend enumerations)rx   r   rÐ   r!   rt   )r±   rS   rÖ   rV   rU   r   rÕ   r   rP     s    
zEnumMeta._get_mixins_c           	      C   sŽ   |   dd¡}|dk	}|dkrpdD ]H}||fD ].}t||dƒ}|ddjtjtjhkr,|} q\q,|dk	r  qpq tj}|tjkr€d}nd}|||fS )a  
        Returns the __new__ to be used for creating the enum members.

        classdict: the class dictionary given to __new__
        member_type: the data type whose __new__ will be used by default
        first_enum: enumeration to check for an overriding __new__
        rs   N)r}   rs   FT)rª   rQ   rs   rx   r   )	rZ   rU   rV   rs   r   ÚmethodÚpossibleÚtargetr€   r   r   r   rp   C  s*    ü
zEnumMeta._find_new_)N)N)r*   r'   r+   r,   ÚclassmethodrW   rs   r�   r•   r˜   rš   rž   r¡   r£   r¦   r§   Úpropertyrœ   rk   r©   r«   r“   rÈ   rÎ   ÚstaticmethodrO   rP   rp   rN   r   r   r7   r   r   ‹   s8   
 %
	5
!
	
.c                   @   st   e Zd ZdZdd„ Zdd„ Ze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edd„ ƒZdS )r   zV
    Generic enumeration.

    Derive from this class to define new enumerations.
    c              
   C   s  t |ƒ| kr|S z| j| W S  tk
r0   Y n: tk
rh   | j ¡ D ]}|j|krH|   Y S qHY nX zd }|  |¡}W n* tk
r¦ } z|}d }W 5 d }~X Y nX zdt	|| ƒr¼|W ¢TS t
d|| jf ƒ}|d krä|d krä|‚n|d k�r td| j|f ƒ}||_|‚W 5 d }d }X d S )Nú%r is not a valid %szDerror in %s._missing_: returned %r instead of None or a valid member)r‘   rw   rŸ   r!   ru   Úvaluesrj   r<   Ú	ExceptionrD   rB   r*   Ú__context__)r(   r.   r—   r·   ÚresultÚeÚve_excr   r   r   rs   w  s@    


ÿÿzEnum.__new__c              	   C   s6   t |ƒD ](}z|d W   S  tk
r.   Y qX q|S )úð
        Generate the next value when not given.

        name: the name of the member
        start: the initial start value or None
        count: the number of existing members
        last_value: the last value assigned or None
        r   N)r¨   r!   )r   r’   r´   r³   Ú
last_valuer   r   r   r;   ¤  s    	zEnum._generate_next_value_c                 C   s   d S rf   r   )r(   r.   r   r   r   r<   µ  s    zEnum._missing_c                 C   s   d| j j| j| jf S )Nú<%s.%s: %r>)r8   r*   r{   rj   r6   r   r   r   rk   ¹  s
      ÿzEnum.__repr__c                 C   s   d| j j| jf S )Nú%s.%s)r8   r*   r{   r6   r   r   r   rl   ½  s    zEnum.__str__c                    s6   ‡ fdd„ˆ j  ¡ D ƒdd„ ˆ jD ƒ }dddg| S )z<
        Returns all members and all public methods
        c                    s2   g | ]*}|j D ]}|d  dkr|ˆ jkr|‘qqS ©r   r   )r^   ru   )rX   r(   rh   r6   r   r   rº   Ä  s     
ýz Enum.__dir__.<locals>.<listcomp>c                 S   s   g | ]}|d  dkr|‘qS rè   r   rg   r   r   r   rº   É  s      r8   r,   r'   )r8   r\   r^   )r#   Úadded_behaviorr   r6   r   rž   À  s    
þûzEnum.__dir__c                 C   sJ   t | ƒjtjtjfk}| jtks$|r2t}t| ƒ}n| j}| j}| ||¡S )z\
        Returns format using actual value type unless __str__ has been overridden.
        )	r‘   rl   r   r   rv   rx   rE   rj   rm   )r#   Úformat_specÚstr_overriddenr(   Úvalr   r   r   rm   Ì  s    	
zEnum.__format__c                 C   s
   t | jƒS rf   )Úhashr{   r6   r   r   r   Ú__hash__ß  s    zEnum.__hash__c                 C   s   | j | jffS rf   ©r8   rj   r"   r   r   r   r&   â  s    zEnum.__reduce_ex__c                 C   s   | j S )zThe name of the Enum member.)r{   r6   r   r   r   r   ì  s    z	Enum.namec                 C   s   | j S )zThe value of the Enum member.©rj   r6   r   r   r   r.   ñ  s    z
Enum.valueN)r*   r'   r+   r,   rs   r;   rÚ   r<   rk   rl   rž   rm   rî   r&   r   r   r.   r   r   r   r   r   q  s   -


)Ú	metaclassc                   @   s   e Zd ZdZdS )r   z.Enum where members are also (and must be) intsN)r*   r'   r+   r,   r   r   r   r   r   ÷  s   c                 C   s   | j S rf   r   r"   r   r   r   rÃ   û  s    rÃ   c                   @   sp   e Zd ZdZdd„ Zedd„ ƒZe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 )r   z
    Support for flags
    c              	   C   sd   |s|dk	r|S dS t |ƒD ]:}zt|ƒ}W  qXW q tk
rT   td| ƒd‚Y qX qd|d  S )rä   Nr   zInvalid Flag value: %rr   )r¨   Ú	_high_bitrß   r!   )r   r’   r´   r³   rå   Úhigh_bitr   r   r   r;     s    	
zFlag._generate_next_value_c                 C   s.   |}|dk r| }|   |¡}|dk r*| }|S )úV
        Returns member (possibly creating it) if one can be found for value.
        r   )r:   )r(   r.   Úoriginal_valueÚpossible_memberr   r   r   r<     s    
zFlag._missing_c                 C   sb   | j  |d¡}|dkr^t| |ƒ\}}|r:td|| jf ƒ‚t | ¡}d|_||_| j  	||¡}|S )úL
        Create a composite member iff value contains only members.
        NrÝ   )
rw   rª   Ú
_decomposerB   r*   rx   rs   r{   rj   rn   )r(   r.   Úpseudo_memberr   Úextra_flagsr   r   r   r:   #  s    
zFlag._create_pseudo_member_c                 C   s8   t || jƒs&tdt|ƒj| jjf ƒ‚|j| j@ |jkS )zP
        Returns True if self has at least the same flags set as other.
        r–   )rD   r8   r!   r‘   r+   rj   ©r#   Úotherr   r   r   r˜   7  s     ÿÿzFlag.__contains__c                 C   sV   | j }| jd k	r$d|j| j| jf S t|| jƒ\}}d|jd dd„ |D ƒ¡| jf S )Nræ   ú|c                 S   s   g | ]}t |jp|jƒ‘qS r   ©rE   r{   rj   rg   r   r   r   rº   H  s     z!Flag.__repr__.<locals>.<listcomp>)r8   r{   r*   rj   rø   rr   ©r#   r(   rÇ   Ú	uncoveredr   r   r   rk   A  s    
ýzFlag.__repr__c                 C   s€   | j }| jd k	r d|j| jf S t|| jƒ\}}t|ƒdkr^|d jd kr^d|j|d jf S d|jd dd„ |D ƒ¡f S d S )Nrç   r   r   z%s.%rrý   c                 S   s   g | ]}t |jp|jƒ‘qS r   rþ   rg   r   r   r   rº   V  s     z Flag.__str__.<locals>.<listcomp>)r8   r{   r*   rø   rj   r   rr   rÿ   r   r   r   rl   L  s    
þzFlag.__str__c                 C   s
   t | jƒS rf   )Úboolrj   r6   r   r   r   r�   Y  s    zFlag.__bool__c                 C   s"   t || jƒstS |  | j|jB ¡S rf   ©rD   r8   ÚNotImplementedrj   rû   r   r   r   Ú__or__\  s    zFlag.__or__c                 C   s"   t || jƒstS |  | j|j@ ¡S rf   r  rû   r   r   r   Ú__and__a  s    zFlag.__and__c                 C   s"   t || jƒstS |  | j|jA ¡S rf   r  rû   r   r   r   Ú__xor__f  s    zFlag.__xor__c                 C   sN   t | j| jƒ\}}|  d¡}| jD ] }||kr"|j| j@ s"||B }q"|  |¡S r¿   )rø   r8   rj   )r#   rÇ   r   Úinvertedrh   r   r   r   Ú
__invert__k  s    


zFlag.__invert__N)r*   r'   r+   r,   r;   rÚ   r<   r:   r˜   rk   rl   r�   r  r  r  r  r   r   r   r   r   þ  s   


c                   @   sT   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Zdd	„ Zd
d„ Z	eZ
eZe	Zdd„ ZdS )r   z)
    Support for integer-based Flags
    c                 C   s*   t |tƒstd|| jf ƒ‚|  |¡}|S )rô   rÝ   )rD   ÚintrB   r*   r:   )r(   r.   Ú
new_memberr   r   r   r<   y  s    

zIntFlag._missing_c                 C   s¬   | j  |d¡}|dkr¨|g}t| |ƒ\}}|rtt|ƒ}d| }|| j krZ||krZ| |¡ || krjd}q*||N }q*t|ƒD ]*}t | |¡}d|_||_	| j  
||¡}q||S )r÷   Nr   r   )rw   rª   rø   rò   rJ   r¨   r	  rs   r{   rj   rn   )r(   r.   rù   Úneed_to_creater   rú   ÚbitÚ
flag_valuer   r   r   r:   ƒ  s(    
ÿ


zIntFlag._create_pseudo_member_c                 C   s0   t || jtfƒstS |  | j|  |¡jB ¡}|S rf   ©rD   r8   r	  r  rj   )r#   rü   rá   r   r   r   r  ¤  s    zIntFlag.__or__c                 C   s,   t || jtfƒstS |  | j|  |¡j@ ¡S rf   r  rû   r   r   r   r  ª  s    zIntFlag.__and__c                 C   s,   t || jtfƒstS |  | j|  |¡jA ¡S rf   r  rû   r   r   r   r  ¯  s    zIntFlag.__xor__c                 C   s   |   | j ¡}|S rf   rï   )r#   rá   r   r   r   r  ¸  s    zIntFlag.__invert__N)r*   r'   r+   r,   rÚ   r<   r:   r  r  r  Ú__ror__Ú__rand__Ú__rxor__r  r   r   r   r   r   t  s   
	
 c                 C   s   |   ¡ d S )zJ
    returns index of highest bit, or -1 if value is zero or negative
    r   )Ú
bit_length©r.   r   r   r   rò   ½  s    rò   c                 C   s^   g }| j  ¡ D ]"\}}||jkr| ||jf¡ q|rZd dd„ |D ƒ¡}td| |f ƒ‚| S )zI
    Class decorator for enumerations ensuring unique member values.
    z, c                 S   s   g | ]\}}d ||f ‘qS )z%s -> %sr   )rX   Úaliasr   r   r   r   rº   Í  s     zunique.<locals>.<listcomp>z duplicate values found in %r: %s)rœ   r_   r   rJ   rr   rB   )ÚenumerationÚ
duplicatesr   r—   Úalias_detailsr   r   r   r
   Ã  s    
ÿÿc                 C   sÔ   |}|dk }|r*dd„ t | j ¡ ƒD ƒ}ndd„ t | j ¡ ƒD ƒ}g }|D ],\}}|rJ||@ |krJ| |¡ || M }qJ|s–|| jkr–| | j| ¡ |jdd„ dd� t|ƒd	krÌ|d j|krÌ| d¡ ||fS )
z-
    Extract all members from the value.
    r   c                 S   s"   g | ]\}}|j d k	r||f‘qS rf   r   ©rX   ra   rh   r   r   r   rº   Þ  s   
þz_decompose.<locals>.<listcomp>c                 S   s*   g | ]"\}}|j d k	st|ƒr||f‘qS rf   )r   Ú_power_of_twor  r   r   r   rº   å  s   
 þc                 S   s   | j S rf   rð   )rh   r   r   r   r½   ñ  r¾   z_decompose.<locals>.<lambda>T)rL   Úreverser   )rH   rw   r_   rJ   rÂ   r   r.   ro   )Úflagr.   Únot_coveredÚnegativeÚflags_to_checkrÇ   r—   r¶   r   r   r   rø   Ò  s(    þþ

rø   c                 C   s   | dk rdS | dt | ƒ kS )Nr   Fr   )rò   r  r   r   r   r  ÷  s    r  )r®   Útypesr   r   Ú__all__r   r   r    r)   rx   r-   r	   Údictr/   r   r‘   r   r	  r   rÃ   r   r   rò   r
   rø   r  r   r   r   r   Ú<module>   s>       ý
	L   i vI%