+
    &hTO                     *   R t ^ RIt^ RIt^ RIt^ RIt^ RIHtHtHtHtH	t	 ]P                  t
R t]P                  ! R4      tR t^ ]! ^R7      R3^]! ^<R7      R3^]! R	R7      R
3^]! ^R7      R3^]! ^R7      R3^]! ^R7      R3^]! RR7      R3.t] U u. uF*  q ^ ,          V ^,          ,          V ^,          V ^,          3NK,  	  up t] U u. uF  q ^ ,          NK  	  up tRt]P                  ! R],          4      t]! ]RR/ 4       UUu/ uF  w   rV^ ,          VR,           bK  	  upptR t]tR tR0R ltR1R ltR tR2R lt]! ^ 4      t]! ^R7      t ! R R]4      t]! R4      t]P@                  ! ^ ]4      t! ! R R]4      t"]"! 4       t#R  t$]! ^^^^4      t%]! ^^^^4      t&]! ^^^^4      t']! ^^
^^4      t(]! ^^^^4      t)](t* ! R! R"]4      t+]+! R3R#R$R%4      t,]+! R4R&R'R(4      t-]+! R5R)R*R+4      t.]+! R6R,R-R.4      t/R# u up i u up i u uppi )7a  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datetimetimezonec                    V P                   '       d   V \        ,
          pM+V P                  \        P                  R7      \        ,
          p\
        P                  ! V4      # )ue  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

>>> timestamp = int(time.time())
>>> utc_dt = datetime.fromtimestamp(timestamp, timezone.utc)
>>> timestamp - dt_to_timestamp(utc_dt)
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   )r   EPOCH_AWAREreplacer   utcr   total_seconds)dttds   & 1lib/python3.14/site-packages/boltons/timeutils.pydt_to_timestampr   A   sA    , 
yyy+ZZx||Z,{:""2&&    z\Dc                x    \         P                  V 4       Uu. uF  p\        V4      NK  	  pp\        V!  # u upi )a  Parses the limited subset of `ISO8601-formatted time`_ strings as
returned by :meth:`datetime.datetime.isoformat`.

>>> epoch_dt = datetime.fromtimestamp(0, timezone.utc).replace(tzinfo=None)
>>> 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.now(timezone.utc).replace(tzinfo=None)
>>> 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

)_NONDIGIT_REsplitintr   )iso_strpdt_argss   &  r   isoparser   a   s9    .  ,11':;:!s1v:G;W <s   7secondssecondminute  hourdaysdayweekmonthim  yearz*[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?z!((?P<value>%s)\s*(?P<unit>\w)\w*)sc           	     ~   / p\         P                  V 4       FB  pVP                  R4      VP                  R4      rC \        V,          p \        T4      pY1T&   KD  	  \        R/ VB #   \         d'    \        RT: R\        P                  4       : 24      hi ; i  \
         d    \        RT: RT: 24      hi ; i)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
valueunitzinvalid time unit z, expected one of zinvalid time value for unit z:  )	_PARSE_TD_REfinditergroup_PARSE_TD_KW_MAPKeyError
ValueErrorkeysfloatr   )text	td_kwargsmatchr(   r)   unit_keys   &     r   parse_timedeltar7      s    2 I&&t,kk'*EKK,?t	@'-H	.%LE $( - !y!!  	@ $&6&;&;&=? @ @	@
  	. $e- . .	.s   A)B)1BB<c                 &    V^8X  d   V # V R,           # )   r&   r*   )r)   r(   s   &&r   _cardinalize_time_unitr:      s     z#:r   c                   Vf5   \         P                  ! \        P                  4      P	                  RR7      pW,
          p\
        P                  ! V4      p\        V4      p\        P                  ! \        V4      ^,
          p\        V,          w  rp
V\
        P                  ! V	4      ,          p\        W4      pV'       d   V\        V
