
    KwgV              	       l   d Z dZdZdZg dZg dZdZej                         j                         Z	ej                         ZdZ
e
j                         j                         Ze
j                         Z
dd	lZdd	lZdd	lZd
dlmZ  eed      reeej(                  fZneefZ ej,                  dej.                  ej0                  z        Z ej,                  d      Zd Zd Zd Zd Zd Z G d de       Z! G d d      Z"d Z#d Z$d Z%d Z&d Z' e#       Z(e"Z) e)d      Z*dZ+ G d d e"      Z,e-d!k(  r e"       Z. e/d"        e/d#e.d$e.ja                         d%e.jc                                e.d
z
  Z2 e/d&e2ja                         d%e2jc                                e.d
z   Z3 e/d'e3ja                         d%e3jc                                 e/d(e3e2z
  z          e/e.ji                  d)              e/e.ji                  d*              e/e.ji                  d+              e/e.ji                  d,              e/e.ji                  d-              e/e.ji                  d.              e/e.ji                  d/              e/e.ji                  d0              e,d1      Z5 e/d2e5d3e5jm                                y	y	)4z3.3.18zXJeff Bauer's lightweight date class, extended by us.  Predates Python's datetime module.i|i$- )      r      r   r   r   r   r   r   r   r   )r      r   r   r   r   r   r   r   r   r   r   z8Monday Tuesday Wednesday Thursday Friday Saturday SundayzeJanuary February March April May June
                July August September October November December    N   )isStrstruct_timez\{(m{1,5}|yyyy|yy|d{1,4})\}z(\d\d\d\d|\d\d)-(\d\d)-(\d\d)c                      t         S N)_monthNameLower     O/var/www/horilla/myenv/lib/python3.12/site-packages/reportlab/lib/normalDate.pygetStdMonthNamesr   '   s    r   c                  B    t               D  cg c]  } | d d 	 c} S c c} w N   )r   xs    r   getStdShortMonthNamesr   *   s    +-.aAbqE...   c                      t         S r   )_dayOfWeekNameLowerr   r   r   getStdDayNamesr   -   s    r   c                  B    t               D  cg c]  } | d d 	 c} S c c} w r   )r   r   s    r   getStdShortDayNamesr   0   s    )+,aAbqE,,,r   c                 R    | dk  r| dz  ryy| dz  dk7  ry| dz  dk7  ry| dz  dk7  ryy)z@determine if specified year is leap year, returns Python boolean@     r   r   d     r   years    r   
isLeapYearr$   3   sC    d{!8	Q	q	qr   c                       e Zd ZdZy)NormalDateExceptionzException class for NormalDateN)__name__
__module____qualname____doc__r   r   r   r&   r&   C   s    (r   r&   c                      e Zd ZdZd=dZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zed        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/ed.        Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:e9Z;d9 Z<d: Z=d; Z>d< Z?y)>
NormalDateaT  
    NormalDate is a specialized class to handle dates without
    all the excess baggage (time zones, daylight savings, leap
    seconds, etc.) of other date structures.  The minimalist
    strategy greatly simplifies its implementation and use.

    Internally, NormalDate is stored as an integer with values
    in a discontinuous range of -99990101 to 99991231.  The
    integer value is used principally for storage and to simplify
    the user interface.  Internal calculations are performed by
    a scalar based on Jan 1, 1900.

    Valid NormalDate ranges include (-9999,1,1) B.C.E. through
    (9999,12,31) C.E./A.D.


    1.0
        No changes, except the version number.  After 3 years of use by
        various parties I think we can consider it stable.

    0.8
        Added Prof. Stephen Walton's suggestion for a range method
         - module author resisted the temptation to use lambda <0.5 wink>

    0.7
        Added Dan Winkler's suggestions for __add__, __sub__ methods

    0.6
        Modifications suggested by Kevin Digweed to fix:
         - dayOfWeek, dayOfWeekAbbrev, clone methods
         - Permit NormalDate to be a better behaved superclass

    0.5
        Minor tweaking

    0.4
         - Added methods __cmp__, __hash__
         - Added Epoch variable, scoped to the module
         - Added setDay, setMonth, setYear methods

    0.3
        Minor touch-ups

    0.2
         - Fixed bug for certain B.C.E leap years
         - Added Jim Fulton's suggestions for short alias class name =ND
           and __getstate__, __setstate__ methods

    Special thanks:  Roedy Green
    Nc                     |7| j                  t        j                  t        j                                      y| j                  |       y)a  
        Accept 1 of 4 values to initialize a NormalDate:
            1. None - creates a NormalDate for the current day
            2. integer in yyyymmdd format
            3. string in yyyymmdd format
            4. tuple in (yyyy, mm, dd) - localtime/gmtime can also be used
            5. string iso date format see _iso_re above
            6. datetime.datetime or datetime.date
        N)setNormalDatetime	localtimeself
