+
    CrhE                         R t . ROt^ RItRtRtRt. ROt. ROtR^ R^ R^ R^ R	RR
R RR!RRRR"RR!RR#RR"RR$RR#/tR t	R t
R tR tR t ! R R4      t ! R R]4      tR# )%zcEmail address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
N  z, UTUTCGMTZASTADTESTEDTCSTCDTMSTMDTPSTPDTc                b    \        V 4      pV'       g   R# V^	,          f   ^ V^	&   \        V4      # )zIConvert a date string to a time tuple.

Accounts for military timezones.
N)_parsedate_tztuple)dataress   & -/usr/local/lib/python3.14/email/_parseaddr.pyparsedate_tzr   -   s0    
 
C
1v~A:    c           
     P   V '       g   R# V P                  4       p V '       g   R# V ^ ,          P                  R4      '       g!   V ^ ,          P                  4       \        9   d   V ^  M5V ^ ,          P	                  R4      pV^ 8  d   V ^ ,          V^,           R V ^ &   \        V 4      ^8X  d8   V ^ ,          P                  R4      p\        V4      ^8X  d   W R,          ,           p \        V 4      ^8X  dX   V ^,          pVP                  R4      pVR8X  d   VP                  R4      pV^ 8  d   VRV W1R .V R&   MV P                  R4       \        V 4      ^8  d   R# V R,          p V w  rErgpV'       d   V'       d	   V'       g   R# VP                  4       pV\        9  d   YTP                  4       rTV\        9  d   R# \        P                  V4      ^,           pV^8  d
   V^,          pVR,          R8X  d   VRR pVP                  R	4      pV^ 8  d   YvrvVR,          R8X  d   VRR pV'       g   R# V^ ,          P                  4       '       g   YrVR,          R8X  d   VRR pVP                  R	4      p\        V4      ^8X  d   Vw  rR
pM}\        V4      ^8X  d   Vw  rpMg\        V4      ^8X  dV   RV^ ,          9   dH   V^ ,          P                  R4      p\        V4      ^8X  d   Vw  r^ pM\        V4      ^8X  d   Vw  rpMR# R#  \        V4      p\        V4      p\        V	4      p	\        V
4      p
\        V4      pT^d8  d   T^D8  d   TR,          pM	TR,          pRpTP                  4       pT\        9   d   \        T,          pM, \        T4      pT^ 8X  d   TP                  R4      '       d   RpT'       d;   T^ 8  d   RpT) pM^pY^d,          R,          T^d,          ^<,          ,           ,          pYeYIY^ ^RT.
#   \         d     R# i ; i  \         d     Li ; i)an  Convert date to extended time tuple.

The last (additional) element is the time zone offset in seconds, except if
the timezone was specified as -0000.  In that case the last element is
None.  This indicates a UTC timestamp that explicitly declaims knowledge of
the source timezone, as opposed to a +0000 timestamp that indicates the
source timezone really was UTC.

N,-:   NN+:   NNr   :N   N:0.il  i  i  )splitendswithlower	_daynamesrfindlenfindappend_monthnamesindexisdigitint
ValueErrorupper
_timezones
startswith)r   istuffsddmmyytmtzthhtmmtsstzoffsettzsigns   &             r   r   r   9   s    ::<D AwQ9 <GGMM#61gacdmDG
4yA~Qc"u:?8#D
4yA~GFF3K7sAq5"1qu~DHKKO
4y1}8DRRR2"	B	XXZB[ 			2		"B	Bw
b	"v}W
A1uB	"v}Wa5==??B	"v}W	#B
2w!|
	RA3	RA#A,U[[r7a<JSCW\ OSsWW#h#h#h 
Cx7$JB $JBH	B	Zb>	2wH Q;2==--Ha<F yHF}d2hnb5HHIBSq!R::E  *  		s$   7P P PPP%$P%c                Z    \        V 4      p\        V\        4      '       d
   VR,          # V# )z&Convert a time string to a time tuple.:N	   N)r   
isinstancer   )r   ts   & r   	parsedaterF      s'    TA!Uur   c                    V ^	,          f%   \         P                  ! V R,          R,           4      # ^ RIpVP                  V 4      pW ^	,          ,
          # )zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.N:N   N)r$   )timemktimecalendartimegm)r   rK   rE   s   &  r   	mktime_tzrM      sB    Aw{{48e+,, 	OOD!7{r   c                F    V P                  RR4      P                  RR4      # )zPrepare string to be used in a quoted string.

