
    5\h                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ 	 d dlZn# e$ r dZY nw xY w eej                  Zd
 Zd Zd Z G d dej                  Z G d dej        ej                  Z G d dej                  Ze dk    r ej!                     dS dS )    N)partial)realpathabspathdirnamebasenameALLOW_MISSING)support)test_genericpath)import_helper)	os_helper)FakePath)mockc                 b    dt           v }d}|  t          j        |          |           g|         S )z
    On Windows, posixpath.abspath still returns paths with backslashes
    instead of posix forward slashes. If this is the case, several tests
    fail, so skip them.
    \z'ABSTFN is not a posix path - tests fail)ABSTFNunittestskip)testfound_backslashmsgs      =/opt/python-3.11.14/usr/lib/python3.11/test/test_posixpath.py!skip_if_ABSTFN_contains_backslashr      s7     fnO
3C$(-$$T**+O<<    c                 R    	 t          j        |            d S # t          $ r Y d S w xY wN)osrmdirOSError)r   s    r   
safe_rmdirr   #   s?    
   s    
&&c                        fd}|S )a{  Simplistic decorator to parametrize a test

    Runs the decorated test multiple times in subTest, with a value from
    'parameters' passed as an extra positional argument.
    Does *not* call doCleanups() after each run.

    Not for general use. Intended to avoid indenting for easier backports.

    See https://discuss.python.org/t/91827 for discussing generalizations.
    c                       fd}|S )Nc                     D ]=}|                      |          5   | g||R i | d d d            n# 1 swxY w Y   >d S r   )subTest)selfargskwargs	parameterfunc
parameterss       r   _parameterizedzE_parameterize.<locals>._parametrize_decorator.<locals>._parameterized5   s    ' ; ;	\\),, ; ;D::i:::6:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; ;s   6:	:	 )r(   r*   r)   s   ` r   _parametrize_decoratorz-_parameterize.<locals>._parametrize_decorator4   s*    	; 	; 	; 	; 	; 	; r   r+   )r)   r,   s   ` r   _parameterizer-   )   s$         "!r   c            	          e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zej        d             Z ej        edu d          d             Z ej        edu d          d             Zd Zd Z ej        ej        dk    d          d             Zg dZd Ze ei ddide i          d                         Z!e ei ddide i          d                         Z"ej        e ei de i          d                                     Z#ej        ed                         Z$d Z%ej        e ei de i          d                                      Z&ej        e ei de i          d!                                     Z'ej        ed"                         Z(ej        e eddide i          d#                                     Z)ej        e ei ddide i          d$                                     Z*ej        e ei ddide i          d%                                     Z+ej        e ei de i          d&                                     Z,ej        e ei ddide i          d'                                     Z-ej        e ei ddide i          d(                                     Z.ej        e ej        e/j0        e/j1        vd)           ej        ej        d*k    d+           eddide i          d,                                                             Z2eej        d-                         Z3d. Z4d/ Z5d0 Z6dS )1PosixPathTestc                 .    |                                   d S r   )tearDownr$   s    r   setUpzPosixPathTest.setUp?   s    r   c                     dD ]?}t          j        t           j        |z              t          t           j        |z              @d S )N) 12)r   unlinkTESTFNr   )r$   suffixs     r   r1   zPosixPathTest.tearDownB   sM    $ 	2 	2FY-6777y'&01111	2 	2r   c                    |                      t          j        dddd          d           |                      t          j        ddd          d           |                      t          j        ddd	          d
           |                      t          j        dddd          d           |                      t          j        ddd          d           |                      t          j        ddd          d           d S )N/foobar/barbaz/bar/bazz/foo/bar/bazz/foo/zbar/zbaz/z/foo/bar/baz/   /foo   bars   /bars   bazs   /bar/bazs   /foo/bar/bazs   /foo/s   bar/s   baz/s   /foo/bar/baz/)assertEqual	posixpathjoinr2   s    r   	test_joinzPosixPathTest.test_joinG   s   vuEE#	% 	% 	%u==~NNN@@(	* 	* 	* 	&II$	& 	& 	&@@(	* 	* 	*'7CC)	+ 	+ 	+ 	+ 	+r   c                 &   |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d	          d
           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           d S )N/foo/bar)r<   r=   /)rI   r5   foo)r5   rJ   ////foo)////rJ   
//foo//bar)//foor=      /foo/bar)rA   rB      /)rP   r      foo)r   rQ      ////foo)   ////rQ   
   //foo//bar)   //foorB   )rC   rD   splitr2   s    r   
test_splitzPosixPathTest.test_splitU   sL   44oFFF--y999//===33_EEE668HIII557HIII..<<<00-@@@446GHHH779KLLLLLr   c                    |                      t          j        |          ||f           |                      t          j        d|z             d|z   |f           |                      t          j        d|z             d|z   |f           |                      t          j        d|z             d|z   |f           |                      t          j        d|z             d|z   |f           |                      t          j        |dz             ||z   dz   df           t          |d          }t          |d          }t          |d          }|                      t          j        |          ||f           |                      t          j        d|z             d|z   |f           |                      t          j        d|z             d|z   |f           |                      t          j        d	|z             d	|z   |f           |                      t          j        d
|z             d
|z   |f           |                      t          j        |dz             ||z   dz   df           d S )NrI   zabc/zabc.def/z	/abc.def/r5   ASCIIrP   s   abc/s   abc.def/s	   /abc.def/r   )rC   rD   splitextbytes)r$   pathfilenameexts       r   splitextTestzPosixPathTest.splitextTestb   s   +D11Hc?CCC+C$J77#.#9NOOO+FTM:: 8+S1	3 	3 	3+J,=>>$x/5	7 	7 	7+K$,>??%0#6	8 	8 	8+D3J77"S.3.3	5 	5 	5 T7##7++C!!+D11Hc?CCC+D4K88/3/	1 	1 	1+GdN;;!H,c2	4 	4 	4+K$,>??%0#6	8 	8 	8+L4,?@@&137	9 	9 	9+D4K88"S.4/5	7 	7 	7 	7 	7r   c                 .   |                      ddd           |                      ddd           |                      ddd           |                      dd	d
           |                      ddd           |                      ddd           |                      ddd           |                      ddd           |                      ddd           |                      ddd           |                      ddd           |                      ddd           d S )Nzfoo.barrJ   z.barzfoo.boo.barzfoo.boozfoo.boo.biff.barzfoo.boo.biffz.csh.rcz.cshz.rcnodotsr5   z.cshrcz...manydotsz...manydots.extz.ext...z........)r_   r2   s    r   test_splitextzPosixPathTest.test_splitext~   s*   )UF333-F;;;,nfEEE)VU333(Hb111(Hb111-;;;+]FCCC#sB'''$b)))*j"555"b"%%%%%r   c                 &   |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d	          d           |                      t          j        d
          d           |                      t          j        d          d           |                      t          j        d          d           d S )Nr5   FrI   Tr<   rH   zfoo/barr   rP   rA   rO   s   foo/bar)assertIsrD   isabsr2   s    r   
