
    MZdO=                     N   d dl mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZm Z  d dl!m"Z"m#Z#m$Z$m%Z% d dl&m'Z'm(Z(m)Z)  e#d	d
      \  Z*Z+Z,Z-Z.Z/Z0 ede/e/      Z1 ede/e/      Z2 ede/e/      Z3 ede/e/      Z4 ede/e/      Z5 ede/e/      Z6 e
e5e6gg      Z7 e
e5ge6gg      Z8d Z9d Z:d Z;d Z<d Z=d Z>d Z?d Z@d ZAd ZBd ZCd ZDd ZEd ZFed         ZGd! ZHd" ZId# ZJd$ ZKd% ZLd& ZMd' ZNd( ZOd) ZPd* ZQd+ ZRd, ZSd- ZTd. ZUy/)0    )Trace)raisesslow)block_collapse	bc_matmulbc_block_plus_identBlockDiagMatrixBlockMatrixbc_dist	bc_mataddbc_transpose
bc_inverseblockcutreblock_2x2deblock)MatrixSymbolIdentityInversetrace	Transposedet
ZeroMatrix	OneMatrix)NonInvertibleMatrixError)MatrixImmutableMatrixImmutableSparseMatrix)TuplesymbolsExprS)	transposeimrezi:n, pT)integerABCDGHc                      t        t        t        z  t        z  t        z        t        t        t        z  t        z  t        t        z  t        z  z   t        z  gg      k(  sJ y N)r   r+   b1b2r*   r
        S/usr/lib/python3/dist-packages/sympy/matrices/expressions/tests/test_blockmatrix.pytest_bc_matmulr3      sE    QrT"WQY;!A#a%!A#a%-1B0C/D#EEEEr1   c                      t        t        t        t        gg      t        t        t        gg      z         t        t        t        z   t        t        z   gg      k(  sJ y r-   )r   r
   r*   r+   r0   r1   r2   test_bc_mataddr5      sJ    [1a&*[1a&-BBC!A#qs%& & &r1   c            	         t        t        t        t        t        gt
        t        gg                  t        t        j                  t
        j                  gt        j                  t        j                  gg      k(  sJ y r-   )r   r   r
   r&   r'   r(   r)   Tr0   r1   r2   test_bc_transposer8       sU    	+1v1v.>"?@A!##qssacc133Z012 2 2r1   c                     t        dt        t              } t        dt        t              }t        dt        t              }t	        | ||      }t        ||z         j                  t	        d| z  d|z  d|z              sJ y )Nr&   r'   r(      )r   nmlr	   r   equals)r&   r'   r(   Xs       r2   test_bc_dist_diagr@   $   sk    S!QAS!QAS!QA1a A1Q3<qsAaC1=>>>r1   c                     t        dt        t              } t        dt        t              }t        dt        t              }t        dt        t              }t        | |g||gg      }t        dt        t        z   t        t        z         }t	        |t        t        t        z         z   |z         t        t        t              t        t                    |z   |z   k(  sJ y )Nr&   r'   r(   r)   Z)r   r;   r<   r
   r   r   r	   )r&   r'   r(   r)   r?   rB   s         r2   test_block_plus_identrC   ,   s    S!QAS!QAS!QAS!QAaVaV$%AS!a%Q'Aq8AE?2Q67HQK!59A=> > >r1   c                     t        dt        t              } t        dt        t              }t        dt        t              }t        dt        t              }t        dt        t        z   t
              }t        dt        t        z   t        t        z         }t        t        | |g||gg            } |j                  |j                   |k(  sJ t        dt        t              }t        | d|z  z         | d|z  z   k(  sJ t        d	t        t              }t        |j                  | z  |z        |j                  | z  |z  k(  sJ |j                  t        t        z   t        t        z   fk(  sJ |j                  d
k(  sJ t        |      t        t        | j                  |j                  g|j                  |j                  gg            k(  sJ t        |      j                  |j                  d d d   k(  sJ ||z  j                  sJ |j!                  |      j                  sJ ||z  j                  t        t        z   t
        fk(  sJ ||z   j"                  sJ |j%                  |      j"                  sJ ||z   j                  |j                  k(  sJ t        dt        d      }t        d	t        d      }t        t        |g|gg            }	||	z  j                  t        t        z   dfk(  sJ t        ||	z        j&                  d   | |z  ||z  z   k(  sJ t        ||	z        j&                  d   ||z  ||z  z   k(  sJ t        t        ||	z              t        t        ||	z              k(  sJ t        t)        ||	z  d|z              t        ||	z        t        d|z        fk(  sJ t        | gg      }
t        dg| j                   }t        |
|z         | |z   k(  sJ y )Nr&   r'   r(   r)   MNEr:   Fr:   r:      )r   r   )rK   r   rB   )r   r;   r<   kr=   pr
   r   	__class__argsr   r7   shape
blockshaper"   	is_MatMul	_blockmul	is_MatAdd	_blockaddblocksr   )r&   r'   r(   r)   rE   rF   r?   rG   rH   YAbrB   s               r2   test_BlockMatrixrY   6   sv   S!QAS!QAS!QAS!QAS!a%#AS!a%Q'AFQFQF+,-A1;;1$$$ 	S!QA!ac'"a!A#g---S!QA!##a%'"acc!eAg---77q1ua!en$$$<<6!!!Q<;vQSSzACC:.F'GHHHHQ<2... aC???;;q>####aC;;1q5!*$$$E;;q>####E==AGG###S!QAS!QAFQC!:&'AaC;;1q5!*$$$!A#%%d+qsQqSy888!A#%%d+qsQqSy888 )AaC.)Y~ac7J-KKKK%!QqS/*qs^AaC0/2 2 2 2 
qcU	BS#177#A"q&!QU***r1   c                      t        ddgddgg      } t        t        | gg            | k(  sJ t        ddgddgg      } t        t        | gg            | k(  sJ y NrK   r:         )r   r   r
   r   r&   s    r2   %test_block_collapse_explicit_matricesr_   g   sh    AA A+se,-2221v1v./A+se,-222r1   c                      t        ddd      } t        dd      }t        | |g||gg      }t        ||z        t        | dz  |g||gg      k(  sJ t        ||z  |z        t        | dz  |g||gg      k(  sJ y )Nar:   r\   )r   r   r
   r   )ra   zbs      r2   test_issue_17624rd   n   s    S!QA1aAaVaV$%A!a% K!Q$QF0C$DDDD!a%!)$adAYA4G(HHHHr1   c                  ^    t        g dg dg dg      } | t        t        |             k(  sJ y )N)rK   r:   r\   )r]         )      	   )r   r	   r^   s    r2   test_issue_18618rk   u   s+    	9i01Aq)****r1   c                     dD  cg c]  } t        | dd       c} \  }}}}t        ||g||gg      }t        |      t        |      t        |      z   k(  sJ t        t        t        t        t              g            dk(  sJ y c c} w )NABCDr\   r   )r   r
   r   r   r;   )sr&   r'   r(   r)   r?   s         r2   test_BlockMatrix_tracero   y   s    178A,q!Q'8JAq!QaVaV$%A8uQx%(****jA./01Q666 9s   Bc                     dD  cg c]  } t        | dd       c} \  }}}}t        ||g||gg      }ddlm} ddlm}  ||j                  |            5  t        |      t        |      t        |j                  d            z  k(  sJ 	 d d d        t        t        |      t              sJ t        t        |g            t        |      k(  sJ t        t        t        t        t              g            dk(  sJ y c c} w # 1 sw Y   yxY w)Nrm   r\   r   )Q)assumingr&   )r   r
   sympy.assumptions.askrq   sympy.assumptions.assumerr   
invertibler   schur
isinstancer    r   r;   )rn   r&   r'   r(   r)   r?   rq   rr   s           r2   test_BlockMatrix_Determinantrx      s    178A,q!Q'8JAq!QaVaV$%A'1	!,,q/	" 41vQ#aggcl"333334 c!fd###{A3 CF***{Jq!,-./1444 94 4s   C>5DDc            	      x   t        dt        t              } t        dt        t              }t        dt        t              }t        dt        t              }t        | |g||gg      }t        | gg      }|j                  sJ |t        t        t        z         z   }t        |      t        | t        t              z   |g||t        t              z   gg      k(  sJ |t        dt        t        z   t        t        z         z   j                  sJ |t        dt        t        z   t        t        z         z  j                  sJ t        |j                        | j                  k(  sJ t        |j                         t              sJ |j                  rJ t        t        t              |g||gg      }|j                  rJ y )Nr&   r'   r(   r)   rq   )r   r;   r<   r
   	is_squarer   r   rT   rR   Irw   inverser   is_Identity)r&   r'   r(   r)   r?   rW   rq   rB   s           r2   test_squareBlockMatrixr~      ss   S!QAS!QAS!QAS!QAaVaV$%AaSEA;;;	HQUOA1a(1+oq)Aq8A;+?@AB C B S!a%Q//::::S!a%Q//::::!##!##%%%aiik7+++}}hqk1%1v./A}}}r1   c            
         t        dt        t              } t        dt        t        t        z
        }t        dt        t        z
  t              }t        dt        t        z
  t        t        z
        }t	        | |g||gg      }|j
                  r|j                  t        t        fk(  sJ t        t        |j                        t              sJ t        dt        t              } t        dt        t              }t        dt        t              }t        t        t              }t	        | |g||gg      }t        |j                               t	        | j                  | j                  |z  |j                  d      j                  z  |z  | j                  z  z   | j                   |z  |j                  d      j                  z  g|j                  d      j                   |z  | j                  z  |j                  d      j                  gg      k(  sJ t        dt        t              } t        dt        t              }t        t        t              }t        dt        t              }t	        | |g||gg      }t        |j                               t	        |j                  d      j                   |z  |j                  z  |j                  d      j                  g|j                  |j                  | z  |j                  d      j                  z  |z  |j                  z  z   |j                   | z  |j                  d      j                  z  gg      k(  sJ t        dt        t              } t        t        t              }t        dt        t              }t        dt        t              }t	        | |g||gg      }t        |j                               t	        |j                   |z  |j                  d      j                  z  |j                  |j                  |z  |j                  d      j                  z  | z  |j                  z  z   g|j                  d      j                  |j                  d      j                   | z  |j                  z  gg      k(  sJ t        t        t              } t        dt        t              }t        dt        t              }t        dt        t              }t	        | |g||gg      }t        |j                               t	        |j                  d      j                  |j                  d      j                   |z  |j                  z  g|j                   |z  |j                  d      j                  z  |j                  |j                  |z  |j                  d      j                  z  |z  |j                  z  z   gg      k(  sJ y Nr&   r'   r(   r)   )r   r;   r<   rL   r
   rz   rP   rw   r   r{   r   r   r|   rv   )r&   r'   r(   r)   r?   s        r2   %test_BlockMatrix_2x2_inverse_symbolicr      s   S!QAS!QU#AS!a%#AS!a%Q'AaVaV$%A;;177q!f,,,nQSS)7333 	S!QAS!QAS!QA1aAaVaV$%A!))+&+	