Turns backslash and double quote characters into quoted pairs.  These
are the only characters that need to be quoted inside a quoted string.
Does not add the surrounding double quotes.
\z\\"z\")replace)strs   &r   quoterS      s"     ;;tV$,,S%88r   c                   z   a  ] tR t^t o RtR tR tR tR tR t	R t
R tRR	 ltR
 tR tR tRR ltR tRtV tR# )AddrlistClasszAddress parser class by Ben Escoto.

To understand what this class does, it helps to have a copy of RFC 2822 in
front of you.

Note: this class interface is deprecated and may be removed in the future.
Use email.utils.AddressList instead.
c                D   RV n         ^ V n        RV n        RV n        V P                  V P                  ,           V n        V P                   V P                  ,           V P                  ,           V n        V P
                  P                  RR4      V n        Wn        . V n	        R# )zkInitialize a new instance.

'field' is an unparsed address header field, containing
one or more addresses.
z()<>@,:;."[]z 	z
r#   r   N)
specialsposLWSCRFWSatomendsrQ   
phraseendsfieldcommentlistselfr^   s   &&r   __init__AddrlistClass.__init__   sx     (88dgg%0477: --//R8
r   c                N   . pV P                   \        V P                  4      8  d   V P                  V P                   ,          V P                  R,           9   dj   V P                  V P                   ,          R9  d-   VP	                  V P                  V P                   ,          4       V ;P                   ^,          un         K  V P                  V P                   ,          R8X  d-   V P
                  P	                  V P                  4       4       EK   \        P                  V4      # )z&Skip white space and extract comments.z
()	rX   r*   r^   rY   r,   r_   
getcommentEMPTYSTRINGjoin)ra   wslists   & r   gotonextAddrlistClass.gotonext   s    hhTZZ(zz$((#txx&'88::dhh'v5MM$**TXX"67ADHH%,  ''(9:''r   c                    . pV P                   \        V P                  4      8  d6   V P                  4       pV'       d   W,          pKF  VP	                  R4       KY  V# )zFParse all addresses.

Returns a list containing all of the addresses.
)r   r   )rX   r*   r^   
getaddressr,   )ra   resultads   &  r   getaddrlistAddrlistClass.getaddrlist  sD    
 hhTZZ("Bh'r   c                
   . V n         V P                  4        V P                  pV P                   pV P                  4       pV P                  4        . pV P                  \	        V P
                  4      8  d4   V'       d*   \        P                  V P                   4      V^ ,          3.pEMkV P
                  V P                  ,          R9   dA   Wn        W n         V P                  4       p\        P                  V P                   4      V3.pEM	V P
                  V P                  ,          R8X  d   . p\	        V P
                  4      pV ;P                  ^,          un        V P                  \	        V P
                  4      8  dw   V P                  4        V P                  V8  d>   V P
                  V P                  ,          R8X  d   V ;P                  ^,          un        EM5W@P                  4       ,           pK  EMV P
                  V P                  ,          R8X  d   V P                  4       pV P                   '       dH   \        P                  V4      R,           RP                  V P                   4      ,           R,           V3.pM\        P                  V4      V3.pMwV'       d+   \        P                  V P                   4      V^ ,          3.pMEV P
                  V P                  ,          V P                  9   d   V ;P                  ^,          un        V P                  4        V P                  \	        V P
                  4      8  d<   V P
                  V P                  ,          R8X  d   V ;P                  ^,          un        V# )	zParse the next address.z.@r!   ;<z (r   )r   )r_   rj   rX   getphraselistr*   r^   SPACErh   getaddrspecrm   getrouteaddrrW   )ra   oldposoldclplist
returnlistaddrspecfieldlen	routeaddrs   &       r   rm   AddrlistClass.getaddress  sv     ""$
88s4::&$zz$*:*:;U1XFG
ZZ!T) H$'')H ::d&6&67BCJZZ!S(J4::HHHMH((S_,88h&4::dhh+?3+FHHMH'//*;;
 - ZZ!S())+I$zz%047"xx(8(89 :<? @AJL M
  %zz%0)<=
 $zz$*:*:;U1XFG
DHH%6A88c$**o%$**TXX*>#*EHHMHr   c                   V P                   V P                  ,          R8w  d   R# RpV ;P                  ^,          un        V P                  4        RpV P                  \        V P                   4      8  Ed   V'       d   V P	                  4        RpMV P                   V P                  ,          R8X  d   V ;P                  ^,          un         V# V P                   V P                  ,          R8X  d   V ;P                  ^,          un        RpMhV P                   V P                  ,          R8X  d   V ;P                  ^,          un        M,V P                  4       pV ;P                  ^,          un         V# V P                  4        EK7  V# )	zqParse a route address (Return-path value).

This method just skips all the route stuff and returns the addrspec.
rt   NFr   >@Tr!   )r^   rX   rj   r*   	getdomainrx   )ra   expectrouteadlists   &  r   ry   AddrlistClass.getrouteaddrJ  s   
 ::dhh3&AhhTZZ( #DHH%,A  DHH%,A"DHH%,A))+A  MMOr   c                4   . pV P                  4        V P                  \        V P                  4      8  Ed   RpV P                  V P                  ,          R8X  dc   V'       d.   VR,          P	                  4       '       g   VP                  4        VP                  R4       V ;P                  ^,          un        RpMV P                  V P                  ,          R8X  d1   VP                  R\        V P                  4       4      ,          4       MV P                  V P                  ,          V P                  9   d7   V'       d.   VR,          P	                  4       '       g   VP                  4        MYVP                  V P                  4       4       V P                  4       pV'       g   EK  V'       g   EK  VP                  V4       EK  V P                  \        V P                  4      8  g#   V P                  V P                  ,          R8w  d   \        P                  V4      # VP                  R4       V ;P                  ^,          un        V P                  4        V P                  4       pV'       g   \        # \        P                  V4      V,           # )zParse an RFC 2822 addr-spec.Tr#   FrP   z"%s"r   r$   )rj   rX   r*   r^   strippopr,   rS   getquoter\   getatomrg   rh   r   )ra   aslistpreserve_wswsdomains   &    r   rx   AddrlistClass.getaddrspecj  s   hhTZZ(Kzz$((#s*&*"2"2"4"4JJLc"A#DHH%,fuT]]_'==>DHH%6&*"2"2"4"4JJLdlln-B{rrb!88s4::&$**TXX*>#*E##F++cA! '&00r   c                   . pV P                   \        V P                  4      8  Ed   V P                  V P                   ,          V P                  9   d   V ;P                   ^,          un         Kl  V P                  V P                   ,          R8X  d,   V P                  P                  V P                  4       4       K  V P                  V P                   ,          R8X  d"   VP                  V P                  4       4       K  V P                  V P                   ,          R8X  d.   V ;P                   ^,          un         VP                  R4       EKK  V P                  V P                   ,          R8X  d   \        # V P                  V P                   ,          V P                  9   d   M"VP                  V P                  4       4       EK  \        P                  V4      # )z-Get the complete domain name from an address.re   [r#   r   )rX   r*   r^   rY   r_   r,   rf   getdomainliteralrg   r\   r   rh   )ra   sdlists   & r   r   AddrlistClass.getdomain  s%   hhTZZ(zz$((#txx/ADHH%,  ''(9:DHH%,d3356DHH%,Ac"DHH%, #"DHH%6dlln-''r   c                P   V P                   V P                  ,          V8w  d   R# R.pRpV ;P                  ^,          un        V P                  \        V P                   4      8  Ed,   V'       d0   VP                  V P                   V P                  ,          4       RpMV P                   V P                  ,          V9   d   V ;P                  ^,          un        MV'       dD   V P                   V P                  ,          R8X  d"   VP                  V P	                  4       4       K  V P                   V P                  ,          R8X  d   RpM,VP                  V P                   V P                  ,          4       V ;P                  ^,          un        EKP  \
        P                  V4      # )a  Parse a header fragment delimited by special characters.

'beginchar' is the start character for the fragment.
If self is not looking at an instance of 'beginchar' then
getdelimited returns the empty string.

'endchars' is a sequence of allowable end-delimiting characters.
Parsing stops when one of these is encountered.

If 'allowcomments' is non-zero, embedded RFC 2822 comments are allowed
within the parsed fragment.
r   Fre   rO   T)r^   rX   r*   r,   rf   rg   rh   )ra   	begincharendcharsallowcommentsslistrS   s   &&&&  r   getdelimitedAddrlistClass.getdelimited  s    ::dhh9,AhhTZZ(TZZ12DHH%1A4::dhh#73#>T__./DHH%-TZZ12HHMHH&&r   c                (    V P                  RRR4      # )z1Get a quote-delimited fragment from self's field.rP   z"Fr   ra   s   &r   r   AddrlistClass.getquote  s      eU33r   c                (    V P                  RRR4      # )z7Get a parenthesis-delimited fragment from self's field.re   z)Tr   r   s   &r   rf   AddrlistClass.getcomment  s      eT22r   c                6    RV P                  RRR4      ,          # )z!Parse an RFC 2822 domain-literal.z[%s]r   z]Fr   r   s   &r   r   AddrlistClass.getdomainliteral  s    ))#ue<<<r   Nc                n   R.pVf   V P                   pV P                  \        V P                  4      8  dk   V P                  V P                  ,          V9   d   MGVP	                  V P                  V P                  ,          4       V ;P                  ^,          un        K  \
        P                  V4      # )zParse an RFC 2822 atom.

Optional atomends specifies a different set of end token delimiters
(the default is to use self.atomends).  This is used e.g. in
getphraselist() since phrase endings must not include the '.' (which
is legal in phrases).r   )r\   rX   r*   r^   r,   rg   rh   )ra   r\   atomlists   && r   r   AddrlistClass.getatom  s}     4}}HhhTZZ(zz$((#x/

488 45HHMH))r   c                   . pV P                   \        V P                  4      8  Ed4   V P                  V P                   ,          V P                  9   d   V ;P                   ^,          un         Kl  V P                  V P                   ,          R8X  d"   VP	                  V P                  4       4       K  V P                  V P                   ,          R8X  d,   V P                  P	                  V P                  4       4       K  V P                  V P                   ,          V P                  9   d    V# VP	                  V P                  V P                  4      4       EKX  V# )zParse a sequence of RFC 2822 phrases.

A phrase is a sequence of words, which are in turn either RFC 2822
atoms or quoted-strings.  Phrases are canonicalized by squeezing all
runs of continuous whitespace into one space.
rP   re   )
rX   r*   r^   r[   r,   r   r_   rf   r]   r   )ra   r|   s   & r   rv   AddrlistClass.getphraselist  s     hhTZZ(zz$((#txx/ADHH%,T]]_-DHH%,  ''(9:DHH%8  T\\$//:;r   )	rZ   r[   rY   r\   r_   r^   r]   rX   rW   )TN)__name__
__module____qualname____firstlineno____doc__rb   rj   rp   rm   ry   rx   r   r   r   rf   r   r   rv   __static_attributes____classdictcell____classdict__s   @r   rU   rU      sT     &(9v@$1L(.#'J43=*( r   rU   c                   N   a  ] tR tRt o RtR tR tR tR tR t	R t
R	 tR
tV tR# )AddressListi  z@An AddressList encapsulates a list of parsed RFC 2822 addresses.c                |    \         P                  W4       V'       d   V P                  4       V n        R # . V n        R # r   )rU   rb   rp   addresslistr`   s   &&r   rb   AddressList.__init__  s,    t+#//1D!Dr   c                ,    \        V P                  4      # r   )r*   r   r   s   &r   __len__AddressList.__len__  s    4##$$r   c                    \        R 4      pV P                  R,          Vn        VP                   F0  pW0P                  9   d   K  VP                  P                  V4       K2  	  V# )N:NNNr   r   r,   ra   othernewaddrxs   &&  r   __add__AddressList.__add__  sV    d#"..q1""A(((##**1- # r   c                    VP                    F0  pW P                   9   d   K  V P                   P                  V4       K2  	  V # r   )r   r,   ra   r   r   s   && r   __iadd__AddressList.__iadd__  s9    ""A(((  ''* # r   c                    \        R 4      pV P                   F0  pW1P                  9   d   K  VP                  P                  V4       K2  	  V# r   r   r   s   &&  r   __sub__AddressList.__sub__  sC    d#!!A)))##**1- " r   c                    VP                    F0  pW P                   9   g   K  V P                   P                  V4       K2  	  V # r   )r   remover   s   && r   __isub__AddressList.__isub__'  s9    ""A$$$  ''* # r   c                (    V P                   V,          # r   r   )ra   r.   s   &&r   __getitem__AddressList.__getitem__.  s    &&r   r   N)r   r   r   r   r   rb   r   r   r   r   r   r   r   r   r   s   @r   r   r     s0     J"%' 'r   r   )rM   rF   r   rS   )janfebmaraprmayjunjulaugsepoctnovdecjanuaryfebruarymarchaprilr   junejulyaugust	septemberoctobernovemberdecember)montuewedthufrisatsunipiiiiDi)r   __all__rI   rw   rg   
COMMASPACEr-   r(   r3   r   r   rF   rM   rS   rU   r    r   r   <module>r      s   
 
I
 >	 1eAuQAT5$T5$T5$T5$T5$

z;z
9k kZ	-'- -'r   