test_isabszPosixPathTest.test_isabs   s4   iob))5111ioc**D111iof--t444ioj114888ioi00%888ioc**E222iod++T222iog..555iok22D999ioj11599999r   c                 &   |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d	           |                      t          j        d
          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d	           d S )NrH   r=   rI   r5   rJ   rK   rM   rO   rB   rP   r   rQ   rR   rT   )rC   rD   r   r2   s    r   test_basenamezPosixPathTest.test_basename   sR   +J77???+C00"555+E22E:::+I66>>>+L995AAA+K88&AAA+D113777+F33V<<<+J77@@@+M::FCCCCCr   c                 &   |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d	           |                      t          j        d
          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           d S )NrH   r<   rI   rJ   r5   rK   rL   rM   rN   rO   rA   rP   rQ   r   rR   rS   rT   rU   )rC   rD   r   r2   s    r   test_dirnamezPosixPathTest.test_dirname   sR   *:66???*3//555*5112666*955v>>>*<88'BBB*;77AAA*400$777*622C888*:66@@@*=998DDDDDr   c                 8   |                      t          j        t          j        dz             d           |                      t          j        t          j        dz             d           t          t          j        dz   d          5 }|                    d           d d d            n# 1 swxY w Y   |                      t          j        t          j        dz             d           t          j                    r$t          j
        t          j        dz   t          j        dz              |                      t          j        t          j        dz             d           t          j        t          j        dz              |                      t          j        t          j        dz             d           |                      t          j        t          j        dz             d           |                      t          j        t          j        dz             d           |                      t          j        t          j        dz             d           |                      t          j        t          j        t          j                  dz             d           |                      t          j        t          j        d	z             d           |                      t          j        t          j        t          j                  d
z             d           d S )Nr6   Fr7   wbrQ   Tu           )rf   rD   islinkr   r9   lexistsopenwritecan_symlinkr   symlinkremoveexistsfsencode)r$   fs     r   test_islinkzPosixPathTest.test_islink   s   i&y'7#'=>>FFFi'	(83(>??GGG)"S($// 	1GGFOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	i&y'7#'=>>FFF "" 	KJy'#-y/?#/EFFFMM)*9+;c+ABBDIIIIi&,---MM)*9+;c+ABBDIIIMM)*9+;c+ABBEJJJMM)+I,<s,BCCTJJJi&y'7('BCCUKKKi&r{93C'D'Dw'NOOQVWWWi&y'7&'@AA5IIIi&r{93C'D'Dw'NOOQVWWWWWs   B**B.1B.c                 z   |                      t          j        d          d           |                      t          j        d          d           |                      t          j        t          d                    d           |                      t          j        t          d                    d           d S )NrI   TrP   )rf   rD   ismountr   r2   s    r   test_ismountzPosixPathTest.test_ismount   s    i',,d333i'--t444i'66===i'77>>>>>r   c                    |                      t          j        t                    d           	 t	          j        t                     |                      t          j        t                    d           t          t                     n# t          t                     w xY w|                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           |                      t          j        d          d           d S )NF   /   //    / )rf   rD   r~   r   r   mkdirr   r2   s    r   test_ismount_non_existentz'PosixPathTest.test_ismount_non_existent   s    i'//777	HVMM)+F33U;;;vJvi'	22E:::i'115999i'00%888i'11599999s   AB
 
B c                    	 t          j        dt                     |                     t	          j        t                    d           t          j        t                     d S # t          j        t                     w xY w)NrI   F)r   rw   r   rf   rD   r~   r8   r2   s    r   test_ismount_symlinksz#PosixPathTest.test_ismount_symlinks   sd    	JsF###MM)+F33U;;;IfBIfs   AA$ $A?NzTest requires posix modulec                     t           j        }d }	 |t           _        |                     t          j        t
                    d           |t           _        d S # |t           _        w xY w)Nc                 d    d}d}| t           k    rd}d}t          j        d||dddddddf
          S )Nr      )r   posixstat_resultr\   st_inost_devs      r   
fake_lstatz?PosixPathTest.test_ismount_different_device.<locals>.fake_lstat   sE    FFv~~$aAq!Q1%MNNNr   Tr   lstatrf   rD   r~   r   r$   
save_lstatr   s      r   test_ismount_different_devicez+PosixPathTest.test_ismount_different_device   sf     X
	O 	O 	O	"!BHMM)+F33T:::!BHHHzBH!!!!   9A A&c                     t           j        }d }	 |t           _        |                     t          j        t
                    d           |t           _        d S # |t           _        w xY w)Nc                     d}d}|                      t                    r| t          k    rt          d          | t          k    rd}d}t          j        d||dddddddf
          S )Nr   z!Fake [Errno 13] Permission deniedr   )