normalDates     r   __init__zNormalDate.__init__z   s5     t~~diik:;z*r   c                 ~    t        |t              st        d      | j                  | j	                         |z          y)3add days to date; use negative integers to subtractz)add method parameter must be integer typeN
isinstanceintr&   	normalizescalarr2   dayss     r   addzNormalDate.add   s3    $s#%;= =t{{}t+,r   c                 ~    t        |t              st        d      | j                         }|j	                  |       |S )z<add integer to normalDate and return a new, calculated valuez&__add__ parameter must be integer typer8   r9   r&   cloner>   r2   r=   cloneds      r   __add__zNormalDate.__add__   s8    $s#%8: :

4r   c                 $    | j                  |      S )zfor completeness)rD   r<   s     r   __radd__zNormalDate.__radd__   s    ||D!!r   c                 8    | j                  | j                        S )z+return a cloned instance of this normalDate)	__class__r3   r2   s    r   rA   zNormalDate.clone   s    ~~doo..r   c                 N    t        |d      sy| j                  |j                  k  S Nr3   Fhasattrr3   r2   others     r   __lt__zNormalDate.__lt__   s$    u\*!1!111r   c                 N    t        |d      sy| j                  |j                  k  S rK   rL   rN   s     r   __le__zNormalDate.__le__   $    u\*%"2"222r   c                 N    t        |d      sy| j                  |j                  k(  S rK   rL   rN   s     r   __eq__zNormalDate.__eq__   rS   r   c                 N    t        |d      sy| j                  |j                  k7  S Nr3   TrL   rN   s     r   __ne__zNormalDate.__ne__   $    u\*%"2"222r   c                 N    t        |d      sy| j                  |j                  k\  S rW   rL   rN   s     r   __ge__zNormalDate.__ge__   rY   r   c                 N    t        |d      sy| j                  |j                  kD  S rW   rL   rN   s     r   __gt__zNormalDate.__gt__   s$    u\*!1!111r   c                 D    t        t        | j                        dd       S )zreturn the day as integer 1-31Nr9   reprr3   rI   s    r   dayzNormalDate.day   s    4(-..r   c                 .    t        | j                          S );return integer representing day of week, Mon=0, Tue=1, etc.)	dayOfWeektoTuplerI   s    r   re   zNormalDate.dayOfWeek   s    $,,.))r   c                 $    t        | dt              S )N_dayOfWeekName)getattrrh   rI   s    r   __day_of_week_name__zNormalDate.__day_of_week_name__   s    t,^<<r   c                 B    | j                   | j                            dd S )z@return day of week abbreviation for current date: Mon, Tue, etc.Nr   rj   re   rI   s    r   dayOfWeekAbbrevzNormalDate.dayOfWeekAbbrev   s!    (()9:2A>>r   c                 <    | j                   | j                            S )z?return day of week name for current date: Monday, Tuesday, etc.rl   rI   s    r   dayOfWeekNamezNormalDate.dayOfWeekName   s    (()9::r   c                     | j                         rt        }nt        }d}t        | j	                         dz
        D ]
  }|||   z   } | j                         |z   S )zday of yearr   r   )r$   _daysInMonthLeapYear_daysInMonthNormalrangemonthrb   )r2   daysByMonthpriorMonthDaysms       r   	dayOfYearzNormalDate.dayOfYear   sY    ??.K,Ktzz|a'( 	=A+k!n<N	=xxzN**r   c                     t        |t              r!| j                         |j                         z
  S | j                         t        |      j                         z
  S )z`
        return value may be negative, since calculation is
        self.scalar() - arg
        )r8   r,   r;   r1   s     r   daysBetweenDateszNormalDate.daysBetweenDates   sG    
 j,;;=:#4#4#666;;=:j#9#@#@#BBBr   c                 v    t        |t              r)|| j                  d u S | j                  |j                  k(  S yNr   )r8   r,   r3   )r2   targets     r   equalszNormalDate.equals   s8    fZ(~$..&*;*;;;r   c                 z    | j                  | j                         dd t        | j                               z         S )z"returns (cloned) last day of monthr_   )rH   __repr__strlastDayOfMonthrI   s    r   
endOfMonthzNormalDate.endOfMonth   s1    ~~dmmob4S9L9L9N5OOPPr   c                 L    | j                  | j                         dd dz         S )z#returns (cloned) first day of monthr   r_   01)rH   r   rI   s    r   firstDayOfMonthzNormalDate.firstDayOfMonth   s#    ~~dmmob4T9::r   c                 H    | j                         }|dd d|dd d|dd S )z3return date as string in common US format: MM/DD/YYr_   /Nir   r2   ds     r   formatUSzNormalDate.formatUS   ,    MMOr"XqvqBx88r   c                 H    | j                         }|dd d|dd d|dd S )z;return date as string in 4-digit year US format: MM/DD/YYYYr   r_   r   Nr   r   r   s     r   formatUSCenturyzNormalDate.formatUSCentury   r   r   c                 4    t        | j                               S r   )r   rt   rI   s    r   _fmtMzNormalDate._fmtM  s    4::<  r   c                 (    d| j                         z  S N%02d)rt   rI   s    r   _fmtMMzNormalDate._fmtMM  s    

$$r   c                 "    | j                         S r   )monthAbbrevrI   s    r   _fmtMMMzNormalDate._fmtMMM	  s    !!r   c                 "    | j                         S r   	monthNamerI   s    r   _fmtMMMMzNormalDate._fmtMMMM  s    ~~r   c                 (    | j                         d   S r|   r   rI   s    r   	_fmtMMMMMzNormalDate._fmtMMMMM  s    ~~""r   c                 4    t        | j                               S r   )r   rb   rI   s    r   _fmtDzNormalDate._fmtD  s    488:r   c                 (    d| j                         z  S r   )rb   rI   s    r   _fmtDDzNormalDate._fmtDD  s    
""r   c                 "    | j                         S r   )rm   rI   s    r   _fmtDDDzNormalDate._fmtDDD  s    ##%%r   c                 "    | j                         S r   )ro   rI   s    r   _fmtDDDDzNormalDate._fmtDDDD  s    !!##r   c                 .    d| j                         dz  z  S )Nr   r    r"   rI   s    r   _fmtYYzNormalDate._fmtYY  s    S))r   c                 4    t        | j                               S r   )r   r#   rI   s    r   _fmtYYYYzNormalDate._fmtYYYY!  s    499;r   c                    |dd }d}	 t         j                  ||      }|rc t        | d|j                         dd j	                         z                }|j                         \  }}|d| |z   ||d z   }|t        |      z   }n|S ~)a  format like MS date using the notation
        {YY}    --> 2 digit year
        {YYYY}  --> 4 digit year
        {M}     --> month as digit
        {MM}    --> 2 digit month
        {MMM}   --> abbreviated month name
        {MMMM}  --> monthname
        {MMMMM} --> first character of monthname
        {D}     --> day of month as digit
        {DD}    --> 2 digit day of month
        {DDD}   --> abrreviated weekday name
        {DDDD}  --> weekday name
        Nr   r   _fmt)_fmtPatsearchri   groupupperspanlen)r2   fmtrfrw   yijs           r   formatMSzNormalDate.formatMS$  s     Fq#ABGD1R)>)>)@!ABDvvx1qVaZ1QR5(AJ r   c                     | j                   S )z(minimize persistent storage requirementsr3   rI   s    r   __getstate__zNormalDate.__getstate__>  s    r   c                 ,    t        | j                        S r   )hashr3   rI   s    r   __hash__zNormalDate.__hash__B  s    DOO$$r   c                     | j                   S r   r   rI   s    r   __int__zNormalDate.__int__E  s    r   c                 4    t        | j                               S )zc
        determine if specified year is leap year, returning true (1) or
        false (0)
        )r$   r#   rI   s    r   r$   zNormalDate.isLeapYearH  s    
 $))+&&r   c                    t        |t              syt        t        |            dkD  ry|dk  rd|z  }nd|z  }t        |      dk  ryt        |      dk(  r|d   dk7  r	|d   dk7  ryt        |dd	       }|d
k  s
|dkD  s|dk(  ryt        |d	d       }|dk  s|dkD  ryt	        |      rt
        |dz
     }nt        |dz
     }t        |dd       }|dk  s||kD  ry|dk(  r|dk(  r|dkD  r|dk  ryy)z.checks for date validity in [-]yyyymmdd formatr   	   %09d%08d   -+Nr   '  r_   r      .  
   r      )r8   r9   r   ra   r$   rq   rr   )r2   r3   dateStrr#   rt   maxDayrb   s          r   _isValidNormalDatezNormalDate._isValidNormalDateO  s   *S)tJ 1$>z)Gz)Gw<!\Q
c!gajC&773B< %<4$;$!)GBrN#19
d)%!)4F'	2F'"#,7cFl4<ERKC!Gbr   c                     | j                         rt        | j                         dz
     S t        | j                         dz
     S )z.returns last day of the month as integer 28-31r   )r$   rq   rt   rr   rI   s    r   r   zNormalDate.lastDayOfMontho  s8    ??'

q(899%djjlQ&677r   c                 "    | j                         S )z8override this method to use your preferred locale format)r   rI   s    r   localeFormatzNormalDate.localeFormatv  s    }}r   c                 D    t        t        | j                        dd       S )zreturns month as integer 1-12r   r_   r`   rI   s    r   rt   zNormalDate.monthz  s    4(B/00r   c                 $    t        | dt              S )N
_monthName)ri   r   rI   s    r   __month_name__zNormalDate.__month_name__~  s    tL44r   c                 H    | j                   | j                         dz
     dd S )z@returns month as a 3-character abbreviation, i.e. Jan, Feb, etc.r   Nr   r   rt   rI   s    r   r   zNormalDate.monthAbbrev  s%    ""4::<!#34Ra88r   c                 B    | j                   | j                         dz
     S )z0returns month name, i.e. January, February, etc.r   r   rI   s    r   r   zNormalDate.monthName  s    ""4::<!#344r   c                    |t         k  rdt         z  }t        |      |t        kD  rdt        z  }t        |      ddlm} |dk\  rdt         ||dz   dz              z   }n:|d	k\  rd
