a
    dP                  
   @   s>  d Z ddlZddlZddlZddlZddlmZmZmZmZ dd Z	dd Z
edZd	d
 ZdedddfdedddfdedddfdedddfdedddfdedddfdedddfgZdd eD Zdd eD ZdZede Zed d eedd! D Zd"d# ZeZd$d% ZdQd'd(ZdRd)d*Zd+d, ZdSd.d/ZedZedd0ZG d1d2 d2eZed3Ze deZ!e"dZ#G d4d5 d5eZ$e$ Z%d6d7 Z&edd8d9dZ'edd:ddZ(edd;ddZ)edd<d=dZ*edd;d>dZ+e*Z,G d?d@ d@eZ-e-dAdBdCdDZ.e-dEdFdGdHZ/e-dIdJdKdLZ0e-dMdNdOdPZ1dS )Ta  Python's :mod:`datetime` module provides some of the most complex
and powerful primitives in the Python standard library. Time is
nontrivial, but thankfully its support is first-class in
Python. ``dateutils`` provides some additional tools for working with
time.

Additionally, timeutils provides a few basic utilities for working
with timezones in Python. The Python :mod:`datetime` module's
documentation describes how to create a
:class:`~datetime.datetime`-compatible :class:`~datetime.tzinfo`
subtype. It even provides a few examples.

The following module defines usable forms of the timezones in those
docs, as well as a couple other useful ones, :data:`UTC` (aka GMT) and
:data:`LocalTZ` (representing the local timezone as configured in the
operating system). For timezones beyond these, as well as a higher
degree of accuracy in corner cases, check out `pytz`_ and `dateutil`_.

.. _pytz: https://pypi.python.org/pypi/pytz
.. _dateutil: https://dateutil.readthedocs.io/en/stable/index.html
    N)tzinfo	timedeltadatedatetimec                 C   s*   d}| j | jd  }| j||  }|| S )aa  For those with older versions of Python, a pure-Python
    implementation of Python 2.7's :meth:`~datetime.timedelta.total_seconds`.

    Args:
        td (datetime.timedelta): The timedelta to convert to seconds.
    Returns:
        float: total number of seconds

    >>> td = timedelta(days=4, seconds=33)
    >>> total_seconds(td)
    345633.0
    g    .AiQ )secondsdaysmicroseconds)tdZa_milliZtd_dsZtd_micro r
   Z/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/boltons/timeutils.pytotal_seconds>   s    r   c                 C   s    | j r| t }n| t }t|S )u_  Converts from a :class:`~datetime.datetime` object to an integer
    timestamp, suitable interoperation with :func:`time.time` and
    other `Epoch-based timestamps`.

    .. _Epoch-based timestamps: https://en.wikipedia.org/wiki/Unix_time

    >>> abs(round(time.time() - dt_to_timestamp(datetime.utcnow()), 2))
    0.0

    ``dt_to_timestamp`` supports both timezone-aware and naïve
    :class:`~datetime.datetime` objects. Note that it assumes naïve
    datetime objects are implied UTC, such as those generated with
    :meth:`datetime.datetime.utcnow`. If your datetime objects are
    local time, such as those generated with
    :meth:`datetime.datetime.now`, first convert it using the
    :meth:`datetime.datetime.replace` method with ``tzinfo=``
    :class:`LocalTZ` object in this module, then pass the result of
    that to ``dt_to_timestamp``.
    )r   EPOCH_AWAREEPOCH_NAIVEr   )dtr	   r
   r
   r   dt_to_timestampQ   s    
r   z\Dc                 C   s   dd t | D }t| S )a  Parses the limited subset of `ISO8601-formatted time`_ strings as
    returned by :meth:`datetime.datetime.isoformat`.

    >>> epoch_dt = datetime.utcfromtimestamp(0)
    >>> iso_str = epoch_dt.isoformat()
    >>> print(iso_str)
    1970-01-01T00:00:00
    >>> isoparse(iso_str)
    datetime.datetime(1970, 1, 1, 0, 0)

    >>> utcnow = datetime.utcnow()
    >>> utcnow == isoparse(utcnow.isoformat())
    True

    For further datetime parsing, see the `iso8601`_ package for strict
    ISO parsing and `dateutil`_ package for loose parsing and more.

    .. _ISO8601-formatted time: https://en.wikipedia.org/wiki/ISO_8601
    .. _iso8601: https://pypi.python.org/pypi/iso8601
    .. _dateutil: https://pypi.python.org/pypi/python-dateutil

    c                 S   s   g | ]}t |qS r
   )int).0pr
   r
   r   