startswithr   r   r   r   r   s      r   r   zEPosixPathTest.test_ismount_directory_not_readable.<locals>.fake_lstat   ss    FFv&& C46>> ABBBv~~$aAq!Q1%MNNNr   Tr   r   s      r   #test_ismount_directory_not_readablez1PosixPathTest.test_ismount_directory_not_readable   sf     X

	O 
	O 
	O	"!BHMM)+F33T:::!BHHHzBH!!!!r   c                     |                      t          j        d          d           |                      t          j        d          d           d S )NrJ   rQ   )rC   rD   
expanduserr2   s    r   test_expanduserzPosixPathTest.test_expanduser  sJ    -e44e<<<-f55v>>>>>r   c                 t   t          j                    5 }d|d<   |                     t          j        d          d           d|d<   |                     t          j        d          d           dD ]}|                     |          5  ||d<   |                     t          j        d          d           |                     t          j        d          d           |                     t          j        d	          d
           d d d            n# 1 swxY w Y   	 d d d            d S # 1 swxY w Y   d S )Nz/home/victorHOME~z/home/victor/)rI   r5   /////)homerI   ~/z~/foor<   )r   EnvironmentVarGuardrC   rD   r   r#   )r$   envr   s      r   test_expanduser_home_envvarz)PosixPathTest.test_expanduser_home_envvar  s   *,, 	L(CKY1#66GGG *CKY1#66GGG, L L\\t\,, L L"&CK$$Y%9#%>%>DDD$$Y%9$%?%?EEE$$Y%9'%B%BFKKK	L L L L L L L L L L L L L L LL	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	Ls7   A5D-	A>DD-DD-DD--D14D1vxworkszno home directory on VxWorksc           	         t          j        d          }|                     t          j        d          t
                     |                     t          j        d          t                     t          j        d          dk    rz|                     t          j        d          dz   t          j        d                     |                     t          j        d          dz   t          j        d                     |                     t          j        d          t
                     |                     t          j        d	          t
                     |                     t          j        d
          t                     |                     t          j        d          t                     t          j	                    5 }|d= |
                    t          j                              j        }|                    d          pd}|                     t          j        d          |           t          j                            |dt$                    5  t          j                            |dt$                    5  dD ]*}|                     t          j        |          |           +	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Npwdr   s   ~/r   rI      ~rP   z~root/z~foo/s   ~root/s   ~foo/r   getpwuid)side_effectgetpwnam)r   z~/.localz
~vstinner/)r   import_moduleassertIsInstancerD   r   strr[   rC   r   r   r   r   getuidpw_dirrstripr   patchobjectKeyError)r$   r   r   r   r\   s        r   test_expanduser_pwdz!PosixPathTest.test_expanduser_pwd!  s    )%00i2488#>>>i25995AAA $$++$S))C/$T**   $T**T1$U++   	i28<<cBBBi27;;SAAAi29==uEEEi28<<eDDD*,, 	GF<<	,,3D;;s##*sDY1#66=== ""3
"II G G""3
"IIG G; G GD$$Y%9$%?%?FFFFGG G G G G G G G G G G G G G G G G G G G G G G G G G G G G G	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs[   BK/(K.K 4K KKKKK/K	K/K	K//K36K3)0)r5   rb   )rI   rI   )z/.rI   )z/./rI   )z/.//.rI   )r<   r<   )rH   rH   )r   r   )r   rI   )z///foo/.//bar//rH   )z///foo/.//bar//.//..//.//baz///z/foo/baz)z///..//./foo/.//barrH   )rb   rb   )z.//.rb   )rc   rc   )../rc   )../foor   )	../../foor   )z../foo/../barz../bar)z../../foo/../bar/./baz/boom/..../../bar/bazz/..rI   r   )z/../rI   )z/..//rI   )z//.r   )z//..r   )//...r   )z//../foorN   )z//../../foorN   )/../foor<   )z
/../../foor<   )z/../foo/../rI   )z/../foo/../barr>   )z/../../foo/../bar/./baz/boom/..r@   )z/../../foo/../bar/./baz/boom/.z/bar/baz/boom)zfoo/../bar/bazzbar/baz)zfoo/../../bar/bazz
../bar/baz)zfoo/../../../bar/bazr   )zfoo///../bar/.././../baz/boomz../baz/boom)zfoo/bar/../..///../../baz/boomz../../baz/boom)/foo/..rI   )z
/foo/../..rI   )z//foo/..r   )z//foo/../..r   )z	///foo/..rI   )z///foo/../..rI   )z
////foo/..rI   )z/////foo/..rI   c                    | j         D ]\  }}|                     |          5  t          j        |          }|                     ||           d d d            n# 1 swxY w Y   |                    d          }|                    d          }|                     |t                    5  t          j        |          }|                     ||           d d d            n# 1 swxY w Y   d S )Nzutf-8)type)NORMPATH_CASESr#   rD   normpathrC   encoder[   )r$   r\   expectedresults       r   test_normpathzPosixPathTest.test_normpath}  se   "1 		3 		3ND(d## 3 3"+D11  2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 ;;w''Dw//Hd// 3 3"+D11  2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3		3 		3s#   +AA	 A	*+C!!C%	(C%	strictTc                    |                      t          di |t          j                               |                      t          d	i |t          j                               |                      t          d                    dgdz            fi |t          j                               |                      t          d
i |t          j                               |                      t          di |t          j                               |                      t          d                    dgdz            fi |t          j                               d S )Nrb   ./.rI   d      .   ./.rP   )rb   )r   )r   )r   )rC   r   r   getcwdrE   getcwdbr$   r&   s     r   test_realpath_curdirz"PosixPathTest.test_realpath_curdir  s.    	0000")++>>>22622BIKK@@@#((C53;"7"7BB6BBBIKKPPP11&112:<<@@@33F33RZ\\BBB$))TFSL"9"9DDVDDbjllSSSSSr   c           	      
   |                      t          di |t          t          j                                         |                      t          d	i |t          t          t          j                                                   |                      t          d                    dgdz            fi |d           |                      t          d