t         ||dz   dz              z   }ndt         ||dz   dz              z   }|t        |      z
  dz   }|dk  r|dz
  }|t        |      z
  dz   }d}t        |      r|dz   }||kD  r|dz   }|t        |      z
  dz   }|dk\  r
|dk  r|dz   }t        |      rt        }nt        }d}d}	t        t        |            D ]  }
|||
   z   }||k\  s|
dz   }	 n d}t        |	dz
        D ]
  }
|||
   z   } ||z
  }| j                  ||	|f       y)zconvert scalar to normalDatez#normalize(%d): scalar below minimumz%normalize(%d): scalar exceeds maximumr   )flooril;r   i g{Gv@ijr   i
 r   i
 r   m  i;r   r   N)_bigBangScalarr&   _bigCrunchScalarmathr   r9   firstDayOfYearr$   rq   rr   rs   r   r.   )r2   r;   msgr   r#   r=   
daysInYearru   dcrt   rw   rv   rb   s                r   r:   zNormalDate.normalize  s   N"7 !C%c**$$9"#C%c**W#eVf_$@ABBDws5&6/X!=>??DE6F?h">?@@Dt,,q019!8DN40014D
d#aJ*!8DN40014Dg&G"3"9Dd.K,Ks;'( 	Ak!n$BTzA		 uqy! 	=A+k!n<N	=^#D%-.r   c                 |    t        |t              s|| z
  }g }t        |      D ]  }|j                  | |z           |S )zXReturn a range of normalDates as a list.  Parameter
        may be an int or normalDate.)r8   r9   rs   append)r2   r=   r   r   s       r   rs   zNormalDate.range  sD     $s#$;Dt 	AHHTAX	r   c                 \    | j                   dk  rd| j                   z  S d| j                   z  S )zprint format: [-]yyyymmddr   r   r   r   rI   s    r   r   zNormalDate.__repr__  s.    
 ??QDOO++DOO++r   c                     | j                         \  }}}t        |      |z   dz
  }| j                         r t        |dz
        D ]  }|t        |   z   } nt        |dz
        D ]  }|t
        |   z   } |dk(  r|dkD  s
|dk(  r
|dkD  r|dz
  }|S )z%days since baseline date: Jan 1, 1900r   r   r   r   )rf   r   r$   rs   rq   rr   )r2   r#   rt   rb   r=   rw   s         r   r;   zNormalDate.scalar  s    !\\^ucd#c)A-??519% 621556 519% 403344<rzerkcAgbyr   c                     | j                         }|dk  s||kD  rd|z  }t        |      | j                         \  }}}| j                  |||f       y)zset the day of the monthr   zday is outside of range 1 to %dN)r   r&   rf   r.   )r2   rb   r   r   r   rw   r   s          r   setDayzNormalDate.setDay  sW    $$&7cFl3f<C%c**LLN	AqAq#;'r   c                 ~    |dk  s|dkD  rt        d      | j                         \  }}}| j                  |||f       y)zset the month [1-12]r   r   zmonth is outside range 1 to 12Nr&   rf   r.   )r2   rt   r   rw   r   s        r   setMonthzNormalDate.setMonth  s@    19
