U e5dVlã&@s(dZdZdZdZdZdZdZdZdZdd l Z dd l Z dd l Z dd l Z dd l Td d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0g&Z d1d2„Zd3d „Zd4d „Zd5d „Zd6d„Zd7d„Zd8d„Ze jje_d9d„Zd:d„Zd;d„Zdd„Zd?d„Zd@d„ZdAd „Z dBdC„Z!zddDlm"Z"Wnek �r|e!Z#Yn XdEd!„Z#zddFlm$Z$m%Z&Wnek �r´e#Z'YnXdGdH„Z(dIdJ„Z)dKd*„Z'e*e dLƒ�oèe  +¡dMdNkZ,dRdOd,„Z-dPd0„Z.zddQlm/Z0Wnek �r"YnXd S)Sz�Common pathname manipulations, WindowsNT/95 version. Instead of importing this module directly, import os and refer to this module as os.path. Ú.ú..ú\ú;ú/z.;C:\binZnuléN)Ú*ÚnormcaseÚisabsÚjoinÚ splitdriveÚsplitÚsplitextÚbasenameÚdirnameÚ commonprefixÚgetsizeÚgetmtimeÚgetatimeÚgetctimeÚislinkÚexistsÚlexistsÚisdirÚisfileÚismountÚ expanduserÚ expandvarsÚnormpathÚabspathÚcurdirÚpardirÚsepÚpathsepÚdefpathÚaltsepÚextsepÚdevnullÚrealpathÚsupports_unicode_filenamesÚrelpathÚsamefileÚ sameopenfileÚsamestatÚ commonpathcCst|tƒrdSdSdS)Nó\/ú\/)Ú isinstanceÚbytes©Úpath©r4ú/usr/lib64/python3.8/ntpath.pyÚ _get_bothseps"s r6cCs8t |¡}t|tƒr$| dd¡ ¡S| dd¡ ¡SdS)zaNormalize case of pathname. Makes all characters lowercase and all slashes into backslashes.ó/ó\rrN)ÚosÚfspathr0r1ÚreplaceÚlower©Úsr4r4r5r,s  cCsjt |¡}t|tƒr,| dd¡ d¡rBdSn| dd¡ d¡rBdSt|ƒd}t|ƒd koh|d t|ƒkS) zTest whether a path is absoluter7r8ó\\?\Trrú\\?\ér) r9r:r0r1r;Ú startswithr Úlenr6r=r4r4r5r =s   c GsTt |¡}t|tƒr"d}d}d}n d}d}d}zð|sD|dd…|t|ƒ\}}ttj|ƒD]~}t|ƒ\}} | r�| d|kr�|s„|sˆ|}| }q\n*|rº||krº| ¡| ¡kr¶|}| }q\|}|rÒ|d|krÒ||}|| }q\|�r|d|k�r|�r|dd…|k�r|||WS||WSttt fk �rNt j d |f|žŽ‚YnXdS) Nr8r.ó:rr/ú:réÿÿÿÿr ) r9r:r0r1r Úmapr<Ú TypeErrorÚAttributeErrorÚ BytesWarningÚ genericpathÚ_check_arg_types) r3Úpathsr!ÚsepsÚcolonZ result_driveZ result_pathÚpZp_driveZp_pathr4r4r5r MsL      ÿÿ cCst |¡}t|ƒdk�rt|tƒr0d}d}d}n d}d}d}| ||¡}|dd…|dkrä|dd …|krä| |d¡}|d kr�|d d…|fS| ||d ¡}||d kr¼|d d…|fS|d krÌt|ƒ}|d |…||d …fS|d d…|k�r|d d…|dd …fS|d d…|fS) aÚSplit a pathname into drive/UNC sharepoint and relative path specifiers. Returns a 2-tuple (drive_or_unc, path); either part may be empty. If you assign result = splitdrive(p) It is always true that: result[0] + result[1] == p If the path contained a drive letter, drive_or_unc will contain everything up to and including the colon. e.g. splitdrive("c:/dir") returns ("c:", "/dir") If the path contained a UNC path, the drive_or_unc will contain the host name and share up to but not including the fourth directory separator character. e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/dir") Paths cannot contain both a drive letter and a UNC path. ér8r7rDrrrErérFNrA)r9r:rCr0r1r;Úfind)rPr!r$rOZnormpÚindexZindex2r4r4r5r |s.   $  cCsxt |¡}t|ƒ}t|ƒ\}}t|ƒ}|rD||d|krD|d8}q&|d|…||d…}}| |¡pj|}|||fS)z~Split a pathname. Return tuple (head, tail) where tail is everything after the final slash. Either part may be empty.rAN)r9r:r6r rCÚrstrip)rPrNÚdÚiÚheadÚtailr4r4r5r ´s   cCs8t |¡}t|tƒr$t |ddd¡St |ddd¡SdS)Nr8r7ó.rrr)r9r:r0r1rKÚ _splitext©rPr4r4r5r Ës  cCs t|ƒdS)z)Returns the final component of a pathnamerA©r r\r4r4r5rÖscCs t|ƒdS)z-Returns the directory component of a pathnamerr]r\r4r4r5rÝsc Cs8zt |¡}Wntttfk r*YdSXt |j¡S)zhTest whether a path is a symbolic link. This will always return false for Windows prior to 6.0. F)r9ÚlstatÚOSErrorÚ ValueErrorrIÚstatÚS_ISLNKÚst_mode©r3Ústr4r4r5räs c Cs.zt |¡}Wnttfk r(YdSXdS)zCTest whether a path exists. Returns True for broken symbolic linksFT)r9r^r_r`rdr4r4r5rðs )Ú_getvolumepathnamecCstt |¡}t|ƒ}t|ƒ}t|ƒ\}}|rD|d|krD| pB||kS||krPdStrl| |¡t|ƒ |¡kSdSdS)zaTest whether a path is a mount point (a drive root, the root of a share, or a mounted volume)rTFN)r9r:r6rr rfrU)r3rNÚrootÚrestr4r4r5rs  cCsút |¡}t|tƒrd}nd}| |¡s,|Sdt|ƒ}}||kr\||t|ƒkr\|d7}q:dtjkrrtjd}nFdtjkr€|Sztjd}Wntk r¦d}YnXt |tjdƒ}t|tƒrÌt  |¡}|dkrêt t |ƒ|d|…ƒ}|||d…S) zLExpand ~ and ~user constructs. If user or $HOME is unknown, do nothing.ó~ú~rAZ USERPROFILEZHOMEPATHZ HOMEDRIVEÚN) r9r:r0r1rBrCr6ÚenvironÚKeyErrorr Úfsencoder)r3ÚtilderWÚnÚuserhomeÚdriver4r4r5r!s.          cCs2t |¡}t|tƒrhd|kr(d|kr(|Sddl}t|j|jddƒ}d}d}d}d }d}ttd dƒ}nFd |kr|d |kr||Sddl}|j|jd}d }d }d}d}d }tj}|dd…} d} t |ƒ} | | k�r.|| | d…} | |k�rX|| dd…}t |ƒ} z&|  | ¡} | | |d| d…7} Wn*t k �rR| | |7} | d} YnX�nÌ| |k�rJ|| d| d…|k�rŽ| | 7} | d7} n¸|| dd…}t |ƒ} z|  |¡} Wn*t k �rÞ| ||7} | d} YnhX|d| …} z.|dk�rt  tjt  | ¡¡}n|| }Wn"tk �r<|| |}YnX| |7} �nÚ| |k�r|| d| d…|k�r‚| | 7} | d7} �q$|| d| d…|k�r^|| dd…}t |ƒ} z|  |¡} Wn.t k �rð| |||7} | d} YnlX|d| …} z.|dk�r"t  tjt  | ¡¡}n|| }Wn&tk �rR||| |}YnX| |7} n¼|dd…} | d7} || | d…} | �r¶| |k�r¶| | 7} | d7} || | d…} �q‚z.|dk�rÚt  tjt  | ¡¡}n|| }Wntk �r|| }YnX| |7} | �r$| d8} n| | 7} | d7} qÆ| S)zfExpand shell variables of the forms $var, ${var} and %var%. Unknown variables are left unchanged.ó$ó%rNz_-Úasciió'ó{ó}Úenvironbú$ú%ú'ú{ú}rArQ)r9r:r0r1ÚstringZ ascii_lettersZdigitsÚgetattrrlrCrTr`rnÚfsdecoderm)r3rZvarcharsZquoteZpercentZbraceZrbraceZdollarrlÚresrTZpathlenÚcÚvarÚvaluer4r4r5rQs¼                         c CsPt |¡}t|tƒr*d}d}d}d}d}nd}d}d}d }d }| |¡rL|S| ||¡}t|ƒ\}}| |¡r€||7}| |¡}| |¡}d }|t |ƒk�r,||r°|||kr¸||=qŽ|||k�r"|d krú||d |krú||d |d …=|d 8}n&|d k�r|  |¡�r||=n|d 7}qŽ|d 7}qŽ|�sB|�sB|  |¡||  |¡S) z0Normalize path, eliminating double slashes, etc.r8r7rZó..)s\\.\r?rrrr)z\\.\r@rrA) r9r:r0r1rBr;r Úlstripr rCÚendswithÚappendr ) r3r!r$rr Zspecial_prefixesÚprefixÚcompsrWr4r4r5rÂsF             cCs@t |¡}t|ƒs8t|tƒr&t ¡}nt ¡}t||ƒ}t|ƒS)z¤Return the absolute version of a path as a fallback function in case `nt._getfullpathname` is not available or raises OSError. See bpo-31047 for more. ) r9r:r r0r1ÚgetcwdbÚgetcwdr r)r3Úcwdr4r4r5Ú_abspath_fallbackôs    r�)Ú_getfullpathnamec Cs4ztt|ƒƒWSttfk r.t|ƒYSXdS)z&Return the absolute version of a path.N)rr�r_r`r�r2r4r4r5r s)Ú_getfinalpathnameÚreadlinkc Cs²d}tƒ}t|ƒ|kr®| t|ƒ¡z:|}t|ƒ}t|ƒs\t|ƒsJ|}Wq®ttt|ƒ|ƒƒ}Wq t k r”}z|j |kr‚WY¢q®‚W5d}~XYq t k rªYq®Yq Xq |S)N) rArQrRééé é2éCéWi&i(i)) ÚsetrÚaddÚ _nt_readlinkr rrr rr_Úwinerrorr`)r3Úallowed_winerrorÚseenZold_pathÚexr4r4r5Ú_readlink_deeps&   r c CsÚd}d}|rÖzt|ƒ}|r$t||ƒn|WStk rÒ}zŒ|j|krF‚z0t|ƒ}||krt|rft||ƒn|WWY¢TSWntk rŠYnXt|ƒ\}}|r°|s°||WY¢S|r¾t||ƒn|}W5d}~XYqXq|S)N) rArQrRr“r”r•r–r—r˜é{i€i�rk)r‘r r_rœr r )r3r�rYrŸÚnew_pathÚnamer4r4r5Ú_getfinalpathname_nonstrictCs(   &r¤c Cs^t|ƒ}t|tƒrBd}d}d}t ¡}t|ƒtt t¡ƒkrjdSn(d}d}d}t ¡}t|ƒttƒkrjdS|  |¡}|sŠt |ƒsŠt ||ƒ}zt |ƒ}d }Wn0t k rÊ}z|j}t|ƒ}W5d}~XYnX|�sZ|  |¡�rZ|  |¡rþ||t|ƒd…}n|t|ƒd…}zt |ƒ|k�r"|}Wn4t k �rX}z|j|k�rH|}W5d}~XYnX|S) Nr?s\\?\UNC\s\\s\\.\NULr@z\\?\UNC\z\\z\\.\NULr)rr0r1r9rŒrrnr&r�rBr r r‘r_rœr¤rC) r3rŠZ unc_prefixZnew_unc_prefixrŽZ had_prefixZinitial_winerrorrŸZspathr4r4r5r'qsD      ÚgetwindowsversionrRrQc Csft |¡}t|tƒr"d}d}d}n d}d}d}|dkr:|}|sFtdƒ‚t |¡}zàtt|ƒƒ}tt|ƒƒ}t|ƒ\}}t|ƒ\} } t|ƒt| ƒkr¢td | |fƒ‚d d „|  |¡Dƒ} d d „|   |¡Dƒ} d } t | | ƒD]$\}}t|ƒt|ƒkrôqþ| d7} qØ|gt | ƒ| | | d…}|�s(|WSt |ŽWSt ttttfk �r`t d||¡‚YnXdS)z#Return a relative version of a pathr8rZr†rrrNzno path specifiedz&path is on mount %r, start on mount %rcSsg|] }|r|‘qSr4r4©Ú.0Úxr4r4r5Ú Âszrelpath..cSsg|] }|r|‘qSr4r4r¦r4r4r5r©ÃsrrAr))r9r:r0r1r`rrr rr ÚziprCr rHrIrJÚDeprecationWarningrKrL)r3Ústartr!rr Z start_absZpath_absZ start_driveZ start_restZ path_driveZ path_restÚ start_listÚ path_listrWZe1Ze2Úrel_listr4r4r5r)¦sJ       ÿ  c s¶|s tdƒ‚tttj|ƒƒ}t|dtƒr8d‰d‰d‰n d‰d‰d‰�z@‡‡fd d „|Dƒ}‡fd d „|Dƒ}zt‡fd d „|Dƒƒ\}Wntk r¨tdƒd‚YnXttdd „|DƒƒƒdkrÌtdƒ‚t |d  ˆˆ¡ƒ\}}|  ˆ¡}‡fdd „|Dƒ}‡fdd „|Dƒ}t |ƒ}t |ƒ}t|ƒD]*\} } | || k�r*|d| …}�qf�q*|dt|ƒ…}|�rt|ˆn|} | ˆ |¡WSttfk �r°tjd|žŽ‚YnXdS)zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencerr8r7rZrrrcs g|]}t| ˆˆ¡ ¡ƒ‘qSr4)r r;r<)r§rP)r$r!r4r5r©ïszcommonpath..csg|]\}}| ˆ¡‘qSr4r]©r§rVrP©r!r4r5r©ðsc3s"|]\}}|dd…ˆkVqdS)NrAr4r°r±r4r5Ú ószcommonpath..z%Can't mix absolute and relative pathsNcss|]\}}|VqdS)Nr4r°r4r4r5r²úsrAzPaths don't have the same drivecsg|]}|r|ˆkr|‘qSr4r4©r§rƒ©rr4r5r©ÿscsg|]}‡fdd„|Dƒ‘qS)csg|]}|r|ˆkr|‘qSr4r4r³r´r4r5r©sz)commonpath...r4)r§r>r´r4r5r©sr-)r-)r`ÚtuplerGr9r:r0r1r™rCr r;r ÚminÚmaxÚ enumerater rHrIrKrL) rMZ drivesplitsÚ split_pathsr rrr3ÚcommonÚs1Ús2rWrƒrŠr4)r$rr!r5r-ÞsF   )Ú_isdir)N)1Ú__doc__rr r%r!r"r$r#r&r9ÚsysrarKÚ__all__r6rr r r r r r[rrrrÚntrfÚ ImportErrorrrrrr�r�rr‘r’r›r'r r¤Úhasattrr¥r(r)r-r½rr4r4r4r5Ús²  ú /8   0q2  *.2 ÿ 84