\        V4      4      3# W3# )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.now(timezone.utc).replace(tzinfo=None)
>>> 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   nowr   r   r
   r   r   absbisect_BOUND_DELTAS_BOUNDSroundr:   )dotherndigitscardinalizediffdiff_secondsabs_diffb_idxbboundbunitbnamef_diffrounded_diffs   &&&&         r   decimal_relative_timerO      s    @ }X\\*22$2?9D**40L4yHMM-2Q6E"5>F5I33E::F)L3E3|;LMMMr   c                `    \        WVRR7      w  r4RpV^ 8  d   Rp\        V4      R RV RV 2# )a  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.now(timezone.utc).replace(tzinfo=None)
>>> 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)rE   agozfrom nowg )rO   r=   )rB   rC   rD   drtr)   phrases   &&&   r   relative_timerV      sB    2 &aTJICF
Qw#hq\4&&**r   c                N    \         P                  ! W4      pVP                  4       # )a)  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whences   && r   strpdater\     s     . v.F;;=r   c              #  z  "   \        V \        4      '       g   \        R4      hV'       d"   \        V\        4      '       g   \        R4      h Vw  rEp\        V4      \        V4      rT\        V\        4      '       d   \	        \        V4      R7      pM)\        V\        4      '       d   M\        RV,          4      hWT^,          ,          pVf   R pMWW8:  d*   V'       d   \        P                  M\        P                  pM(V'       d   \        P                  M\        P                  pT pV! W4      '       gh   Vx  V'       dR   \        VP                  ^,
          V,           ^4      w  rVP                  VP                  V	,           V
^,           R7      pW,           pKu  R#   \         d
    ^ ^ Trep ELOi ; i5i)aT  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    zBstep expected int, timedelta, or tuple (year, month, day), not: %rNc                     R # )Fr*   )r<   stops   &&r   <lambda>daterange.<locals>.<lambda>r  s    Ur   )r%   r$   )
isinstancer   	TypeErrorr   r   r0   operatorgtgeltledivmodr$   r
   r%   )startr_   step	inclusivey_stepm_stepd_stepfinishedr<   m_y_step	cur_months   &&&&       r   	daterangers   *  sb    f eT""?@@JtT**FGG2!% Vc&k&#F,	FI	&	& 8:>? @ 	@ rkF|*	"+8;;"+8;;
Cs!!	"(#))a-6)A2"FH++388h#6%.]  5Cl
;  ,!"At,sB   )F;!F;F$ BF;"(F;;F;AF;$F84F;7F88F;hoursc                   Z   a  ] tR tRt o RtR]3R lt]R 4       tR t	R t
R tR	 tR
tV tR# )ConstantTZInfoi  z
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.

ConstantTZc                    Wn         W n        R # Nnameoffset)selfr|   r}   s   &&&r   __init__ConstantTZInfo.__init__  s    	r   c                P    \         P                  ! V P                  4      R,          # )<   r   )r   r   r}   r~   s   &r   utcoffset_hoursConstantTZInfo.utcoffset_hours  s    &&t{{3w??r   c                    V P                   # rz   )r}   r~   r   s   &&r   	utcoffsetConstantTZInfo.utcoffset  s    {{r   c                    V P                   # rz   )r|   r   s   &&r   tznameConstantTZInfo.tzname  s    yyr   c                    \         # rz   )ZEROr   s   &&r   dstConstantTZInfo.dst  s    r   c                p    V P                   P                  pV R V P                  : RV P                  : R2# )z(name=z	, offset=))	__class____name__r|   r}   )r~   cns   & r   __repr__ConstantTZInfo.__repr__  s2    ^^$$VDII=	$++BBr   r{   N)r   
__module____qualname____firstlineno____doc__r   r   propertyr   r   r   r   r   __static_attributes____classdictcell____classdict__s   @r   rw   rw     sG      )  @ @C Cr   rw   UTCc                      a  ] tR tRt o Rt]! ]P                  ) R7      t]t	]P                  '       d   ]! ]P                  ) R7      t	R tR tR tR tR tR	tV tR
# )LocalTZInfoi  a#  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           	        VP                   VP                  VP                  VP                  VP                  VP
                  VP                  4       ^ R3	p\        P                  ! \        P                  ! V4      4      pVP                  ^ 8  # )    )r%   r$   r"   r   r   r   weekdaytime	localtimemktimetm_isdst)r~   r   dt_tlocal_ts   &&  r   is_dstLocalTZInfo.is_dst  sc    266277BII		2::<B0..T!23!##r   c                `    V P                  V4      '       d   V P                  # V P                  # rz   )r   _dst_offset_std_offsetr   s   &&r   r   LocalTZInfo.utcoffset  s'    ;;r??###r   c                v    V P                  V4      '       d   V P                  V P                  ,
          # \        # rz   )r   r   r   r   r   s   &&r   r   LocalTZInfo.dst  s+    ;;r??##d&6&666r   c                N    \         P                  V P                  V4      ,          # rz   )r   r   r   r   s   &&r   r   LocalTZInfo.tzname  s    {{4;;r?++r   c                <    R V P                   P                  ,          # )z%s())r   r   r   s   &r   r   LocalTZInfo.__repr__  s    ////r   r*   N)r   r   r   r   r   r   r   r   r   r   daylightaltzoner   r   r   r   r   r   r   r   s   @r   r   r     sX      T]]N3KK}}}6$ 