i |t          t          j                                         |                      t          di |t          t          t          j                                                   |                      t          d                    dgdz            fi |d           d S )Nrc   ../..rI   r      ..   ../..rP   )rc   )r   )r   )r   )rC   r   r   r   r   rE   r   r   s     r   test_realpath_pardirz"PosixPathTest.test_realpath_pardir  sR    	11&11729;;3G3GHHH44V44ggbikk>R>R6S6STTT#((D6C<"8"8CCFCCSIII22622GBJLL4I4IJJJ55f55wwrz||?T?T7U7UVVV$))UGcM":":EEfEEtLLLLLr   c                    	 t          j        t          dz   t                     |                     t	          t          fi |t          dz              t          j        t                     d S # t          j        t                     w xY wNr6   )r   rw   r   rC   r   r   r8   r   s     r   test_realpath_basicz!PosixPathTest.test_realpath_basic  su    
	%Jvcz6***Xf7777DDDV$$$$$IV$$$$s   AA- -Bc                 `   	 t          j        t          dz   t                     |                     t          t
          t          d           |                     t          t
          t          dz   d           t          j        t                     d S # t          j        t                     w xY w)Nr6   Tr   r7   )r   rw   r   assertRaisesFileNotFoundErrorr   r   r8   r2   s    r   test_realpath_strictz"PosixPathTest.test_realpath_strict  s    
	%Jvcz6***/6$OOO/6C<PTUUUV$$$$$IV$$$$s   A5B B-c                    d}|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d}|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d}|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d}|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d}|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d	}|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d
}|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d}|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d}t
          j        dk    rs|                     t          |d          |           |                      t          t          |d           |                     t          |t                    |           nn|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d}t
          j        dk    rP|                     t          |d          |           |                     t          |t                    |           nK|                      t          t          |d           |                      t          t          |t                     |                      t          t          |d           d}t
          j        dk    rs|                     t          |d          d           |                      t          t          |d           |                     t          |t                    d           nn|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     d}t
          j        dk    rP|                     t          |d          d           |                     t          |t                    d           nK|                      t          t          |d           |                      t          t          |t                     |                      t          t          |d           d}t
          j        dk    ro|                      t          t          |d           |                      t          t          |d           |                      t          t          |t                     n|                     t          |d          |           t          j        rL|                      t          t          |d           |                      t          t          |t                     nM|                      t          t          |d           |                     t          |t                    |           d}t
          j        dk    rL|                      t          t          |d           |                      t          t          |t                     n%|                     t          |d          |           t          j        rM|                      t          t          |d           |                      t          t          |t                     d S |                      t          t          |d           d S )Nr   Fr   Tr   z/nonexistent/x s   /nonexistent/x z/ /..s   / /..z/nonexistent/x /..s   /nonexistent/x /..r   win32u   /nonexistent/u   //..rI   u   /nonexistent//..z/nonexistentr   s   /nonexistent/)r   
ValueErrorr   r   r   sysplatformrC   UnicodeEncodeErrorUnicodeDecodeErrorr	   is_wasir   )r$   r\   s     r   test_realpath_invalid_pathsz)PosixPathTest.test_realpath_invalid_paths  s   *hUCCC*hTBBB*h]KKK*hUCCC*hTBBB*h]KKK#*hUCCC+XtDIII*h]KKK$*hUCCC+XtDIII*h]KKK*hUCCC*hTBBB*h]KKK*hUCCC*hTBBB*h]KKK&*hUCCC+XtDIII*h]KKK'*hUCCC+XtDIII*h]KKK<7""Xd59994@@@/4MMMXd=AAA4HHHH0(DOOO0(DNNN0(DWWW$<7""Xd59994@@@Xd=AAA4HHHH0(DOOO0(DWWW+XtDIII<7""Xd59993???/4MMMXd=AAA3GGGG0(DOOO0(DNNN0(DWWW'<7""Xd5999>JJJXd=AAA>RRRR0(DOOO0(DWWW+XtDIII<7""0(DOOO0(DNNN0(DWWWWXd59994@@@ M!!'8T$!GGG!!'8T-!PPPP!!"3XtD!QQQ  $}!E!E!EtLLL#<7""0(DOOO0(DWWWWXd59994@@@? 	NgxdCCCgxmLLLLL/4MMMMMr   c                 :   	 t          j        t          j        t          dz             t                     |                     t          t          fi |t          dz              t          j        t                     d S # t          j        t                     w xY wr   )	r   rw   rD   relpathr   rC   r   r   r8   r   s     r   test_realpath_relativez$PosixPathTest.test_realpath_relative  s    	%Jy(44f===Xf7777DDDV$$$$$IV$$$$s   A"A? ?Bc                 N   	 t          j        t          j        dz   t          j                   |                     t          dt          j        z   fi |t          dz              t          j        t          j                   d S # t          j        t          j                   w xY w)Nr6   znonexistent/../)r   rw   r   r9   rC   r   r   r8   r   s     r   test_realpath_missing_pardirz*PosixPathTest.test_realpath_missing_pardir  s    	/Jy'#-y/?@@@*Y-==HHHH&SV,X X X Y-.....IY-....s   A"B  B$c                 H
   	 t          j        t          t                     |                     t	          t                    t                     t          j        t          dz   t          dz              t          j        t          dz   t          dz              |                     t	          t          dz             t          dz              |                     t	          t          dz             t          dz              |                     t	          t          dz             t          dz              |                     t	          t          dz             t          t                               |                     t	          t          dz             t          t                    dz              t          j        t          dz   t          dz              |                     t	          t          d	z   t          t                    z   dz             t          dz              |                     t	          t          d	z   t          t                    z   dz             t          dz              t          j        t          t                    d
z   t          dz              |                     t	          t          dz             t          d
z              t          j        dt          t          t                              z   dz   t          t                    z   dz   t          dz              |                     t	          t          dz             t          dz              t          j        t          t                              5  |                     t	          t          t                              t                     d d d            n# 1 swxY w Y   t          j	        t                     t          j	        t          dz              t          j	        t          dz              t          j	        t          dz              t          j	        t          dz              t          j	        t          dz              d S # t          j	        t                     t          j	        t          dz              t          j	        t          dz              t          j	        t          dz              t          j	        t          dz              t          j	        t          dz              w xY w)Nr6   r7   1/x1/..1/../x/xxy1/../a/bar   rI   c)
r   rw   r   rC   r   r   r   r   
change_cwdr8   r2   s    r   test_realpath_symlink_loopsz)PosixPathTest.test_realpath_symlink_loops*  s2   
"	)Jvv&&&Xf--v666Jvcz6#:...Jvcz6#:...XfSj116#:>>>XfSj116#:>>>XfUl33VE\BBBXfVm44gfooFFFXfXo66$8NOOOJvcz6#:...XfWnx7G7G&G#&MNN#c\+ + +XfWnx7G7G&G#&MNN#c\+ + + Jx''%/<<<XfSj116%<@@@Jux8883>''(*-./5cz; ; ;XfSj116#:>>> %gfoo66 E E  (6*:*:!;!;VDDDE E E E E E E E E E E E E E E V$$$VCZ(((VCZ(((VCZ(((VCZ(((VCZ((((( V$$$VCZ(((VCZ(((VCZ(((VCZ(((VCZ((((s1   M?Q: ;O<Q: OQ: OQ: :B'T!c                    	 t          j        t          t                      | j        t          t
          t          fi | t          j        t          dz   t          dz              t          j        t          dz   t          dz               | j        t          t
          t          dz   fi |  | j        t          t
          t          dz   fi |  | j        t          t
          t          dz   fi |  | j        t          t
          t          dz   fi |  | j        t          t
          t          dz   fi | t          j        t          dz   t          dz               | j        t          t
          t          dz   t          t                    z   dz   fi |  | j        t          t
          t          dz   t          t                    z   dz   fi | t          j        t          t                    d	z   t          d
z               | j        t          t
          t          d
z   fi | t          j        dt          t          t                              z   dz   t          t                    z   dz   t          dz               | j        t          t
          t          dz   fi | t          j	        t          t                              5   | j        t          t
          t          t                    fi | d d d            n# 1 swxY w Y   t          j
        t                     t          j
        t          dz              t          j
        t          dz              t          j
        t          dz              t          j
        t          dz              t          j
        t          d
z              d S # t          j
        t                     t          j
        t          dz              t          j
        t          dz              t          j
        t          dz              t          j
        t          dz              t          j
        t          d
z              w xY w)Nr6   r7   r   r   r   r   r   r   r   r   r   rI   r   )r   rw   r   r   r   r   r   r   r   r   r8   r   s     r   "test_realpath_symlink_loops_strictz0PosixPathTest.test_realpath_symlink_loops_strictS  s$   "	)Jvv&&&DgxBB6BBBJvcz6#:...Jvcz6#:...DgxFFvFFFDgxFFvFFFDgxHHHHHDgxII&IIIDgxKKFKKKJvcz6#:...Dgx$Wnx/?/??#EQ QIOQ Q QDgx$Wnx/?/??#EQ QIOQ Q Q Jx''%/<<<DgxFFvFFFJux8883>''(*-./5cz; ; ;DgxFFvFFF %gfoo66 Q Q!!'8Xf5E5EPPPPPQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q V$$$VCZ(((VCZ(((VCZ(((VCZ(((VCZ((((( V$$$VCZ(((VCZ(((VCZ(((VCZ(((VCZ((((s1   KN. -K<0N. <L  N. L N. .B'Qc                 n   	 t          j        t                     t          j        dt	          t                    z   t          dz              t          j        dt          dz              |                     t          t          dz   fi |t                     t          j        t          dz              t          j        t          dz              t          t                     d S # t          j        t          dz              t          j        t          dz              t          t                     w xY w)Nr   z/selfzself/self/selfz/link)
r   r   r   rw   r   rC   r   r   r8   r   r   s     r   (test_realpath_repeated_indirect_symlinksz6PosixPathTest.test_realpath_repeated_indirect_symlinks}  s   
	HVJux///'1ABBBJ'')9:::Xfw&6AA&AA6JJJVg-...Vg-...v Vg-...Vg-...vs   BC& &AD4c                 Z   d}	 t          j        t                     t          |          D ]?}t          j        d                    d|z  gdz            t          d|dz   z  z              @t          j        dt          dz              |                     t          t          d|z  z   fi |t                     t          j	        t                    5  |                     t          d|z            t                     d d d            n# 1 swxY w Y   t          |dz             D ]!}t          j
        t          d|z  z              "t          t                     d S # t          |dz             D ]!}t          j
        t          d|z  z              "t          t                     w xY w)N
   rI   z%dz/%dr   rb   z/0)r   r   r   rangerw   rE   rC   r   r   r   r8   r   )r$   r&   depthis       r   test_realpath_deep_recursionz*PosixPathTest.test_realpath_deep_recursion  s    	HV5\\ P P
388TAXJO44fuA6NOOOOJsFTM***Xfuu}&<GGGGPPP %f-- A A  $,!7!7@@@A A A A A A A A A A A A A A A 519%% 5 5 %!)!34444v 519%% 5 5 %!)!34444vs1   CE  ,D?E  DE  DE   A
F*c                    	 t          j        t                     t          j        t          dz              t          j        t          dz   t          dz              t	          j        t          dz             5  |                     t          di |t          dz              d d d            n# 1 swxY w Y   t	          j        t          dz              t          t          dz              t          t                     d S # t	          j        t          dz              t          t          dz              t          t                     w xY w)Nz/y/kr   z/y/a)r   )
r   r   r   rw   r   r   rC   r   r8   r   r   s     r   test_realpath_resolve_parentsz+PosixPathTest.test_realpath_resolve_parents  sY   	HVHVd]###Jv}ftm444%ftm44 5 5  !8!8!8!8$*VO5 5 55 5 5 5 5 5 5 5 5 5 5 5 5 5 5 Vd]+++v}%%%v Vd]+++v}%%%vs1   A6D 8)B-!D -B11D 4B15D A	E
c                    	 t          j        t                     t          j        t          dz              t          j        t          dz              t          j        t          dz   t          dz              |                     t          t          dz   fi |t          dz              t          j        t          t                              5  |                     t          t          t                    dz   fi |t          dz              d d d            n# 1 swxY w Y   t          j
        t          dz              t          t          dz              t          t          dz              t          t                     d S # t          j
        t          dz              t          t          dz              t          t          dz              t          t                     w xY w)Nr  z/k/yz/link-yz
/link-y/..)r   r   r   rw   rC   r   r   r   r   r   r8   r   r   s     r   (test_realpath_resolve_before_normalizingz6PosixPathTest.test_realpath_resolve_before_normalizing  s   	HVHVd]###HVf_%%%Jv(:;;; Xf|&;FFvFFQUVVV%gfoo66 0 0  (6*:*:\*I!T!TV!T!T!'$0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Vi/000v'''v}%%%v Vi/000v'''v}%%%vs1   CF ?DF DF !D"F A G%c                 *   	 t          j        t                     t          j        t          dz              t          j        t          t          dz              t	          j        t          t                              5  t          t                    }|                     t          |dz   fi |t                     |                     t          |dz   fi |t          dz              d d d            n# 1 swxY w Y   t	          j
        t          dz              t          t          dz              t          t                     d S # t	          j
        t          dz              t          t          dz              t          t                     w xY w)Nr  linkzlink/k)r   r   r   rw   r   r   r   r   rC   r   r8   r   )r$   r&   bases      r   test_realpath_resolve_firstz)PosixPathTest.test_realpath_resolve_first  s   	HVHVd]###Jvv///%gfoo66 U U''  $-!B!B6!B!BFKKK  $/!D!DV!D!DftmTTTU U U U U U U U U U U U U U U
 Vf_---v}%%%v Vf_---v}%%%vs2   A=E	 ?A*C5)E	 5C99E	 <C9=E	 	A	FzCan't set symlink permissionsdarwinz1only macOS requires read permission to readlink()c                    	 t          j        t          dz   t                     t          j        t          dd           |                     t
                    5  t          t          fi | d d d            n# 1 swxY w Y   |                     t
                    5  t          t          dz   fi |f d d d            n# 1 swxY w Y   |                     t
                    5  t          t          dz   fi | d d d            n# 1 swxY w Y   |                     t
                    5  t          t          dz   fi | d d d            n# 1 swxY w Y   t          j        t          dd           t          j        t                     d S # t          j        t          dd           t          j        t                     w xY w)	Nr6   r   F)follow_symlinksr<   r   r     )r   rw   r   chmodr   PermissionErrorr   r8   r   s     r   'test_realpath_unreadable_symlink_strictz5PosixPathTest.test_realpath_unreadable_symlink_strict  s   	Jvcz6***HVUE::::""?33 + +**6***+ + + + + + + + + + + + + + +""?33 5 5&33F33445 5 5 5 5 5 5 5 5 5 5 5 5 5 5""?33 7 7)+66v6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7""?33 7 7)+66v6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 HVUE::::If HVUE::::Ifs   AF A9-F 9A==F  A=F C5F CF C	F &D<F DF DF -EF EF EF 7Gc                    	 t          j        t                     t          j        t          dz              t          j        t          d           |                     t          t          d          t                     |                     t          t          d          t                     |                     t          t          t                    t                     	 t          j        t                     |                     d           n# t          $ r Y nw xY w|                     t          t          dz   d          t          dz              | 
                    t          t
          t          dz   d           | 
                    t          t
          t          dz   t                     |                     t          t          dz   d          t          dz              | 
                    t          t
          t          dz   d           | 
                    t          t
          t          dz   t                     t          j        t          d           t          t          dz              t          t                     d S # t          j        t          d           t          t          dz              t          t                     w xY w)	Nr  r   Fr   TzCannot block permissionsz/missingr  )r   r   r   r  rC   r   r   statskipTestr  r   r   r2   s    r   "test_realpath_unreadable_directoryz0PosixPathTest.test_realpath_unreadable_directory  s{   	HVHVd]###HVU###XfU;;;VDDDXfT:::FCCCXf]CCCVLLL: 89999 #   
 XftmEBBB#d], , ,ox$%)  + + +ox$%2  4 4 4 Xfz&9%HHH#j02 2 2ox*9L%)  + + +ox*9L%2  4 4 4 HVU###v}%%%v HVU###v}%%%vs2   C!J
 $D =J
 
D J
 D  D#J
 
AKc                    t           j        d c}t           _        	 t           j                            t          j                              d         }|                     t
          t          j        d           |                     t          j        d          d           |                     t          j        t          j	        d                    d           |                     t          j        d          d           |                     t          j        d          d           |                     t          j        dd          d|z   d	z              |                     t          j        dd
          d|z   dz              |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        d	d	          d           |                     t          j        dd          d           |t           _        d S # |t           _        w xY w)Nc                      dS )Nz/home/user/barr+   r+   r   r   <lambda>z,PosixPathTest.test_relpath.<locals>.<lambda>   s    7H r   r5   r   r   z../a/bz../br   z/az../cz/a/bzb/cz../../arb   z/foo/bar/batz/x/y/zz../../../foo/bar/batrH   batrI   zfoo/bar/batz../../..r   z../foo/bar/batz
../../../x)
r   r   r\   rV   r   r   rD   r   rC   r   )r$   real_getcwdcurdirs      r   test_relpathzPosixPathTest.test_relpath  s   $&I/H/H bi	$W]]29;;//3Fj)*;R@@@Y.s33S999Y.y/@/E/EFFLLLY.u55u===Y.x88(CCCY.sF;;U6\$=NOOOY.uf=="6\&02 2 2Y.sE::IFFFY.sC88#>>>Y.~xHHJ`aaaY.~zJJERRRY.~sCC]SSSY.sNCCZPPPY.~tDDFVWWWY.t^DDlSSSY.sC88#>>>Y.tT::C@@@Y.vv>>DDD#BIIIBI####s   L/M M'c                 p   t           j        d c}t           _        	 t           j                            t          j                              d         }|                     t
          t          j        d           |                     t          j        d          d           |                     t          j        t          j	        d                    d           |                     t          j        d          d           |                     t          j        d          d           |                     t          j        dd          d|z   d	z              |                     t          j        dd
          d|z   dz              |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        dd          d           |                     t          j        d	d	          d           |                     t          j        dd          d           |                     t          t          j        dd           |                     t          t          j        dd           |t           _        d S # |t           _        w xY w)Nc                      dS )Ns   /home/user/barr+   r+   r   r   r  z2PosixPathTest.test_relpath_bytes.<locals>.<lambda>:  s    :L r   r  r      as   a/bs   ../a/bs   ../bs   ../s   /as   ../cs   /a/bs   b/cs   ../../ar   s   /foo/bar/bats   /x/y/zs   ../../../foo/bar/batrO   s   batrP   s   foo/bar/bats   ../../..s   /xs   ../foo/bar/bats
   ../../../xs   bytesr   )r   r   r\   rV   r   r   rD   r   rC   r   	TypeError)r$   real_getcwdbr   s      r   test_relpath_bytesz PosixPathTest.test_relpath_bytes9  s$   &(j2L2L"rz	&W]]2:<<004Fj)*;SAAAY.t44d;;;Y.y/@/F/FGGNNNY.v66???Y.y999EEEY.tW==#F]502 2 2Y.vw??#F]724 4 4Y.tV<<jIIIY.tT::DAAAY.	JJLcdddY.LLfUUUY.EE~VVVY.t_EE{SSSY.FFHYZZZY.uoFFVVVY.tT::DAAAY.ue<<dCCCY.w@@$GGGi):HeLLLi):E8LLL%BJJJBJ%%%%s   M=N' 'N5c                      fd} fd}                      t          t          j        g             |t          ddg            |t          ddg            |dgd            |ddgd            |ddgd            |ddgd            |ddgd            |d	d
gd            |ddgd            |ddgd            |ddgd            |ddgd            |ddgd            |ddgd            |dgd            |ddgd            |ddgd            |ddgd            |ddgd            |ddgd            |g dd            |g dd            |dgd            |ddgd            |t          ddg                                 t          t          j        d dg                                 t          t          j        d d!g                                 t          t          j        d"dg                                 t          t          j        dd#g                                 t          t          j        dd$g                                 t          t          j        d%d#g           d S )&Nc                                          t          j        |           |                                t          j        d | D                       t          j        |                     d S )Nc                 6    g | ]}t          j        |          S r+   r   rz   .0ps     r   
<listcomp>z@PosixPathTest.test_commonpath.<locals>.check.<locals>.<listcomp>Z  s     2Q2Q2Qa2;q>>2Q2Q2Qr   )rC   rD   
commonpathr   rz   )pathsr   r$   s     r   checkz,PosixPathTest.test_commonpath.<locals>.checkX  so    Y1%88(CCCY12Q2Q52Q2Q2QRR[224 4 4 4 4r   c                                          | t          j        |                                | t          j        d |D                        d S )Nc                 6    g | ]}t          j        |          S r+   r+  r,  s     r   r/  zFPosixPathTest.test_commonpath.<locals>.check_error.<locals>.<listcomp>_  s     ===!r{1~~===r   )r   rD   r0  )excr1  r$   s     r   check_errorz2PosixPathTest.test_commonpath.<locals>.check_error\  sX    c9#7???c9#7==u===? ? ? ? ?r   z/usrusrz
/usr/localz/usr/local/z/usr//localz//usr/localz/usr/./localz/./usr/localrI   z/devz	/usr/lib/z/usr/lib/python3z/usr/libz/usr/lib64/z
/usr/lib64spamalotr5   and/jamand/spamandzand//jamz
and/spam//z	and/./jamz
./and/spam)r:  r;  r9  )r:  r;  r<  z	spam/alotz
/spam/alots	   /usr/lib/zusr/lib/python3s   usr/lib/s   /usr/lib/python3s   usr/lib/python3zusr/lib/)r   r   rD   r0  r%  )r$   r2  r6  s   `  r   test_commonpathzPosixPathTest.test_commonpathW  s   	4 	4 	4 	4 	4	? 	? 	? 	? 	?
 	*i&:B???J000J000|nl+++|\*L999}l+\:::}m,l;;;}m,l;;;~~.===sFmS!!!vv$$${./<<<{M*F333z<(&111{L)6222vhvv'''vv###y*%u---z<(%000{L)5111---r222,,,e444rdBr;$$$J\ 2333)Y%9');<	> 	> 	>)Y%9'):;	= 	= 	=)Y%9&(:;	= 	= 	=)Y%9&(;<	> 	> 	>)Y%9&(:;	= 	= 	=)Y%9%':;	= 	= 	= 	= 	=r   )7__name__
__module____qualname__r3   r1   rF   rW   r_   rd   rh   rj   rl   r|   r   r   r   skip_unless_symlinkr   r   skipIfr   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   r  supports_follow_symlinksr  r  r!  r'  r=  r+   r   r   r/   r/   =   sJ         2 2 2
+ + +M M M7 7 78& & &: : :D D DE E EX X X*? ? ?: : : "  #" X_Ud]$@AA" " BA"" X_Ud]$@AA" " BA"*? ? ?L L L  X_S\Y.35 5%G %G5 5%GN1 1 1Nf
3 
3 
3 ']2$'(M)BCCT T DC '&T ']2$'(M)BCCM M DC '&M "&]2-011% % 21 '& #"% "&% % '& #"%]N ]N ]N~ "&]2-011% % 21 '& #"% "&]2-011/ / 21 '& #"/ "&%) %) '& #"%)N "&]Hd#h%>??%) %) @? '& #"%)N "&]2$'(M)BCC
 
 DC '& #"
 "&]2$'(M)BCC  DC '& #"" "&]2-011  21 '& #"$ "&]2$'(M)BCC  DC '& #"4 "&]2$'(M)BCC  DC '& #"" "&X_RXR%@@BabbX_S\X-/bcc]Hd#h%>??  @? dc cb '& #"
  '"    #" '& D$ $ $4& & &<4= 4= 4= 4= 4=r   r/   c                       e Zd ZeZg dZdS )PosixCommonTest)r   samefilesameopenfilesamestatN)r>  r?  r@  rD   
pathmodule
attributesr+   r   r   rE  rE    s        JDDDJJJr   rE  c                       e Zd ZeZd Zd Zd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Z ei ddidei          d             Zd Zd ZdS )PathLikeTestsc                 6   t           j        | _        t          t           j                  | _        |                     t           j        | j                   t          | j        dd          5 }|                    d           d d d            d S # 1 swxY w Y   d S )Nxbr   s   test_posixpath.PathLikeTests)	r   r9   	file_namer   	file_path
addCleanupr8   rt   ru   )r$   files     r   r3   zPathLikeTests.setUp  s    ")!)"233	($.999$.$** 	8dJJ6777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s   +BBBc                 j    |                       || j                   || j                             d S r   )rC   rP  rO  )r$   r(   s     r   assertPathEqualzPathLikeTests.assertPathEqual  s6    dn--ttDN/C/CDDDDDr   c                 D    |                      | j        j                   d S r   )rT  r\   normcaser2   s    r   test_path_normcasez PathLikeTests.test_path_normcase  !    TY/00000r   c                 D    |                      | j        j                   d S r   )rT  r\   rg   r2   s    r   test_path_isabszPathLikeTests.test_path_isabs       TY_-----r   c                     |                      | j                            dt          d          d          | j                            ddd                     d S )Nr   br   )rC   r\   rE   r   r2   s    r   test_path_joinzPathLikeTests.test_path_join  sS    Xc]]C@@S#66	8 	8 	8 	8 	8r   c                 D    |                      | j        j                   d S r   )rT  r\   rV   r2   s    r   test_path_splitzPathLikeTests.test_path_split  r[  r   c                 D    |                      | j        j                   d S r   )rT  r\   rZ   r2   s    r   test_path_splitextz PathLikeTests.test_path_splitext  rX  r   c                 D    |                      | j        j                   d S r   )rT  r\   
splitdriver2   s    r   test_path_splitdrivez"PathLikeTests.test_path_splitdrive  !    TY122222r   c                 D    |                      | j        j                   d S r   )rT  r\   r   r2   s    r   test_path_basenamez PathLikeTests.test_path_basename  rX  r   c                 D    |                      | j        j                   d S r   )rT  r\   r   r2   s    r   test_path_dirnamezPathLikeTests.test_path_dirname  !    TY./////r   c                 D    |                      | j        j                   d S r   )rT  r\   rr   r2   s    r   test_path_islinkzPathLikeTests.test_path_islink  s!    TY-.....r   c                 D    |                      | j        j                   d S r   )rT  r\   rs   r2   s    r   test_path_lexistszPathLikeTests.test_path_lexists  rk  r   c                 D    |                      | j        j                   d S r   )rT  r\   r~   r2   s    r   test_path_ismountzPathLikeTests.test_path_ismount  rk  r   c                 D    |                      | j        j                   d S r   )rT  r\   r   r2   s    r   test_path_expanduserz"PathLikeTests.test_path_expanduser  rf  r   c                 D    |                      | j        j                   d S r   )rT  r\   
expandvarsr2   s    r   test_path_expandvarsz"PathLikeTests.test_path_expandvars  rf  r   c                 D    |                      | j        j                   d S r   )rT  r\   r   r2   s    r   test_path_normpathz PathLikeTests.test_path_normpath  rX  r   c                 D    |                      | j        j                   d S r   )rT  r\   r   r2   s    r   test_path_abspathzPathLikeTests.test_path_abspath  rk  r   r   Tc                     |                      | j        j                   |                      t          | j        j        fi |           d S r   )rT  r\   r   r   r   s     r   test_path_realpathz PathLikeTests.test_path_realpath  sJ    TY/000WTY%7BB6BBCCCCCr   c                 D    |                      | j        j                   d S r   )rT  r\   r   r2   s    r   test_path_relpathzPathLikeTests.test_path_relpath  rk  r   c                     | j                             | j        | j        g          }|                     || j                   d S r   )r\   r0  rP  rO  rC   )r$   common_paths     r   test_path_commonpathz"PathLikeTests.test_path_commonpath  s>    i**DNDN+KLLdn55555r   N)r>  r?  r@  rD   r\   r3   rT  rW  rZ  r^  r`  rb  re  rh  rj  rm  ro  rq  rs  rv  rx  rz  r-   r   r|  r~  r  r+   r   r   rL  rL    sq       D8 8 8E E E1 1 1. . .8 8 8. . .1 1 13 3 31 1 10 0 0/ / /0 0 00 0 03 3 33 3 31 1 10 0 0 ]2$'(M)BCCD D DCD
0 0 06 6 6 6 6r   rL  __main__)"r   rD   r   r   	functoolsr   r   r   r   r   r   r   r	   r
   test.supportr   r   test.support.os_helperr   r   r   ImportErrorr9   r   r   r   r-   TestCaser/   
CommonTestrE  rL  r>  mainr+   r   r   <module>r     s   				     



        I I I I I I I I I I I I I I       ! ! ! ! ! ! & & & & & & " " " " " " + + + + + +      LLLL   EEE 
!	"	"= = =  " " "(N= N= N= N= N=H% N= N= N=bE E E E E&183D E E E
G6 G6 G6 G6 G6H% G6 G6 G6T ZHMOOOOO s   
A AA