<listcomp>       zisoparse.<locals>.<listcomp>)_NONDIGIT_REsplitr   )Ziso_strZdt_argsr
   r
   r   isoparseo   s    r      r   second<   minute  hourr   day   week      monthim  yearc                 C   s*   g | ]"}|d  |d  |d |d fqS )r   r   r$   r
   r   br
   r
   r   r      r   r   c                 C   s   g | ]}|d  qS )r   r
   r(   r
   r
   r   r      r   z*[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?z!((?P<value>%s)\s*(?P<unit>\w)\w*)c                 C   s"   g | ]\}}}|d  |d fqS )r   sr
   )r   _unitr
   r
   r   r      s   c              	   C   s   i }t | D ]}|d|d }}zt| }W n& tyZ   td|t f Y n0 zt|}W n" ty   td||f Y n0 |||< qtf i |S )a  Robustly parses a short text description of a time period into a
    :class:`datetime.timedelta`. Supports weeks, days, hours, minutes,
    and seconds, with or without decimal points:

    Args:
        text (str): Text to parse.
    Returns:
        datetime.timedelta
    Raises:
        ValueError: on parse failure.

    >>> parse_td('1d 2h 3.5m 0s') == timedelta(days=1, seconds=7410)
    True

    Also supports full words and whitespace.

    >>> parse_td('2 weeks 1 day') == timedelta(days=15)
    True

    Negative times are supported, too:

    >>> parse_td('-1.5 weeks 3m 20s') == timedelta(days=-11, seconds=43400)
    True
    valuer,   z(invalid time unit %r, expected one of %rz"invalid time value for unit %r: %r)	_PARSE_TD_REfinditergroup_PARSE_TD_KW_MAPKeyError
ValueErrorkeysfloatr   )textZ	td_kwargsmatchr.   r,   Zunit_keyr
   r
   r   parse_timedelta   s"    

r9   c                 C   s   |dkr| S | d S )Nr   r*   r
   )r,   r.   r
   r
   r   _cardinalize_time_unit   s    r:   Tc                 C   sz   |du rt  }||  }t|}t|}tt|d }t| \}}	}
|t|	 }t||}|rr|t|
t|fS ||
fS )a  Get a tuple representing the relative time difference between two
    :class:`~datetime.datetime` objects or one
    :class:`~datetime.datetime` and now.

    Args:
        d (datetime): The first datetime object.
        other (datetime): An optional second datetime object. If
            unset, defaults to the current time as determined
            :meth:`datetime.utcnow`.
        ndigits (int): The number of decimal digits to round to,
            defaults to ``0``.
        cardinalize (bool): Whether to pluralize the time unit if
            appropriate, defaults to ``True``.
    Returns:
        (float, str): A tuple of the :class:`float` difference and
           respective unit of time, pluralized if appropriate and
           *cardinalize* is set to ``True``.

    Unlike :func:`relative_time`, this method's return is amenable to
    localization into other languages and custom phrasing and
    formatting.

    >>> now = datetime.utcnow()
    >>> decimal_relative_time(now - timedelta(days=1, seconds=3600), now)
    (1.0, 'day')
    >>> decimal_relative_time(now - timedelta(seconds=0.002), now, ndigits=5)
    (0.002, 'seconds')
    >>> decimal_relative_time(now, now - timedelta(days=900), ndigits=1)
    (-2.5, 'years')

    Nr   )	r   utcnowr   absbisect_BOUND_DELTAS_BOUNDSroundr:   )dotherndigitscardinalizediffZdiff_secondsZabs_diffZb_idxZbboundZbunitZbnameZf_diffZrounded_diffr
   r
   r   decimal_relative_time   s     
rF   c                 C   s6   t | ||dd\}}d}|dk r$d}dt|||f S )aI  Get a string representation of the difference between two
    :class:`~datetime.datetime` objects or one
    :class:`~datetime.datetime` and the current time. Handles past and
    future times.

    Args:
        d (datetime): The first datetime object.
        other (datetime): An optional second datetime object. If
            unset, defaults to the current time as determined
            :meth:`datetime.utcnow`.
        ndigits (int): The number of decimal digits to round to,
            defaults to ``0``.
    Returns:
        A short English-language string.

    >>> now = datetime.utcnow()
    >>> relative_time(now, ndigits=1)
    '0 seconds ago'
    >>> relative_time(now - timedelta(days=1, seconds=36000), ndigits=1)
    '1.4 days ago'
    >>> relative_time(now + timedelta(days=7), now, ndigits=1)
    '1 week from now'

    T)rD   Zagor   zfrom nowz%g %s %s)rF   r<   )rA   rB   rC   Zdrtr,   phraser
   r
   r   relative_time   s
    rH   c                 C   s   t | |}| S )aq  Parse the date string according to the format in `format`.  Returns a
    :class:`date` object.  Internally, :meth:`datetime.strptime` is used to
    parse the string and thus conversion specifiers for time fields (e.g. `%H`)
    may be provided;  these will be parsed but ignored.

    Args:
        string (str): The date string to be parsed.
        format (str): The `strptime`_-style date format string.
    Returns:
        datetime.date

    .. _`strptime`: https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

    >>> strpdate('2016-02-14', '%Y-%m-%d')
    datetime.date(2016, 2, 14)
    >>> strpdate('26/12 (2015)', '%d/%m (%Y)')
    datetime.date(2015, 12, 26)
    >>> strpdate('20151231 23:59:59', '%Y%m%d %H:%M:%S')
    datetime.date(2015, 12, 31)
    >>> strpdate('20160101 00:00:00.001', '%Y%m%d %H:%M:%S.%f')
    datetime.date(2016, 1, 1)
    )r   strptimer   )stringformatwhencer
   r
   r   strpdate  s    rM   Fc                 c   s@  t | tstd|r(t |ts(tdz|\}}}W n" tyX   dd|  }}}Y n0 t|t| }}t |trtt|d}nt |trntd| ||d 7 }|du rdd	 }n*| |kr|rtjntj}n|rtj	ntj
}| }|||s<|V  |r2t|jd
 | d\}	}
