U
    [e                     @   s   d Z ddlZddlZddlmZ ddlmZmZmZ i Z	e
 ZejejedZdd Zdd	 Zd
d ZdddZdd ZG dd deZG dd dejZdS )aG  
    babel.localedata
    ~~~~~~~~~~~~~~~~

    Low-level locale data access.

    :note: The `Locale` class, which uses this module under the hood, provides a
           more convenient interface for accessing the locale data.

    :copyright: (c) 2013-2019 by the Babel Team.
    :license: BSD, see LICENSE for more details.
    N)chain)picklestring_typesabczlocale-datac                 C   sL   | rt | tsdS |   } ttt gD ]}| | kr.|  S q.dS )zNormalize a locale ID by stripping spaces and apply proper casing.

    Returns the normalized locale ID string or `None` if the ID is not
    recognized.
    N)
isinstancer   striplowerr   from_iterable_cachelocale_identifiers)nameZ	locale_id r   R/var/www/html/services/stratfitenv/lib/python3.8/site-packages/babel/localedata.pynormalize_locale   s    r   c                 C   sL   | rt | tsdS | tkrdS tjtjtd|  }|r@dS tt	| S )zCheck whether locale data is available for the given locale.

    Returns `True` if it exists, `False` otherwise.

    :param name: the locale identifier string
    FT%s.dat)
r   r   r
   ospathexistsjoin_dirnameboolr   )r   Z
file_foundr   r   r   r   )   s    r   c                  C   s<   t tdd} | dkr8dd dd ttD D  t_} | S )a  Return a list of all locale identifiers for which locale data is
    available.

    This data is cached after the first invocation in `locale_identifiers.cache`.

    Removing the `locale_identifiers.cache` attribute or setting it to `None`
    will cause this function to re-read the list from disk.

    .. versionadded:: 0.8.1

    :return: a list of locale identifiers (strings)
    cacheNc                 S   s$   g | ]\}}|d kr|dkr|qS )z.datrootr   ).0stem	extensionr   r   r   
<listcomp>G   s    z&locale_identifiers.<locals>.<listcomp>c                 s   s   | ]}t j|V  qd S N)r   r   splitext)r   filenamer   r   r   	<genexpr>J   s     z%locale_identifiers.<locals>.<genexpr>)getattrr   r   listdirr   r   )datar   r   r   r   8   s    r   Tc              	   C   s   t   zt| }|s| dks$|s*i }nXddlm} |d| }|sv| d}t|dkrdd}nd	|dd }t
| }tj	td	|  }t|d
.}| dkr|rt|t
| n
t
|}W 5 Q R X |t| < |W S t   X dS )ae  Load the locale data for the given locale.

    The locale data is a dictionary that contains much of the data defined by
    the Common Locale Data Repository (CLDR). This data is stored as a
    collection of pickle files inside the ``babel`` package.

    >>> d = load('en_US')
    >>> d['languages']['sv']
    u'Swedish'

    Note that the results are cached, and subsequent requests for the same
    locale return the same dictionary:

    >>> d1 = load('en_US')
    >>> d2 = load('en_US')
    >>> d1 is d2
    True

    :param name: the locale identifier string (or "root")
    :param merge_inherited: whether the inherited data should be merged into
                            the data of the requested locale
    :raise `IOError`: if no locale data file is found for the given locale
                      identifer, or one of the locales it inherits from
    r   r   )
get_globalZparent_exceptions_   Nr   rb)_cache_lockacquirereleaser
   getZ
babel.corer$   splitlenr   loadcopyr   r   r   openmerger   )r   Zmerge_inheritedr#   r$   parentpartsr   fileobjr   r   r   r/   P   s,    

r/   c                 C   s   |  D ]\}}|dk	r| |}t|tr|dkr8i }t|trL||f}qt|trz|\}}| }t|| ||f}q| }t|| n|}|| |< qdS )an  Merge the data from `dict2` into the `dict1` dictionary, making copies
    of nested dictionaries.

    >>> d = {1: 'foo', 3: 'baz'}
    >>> merge(d, {1: 'Foo', 2: 'Bar'})
    >>> sorted(d.items())
    [(1, 'Foo'), (2, 'Bar'), (3, 'baz')]

    :param dict1: the dictionary to merge into
    :param dict2: the dictionary containing the data that should be merged
    N)itemsr,   r   dictAliastupler0   r2   )Zdict1Zdict2keyZval2Zval1aliasothersr   r   r   r2      s"    






r2   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r8   zRepresentation of an alias in the locale data.

    An alias is a value that refers to some other part of the locale data,
    as specified by the `keys`.
    c                 C   s   t || _d S r   )r9   keys)selfr=   r   r   r   __init__   s    zAlias.__init__c                 C   s   dt | j| jf S )Nz<%s %r>)type__name__r=   r>   r   r   r   __repr__   s    zAlias.__repr__c                 C   sN   |}| j D ]}|| }q
t|tr.||}nt|trJ|\}}||}|S )zResolve the alias based on the given data.

        This is done recursively, so if one alias resolves to a second alias,
        that second alias will also be resolved.

        :param data: the locale data
        :type data: `dict`
        )r=   r   r8   resolver9   )r>   r#   baser:   r;   r<   r   r   r   rD      s    	




zAlias.resolveN)rA   
__module____qualname____doc__r?   rC   rD   r   r   r   r   r8      s   r8   c                   @   sJ   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S )LocaleDataDictzUDictionary wrapper that automatically resolves aliases to the actual
    values.
    Nc                 C   s   || _ |d kr|}|| _d S r   )_datarE   )r>   r#   rE   r   r   r   r?      s    zLocaleDataDict.__init__c                 C   s
   t | jS r   )r.   rJ   rB   r   r   r   __len__   s    zLocaleDataDict.__len__c                 C   s
   t | jS r   )iterrJ   rB   r   r   r   __iter__   s    zLocaleDataDict.__iter__c                 C   s   | j |  }}t|tr$|| j}t|trP|\}}|| j }t|| t|t	krjt
|| jd}||k	r||| j |< |S N)rE   )rJ   r   r8   rD   rE   r9   r0   r2   r@   r7   rI   )r>   r:   origvalr;   r<   r   r   r   __getitem__   s    



zLocaleDataDict.__getitem__c                 C   s   || j |< d S r   rJ   )r>   r:   valuer   r   r   __setitem__   s    zLocaleDataDict.__setitem__c                 C   s   | j |= d S r   rR   )r>   r:   r   r   r   __delitem__   s    zLocaleDataDict.__delitem__c                 C   s   t | j | jdS rN   )rI   rJ   r0   rE   rB   r   r   r   r0      s    zLocaleDataDict.copy)N)rA   rF   rG   rH   r?   rK   rM   rQ   rT   rU   r0   r   r   r   r   rI      s   
rI   )T)rH   r   	threading	itertoolsr   Zbabel._compatr   r   r   r
   RLockr)   r   r   dirname__file__r   r   r   r   r/   r2   objectr8   MutableMappingrI   r   r   r   r   <module>   s   
6!!