%&FGGLLN	AqAua=)r   c                    t        |t              r|| _        nt        |      r	 t        |      | _        nt        |t              rt        d|dd z        | _        nt        |t              r|j                  | _        nct        |t        j                  t        j                  f      r2|j                  dz  |j                  z   dz  |j                   z   | _        nd| _        | j#                  | j                        st        dt        |      z        y#  t        j                  |      }|rE| j                  |j                  d      |j                  d      z   |j                  d      z          nt        dt        |      z        Y xY w)zb
        accepts date as scalar string/integer (yyyymmdd) or tuple
        (year, month, day, ...)r      r   zunable to setNormalDate(%s)z%04d%02d%02dNr    )r8   r9   r3   r   _iso_rematchr.   r   r&   ra   _DateSeqTypesr,   datetimedater#   rt   rb   r   )r2   r3   rw   s      r   r.   zNormalDate.setNormalDate  sD    j%(DO:`"%j/ 
=1!.:bq>"ABDO
:.(33DO
H$5$5hmm#DE)s2:3C3CCSHWDO"DO&&t7%&Cd:FV&VWW 8`MM*-&&qwwqz!''!*'<QWWQZ'GH-.KdS]N^.^__ Is   D A5Fc                     |dk(  rt        d      |dk  rt        d      |dkD  rt        d      | j                         \  }}}| j                  |||f       y )Nr   zcannot set year to zeror   zyear cannot be less than -9999r   z year cannot be greater than 9999r   )r2   r#   r   rw   r   s        r   setYearzNormalDate.setYear  s`    19%&?@@E\%&FGGD[%&HIILLN	AqD!Q<(r   c                     t        |t              r| j                  |       S | j                         |j                         z
  S r   r8   r9   rD   r;   r2   vs     r   __sub__zNormalDate.__sub__  s4    a<<##{{}qxxz))r   c                     t        |t              rt        |      | z
  S |j                         | j                         z
  S r   )r8   r9   r,   r;   r   s     r   __rsub__zNormalDate.__rsub__  s2    aa=4''88:--r   c                 `    | j                         | j                         | j                         fS )z'return date as (year, month, day) tuple)r#   rt   rb   rI   s    r   rf   zNormalDate.toTuple  s!    		TZZ\488:66r   c                 D    t        t        | j                        dd       S )z9return year in yyyy format, negative values indicate B.C.Nr   r`   rI   s    r   r#   zNormalDate.year!  s    4("-..r   r   )@r'   r(   r)   r*   r4   r>   rD   rF   rA   rP   rR   rU   rX   r[   r]   rb   re   propertyrj   rm   ro   rx   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r   r   r   rt   r   r   r   r:   rs   r   r;   r   r   r.   r   __setstate__r   r  rf   r#   r   r   r   r,   r,   G   sT   1d+-"/2