|j|j|	 |
d
 d}|| }qdS )a  In the spirit of :func:`range` and :func:`xrange`, the `daterange`
    generator that yields a sequence of :class:`~datetime.date`
    objects, starting at *start*, incrementing by *step*, until *stop*
    is reached.

    When *inclusive* is True, the final date may be *stop*, **if**
    *step* falls evenly on it. By default, *step* is one day. See
    details below for many more details.

    Args:
        start (datetime.date): The starting date The first value in
            the sequence.
        stop (datetime.date): The stopping date. By default not
            included in return. Can be `None` to yield an infinite
            sequence.
        step (int): The value to increment *start* by to reach
            *stop*. Can be an :class:`int` number of days, a
            :class:`datetime.timedelta`, or a :class:`tuple` of integers,
            `(year, month, day)`. Positive and negative *step* values
            are supported.
        inclusive (bool): Whether or not the *stop* date can be
            returned. *stop* is only returned when a *step* falls evenly
            on it.

    >>> christmas = date(year=2015, month=12, day=25)
    >>> boxing_day = date(year=2015, month=12, day=26)
    >>> new_year = date(year=2016, month=1,  day=1)
    >>> for day in daterange(christmas, new_year):
    ...     print(repr(day))
    datetime.date(2015, 12, 25)
    datetime.date(2015, 12, 26)
    datetime.date(2015, 12, 27)
    datetime.date(2015, 12, 28)
    datetime.date(2015, 12, 29)
    datetime.date(2015, 12, 30)
    datetime.date(2015, 12, 31)
    >>> for day in daterange(christmas, boxing_day):
    ...     print(repr(day))
    datetime.date(2015, 12, 25)
    >>> for day in daterange(date(2017, 5, 1), date(2017, 8, 1),
    ...                      step=(0, 1, 0), inclusive=True):
    ...     print(repr(day))
    datetime.date(2017, 5, 1)
    datetime.date(2017, 6, 1)
    datetime.date(2017, 7, 1)
    datetime.date(2017, 8, 1)

    *Be careful when using stop=None, as this will yield an infinite
    sequence of dates.*
    z%start expected datetime.date instancez,stop expected datetime.date instance or Noner   r    zBstep expected int, timedelta, or tuple (year, month, day), not: %r   Nc                 S   s   dS )NFr
   )nowstopr
   r
   r   <lambda>  r   zdaterange.<locals>.<lambda>r   )r'   r&   )
isinstancer   	TypeErrorr   r   r4   operatorgtgeltledivmodr&   replacer'   )startrP   stepZ	inclusiveZy_stepZm_stepZd_stepfinishedrO   Zm_y_stepZ	cur_monthr
   r
   r   	daterange8  s@    3




r^   hoursc                   @   sJ   e Zd ZdZdefddZedd Zdd Zd	d
 Z	dd Z
dd ZdS )ConstantTZInfoz
    A :class:`~datetime.tzinfo` subtype whose *offset* remains constant
    (no daylight savings).

    Args:
        name (str): Name of the timezone.
        offset (datetime.timedelta): Offset of the timezone.
    Z
ConstantTZc                 C   s   || _ || _d S N)nameoffset)selfrc   rd   r
   r
   r   __init__  s    zConstantTZInfo.__init__c                 C   s   t | jd S )Nr   )r   rd   re   r
   r
   r   utcoffset_hours  s    zConstantTZInfo.utcoffset_hoursc                 C   s   | j S rb   )rd   re   r   r
   r
   r   	utcoffset  s    zConstantTZInfo.utcoffsetc                 C   s   | j S rb   )rc   ri   r
   r
   r   tzname  s    zConstantTZInfo.tznamec                 C   s   t S rb   )ZEROri   r
   r
   r   dst  s    zConstantTZInfo.dstc                 C   s   | j j}d|| j| jf S )Nz%s(name=%r, offset=%r))	__class____name__rc   rd   )re   Zcnr
   r
   r   __repr__  s    zConstantTZInfo.__repr__N)ro   