qssQw'!+acc1	1ACC4!8aggclnn3LM
''#,..1	qss	"AGGCLNN37 +    	S!QAS!QA1aAS!QAaVaV$%A!))+&+
''#,..1	qss	"AGGCLNN3	
qssQw'!+acc1	1ACC4!8aggclnn3LM7 +    	S!QA1aAS!QAS!QAaVaV$%A!))+&+
##AGGCLNN	"ACC!##'AGGCLNN*BQ*F*L$LM	
!''#,..1,qss237 +    	1aAS!QAS!QAS!QAaVaV$%A!))+&+	
!''#,..1,qss23
##AGGCLNN	"ACC!##'AGGCLNN*BQ*F*L$LM7 +   r1   c                  f   t        ddgddgg      } t        ddgddgg      }t        ddgddgg      }t        ddgddgg      }|j                         |j                         cxk(  r|j                         cxk(  rdk(  sJ  J ||z   j                         ||z   j                         cxk(  r||z   j                         cxk(  rdk(  sJ  J t        | |g||gg      }t        |j	                               j                         |j                         j	                         k(  sJ t        || g||gg      }t        |j	                               j                         |j                         j	                         k(  sJ t        ||g| |gg      }t        |j	                               j                         |j                         j	                         k(  sJ t        ||g|| gg      }t        |j	                               j                         |j                         j	                         k(  sJ y)z>Test 2x2 block matrix inversion numerically for all 4 formulasrK   r:   r\   r]   rj      N)r   rankr
   r   invas_explicit)rE   D1D2D3Ks        r2   $test_BlockMatrix_2x2_inverse_numericr      s   AA A	!Q!Q 	!B	!Q!Q 	!B	!Q!R!	"B779	3RWWY3!33333G>>R~~/HBG>>3CHqHHHHH 	aWr2h'(A!%%'"..0AMMO4G4G4IIIIb!Wr2h'(A!%%'"..0AMMO4G4G4IIIIb"X2w'(A!%%'"..0AMMO4G4G4IIIIb"XAw'(A!%%'"..0AMMO4G4G4IIIIr1   c                     t         t        t        f} t        t        t         f}t        | D cg c]"  }|D cg c]  }t	        d||||       c}$ c}}      }t        |j                        }t        |t              sJ y c c}w c c}}w )NrE   )r;   r<   rL   r
   r   r   r{   rw   )rowblocksizescolblocksizesrowscolsr   collapses         r2   test_BlockMatrix_3x3_symbolicr      s     1IM1IM! GTTdt,dD	9T 	A acc"Hh,,,	 	Us   	B	