3
3
3
3
2
/* = =?;	+CQ;9
9
!%" ##&$* 4%'@81 5 595-/^,(*X4) !L*
.7/r   r,   c                      t        d      S )z%return lower boundary as a NormalDate)r   r   r   r,   r   r   r   bigBangr	  '  s    m$$r   c                      t        d      S )z%return upper boundary as a NormalDate)r   r   r   r  r   r   r   	bigCrunchr  +  s    n%%r   c                     |dk(  s|dk(  r
|dz   }| dz
  } |d|z  z   d|dz   z  dz  z   | z   | dz  z   | dz  z
  | dz  z   d	z  S )
rd   r   r   r   r      r   r    r!      r   )r   rw   r   s      r   re   re   /  se    AvaFE!Ga1gqj 1$q!t+af4q#v=BBr   c                 h   t        | t              sdt        |       z  }t        |      | dk(  rt        d      | dk  r| dz  t        | dz
  dz        z   dz
  }|S t        | dz   dz        }| d	kD  r,|t        | d
z   d	z
  dz        z
  t        | dz   d	z
  dz        z   }| dz  |z   dz
  }| dkD  r|dz
  }|S )z@number of days to the first of the year, relative to Jan 1, 1900z)firstDayOfYear() expected integer, got %sr   z$first day of year cannot be zero (0)r   r   r   i\
 r   r   c   r    i  r!   i˖
 r   r   )r8   r9   typer&   )r#   r   firstDay
leapAdjusts       r   r   r   6  s    d39DJF!#&&qy!"HII	3J#tax1n"55> O $(a(
$;#c4"9t+;s*B&CCdSj4/3678J#:
*V3$;"}HOr   c                 D    t        | t              xr | xs t        |       S )zconvert to ND if required)r8   r,   ND)r   s    r   FNDr  I  s    a
#)2RU2r   ih io;c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)BusinessDatez 
    Specialised NormalDate
    c                 ~    t        |t              st        d      | j                  | j	                         |z          y)r6   z$add method parameter must be integerNr7   r<   s     r   r>   zBusinessDate.addV  s/    $s#%&LMMt{{}t+,r   c                 ~    t        |t              st        d      | j                         }|j	                  |       |S )z>add integer to BusinessDate and return a new, calculated valuez!__add__ parameter must be integerr@   rB   s      r   rD   zBusinessDate.__add__\  s4    $s#%&IJJ

4r   c                     t        |t              xr | j                  |       xs! | j                         |j                         z
  S r   r   r   s     r   r   zBusinessDate.__sub__d  s5    !C 5T\\1"%5S9SSr   c                 ,    t        | j                        S r   )r  r3   rI   s    r   asNormalDatezBusinessDate.asNormalDateg  s    $//""r   c                 8    | j                   j                  |      S r   )r  rz   r1   s     r   rz   zBusinessDate.daysBetweenDatesj  s      11*==r   c                 Z    | j                         dkD  rt        d| j                  z        y )Nr   z%r isn't a business day)re   r&   r3   rI   s    r   	_checkDOWzBusinessDate._checkDOWm  s,    >>A%89RUYUdUd9d%eer   c                 l    t        |      }t        j                  | |dz  dz  |dz  z   t        z          y Nr  r  )r9   r,   r:   BDEpochScalar)r2   r   s     r   r:   zBusinessDate.normalizep  s0    FT1a4(1Q3,}"<=r   c                 P    | j                         }|t        z
  }d|dz  z  |dz  z   S r"  )r  BDEpoch)r2   r   r   s      r   r;   zBusinessDate.scalart  s/    K!Q$x!A#~r   c                 P    t         j                  | |       | j                          y r   )r,   r.   r   r1   s     r   r.   zBusinessDate.setNormalDatez  s      j1r   N)r'   r(   r)   r*   r>   rD   r   r  rz   r   r:   r;   r.   r   r   r   r  r  R  s6    -T#>f>r   r  __main__zNormalDate test:z	  Today (z) is:  z  Yesterday was: z  Tomorrow will be: z)  Days between tomorrow and yesterday: %dz{d}/{m}/{yy}z{dd}/{m}/{yy}z{ddd} {d}/{m}/{yy}z{dddd} {d}/{m}/{yy}z{d}/{mm}/{yy}z{d}/{mmm}/{yy}z{d}/{mmmm}/{yy}z{d}/{m}/{yyyy}20010116zb=z
b.scalar())7__version__r*   r   r   rr   rq   rh   lowersplitr   r   r   rer/   r   utilsr   rM   listtupler	   r   compile	MULTILINE
IGNORECASEr   r   r   r   r   r   r$   	Exceptionr&   r,   r	  r  re   r   r  Epochr  r%  r#  r  r'   todayprintrm   r   	yesterdaytomorrowr   br;   r   r   r   <module>r;     s   b : < O$**,224 %%'C
""$**,
   
4% 0 01M%LM
"**4R\\"--5O
P
"**5
6/- 	) 	\/ \/@%&C&3 i
8*: *X zLE	
	eU-B-B-DeFXFXFZ
[\	I	i&?&?&A9CYCYC[
\]qyH	)A)A)CXEZEZE\
]^	
5I9M
NO	%..
()	%..
)*	%..-
./	%...
/0	%..
)*	%..)
*+	%..*
+,	%..)
*+Z A	$qqxxz*% r   