,0 0r   r   c                 h    ^V P                  4       ,
          pV'       d   V \        V4      ,          p V # )   )r   r   )r   
days_to_gos   & r   _first_sunday_on_or_afterr     s)    RZZ\!J
i
##Ir   c                   B   a  ] tR tRt o RtR tR tR tR tR t	Rt
V tR	# )

USTimeZonei  zCopied 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                L    \        VR 7      V n        W n        W0n        W@n        R# )rt   N)r   	stdoffsetreprnamestdnamedstname)r~   ru   r   r   r   s   &&&&&r   r   USTimeZone.__init__  s    "/ r   c                    V P                   # rz   )r   r   s   &r   r   USTimeZone.__repr__  s    }}r   c                `    V P                  V4      '       d   V P                  # V P                  # rz   )r   r   r   r   s   &&r   r   USTimeZone.tzname  s#    88B<<<<<<r   c                F    V P                   V P                  V4      ,           # rz   )r   r   r   s   &&r   r   USTimeZone.utcoffset  s    ~~,,r   c                >   Ve   VP                   f   \        # VP                   V J g   Q hRVP                  8  d   \        \        r2M[RVP                  u;8  d   R8  d   M M\
        \        r2M3RVP                  u;8  d   R8  d   M \        # \        \        r2M\        # \        VP                  VP                  R7      4      p\        VP                  VP                  R7      4      pWAP                  R R7      u;8:  d   V8  d    \        #  \        # \        # )Ni  i  i  i  i  )r%   r   )r   r   r%   DSTSTART_2007DSTEND_2007DSTSTART_1987_2006DSTEND_1987_2006DSTSTART_1967_1986DSTEND_1967_1986r   r
   HOUR)r~   r   dststartdstendrj   ends   &&    r   r   USTimeZone.dst  s    :*
 KyyD    "''>,kfBGG"d"13CfBGG"d" K  23CfK)(*:*:*:*HI'BGG(DE JJdJ+1c1K 2 K4Kr   )r   r   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   s   @r   r   r     s(     
 - r   r   EasternESTEDTCentralCSTCDTMountainMSTMDTPacificPSTPDT)Nr   T)Nr   )r9   Fiii)0r   rer   r>   rd   r   r   r   r   r   r   r   compiler   r   r@   r?   _FLOAT_PATTERNr+   reversedr.   r7   parse_tdr:   rO   rV   r\   rs   r   r   rw   r   fromtimestampr	   r   LocalTZr   r   r   r   r   r   r   r   r   r   r   r   )b_r)   s   000r   <module>r      s  >, 
    @ @
 ''': zz% 6 y#X.y$h/y&/ya %(ya &)yb!7+yc"F+- /6
6gaD1Q4K1qt$g
6&'w!1w'>zz>OP+3GCRL+AC+AZQ GTCZ'+AC '"T +\+@6Vx |qCV C> U$$Q,(0& (0V -" Aq!$q"a# aAq) Ar2q) 
 aB* # 4 4n RUE
2
RUE
2b*eU3
RUE
2g 7'Cs   0HH
H