BB	
B	
c                  0   t        dt        t              t        dt        t              t        dt        t              t        dt        t        z   t        z   t        t        z   t        z         } t	              t	        dz  dz        }j
                  d   k(  sJ j                  t        t        z   t        z   t        t        z   t        z   fk(  sJ t        fdt        d      D              sJ  j                  j                   k(  sJ j                         fk(  sJ t        t        j                  z        t              sJ t!        z        t	        z  z  z        k(  sJ t        z        t	        z  z  z        k(  sJ t        z         j#                  t	        dz  dz  dz              sJ t        |z        t	        z  dz  z  dz  z        k(  sJ t        |z         t	        dz  dz  d	z        k(  sJ d| z  z  j$                  sJ d| z  z   j&                  sJ j)                  |       j$                  sJ j+                  |       j&                  sJ y )
Nr&   r'   r(   rE   r:   r\   )rK   rK   c              3      K   | ]J  }t        d       D ]:  }||k7  rj                  ||f   j                  nj                  ||f   fv  < L yw)r\   N)rangerV   is_ZeroMatrix).0ijr&   r'   r(   r?   s      r2   	<genexpr>z'test_BlockDiagMatrix.<locals>.<genexpr>  se      1uQx1"# 01Avqxx1~++188AqD>aQRTUY;VV 1V 1s   AAr]   )r   r;   r<   r=   r	   rV   rP   allr   rN   rO   get_diag_blocksrw   r   r{   r   r   r>   rR   rT   rS   rU   )rE   rW   r&   r'   r(   r?   s     @@@@r2   test_BlockDiagMatrixr     sm   S!QAS!QAS!QAS!a%!)QUQY/A1a A1Q3!$A88D>Q77q1uqy!a%!),,,, 11X1 1 1 11;;1$$$1a)+++nQSS1W-x888QqS>_QqS!A#qs;;;;!A#/!A#qsAaC"@@@@!a% ''!QqS!A#(FGGG!A#/!A#qs1uac!e"DDDD!a% OAaC1ac$BBBB qsG1I    KKN%%%%KKN%%%%r1   c                     t        dt        t              t        dt        t              } t        |       }|j                  t        t        z   t        t        z   fk(  sJ |j                  t        t        z   t        t        z   fk(  sJ |j                  t        t        gk(  sJ |j                  t        t        gk(  sJ t        dt        t              t        dt        t              }t        |      }t        ||z         t        z   | |z         k(  sJ t        ||j                  z        t        j                  z  | |j                  z        k(  sJ t        t        fd       y )Nr&   r'   r(   r)   c                  L    t         j                        j                         S r-   )r	   r7   r|   )r&   r(   s   r2   <lambda>z0test_BlockDiagMatrix_nonsquare.<locals>.<lambda>.  s    _Q-D-L-L-N r1   )r   r;   r<   rL   r=   r	   rP   r   r   r   r7   r   r   )r'   r?   r)   rW   r&   r(   s       @@r2   test_BlockDiagMatrix_nonsquarer   !  s   S!QAS!QA1A77q1ua!en$$$77q1ua!en$$$??q!f$$$??q!f$$$S!QAS!QA1A!a% OAE1q5$AAAA!acc'"oa!##gq133w&GGGG
#%NOr1   c                     t        dt        t              } t        dt        t              }t        t	                     dk(  sJ t        t	        |             t        |       k(  sJ t        t	        | |            t        |       t        |      z  k(  sJ t        dt        t              }t        dt        t              }t        t	        ||            dk(  sJ y )Nr&   r'   rK   r(   r)   r   )r   r;   r<   r   r	   r&   r'   r(   r)   s       r2    test_BlockDiagMatrix_determinantr   0  s    S!QAS!QA !Q&&&q!"c!f,,,q!$%Q#a&888 	S!QAS!QAq!$%***r1   c                     t        t                     dk(  sJ t        t        t        t        t                          dk(  sJ t	        dt        t              } t        t        |             t        |       k(  sJ t	        dt
        t
              }t        t        | |            t        |       t        |      z   k(  sJ t	        dt
        t              }t	        dt        t
              }t        t        t        ||            t              sJ y )Nr   r&   r'   r(   r)   )r   r	   r   r;   r   r<   rw   r   r   s       r2   test_BlockDiagMatrix_tracer   <  s    "#q(((Aq!123q888S!QA#$a000S!QAA&'58eAh+>>>> 	S!QAS!QAeOAq12E:::r1   c                  `   t        dt        t              } t        dt        t              }t        t                     t               k(  sJ t        t        |             t        | j                        k(  sJ t        t        | |            t        | j                  |j                        k(  sJ y )Nr&   r'   )r   r;   r<   rL   r=   r"   r	   r7   )r&   r'   s     r2   test_BlockDiagMatrix_transposer   I  s    S!QAS!QA_&'?+<<<<_Q'(OACC,@@@@_Q*+qssACC/HHHHr1   c                  2   t        t        t        g      t        t        g            } t        t        t        g      t        t
        g            }t        | |z         t        t        t        t        z   g      t        t        t
        z   g            k(  sJ y r-   )r	   r   r   r   rL   r=   r   )bdm1bdm2s     r2   test_issue_2460r   P  sh    61#;s4D61#;s4D$+&/&!a%/6STWXSXRY?*[[[[r1   c            	      >   t        dt        t              } t        | t        dz  t        dz  ft        dz  t        dz  f      }|t	        | d t        dz  d t        dz  f   | d t        dz  t        dz  d f   g| t        dz  d d t        dz  f   | t        dz  d t        dz  d f   gg      k(  sJ t        ddt        d            }t        |dd      }|t        |      k(  sJ t        |dd      }t        |j                  d         t        ddgg      k(  sJ y )	Nr&   r:   r]   r   rI   )rK   r\   )r   rK   r\   )r   r;   r<   r   r
   r   r   rV   )r&   r'   rE   s      r2   test_blockcutr   U  s$   S!QAQqS!A#J1ac
+Aa1dqsd
mQt!tQqSTz];!dqsd
mQqstQqSTz];= > > > > 	1eBi(AFF#A""""FF#A188D>*o1vh.GGGGr1   c                     t        t        d      D  cg c]+  } t        d      D cg c]  }t        d| |fz  dd       c}- c}}       }|j                  j                  dk(  sJ t        |      }|j                  j                  dk(  sJ |j                  |j                  k(  sJ |j                         |j                         k(  sJ y c c}w c c}} w )Nr\   A_%d%dr:   )r\   r\   rI   )r
   r   r   rV   rP   r   r   )r   r   r'   BBs       r2   test_reblock_2x2r   b  s    %*1X/ ! &+1X/ ! #8QqE>1a8 / / 	0A 88>>V###	QB99??f$$$77bhh==?bnn..../ /s   C
CC
C
c                      t        t        d      D  cg c]3  } t        d      D cg c]  }t        d| |fz  t        t               c}5 c}}       }t	        t        |            |k(  sJ y c c}w c c}} w )Nr]   r   )r
   r   r   r;   r   r   )r   r   r'   s      r2   test_deblockr   n  sq    "1X' #1X' #8QqE>1a8 ' ' 	(A ;q>"a'''	' 's   A3
!A.A3
.A3
c                  <   t        t        dg      t        dg            } t        t        dg      t        dg            }| j                  j                  t         k(  sJ t	        | |z
        j                  t         k(  sJ t	        t        |             j                  t         k(  sJ t	        t        |             j                  t         k(  sJ t        t        |             j                  t         k(  sJ t        t        |             j                  t         k(  sJ y r[   )	r	   r   r7   rN   r   r   r   r   r   )bm1bm2s     r2   test_block_collapse_typer   u  s    
/1#.0D
EC
/1#.0D
EC55??o---#)$../AAA'#,'11_DDD)C.)33FFF	#'11_DDDgcl#--@@@r1   c                      t        t        d        t        t        d        t        t        d        t        t        d        y )Nc                  B    t        t        d      t        d      gg      S )Nr:   rf   )r
   r   r0   r1   r2   r   z+test_invalid_block_matrix.<locals>.<lambda>  s     {	!hqk",   r1   c                  R    t        t        t              t        t              gg      S r-   )r
   r   r;   r<   r0   r1   r2   r   z+test_invalid_block_matrix.<locals>.<lambda>  s     {	!hqk",   r1   c            	          t        t        t        t              t        t        t              gt        t        t        dz
        t        t        t        dz         gg      S NrK   r
   r   r;   r0   r1   r2   r   z+test_invalid_block_matrix.<locals>.<lambda>  sD    {	Aq	:a+,	Aq1u	z!QU34,   r1   c                      t        t        t        dz
  t              t        t        t              gt        t        dz   t              t        t        t              gg      S r   r   r0   r1   r2   r   z+test_invalid_block_matrix.<locals>.<lambda>  sD    {	AE1	z!Q/0	AE1	z!Q/0,   r1   )r   
ValueErrorr0   r1   r2   test_invalid_block_matrixr     sD    
:   :   :   :  r1   c                     t        dt        t              } t        dt        t              }t        dt        t              }t        dt        t              }t        | |g||gg      }|j	                         \  }}}t        ||z  |z        |k(  sJ |j                         \  }}}t        ||z  |z        |k(  sJ |j                         \  }}t        ||z        |k(  sJ y r   )r   r;   r<   r
   LDUdecompositionr   UDLdecompositionLUdecomposition)r&   r'   r(   r)   r?   LUs          r2   test_block_lu_decompositionr     s    S!QAS!QAS!QAS!QAaVaV$%A   "GAq!!A#a% A%%%   "GAq!!A#a% A%%% DAq!A#!###r1   c            	          d} t        |       }t        | |       }t        ||||g||||g||||g||||gg      }t        |j	                               }t        ||||g||||g||||g| |||gg      }||k(  sJ y )N
   )r   r   r
   r   r   )r;   r{   Or&   AinvAinvTs         r2   test_issue_21866r     s    	A	!A	Aq	A	QQ(QQ(QQ(QQ(* 
+A !%%'"DAA+QQ(QQ(a!a)+ ,E 5==r1   c            	      x   t        d      } t        dd      }t        dd      }t        d      }t        | |g||gg      }t        | t        j
                  |z  g||gg      }|j                         t        | t        dd      gt        dd      |gg      k(  sJ t        |      |k(  sJ |j                         t        | t        dd      gt        j
                   t        dd      z  |gg      k(  sJ t        |      t        t        dd      t        dd      gt        dd      t        dd      gg      k(  sJ y )Nr\   r:   )	r   r   r   r
   r!   ImaginaryUnitadjointr$   r#   )r&   r'   r(   r)   r?   X2s         r2   !test_adjoint_and_special_matricesr     s5   A!QA1aAAaVaV$%A	q!//!+,q!f5	6B99;+:a+;'<yAPQ>R&STTTTa5A::::<;Jq!,<(=@PQZ[\^_Q`@`bc?d'effffb6[:a#3Yq!_"E
STVWHXZdefhiZjGk!lmmmmr1   N)V sympy.matrices.expressions.tracer   sympy.testing.pytestr   r   &sympy.matrices.expressions.blockmatrixr   r   r   r	   r
   r   r   r   r   r   r   r   sympy.matrices.expressionsr   r   r   r   r   r   r   r   sympy.matrices.commonr   sympy.matricesr   r   r   
sympy.corer   r   r    r!   sympy.functionsr"   r#   r$   r   r   rL   r=   r<   r;   rM   r&   r'   r(   r)   r*   r+   r.   r/   r3   r5   r8   r@   rC   rY   r_   rd   rk   ro   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   r1   r2   <module>r      s   2 -$ $ $ $? ? ? :4 4 . . - -h5 1aAq!aaaaaa1a&1#sF&2?>/+b3I+7
563lJ0 	- 	-&@P
+;I\
H
/(	A $& 
nr1   