
    Q?h                     L   S r SrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
  SSKJrJr  SSKJr  SSKJr  SSKJrJr  S	S
KJrJrJrJr  SSKJr   " S S5      r\" 5       r SSKr\R>                  " 5       S:H  r S r! " S S5      r"\#" \"RH                  5      4S jr%C"S r&\'\(44S jr)S r*\#" S5      r+\,\-4r.S r/SS jr0SS jr1SS jr2SS jr3S r4S r5S r6S r7S  r8S! r9S" r:SS# jr;S$ r<S% r=S& r>S' r?SSK@r@\A" \@S(5      rBC@S) rCSS* jrDS+ rESS, jrFSS- jrG " S. S/\H5      rI\R                  S0:X  a  SSKKrKSSKLrLS1S2S2S3S4S4S5S5S6S7S8S8S9S:S;.rMSS< jrNOSS= jrNSSKOrO\R                  R                  \OR                  5      rS\R                  R                  \S5      =(       a    \S=(       d    \R                  R                  \S5      rVCO \R  SSKXrXSSKYrY \Zr[\[(       + r\\F" \[S>9(       d  \]" S?\[-  5      e\R                  R                  \R                  R                  \[R                  5      5      ra\a\R                  -   rc\R                  R                  \a5      rd\d\R                  -   re\f" \c5      rg\f" \e5      rh\c\e\a\d\R                  R                  \R                  R                  \R                  \R                  \f" \R                  5      4	S@ jrjSA rk\XR                  \YR                  \V\R                  R                  4SB jrmCXCY\\=(       a:    \R                  R                  \R                  R                  \R5      S   SE-   5      rpSF rqSG rrSH rsSI rt\A" \SJSK 5      ruSSL jrv\SLrw " SM SN5      rxSO rySSP jrzSQ r{SSR jr|SSSK}J~r~Jr  SSTKJr  SU rSSV jrSSW jrSSX jr\R                  R                  4SY jr\R                  GR                  \R                  R                  4SZ jr\R                  GR                  \R                  R                  \GR                  4S[ jr\R                  R                  \R                  R                  \R                  GR                  \GR                  4S\ jrSS]KJr  S^ rS_ rS` r " Sa Sb5      r " Sc Sd\5      rSe r " Sf Sg5      rSh rSi rSSj jr " Sk Sl5      r " Sm Sn5      rSo rSp rSq rSr rSSKrSs rSt rSu rSSv jrSSw jrSx r " Sy Sz\,5      r " S{ S|\,5      rS} r " S~ S\GRT                  5      r " S S5      rSS jrS rS rS rS r " S S5      rg!   Sr  GN= f!   \R                  S   rR GN= f!   \R                  R                  \R5      r\Sr[SC rk\XR                  4SD jrm GN= f)z3.5.34z6Gazillions of miscellaneous internal utility functions    N)literal_eval)decodebytesencodebytes)BytesIO)md5)get_rl_tempfileget_rl_tempdir   )rl_safe_execrl_safe_evalsafer_globalsrl_extended_literal_eval)Imagec                   8    \ rS rSr\S 5       r\S 5       r\rSrg)	__UNSET__   c                      g)NF r       E/var/www/html/env/lib/python3.13/site-packages/reportlab/lib/utils.py__bool____UNSET__.__bool__   s    r   c                      g)Nr   r   r   r   r   __str____UNSET__.__str__   s    r   r   N)	__name__
__module____qualname____firstlineno__staticmethodr   r   __repr____static_attributes__r   r   r   r   r      s+      Hr   r   PyPyFc                 8    [        U 5      [        [        5      :H  $ N)type
isFunctionvs    r   r'   r'   !   s    7d:&&&r   c                       \ rS rSrS rSrg)c$   c                     g r%   r   selfs    r   mc.m%   s    r   r   N)r   r   r   r   r0   r"   r   r   r   r+   r+   $   s    r   r+   c                     [        U 5      U:H  $ r%   )r&   )r)   mts     r   isMethodr4   '   s    7b=r   c                 8    [        U 5      [        [        5      :H  $ r%   )r&   sysr(   s    r   isModuler7   +   s    7d3ir   c                     [        X5      $ r%   )
isinstance)r)   _sts     r   isSeqr;   .   s    ar   c                 "    [        U [        5      $ r%   r9   strr(   s    r   isNativer?   1       ar   c                     [        [        U 5      (       a  U 5      R                  5       $ U R                  S5      5      R                  5       $ )Nutf8)r   isBytesencode	hexdigestss    r   	_digesterrH   9   s8    GAJJq5??AAAHHV$45??AAr   c           	          [        U [        5      (       a  U $  U R                  U5      $ !   [        S[	        U 5      < S[	        U5      < S35         g = f)NzasBytes(,enc=	) error: )r9   bytesrD   annotateExceptionasciir)   encs     r   asBytesrQ   <   sD    !E1HPxx}P%(5:NO	   * (Ac           	          [        U [        5      (       a  U $  U R                  U5      $ !   [        S[	        U 5      < S[	        U5      < S35         g = f)Nz
asUnicode(rJ   rK   )r9   r>   decoderM   rN   rO   s     r   	asUnicoderU   C   sD    !C(Rxx}RE!HU3ZPQrR   c           	          [        U [        5      (       a  U $  [        U [        5      (       a  U R                  U5      $ [        U 5      $ !   [	        S[        U 5      < S[        U5      < S35         g = f)NzasUnicodeEx(rJ   rK   )r9   r>   rL   rT   rM   rN   rO   s     r   asUnicodeExrW   J   sY    !C(T *1U 3 3qxx}?Q?TeAhuSzRSs   %A
 
A
 
(A4c                     [        XS9$ )N)rP   )rU   rO   s     r   asNativerY   Q   s    Qr   c                     [        U /5      $ r%   )rL   )is    r   int2Byter\   T   s    !:r   c                 .    [        U [        [        45      $ r%   )r9   r>   rL   r(   s    r   isStrr^   W   s    a#e%%r   c                 "    [        U [        5      $ r%   )r9   rL   r(   s    r   rC   rC   Z   s    ar   c                 "    [        U [        5      $ r%   r=   r(   s    r   	isUnicodera   ]   r@   r   c                 "    [        U [        5      $ r%   r9   r&   r(   s    r   isClassrd   `   s    ar   c                 @   [        U [        [        [        [        [
        [        [        [        [        [        [        [        [        R                  [        R                  [        R                   [        R"                  [        R$                  [        R&                  [        R(                  [        R*                  [        R,                  [        R.                  [        R0                  [        R2                  [        R4                  [        R6                  45      (       + $ r%   )r9   floatintr&   tuplelistdictr>   rL   complexboolslice_rl_NoneTypetypesFunctionType
LambdaTypeCodeTypeMappingProxyTypeSimpleNamespaceGeneratorType
MethodTypeBuiltinFunctionTypeBuiltinMethodType
ModuleTypeTracebackType	FrameTypeGetSetDescriptorTypeMemberDescriptorType)xs    r   isNonPrimitiveInstancer   c   s    !U3tE$tCgdSXYe5++ENNu44E,,U-F-F 0 01D1D2253M3MO P P Pr   c                 ,    [        U [        5      (       + $ r%   rc   r(   s    r   instantiatedr   k   s    !D!!!r   c                     [        U [        5      (       a  U R                  U5      $ [        U [        5      (       a  U $ [        U 5      R                  U5      $ r%   )r9   r>   rD   rL   )r~   rP   s     r   bytestrr   n   sB    !Cxx}	Ae		1v}}S!!r   c                 z    [        [        R                  " U 5      5      R                  5       R	                  S5      $ Nlatin1)base64_encodebytespickledumpsstriprT   )argss    r   encode_labelr   v   s*    fll401779@@JJr   c                 ^    [         R                  " [        U R                  S5      5      5      $ r   )r   loadsbase64_decodebytesrD   )labels    r   decode_labelr   y   s     <<*5<<+ABCCr   c                 R    [        U [        5      (       d  U R                  S5      $ U $ zconverts first 256 unicodes 1-1r   )r9   r>   rT   rF   s    r   
rawUnicoder   |   s"    %/#%6%6188H=A=r   c                 R    [        U [        5      (       a  U R                  S5      $ U $ r   )r9   r>   rD   rF   s    r   rawBytesr      s"    !+Ac!2!2188H99r   execc                     [        U [        5      (       a  U $ [        [        U [        5      (       a  U OU R	                  S5      5      $ r   )r9   rg   ordr>   rT   rF   s    r   char2intr      s6    Ac""A[Ac1B1BAQYHZ([[r   c                 F    UR                   ULa  UR                  U5      eUer%   )__traceback__with_traceback)tr)   bs      r   
rl_reraiser      s$    aq!!
Gr   c                  V    SS K nU R                  5        H  u  p#[        XU5        M     g Nr   )builtinsitemssetattr)kwdr   kr)   s       r   rl_add_builtinsr      s!    yy{1 r   c                      U (       d#  [         R                  " S5      R                  S   n SSKJn  [        X5      (       a  [        U R                  5      (       a  U $ S $ !    g = f)Nr
   
__loader__r   )zipimporter)r6   	_getframe	f_globals	zipimportr   r9   len_files)ldrr   s     r   zipImportedr      sQ    --",,\:C) 11c#**oosO4Os   AA  A   A$c                 H   SSK JnJnJn  SSKJn  UR                  5       n/ nUR                  nU  Hm  nU" U5      (       d  M  U" U5       HO  n	U" X5      n	U" U	5      (       d  M  U(       a&  U	R                  5       R                  U5      (       d  MG  U" U	5        MQ     Mo     U$ )Nr   )isfileisdirjoin)listdir)	os.pathr   r   r   osr   lowerappendendswith)
dirListextr   r   	path_joinr   RADfns
             r   
_findFilesr      s~    88
))+C
A	AQxx!*B1Bbzz3"((**=*=c*B*BQrU  
 Hr   c                   N    \ rS rSrS rS rS rS rS rSS jr	S	 r
S
 rS rSrg)CIDict   c                 X    U H  o0R                  U5        M     U R                  U5        g r%   )update)r/   r   kwdsas       r   __init__CIDict.__init__   s    A{{1~Dr   c                 >    UR                  5        H	  u  p#X0U'   M     g r%   )r   )r/   r   r   r)   s       r   r   CIDict.update   s    779CA1g9r   c                 `     UR                  5       n[        R                  XU5        g !    N= fr%   )r   rj   __setitem__r/   r   r)   s      r   r   CIDict.__setitem__   s.    		A 	"	   ) -c                 \     UR                  5       n[        R                  X5      $ !    N= fr%   )r   rj   __getitem__r/   r   s     r   r   CIDict.__getitem__   /    		A ''	   ' +c                 \     UR                  5       n[        R                  X5      $ !    N= fr%   )r   rj   __delitem__r   s     r   r   CIDict.__delitem__   r   r   Nc                 0     X   $ ! [          a    Us $ f = fr%   )KeyError)r/   r   dvs      r   get
CIDict.get   s"    	7N 	I	s    c                      X     g!    g= f)NTFr   r   s     r   __contains__CIDict.__contains__   s    	G	s    c                 `     UR                  5       n[        R                  " X4U-   6 $ !    N= fr%   )r   rj   popr/   r   r   s      r   r   
CIDict.pop   s3    		A xx4(1*&&	r   c                 `     UR                  5       n[        R                  " X4U-   6 $ !    N= fr%   )r   rj   
setdefaultr   s      r   r   CIDict.setdefault   s3    		A $!--	r   r   r%   )r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r   r   r   r   r      s/    *#(('.r   r   mac)oglezBMP )r   EPSF)r   GIFf)r   JPEG)ttxtPICT)r   PNGf)r   z.PPM)r   TIFF)CAROzPDF )MSIETEXT)BMPEPSr   GIFJPGr   PCTr   PNGPPMTIFr   PDFHTMLc                      Ub  Uc  Ub   [         UR                  5          u  p[        R                  " U 5      R	                  X5        [
        R                  " U 5        g !    g = f!    g = fr%   )_KNOWN_MAC_EXTuppermacfsFSSpecSetCreatorType
macostoolstouched)filenamecreatorcodefiletyper   s       r   markfilenamer     sh    		"h&63?,:399;,G)K LL"11+Gx(	s'   	A( A! ;A( !A%#A( %A( (A,c                     g r%   r   )r  r  r  s      r   r  r     s    r   )r   z#can't handle compact distro type %rc
                    U" U R                  SU5      5      n U" U 5      n
XU4;   a  gU
R                  U5      (       a  SU [        S 4$ U
R                  U5      (       a  SU [        S 4$ U" U" 5       5      n[	        U5      nU
R                  U5      (       a1  XS R                  U5      (       a	  SXU	-   S 4$ U[	        U 5      :X  a  g[
        R                  R                  U 5      (       + U 4$ )z3if the name starts with a known prefix strip it off/)r
    r
   N)replace
startswith_archivepfxlen_archivedirpfxlenr   r   pathisabs)r   _archivepfx_archivedirpfx_archive_archivediros_path_normpathos_path_normcase	os_getcwdos_sep
os_sep_lennfncwdns                r   __startswith_rlr%    s     bjjV45r"x((>>+&&qNO1D/D(D>>.))!B7H7I4J2J+Jy{+H>>#"v  ((B|}4E1E*E#b'z$77==$$R''r   c                     [        U 5      S   $ )Nr
   )r%  r   s    r   _startswith_rlr(  3  s    r"1%%r   c                    [        U 5      u  pVU" U5      nU(       d  U/ :X  a]  U[        [        [        U4S j[        [	        Xb4S j[        [
        R                  R                  5       5      5      5      5      5      -  nU$ )Nc                     U" [         U 5      $ r%   )r  )r~   r   pjoins      r   <lambda>rl_glob.<locals>.<lambda>:  s    eKPQ>Rr   c                     U" X5      $ r%   r   )r~   pfnfnmatchs      r   r,  r-  :  s      BI  JK  BPr   )r%  ri   mapr  filter__rl_loader__r   keys)patternglobr0  _RL_DIRr+  r+   r/  rs           r   rl_globr9  6  s     )I2c[uRSWX^lo  `P  QU  Vc  Vj  Vj  Vo  Vo  Vq  Qr  Ys  Tt  u  v  vAr   c                     U $ r%   r   r'  s    r   r(  r(  ?  s    	r   c                     U" U 5      $ r%   r   )r5  r6  s     r   r9  r9  A  s    G}r   .pyc                      [         $ )z*return truth if a file system distribution_isFSDr   r   r   isFileSystemDistror@  F  s    Mr   c                      [         (       + $ )z.return truth if not a file system distributionr>  r   r   r   isCompactDistrorB  J  s
    :r   c                      [         $ )z1return truth if a source file system distribution)_isFSSDr   r   r   isSourceDistrorE  N  s    Nr   c                     [         R                  R                  [         R                  R                  [         R                  R	                  U 5      5      5      $ r%   )r   r  normcaseabspathnormpath)ps    r   normalize_pathrK  R  s3    77BGGOOBGG,<,<Q,?@AAr   invalidate_cachesc                      g r%   r   r   r   r   r,  r,  U  s    Tr   c                    [         R                   Vs/ s H  n[        U5      PM     nnU(       aT  [        U[        [
        45      (       a  UOU4 H0  nU(       d  M  [        U5      nXE;  d  M  UR                  SU5        M2     U(       aJ  SS[        S5      4 H7  nXE;   d  M
  U(       a  [        SU-  5        UR                  U5        XE;   a  M-  M9     O,[        R                  " 5       nXE;  a  UR                  SU5        [         R                  n U[         l        [        5         U(       a  [        5         [        S5        [        S[        U 5      -  5        [        S[        [        R                  " 5       5      -  5        [        S[        [         R                  5      -  5        [        S	[        S
U -  5      < S[        [        R                  R                  S
U -  5      5      < 35        [        S[        U5      -  5        [        S5        [        R                  " U 5      U[         l        [        5         U(       a  [        S[!        U5      -  5        $ $ s  snf ! ["         a;    [%        SU < S[         R                  < S[        R                  " 5       < 35         Oa  [%        S['        [         R(                  " 5       S   5      < SU < S[         R                  < S[        R                  " 5       < 35         O= fU[         l        [        5         U(       a  [        S[!        U5      -  5        gg! U[         l        [        5         U(       a  [        S[!        U5      -  5        f f = f)zEDynamically imports possible packagized module, or raises ImportErrorr   r  .zremoved "%s" from pathz++++++++++++++++++++z+++++ modulename=%sz+++++ cwd=%sz+++++ sys.path=%sz+++++ os.paths.isfile(z./%s.pyz)=z+++++ opath=%sz--------------------z===== restore sys.path=%szCould not import z
using sys.path z in cwd=z
Exception r
   z while importing N)r6   r  rK  r9   ri   rh   insertprintremover   getcwd_importlib_invalidate_cachesrN   r   	importlibimport_modulereprImportErrorrM   r>   exc_info)
modulenamebaseDirnoCWDdebugrJ  r  opaths          r   recursiveImportr_  W  sv   '*xx0x!N1xD0&wU|<<7*LAq"1%=$++a"2 M S,-A)% 81 <=A ) .
 IIK=KK! HHE=$&G&M'%
*;;<.5#556%chh78E)J:N4OQVWYW^W^WeWefopzfzW{Q|}~"U5\12&M&&z2 $&-U;< S 1>  388BIIK1 	JCLLN1%&
388BIIKI 	J $&-U;<  $&-U;< s,   IDI# #AL%L= 'ALL= =6M3c                       \ rS rSrSrS rSrg)ArgvDictValuei  zGA type to allow clients of getArgvDict to specify a conversion functionc                     Xl         X l        g r%   )valuefunc)r/   rc  rd  s      r   r   ArgvDictValue.__init__  s    
	r   )rd  rc  N)r   r   r   r   __doc__r   r"   r   r   r   ra  ra    s
    Qr   ra  c                     S n[         R                  SS n0 nU R                  5        H  u  pE[        U[        5      (       a  UR
                  UR                  peOSnSnUS-   nU HG  n	U	R                  U5      (       d  M  U	[        U5      S n
UR                  U	5        U" XZU5      X4'   Sn  O   U(       a  M  U" XUU5      X4'   M     U$ )zBuilds a dictionary from its keyword arguments with overrides from sys.argv.
Attempts to be smart about conversions, but the value can be an instance
of ArgDictValue to allow specifying a conversion function.
c                    U(       a
  U" U5      n U $ [        U 5      (       a  Un U $ [        U [        5      (       a  [        U5      n U $ [        U [        5      (       a  [        U5      n U $ [        U [        5      (       a  [	        [        U5      0 5      n U $ [        U [        5      (       a  [        [        U5      0 5      n U $ [        SU< S[        U 5      < 35      e)NzCan't convert string z to )	r^   r9   rf   rg   ri   r   rh   	TypeErrorr&   )r)   avrd  s      r   handleValue getArgvDict.<locals>.handleValue  s    RA  Qxx  Ae$$"I  Ac""G  Ad##b)"-
 	 Ae$$,r*2.   2d1g NOOr   r
   Nr   =)
r6   argvr   r9   ra  rc  rd  r  r   rR  )kwrk  r   r   r   r)   rd  handledker   rj  s              r   getArgvDictrr    s    
$ 	A
A
a&&ggqvvtDsUA||Bs2wx["1-  w{1t4 " Hr   c                      SSK Jn  U cA  [        R                  R	                  [        R                  R                  [        5      S5      n U" U 5      $ ! [         a  n[        U5      S:w  a  e  S nAg S nAff = f)Nr   )Hyphenzhyphen.mashedzNo module named pyHnj)	reportlab.lib.pyHnjrt  r   r  r   dirname__file__rX  r>   )hDictrt  errMsgs      r   getHyphenaterrz    s[    .=RWW__X-F W%e} v;//s   AA 
A8A33A8c                      U R                   R                  nUR                  S5      nUS:  a  XS-   S $ U$ ! [         a    [	        U 5      s $ f = f)zReturn a shortened class namerO  r   r
   N)	__class__r   rfindAttributeErrorr>   )r/   namer[   s      r   
_classNamer    sU    ~~&&
**S/a4qST
" 4ys   38 8 AAc                 @   SU;  a  SU-   n [        X5      $ ! [         a{    [        (       d  [        c  e [	        U 5      n [        R                  U 5      nSU;  a4  [        R                  S:w  a   UR                  [        R                  S5      n[        U5      s $ f = f)Nr8  r   
)
openIOErrorr?  r3  r(  get_datar   linesepr  r   )r  moderG   s      r   open_for_read_by_namer    s    
$s4x	D 6]*E d#""4(d?rzz4/QYYrzz$5Oqzs   
 BBB)unquoteurlparse)urlopenc                 4    [        U 5      R                  5       $ r%   )r  read)r  s    r   	rlUrlReadr    s    4=r   c                   ^^^^ [         4S jmSSKJmJm  T(       aJ  SS KnSS KmU4S jnUR                  SR                  SSR                  [        UT5      5      S45      5      mSUUU4S	 jjnU[        5       S
'   U" X5      $ )Nc                 D    U R                  SS5      u  p#U(       d  SnUR                  S5      nUS:  a  SX$S	 ;  a  X$S-   S	 nUS	U nOS
nUS:X  a  [	        UR                  S5      5      nU$ U" U5      R                  S5      nU$ ! [         a    [        SS5      ef = f)zUse "data" URL.,r
   z
data errorzbad data URLztext/plain;charset=US-ASCII;r   rm  Nr  base64rN   zlatin-1)split
ValueErrorr  r}  r   rD   )urlr  typdatasemiencodings         r   
datareader!open_for_read.<locals>.datareader  s    	8		#q)IC /Cyy~19CJ.67|Het*CHx%dkk'&:;D  4=''	2D  	8,77	8s   B Br   )trustedHoststrustedSchemesc                 h   > TR                   " U 5      n U R                  S5      (       a  U SS $ U S S $ )Nz(?s:   i)	translater  )rG   r0  s    r   xreopen_for_read.<locals>.xre  s8    !!!$All6221Qr7>#2>r   r  z^(?:|z)\Zc                 p  > [        U S5      (       a  U $  [        X5      $ !    TbK  [        U 5      nUS   (       a6  US   S;   d  TR                  US   5      (       a	  US   T;   d  [	        S5      e[        U SS R                  5       S:X  a  TO[        " U 5      5      s $ !   [        S	U -  5      e= f= f)
z)attempt to open a file or URL for readingr  Nr   )r  filer
   zAttempted untrusted host access   zdata:zCannot open resource "%s")	hasattrr  r  matchr  r   r   r  r  )r  r  purlr  r  r  s      r   open_for_read$open_for_read.<locals>.open_for_read  s    4
	B(33	BB+#D>DAwaO)C|GYGYZ^_`ZaGbGbimnoip  uC  jC()JKKd2Ahnn.>.G
Y VX\]^^B9D@AAs!   
! B5A;B"B5"B22B5r  r   )
r  reportlab.rl_configr  r  rer0  compiler   r1  globals)	r  r  r  r  r  r  r0  r  r  s	        @@@@r   r  r    s{    
 !( 6 A	? zz"''6 #S)> ? &+( #) *B B "/GIo##r   c                     [        X5      nXLa-  [        US5      (       a  U   UR                  5       sS S S 5        $ UR                  5       $ ! , (       d  f       g = f)N__exit__)r  r  r  )r  r  fs      r   open_and_readr    sE    d A}:..668 Q vvx Qs   A
Ac                 6    [        X5      R                  S5      $ Nr  )r  r  )r  r  s     r   open_and_readlinesr     s    #))$//r   c                     [        U S5      (       a  gU" U 5      (       a  g[        (       d  [        c  g[        U 5      n U [	        [        R
                  R                  5       5      ;   $ )Nr  TF)r  r?  r3  r(  ri   r   r4  )r   os_path_isfiles     r   	rl_isfiler  #  sS    r&$b$v&u		Bm**//1222r   c                 h   U" U 5      (       a  g[         (       d  [        c  g[        U" U 5      5      n U R                  [        R
                  5      (       d  U [        R
                  -  n [        [        [        U 4S j[        [        R                  R                  5       5      5      5      5      S:  $ )NTFc                 $    U R                  U5      $ r%   )r  )r~   pns     r   r,  rl_isdir.<locals>.<lambda>/  s    1<<+;r   r   )r?  r3  r(  r   r   sepr   ri   r2  r   r4  )r  os_path_isdirr  s      r   rl_isdirr  *  s~    Rv&u	(,	-B;;rvvbfftFr;DAUAUAZAZA\<]^_`abbbr   c                    U" U 5      (       d  [         (       d  [        c  U" U 5      $ [        U" U 5      5      n U R                  [        R
                  5      (       d  U [        R
                  -  n [        R                  R                  5        Vs/ s H(  oDR                  U 5      (       d  M  U[        U 5      S  PM*     sn$ s  snf r%   )
r?  r3  r(  r   r   r  r   r4  r  r   )r  r  r  
os_listdirr~   s        r   
rl_listdirr  1  s    RFFm&;JrN=R	(,	-B;;rvvbff!.!5!5!:!:!<Q!<AR@PKAc"ghK!<QQQs   C-Cc                 H   U" U 5      (       d  [         (       d  [        c  U" U 5      $ [        U" U 5      5      n [        R                  U   nUS   nUS   nU" US-	  S-  S-   US-	  S-  US-  US-	  S-  US-	  S	-  US-  S
-  SSS4	5      $ ! [         a    U" U 5      s $ f = f)Nr     	      i           ?   r
   r   )r?  r3  r(  r   r   )	r  r  r  os_path_getmtimetime_mktimerJ  erG   ds	            r   rl_getmtimer  7  s    bVV}'<EUVXEY>Y'+,A$  # 	
!A	!A!Q$d*AqD#:afaeT\1a4QU+WXY]W]`aVabcdefghii	  $##$s   B B! B!)utilc                    S H{  n[         R                  R                  XU-   5      n[         R                  R                  U5      (       d  MK  [        R
                  " X5      nUR                  R                  5       s  $    [        S5      e)N)r<  z.pywz.pyoz.pycz.pydzno suitable file found)	r   r  r   r   importlib_utilspec_from_file_locationloaderload_modulerX  )r  dirr   r  specs        r   __rl_get_module__r  C  sf    2ww||CS)77>>$!99$DD;;**,,	 3
 .
//r   c                    U [         R                  ;   a%  [         R                  U    n[         R                  U 	 OS n  [        X5      U(       a  U[         R                  U '   $ $ !   [        5       (       a  SS Kn[        U5      nUS:H  =(       d    U(       + =(       a    [        =(       dB    [        R                  R                  [        UR                  S[        R                  5      5      nUR                  U5      nUR                  U 5      s U(       a  U[         R                  U '   $ $ [        U < SU< S35      e= f! U(       a  U[         R                  U '   f f = f)Nr   rO  r  [])r6   modulesr  rB  r   r(  r  r   r  r   r  r  r   r  rX  )r  r  omr   zis        r   rl_get_moduler  K  s   s{{[[KK&
	5$T. 2s{{4 2	5   $S)Cx*s78jBGGLLRUR]R]^abdbhbhRi<j**3/~~d++ 2s{{4 2 $s3442s{{4 2s$   
A$ $B+D?E ,D??E Ec                 X     [        U [        R                  5      $ ! [         a     gf = fr   )r9   r   r~  )ims    r   _isPILImager  `  s*    "U[[)) s    
))c                   ~    \ rS rSrSr0 rSrSS jrS rS r	\
S 5       r\
SS j5       rS	 rS
 rS rS rS rS rSrg)ImageReaderif  z%Wraps up PIL to get data from bitmapsNc                    [        U[        5      (       a  UR                  U l        g X l        Xl        S U l        S U l        S U l        S U l        S U l	        [        U5      (       a5  Xl        [        USS 5      U l         U R
                  R                  U l        g  SSKJn  US:w  a  [#        S5      e[%        US5      n[        U[&        5      (       d+  U['        UR)                  5       5      pEUR+                  5         AX@l        U R-                  U R                  5      U l        [        U[.        5      (       a  UO
[1        U5      U R
                  l        U R3                  U R
                  5        [        U R
                  SS 5      S:X  a  U R4                  U l        g g ! [         a    S[        U 5      -  U l         g f = f!   [9        S	U< S
U R;                  5       < 35         g = f)NfpzPILIMAGE_%dr   )imageReaderFlagszYimageReaderFlags values other than 0 are no longer supported; all images are interned nowr   formatr   z

fileName=z
 identity=)r9   r  __dict___identfileName_image_width_height_transparent_datar  getattrr  r~  idr  r  r  r  r   r  close_read_imager>   rW  check_pil_image_size_jpeg_fhjpeg_fhrM   identity)r/   r  identr  r  tfps         r   r   ImageReader.__init__j  s   h{++$--DM ! 
x  "KhtD1DG9 $ 4 4Z@#q($  &A  B  B"8C0!"g.. '"'')"4IIK"..tww73=hs3K3KxQUV^Q_$))$++64;;x5v=#'==DL >! " 9 -4 89$Z!x"XYs    F  DG  G ?G #G(c                 D   U R                   n[        U5      (       d  [        [        U SS5      SS5      nU R                  nSU R                  R
                  < S[        [        U 5      5      < U=(       a    SU-  =(       d    S< U=(       a    SU-  =(       d    S< S	3$ )
z9try to return information that will identify the instancer  Nr  r  @z	 ident=%rr  z filename=%rr  )r  r^   r  r  r|  r   hexr  )r/   r   r  s      r   r  ImageReader.identity  s    ]]Ryyd40=B $ 7 7BtHeFeQ\_dQdFkikFkln  mI  uC  FH  uH  mO  MO  mO  P  	Pr   c                 .    [         R                  " U5      $ r%   )r   r  r/   r  s     r   r  ImageReader._read_image  s    zz"~r   c                     U R                   nUc  g UR                  u  p4UR                  n[        SUS:X  a  SOS[	        U5      -  U-  U-  S-	  5      nXb:  a   [        SU< SU< SU< SU< S	U< S
35      eg )Nr
   1      zPIL  z x z image would use z > z bytes)_max_image_sizesizer  maxr   MemoryError)clsr  max_image_sizewhr0   r  s          r   r   ImageReader.check_pil_image_size  s    ,,!6wwGG1AsFq#a&!3A59:./!DI J J r   c                 H    Xl         Ub  SSKJn  U" U R                  5        g g )Nr   )register_reset)r  r  r  set_max_image_size)r  r  r  s      r   r  ImageReader.set_max_image_size  s$    ,%:3112 &r   c                 @    U R                   nUR                  S5        U$ r   )r  seekr  s     r   r  ImageReader._jpeg_fh  s    WW

	r   c                     g r%   r   r.   s    r   r  ImageReader.jpeg_fh  s    r   c                     U R                   b  U R                  c#  U R                  R                  u  U l         U l        U R                   U R                  4$ r%   )r  r  r  r  r.   s    r   getSizeImageReader.getSize  s@    KK4<<#7(,(8(8%DKT\\**r   c                 T    U R                   Gck  SU l        U R                  nUR                  =o l        US;   a{  [	        [
        SS5      R                  S5      (       a  UR                  5         [        UR                  5       US:X  a  SOS   5      U l        USS	 nUR                  U5      nX0l        OUS
;  a  UR                  S:X  ad  UR                  S:X  aT  SUR                  ;   aD  UR                  S5      n[        UR                  5       S   5      U l        UR                  S5      nOUR                  S5      nSU l        [        US5      (       a  UR                  OUR                  " 5       U l         U R                   $ !   [!        SU R#                  5       -  5         g= f)z'Return byte array of RGB data as stringN)LARGBAVERSIONr  z1.1.7r#  r
  r
   )LRGBCMYKr   Ptransparencyr'  tobytesz
identity=%s)r  _dataAr  r  r  r   r  loadr  r  convertr  infor  r+  tostringrM   r  )r/   r  r  nms       r   
getRGBDataImageReader.getRGBData  sO   	?zz!"[[#%77*y=(uYr2==gFF	"-bhhjdFlPQ.R"SDKcrBBB "I!33yy%'BGGSL^rww=VZZ/&1"((*Q-&@ZZ.ZZ. %DI,3B	,B,BbjjSV
::	?odmmo=>s   FF F'c                 J    U R                  5       u  pXU R                  5       4$ r%   )r  r2  )r/   widthheights      r   getImageDataImageReader.getImageData  s!    doo///r   c                     SU R                   R                  ;   aF  U R                   R                  S   S-  nU R                   R                  n UR                  nX!US-    $ g !    UR                  n N!     g = f= f)Nr*  r
  )r  r/  paletter  )r/   r*  r:  s      r   getTransparentImageReader.getTransparent  s|    T[[---;;++N;a?Lkk))G !// Q77  %llG s$   A" "A;%A33A85A;8A;)r  r  r,  r  r  r  r  r  r  r  r  r  r%   )r   r   r   r   rf  _cacher  r   r  r  classmethodr  r  r  r  r  r2  r7  r;  r"   r   r   r   r  r  f  si    +FO%ZNP J J 3 3
+
?60r   r  c                       \ rS rSrSrg)LazyImageReaderi  r   N)r   r   r   r   r"   r   r   r   r@  r@    s    r   r@  c                 v     U R                  5       $ ! [         a    [        U 5      R                  5       s $ f = f)z<Get width, height and RGB pixels from image file.  Wraps PIL)r7  r~  r  )imageFileNames    r   r7  r7    s9    9))++ 9=)66889s    #88c                       \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS r\\\\S.rS rS rS rS rS rSrg)	DebugMemoi  au  Intended as a simple report back encapsulator

Typical usages:
    
1. To record error data::
    
    dbg = DebugMemo(fn='dbgmemo.dbg',myVar=value)
    dbg.add(anotherPayload='aaaa',andagain='bbb')
    dbg.dump()

2. To show the recorded info::
    
    dbg = DebugMemo(fn='dbgmemo.dbg',mode='r')
    dbg.load()
    dbg.show()

3. To re-use recorded information::
    
    dbg = DebugMemo(fn='dbgmemo.dbg',mode='r')
        dbg.load()
    myTestFunc(dbg.payload('myVar'),dbg.payload('andagain'))

In addition to the payload variables the dump records many useful bits
of information which are also printed in the show() method.
Nc                 
   SS K nXl        U(       d  [        R                  U l        O)[	        US5      (       a  X`l        O[        US5      U l        US:w  a  g 0 =U l        n	U(       aL  [        R                  " 5       S:w  a3  SS Kn
[        5       nU
R                  S U5        UR                  5       U	S'   [        R                  " 5       n[        R                  " U5      n[        R                  R!                  U5      nU=(       a    [        R                  " U5      =(       d    Sn[        R                  R#                  [        R                  R!                  [        R$                  S   5      5      nSnS n SS KnUR)                  [*        R-                  S5      5      nUS   n[        R.                  n[1        UR3                  5       5      nUR5                  5         U	R7                  0 S	[8        R:                  " [8        R<                  " [8        R8                  " 5       5      5      _S
[        R>                  _S[        R@                  _S[C        [        RD                  5      _S[        RF                  _S[        RH                  _S[        RJ                  _S[        R                  _S[        R$                  _SU_SURM                  5       _SU_SU_S[        RN                  _S[Q        [        SS5      _S[Q        [        SS5      _S[Q        [        SS5      _[Q        [        SS5      SRS                  S/U Vs/ s H  nU< SUU   < 3PM     sn-   5      [U        [*        5      UUS .E5        [        S!4[        S"44 H7  u  nnU H+  n[	        UU5      (       d  M   [Q        UU5      " 5       U	U'   M-     M9     UU:w  a)   U	R7                  U[        R                  " U5      S#.5        U(       at  [        R                  R#                  [        R$                  S   5      n[        R                  RW                  U5      (       a    U[        US$5      RY                  5       4U	S%'   0 n[        RZ                  R]                  5        H  u  nnUS&:X  d  US':X  d  US S( S):X  d  US S* S+:X  d  M&  S, Vs/ s H  n[Q        UUS 5      PM     nnU Vs/ s H  nU(       d  M  UPM     sn(       d  Mf  US   /US-S   Vs/ s H  nU(       d  M  UPM     sn-   n[_        U5      UU'   M     UU	S.'   0 U R                  S/'   U Ra                  U5        g !    GN= fs  snf !    GM  = f!    GNz= f!    GN= fs  snf s  snf s  snf )0Nr   writer  )NNN__tracebackz???zmeta_data.marproject_versiongmtplatformversion
hexversion
executableexec_prefixprefixr  rn  r#  hostnamelcwdlpcwd	byteordermaxint
maxunicodez????api_versionversion_infowinverz
			r  rm  )rX  environmentr3  project_meta_datarH  )getwindowsversiongetfilesystemencoding)unamectermidgetgidgetuidgetegidgeteuidgetlogin	getgroupsgetpgrpgetpidgetppid)exedlexedr8  __script	reportlabrlextra
   z
reportlab.r	  zrlextra.)__version____path__rw  r
   __module_versions	__payload)1socketr   r6   stdoutr  r  storerY  	tracebackr   	print_excgetvaluer   rS  r   r  rv  rH  rn  marshalr   r3  r  environri   r4  sortr   timeasctimegmtimerJ  rK  r  rL  rM  rN  rO  gethostnamerS  r  r   rW  r   r  r  r   rh   _add) r/   r   r  	getScriptr  capture_tracebackrs  ro  rr  rt  ru  rG   r#  rQ  pcwdrR  rh  rH  mdrx  envKr   Mr   r   module_versionsr$  r0   r~   r)   _fs                                    r   r   DebugMemo.__init__  s   **DKvg&&$"6#.9f
U3C!C	AQ'#$::<E- IIKzz#wws#)D)2Uwwrwwsxx{;<	}}]33ODEB01O jj
sxxz
	 t||DKK		,DE "CLL!3;; %c#..&9 %cnn	
 &s !#**   s #F$6$6$8    $S]] !'#l6"B &ws='H  'N6(J!" #*#hv">'1t[\<][\VW#a&=Q[\<]7]'^)-m)<-/+:+ 	0 BC  CAa 1Q<<#*1Q<>a  9dRZZ5EGH !-Bww~~b!!)+DCL,=,=,?(@E*% ;;$$&CAa+~I3B1E2APZIZ0UV0U1WQq&0UV!")2bB))1qu!;u"u!;;A).qOA& ' &5!""$

;		"{	, =^ W)!;sT   8-U
 ;U U(U  U( 0U0U5U58U:U:
UU U%(U-c                 \    U R                   S   nUR                  5        H	  u  p4XBU'   M     g Nrq  )rt  r   )r/   r   payloadr   r)   s        r   r  DebugMemo._addg  s)    **[)GGIDAAJ r   c                 &    U R                  U5        g r%   )r  )r/   ro  s     r   addDebugMemo.addl  s    		"r   c                     UR                  5       n[        R                  " U R                  U5        g !   U R                  R	                  5       n[        5       nUR                  5        H-  u  pV [        R                  " XV0U5        M   !   SU-  X5'    M,  = f   UR                  WS5        [        R                  " X15         g = f)Nz<unpicklable object %r>r   )tellr   dumprt  copyr   r   r  )r/   r  posSffr   r)   s          r   _dumpDebugMemo._dumpo  s    	CKK

1%		jjooAyBwwy9KKb)94q8AD	 !
 FF3qMKKs!   14 ;C0B
C
	B0Cc                     [        U R                  S5      n U R                  U5        UR                  5         g ! UR                  5         f = f)Nwb)r  r   r  r  r/   r  s     r   r  DebugMemo.dump~  5    	JJqMGGIAGGI	   : Ac                 X    [        5       nU R                  U5        UR                  5       $ r%   )r   r  rw  r  s     r   r   DebugMemo.dumps  s     I

1zz|r   c                 :    [         R                  " U5      U l        g r%   )r   r-  rt  r  s     r   _loadDebugMemo._load  s    [[^
r   c                     [        U R                  S5      n U R                  U5        UR                  5         g ! UR                  5         f = f)Nrb)r  r   r  r  r  s     r   r-  DebugMemo.load  r  r  c                 8    U R                  [        U5      5        g r%   )r  r   )r/   rG   s     r   r   DebugMemo.loads  s    

71:r   c           
         U R                  USS  5        [        UR                  5       5      nUR                  5         U H  nX!   =pE[	        U[
        5      (       a  US   n [        U5        [        R                  U   n[        USS 5      U:H  =(       a    S=(       d    SnU R                  SU< SU< S	U< S
35        M     g !   S nSn N+= f)N   r   rn  SAME	DIFFERENTz??????unknown??????z   = z ())
_writelnri   r4  rz  r9   rh   
__import__r6   r  r  )r/   r   r)   r  vkvk0r0   r  s           r   _show_module_versionsDebugMemo._show_module_versions  s    aeN	AtOB"U##2a5S*1KKNAmD136A6P[ MMa156 *)s   #A CCc                 >    U R                  SU< SUSS  < S35        g )Nz###################r  r  z##################)r  )r/   r   whats      r   _bannerDebugMemo._banner  s    d1QR5QRr   c                 (    U R                  US5        g )NzStart  r  r   s     r   _startDebugMemo._start      Qy!r   c                 (    U R                  US5        g )NzFinish r  r   s     r   _finishDebugMemo._finish  r  r   c                 j    U R                  U5        U R                  U5        U R                  U5        g r%   )r  r  r  r   s      r   _show_linesDebugMemo._show_lines  s$    AaQr   c                 ~    U< S[         R                  R                  US   5      < 3nU R                  XS   5        g )Nr  r   r
   )r   r  basenamer  r   s      r   
_show_fileDebugMemo._show_file  s1    ))!A$/0Q4 r   c                     U(       aB  SS K nU R                  U5        UR                  X R                  5        U R                  U5        g g r   )pprintr  rs  r  )r/   r   r)   r  s       r   _show_payloadDebugMemo._show_payload  s3    KKNMM!KK(LLO	 r   c           
      p   S H  n U/R                   n[        U5        [        R                  U   nU" UR                  5        S H-  n[        X45      (       d  M  U" U< S[        X45      < 35        M/     U R                  SSR                  UR                  5      -   5        M     g !   W" S5         N>= f)N)	_rl_accel	_renderPMsgmloppyRXPpyRXPU_imagingr   )rn  r$  _versionrK  rm  z	not foundr  )
r   r  r6   r  rw  r  r  r  r   __self__)r/   mnr   r0   vns        r   _show_extensionsDebugMemo._show_extensions  s    XB	DKK2KKO!**HBq}}R67 I
 MM#chhqzz223 Y+s   AB)B))
B5)rp  rq  rG  rj  c                    [        U R                  R                  5       5      nUR                  5         U HR  nU[        U R                  R                  5       5      ;  d  M,  U R                  U<S SU R                  U   < 35        MT     U HO  nU[        U R                  R                  5       5      ;   d  M,  U R                  U   " XU R                  U   5        MQ     U R                  5         g )N15r  )ri   rt  r4  rz  specialsr  r  )r/   r  r   s      r   showDebugMemo.show  s    "#	AT]]//122DMMRSTXT^T^_`TaBb4c AD++-..a0@

ST0V r   c                 &    U R                   S   U   $ r  rt  r/   r  s     r   r  DebugMemo.payload      zz+&t,,r   c                 &    X R                   S   U'   g r  r  )r/   r  rc  s      r   r   DebugMemo.__setitem__  s    (-

;%r   c                 &    U R                   S   U   $ r  r  r  s     r   r   DebugMemo.__getitem__  r  r   c                 @    U R                   R                  US-   5        g r  )rs  rF  )r/   msgs     r   r  DebugMemo._writeln  s    #d(#r   )r   rs  rt  )zrl_dbgmemo.dbgr  r
   r   r
   N)r   r   r   r   rf  r   r  r  r  r  r   r  r-  r   r  r  r  r  r  r  r  r  r  r  r  r   r   r  r"   r   r   r   rD  rD    s    2Yv

$7 S""
!4 &;**&H
 -.-$r   rD  c                 `    U  H(  n[        U5      (       a  [        X!5        M   U" U5        M*     g r%   )r;   _flatten)r&  r   r~   s      r   r  r    s"    88Xa]d r   c                 4    / n[        XR                  5        U$ )z'recursively flatten the list or tuple L)r  r   )r&  r   s     r   flattenr    s    
AQxxHr   c                 p     U " [         R                  " U5      R                  5      nU(       a  U$ US-  nM6  )zPapply func to the locals at each stack frame till func returns a non false valuer
   )r6   r   f_locals)rd  depth_s      r   find_localsr    s3    
u%../Qh
 r   c                        \ rS rSrS rS rSrg)_FmtSelfDicti  c                     Xl         X l        g r%   )obj_overrideArgs)r/   r  overrideArgss      r   r   _FmtSelfDict.__init__  s    )r   c                      U R                   U   $ ! [         aE     U R                  R                  U   s $ ! [         a    [	        U R                  U5      s s $ f = ff = fr%   )r  r   r  r  r  r   s     r   r   _FmtSelfDict.__getitem__  sa    	+%%a(( 	++xx((++ +txx**+	+s)    
A 7A  AA AA )r  r  N)r   r   r   r   r   r   r"   r   r   r   r  r    s    *+r   r  c                       \ rS rSrSrS rSrg)FmtSelfDicti  z mixin to provide the _fmt methodc                      [        X5      nX-  $ r%   )r  )r/   fmtr  r   s       r   _fmtFmtSelfDict._fmt	  s    ,wr   r   N)r   r   r   r   rf  r  r"   r   r   r   r  r    s
    *r   r  c                 N   / nU" S5      n/ nU* nU R                  5        H[  nU" U5      nXd-   U-   U::  d  U/ :X  a  UR                  U5        Xd-   U-   nM6  UR                  SR                  U5      5        U/nUnM]     U/ :w  a   UR                  SR                  U5      5        U$ )Nr  )r  r   r   )	txtmWSWr&  wsOr  r   lts	            r   _simpleSplitr
    s    
A	CB
A	AYY[U47B;!R%HHQKAHHSXXa[!AA  	"uahhsxx{#Hr   c                    ^ SSK Jm  [        U 5      R                  S5      nX4U4S jjnU(       a(  / nU H  nUR	                  [        XsU5      5        M      UnU$ )Nr   )stringWidthr  c                    > T" XU5      $ r%   r   )textfNfSr  s      r   r,  simpleSplit.<locals>.<lambda>!  s    Db0Ir   )reportlab.pdfbase.pdfmetricsr  rU   r  extendr
  )	r  fontNamefontSizemaxWidthlinesr  r&  lr  s	           @r   simpleSplitr    sQ    8dO!!%(E!	IBAHH\!R01 Lr   c                     SSK Jn  U c  U $ [        U 5      (       a  U R                  S5      nU" U 5      n U R	                  SS5      n U R	                  SS5      n U R	                  SS	5      n U $ )
zEscapes once onlyr   )escaperB   	&amp;amp;&amp;&amp;gt;&gt;&amp;lt;&lt;)xml.sax.saxutilsr  rC   rT   r  )r  r  rG   s      r   escapeTextOncer#  )  sc    '|t}}$++f-a$<D<<X.D<<W-D<<W-DKr   c                     [        U 5      (       a  U $ [         H  n U R                  U5      s  $    [        SU -  5      e!    M,  = f)Nz(cannot convert %r to filesystem encoding)ra   fsEncodingsrT   r  )r   rP   s     r   fileName2FSEncr&  5  sJ    }}
Cyy~% 
 ?"D
EEs   A  Ac                     [         R                  " S/U S/5      n[         R                  " US5      u  p#n U" U5        U" U5        U" U5        [	        X#U5      $ ! [         a     Nf = f)a  
Loop over a collection with look-ahead and look-back.

From Thomas Guest, 
http://wordaligned.org/articles/zippy-triples-served-with-python

Seriously useful looping tool (Google "zippy triples")
lets you loop a collection and see the previous and next items,
which get set to None at the ends.

To be used in layout algorithms where one wants a peek at the
next item coming down the pipe.

Nr
  )	itertoolschainteeStopIterationzip)r   r  prevthisnexts        r   prev_this_nextr0  A  sl      __dVUTF3F }}VQ/DT
T
T
 t4    s   A 
A'&A'c                    [        U 5      (       a  U R                  S5      n [        U 5      S-
  nU S-  n SnS/nX!::  an  X   S:X  aK  XS-      S:X  a  US==   S-  ss'   US-  nO<US   R                  5       US'   X!:w  a  UR	                  S5        OUS==   X   -  ss'   US-  nX!::  a  Mn  US   R                  5       US'   U$ )a  
Splits the string s at every unescaped comma and returns the result as a list.
To escape a comma, double it. Individual items are stripped.
To avoid the ambiguity of 3 successive commas to denote a comma at the beginning
or end of an item, add a space between the item seperator and the escaped comma.

>>> commasplit(u'a,b,c') == [u'a', u'b', u'c']
True
>>> commasplit('a,, , b , c    ') == [u'a,', u'b', u'c']
True
>>> commasplit(u'a, ,,b, c') == [u'a', u',b', u'c']
rB   r
   r  r   r  r  r%  )rC   rT   r   r   r   )rG   r$  r[   r8  s       r   
commasplitr2  [  s     qzzqxx'1AqAIA	A
eA
$4:1vt|"tQ""4#bEQTME	1 $ bEKKMAbEHr   c           
          SR                  U  Vs/ s H$  nS[        U5      R                  SS5      -   S-   PM&     sn5      $ s  snf )am  
Inverse of commasplit, except that whitespace around items is not conserved.
Adds more whitespace than needed for simplicity and performance.

>>> commasplit(commajoin(['a', 'b', 'c'])) == [u'a', u'b', u'c']
True
>>> commasplit((commajoin([u'a,', u' b ', u'c'])) == [u'a,', u'b', u'c']
True
>>> commasplit((commajoin([u'a ', u',b', u'c'])) == [u'a', u',b', u'c'] 
r  r  z,,)r   rU   r  )r  r[   s     r   	commajoinr4  {  sC     99PQSPQ1til224??$FPQSTTSs   +Ac                    U=(       a    [         R                  R                  =(       d    [         R                  R                  nU" U 5      (       a  U $ [         R                  R                  n[         R                  R                  U 5      (       d"  U H  nU" X`5      nU" U5      (       d  M  Us  $    U(       a  [        SU < SU< 35      eU $ )z*search for relative files in likely placeszcannot locate z with paths=)r   r  r   r   r   r  r  )r   pathsr   failexistsr+  rJ  r/  s           r   findInPathsr9    s    &7"''--Fbzz"9GGLLE77==A+Cc{{
  :"UKLLIr   c                     [         R                  " 5       u  pEn[        XD" UR                  S U [	        U5      U4 5       5      5      U5        g)z,add msg to the args of an existing exceptionc              3   6   #    U  H  o(       d  M  Uv   M     g 7fr%   r   .0r  s     r   	<genexpr>$annotateException.<locals>.<genexpr>  s     B(<1QQ(<s   
	N)r6   rY  r   r   r>   )r  rP   postMsgr  r   r)   r   s          r   rM   rM     s<    
,,.EAq388BSVG(<BCDQGr   c                 &   U R                  SS5      n U R                  SS5      n U R                  SS5      n U R                  SS5      n U R                  SS	5      n U R                  SS5      n U R                  SS5      n U R                  SS5      n U $ )
zEnsure XML output is escaped just once, irrespective of input

>>> escapeOnce('A & B')
'A &amp; B'
>>> escapeOnce('C &amp; D')
'C &amp; D'
>>> escapeOnce('E &amp;amp; F')
'E &amp; F'

&r  r  r  r  r   r!  z&amp;#z&#)r  )r  s    r   
escapeOncerC    s     <<W%D
 <<W-D<<
F+D<<
F+D<<$'D <<W-D<<
F+D<<
F+DKr   c                       \ rS rSrSrS rSrg)IdentStri  z,useful for identifying things that get splitc                     [        U[        5      (       a-  UR                  nUS S[        [	        U5      5      -   *  nUS-  nOSnUSU-  -  n[        R                  X5      nX#l        U$ )Nr  r
   r   z[%d])r9   rE  _IdentStr__incr   r>   __new__)r  rc  incr/   s       r   rH  IdentStr.__new__  sh    eH%%++C-Qs3s8}_-.E1HCC#{{3%
r   )__incNr   r   r   r   rf  rH  r"   r   r   r   rE  rE    s
    6
r   rE  c                       \ rS rSrSrS rSrg)RLStringi  zallows specification of extra properties of a string using a dictionary of extra attributes
eg fontName = RLString('proxima-nova-bold',
                svgAttrs=dict(family='"proxima-nova"',weight='bold'))
c                 z    [         R                  X5      nUR                  5        H  u  pA[        X4U5        M     U$ r%   )r>   rH  r   r   )r  r)   r   r/   r   s        r   rH  RLString.__new__  s1    {{3!::<CAD1  r   r   NrL  r   r   r   rN  rN    s    r   rN  c                 H    [        U 5      (       d  U R                  S5      n U $ )zEforce filename strings to unicode so python can handle encoding stuffrB   )ra   rT   rF   s    r   makeFileNamerR    s    Q<<HHVHr   c                   0    \ rS rSrSrS rS rS rS rSr	g)	FixedOffsetTZi  z&Fixed offset in minutes east from UTC.c                 B    [         R                  " XS9U l        X0l        g )N)hoursminutes)datetime	timedelta_FixedOffsetTZ__offset_FixedOffsetTZ__name)r/   r  r0   r  s       r   r   FixedOffsetTZ.__init__  s     **@r   c                     U R                   $ r%   )rZ  r/   dts     r   	utcoffsetFixedOffsetTZ.utcoffset  s    }}r   c                     U R                   $ r%   )r[  r^  s     r   tznameFixedOffsetTZ.tzname  s    {{r   c                 .    [         R                  " S5      $ r   )rX  rY  r^  s     r   dstFixedOffsetTZ.dst  s    !!!$$r   )__name__offsetN)
r   r   r   r   rf  r   r`  rc  rf  r"   r   r   r   rT  rT    s    0%r   rT  c                   >    \ rS rSrSS jr\S 5       r\S 5       rSrg)	TimeStampi  Nc                 0   Uc  SSK Jn  [        R                  R	                  SS5      R                  5       nU(       d  U(       a5  U(       a  [        U5      OSn[        R                  " U5      nS=pESU l	        Oq[        R                  " 5       n[        R                  " U5      n[        U5      n[        UR                  S-  5      nUR                  S-  S	-  nUR                  U l	        X l        X0l        [        U5      S S
 U l        X@l        XPl        g )Nr   )	invariantSOURCE_DATE_EPOCHr  g   6AUTCg      @i  <   r  )r  rm  r   ry  r   r   rg   r{  r}  rc  	localtimerh   	tm_gmtofftm_zoner   r	  YMDhmsdhhdmm)r/   rm  r   r	  ru  rv  
local_times          r   r   TimeStamp.__init__  s    5JJNN.r288:AAQBMCDK		A*Jz"Bj**f56C''$."4C$,,DKBimr   c                    U R                   (       aS  [        R                  R                  U R                  [	        U R
                  U R                  U R                   5      5      $ [        R                  R                  5       $ r%   )rc  rX  fromtimestampr   rT  ru  rv  nowr.   s    r   rX  TimeStamp.datetime  sV    ;;$$22466-QUQYQYZ^ZeZe:fgg$$((**r   c                 B    [         R                  " U R                  5      $ r%   )r{  r|  r	  r.   s    r   r|  TimeStamp.asctime  s    ||DGG$$r   )rt  ru  rv  r	  r   rc  r%   )	r   r   r   r   r   propertyrX  r|  r"   r   r   r   rk  rk    s/    , + + % %r   rk  c                 &   [        U5      (       d  [        S[        U 5      < SU< 35      e[        U5      nUR	                  5       nU(       d  [        S[        U 5      -  5      eU(       a  US   S;  a  SOSn[        SU< U< 30 [        U S9S	9$ )
z/Can call down into e.g. object1.object2[4].attrzinvalid recursive access of rO  zempty recursive access of %sr   z[.(r  r  )r  )gr  )r^   ri  rW  rY   r   r  r   rj   )r  r  r  dots       r   recursiveGetAttrr    sw    ;;itTWyY](^__D>D::<Dz"@49"LMM$q'.#BC3t,dsmDDr   c                     UR                  S5      n[        U5      S:X  a  [        XU5        gSR                  USS 5      nUS   n[	        X5      n[        XeU5        g)z7Can call down into e.g. object1.object2[4].attr = valuerO  r
   Nr%  )r  r   r   r   r  )r  r  rc  tokensmostlastparents          r   recursiveSetAttrr    sX     ZZ_F
6{a5!xxs$bz!#,e$r   c                     UR                  S5      n[        U5      S:X  a  [        X5        g SR                  US S 5      nUS   n[	        X5      n[        XT5        g )NrO  r
   r%  )r  r   delattrr   r  )r  r  r  r  r  r  s         r   recursiveDelAttrr    sR    ZZ_F
6{axxs$bz!#,r   c              #      #    Sn[        U 5      nX:  a/   U R                  SU5      nXU v   US-   nU (       d  g X:  a  M.  gg! [         a	    XS v    gf = f7f)z:yield sublists of L separated by None; the Nones disappearr   Nr
   )r   indexr  )r&  r[   r$  js       r   yieldNoneSplitsr  %  sh     	AAA
#	QAa&L!Ae1 #  	B%K	s-   A$A AAAAAAc                 P    SR                  S U R                  S5       5       5      $ )Nr  c              3   @   #    U  H  oR                  5       v   M     g 7fr%   )lstripr<  s     r   r>  _rl_docdent.<locals>.<genexpr>4  s     8-Qhhjj-s   )r   r  rF   s    r   _rl_docdentr  3  s    998!''$-899r   c                   :    \ rS rSrS	S jrS rS rS rS
S jrSr	g)
KlassStorei6  c                     Xl         0 U l        g r%   limrt  )r/   r  s     r   r   KlassStore.__init__7  s    
r   c                 ~   [        U[        5      (       a  [        U[        5      (       d9  [        U R                  R
                   S[        U5      [        U5      4 S35      eU R                  nX#U'   [        U5      U R                  :  a1  [        UR                  5       5      S U R                  *   H  nX4	 M     g g )Nz%.add takes (str,type) arguments not (r  )r9   r>   r&   r  r|  r   rt  r   r  ri   r4  )r/   r   r)   rt  r  s        r   r  KlassStore.add;  s    1S!!j4&8&8 7 788]^bcd^efjklfm^m]nnopqq

au:txx%**,'
$((3H 4  r   c                     XR                   ;   $ r%   r  r   s     r   r   KlassStore.__contains__D  s    JJr   c                      U R                   U   $ r%   r  r   s     r   r   KlassStore.__getitem__G  s    zz!}r   Nc                 8    U R                   R                  X5      $ r%   )rt  r   )r/   r   defaults      r   r   KlassStore.getJ  s    zz~~a((r   r  )r  r%   )
r   r   r   r   r   r  r   r   r   r"   r   r   r   r  r  6  s    )r   r  )rB   r%   )z.ttf)NNr  )NN)Nr   r   r  )r   )r   )TF)rB   r  r  )rn  rf  r   r   r6   r{  ro   rX  rU  astr   r  r   r   r   r   ior   hashlibr   reportlab.lib.rltempfiler   r	   r   r   r   r   PILr   r   rJ  python_implementationisPyPyr'   r+   r&   r0   r4   r7   rh   ri   r;   r?   rn   r>   rL   strTypesrH   rQ   rU   rW   rY   r\   r^   rC   ra   rd   r   r   r   r   r   r   r   r   r  rl_execr   r   r   r   r   rj   r   r  r  r	  r  r  rk  r  rv  rw  __RL_DIRr  rH  r7  rn  r6  r0  r   r3  r?  NotImplementedErrorrG  rI  archiver  r  r  r  r  r   r  r  rS  r%  r(  r   r9  r   splitextrD  r@  rB  rE  rK  rT  r_  
haveImagesra  rr  rz  r  r  urllib.parser  r  urllib.requestr  r  r  r  r  r  r   r  r   r  getmtimemktimer  r  r  r  r  r  r  r@  r7  rD  r  r  r  r  r  r
  r  r#  r&  r(  r0  r2  r4  r9  rM   rC  rE  rN  rR  tzinforT  rk  r  r  r  r  r  r  r   r   r   <module>r     s   D 8 8 8 8  W   D ^ ^   K	++-v5F'  qss)   t  $Z;BPRT & P""KD>: 
(6
"\
6.T 6.p 77e 
N 
 	++	,
h,HI0I 1MF=)!"G-"WXXww 0 01F1F GHHRVV#K''//(+K 266)N%NN+ +#1% +%'WW%5%5%'WW%5%5 ii66!$RVV(.& "YYwVXV]V]VbVb  	'

IRWW^^BGG$4$4X$>q$A5$HIB  'y1D\R ,=\ $
 *X + " 8$t0 !# 3 !ggmmRWW=M=M c !#rww?O?O[][e[e R #%''.."''BRBRdfdkdkdtdt  BF  BM  BM 	j -0&*@ @D	k 	9t$ t$l
+ + "	
	F !4@UH
6s 	s 	%HOO %  %  %DE
%:) )q(F^xx{HZWW^^H%FM!YY s%   'U U D4U. UU+.2V#