__module____qualname____doc__rl   rf   propertyrh   rj   rk   rm   rp   r
   r
   r
   r   ra     s   
ra   UTCc                   @   s^   e Zd ZdZeej dZeZej	r2eej
 dZdd Zdd Zdd Zd	d
 Zdd ZdS )LocalTZInfoaK  The ``LocalTZInfo`` type takes data available in the time module
    about the local timezone and makes a practical
    :class:`datetime.tzinfo` to represent the timezone settings of the
    operating system.

    For a more in-depth integration with the operating system, check
    out `tzlocal`_. It builds on `pytz`_ and implements heuristics for
    many versions of major operating systems to provide the official
    ``pytz`` tzinfo, instead of the LocalTZ generalization.

    .. _tzlocal: https://pypi.python.org/pypi/tzlocal
    .. _pytz: https://pypi.python.org/pypi/pytz

    r   c              	   C   s@   |j |j|j|j|j|j| ddf	}tt	|}|j
dkS )Nr   )r'   r&   r!   r   r   r   weekdaytime	localtimemktimetm_isdst)re   r   Zdt_tZlocal_tr
   r
   r   is_dst  s
    zLocalTZInfo.is_dstc                 C   s   |  |r| jS | jS rb   )r}   _dst_offset_std_offsetri   r
   r
   r   rj     s    
zLocalTZInfo.utcoffsetc                 C   s   |  |r| j| j S tS rb   )r}   r~   r   rl   ri   r
   r
   r   rm     s    
zLocalTZInfo.dstc                 C   s   t j| | S rb   )ry   rk   r}   ri   r
   r
   r   rk     s    zLocalTZInfo.tznamec                 C   s   d| j j S )Nz%s())rn   ro   rg   r
   r
   r   rp     s    zLocalTZInfo.__repr__N)ro   rq   rr   rs   r   ry   timezoner   r~   daylightaltzoner}   rj   rm   rk   rp   r
   r
   r
   r   rv     s   rv   c                 C   s    d|    }|r| t|7 } | S )N   )rx   r   )r   Z
days_to_gor
   r
   r   _first_sunday_on_or_after  s    r               
         c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )
USTimeZonezCopied directly from the Python docs, the ``USTimeZone`` is a
    :class:`datetime.tzinfo` subtype used to create the
    :data:`Eastern`, :data:`Central`, :data:`Mountain`, and
    :data:`Pacific` tzinfo types.
    c                 C   s"   t |d| _|| _|| _|| _d S )Nr_   )r   	stdoffsetreprnamestdnamedstname)re   r`   r   r   r   r
   r
   r   rf     s    zUSTimeZone.__init__c                 C   s   | j S rb   )r   rg   r
   r
   r   rp     s    zUSTimeZone.__repr__c                 C   s   |  |r| jS | jS d S rb   )rm   r   r   ri   r
   r
   r   rk     s    
zUSTimeZone.tznamec                 C   s   | j | | S rb   )r   rm   ri   r
   r
   r   rj      s    zUSTimeZone.utcoffsetc                 C   s   |d u s|j d u rtS |j | u s$J d|jk r:tt }}nPd|j  k rPdk r`n ntt }}n*d|j  k rvdk rn ntt }}ntS t	|j
|jd}t	|j
|jd}||j
d d  kr|k rn ntS tS d S )Ni  i  i  i  i  )r'   )r   )r   rl   r'   DSTSTART_2007DSTEND_2007DSTSTART_1987_2006DSTEND_1987_2006DSTSTART_1967_1986DSTEND_1967_1986r   rZ   HOUR)re   r   ZdststartZdstendr[   endr
   r
   r   rm   #  s    
 zUSTimeZone.dstN)	ro   rq   rr   rs   rf   rp   rk   rj   rm   r
   r
   r
   r   r     s   r   EasternESTEDTiCentralCSTCDTiMountainMSTMDTiPacificPSTPDT)Nr   T)Nr   )r   F)2rs   rery   r=   rT   r   r   r   r   r   r   compiler   r   r?   r>   Z_FLOAT_PATTERNr/   dictreversedr2   r9   Zparse_tdr:   rF   rH   rM   r^   rl   r   ra   ru   fromtimestampr   utcfromtimestampr   rv   ZLocalTZr   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   <module>!   sf   
*
.
 
\

+7