o =?ht@sdZdZdZdZdZdZdZdZdZdd l Z dd l Z dd l Z dd l Z dd l Tgd Z d d ZzddlmZmZmZddZWn eyKddZYnwddZddZddZddZddZe jje_ddZddZd d!Z d"d#Z!zdd$l"m#Z#Wn eyd Z#Ynwd%d&Z$d'd(Z%d)d*Z&d+d,Z'd-d.Z(zdd/l"m)Z)Wn eye(Z*Ynwd0d1Z*z dd2l"m+Z+m,Z-Wneyd3d4d5d6Z.Ynwe/fd7d8Z0e/fd9d:Z1d3d4d;d6Z.e2e d<oe 3d=d>kZ4dDd?d@Z5dAdBZ6z ddCl"m7Z8Wd Sey Yd Sw)EzCommon pathname manipulations, WindowsNT/95 version. Instead of importing this module directly, import os and refer to this module as os.path. ...\;/z.;C:\binZnulN)*)'normcaseisabsjoin splitdrivesplitsplitextbasenamedirname commonprefixgetsizegetmtimegetatimegetctimeislinkexistslexistsisdirisfileismount expanduser expandvarsnormpathabspathcurdirpardirseppathsepdefpathaltsepextsepdevnullrealpathsupports_unicode_filenamesrelpathsamefile sameopenfilesamestat commonpath ALLOW_MISSINGcCst|trdSdS)N\/\/) isinstancebytespathr5-/opt/alt/python310/lib64/python3.10/ntpath.py _get_bothseps$s r7) LCMapStringExLOCALE_NAME_INVARIANTLCMAP_LOWERCASEcCsdt|}|s |St|tr(t}||ddd}tt t |}| |dStt t |ddS)nNormalize case of pathname. Makes all characters lowercase and all slashes into backslashes. surrogateescaperr) osfspathr1r2sysgetfilesystemencodingdecodereplace_LCMapStringEx_LOCALE_NAME_INVARIANT_LCMAP_LOWERCASEencode)sencodingr5r5r6r4s    rcCs@t|}t|trtt|ddS|ddS)r;rr)r=r>r1r2fsencodefsdecoderBlowerrGr5r5r6rGs  cCsjt|}t|tr|dddrdSn |dddr!dSt|d}t|d ko4|d t|vS) zTest whether a path is absolute/\\\?\Trr\\?\r) r=r>r1r2rB startswithr lenr7rLr5r5r6r Xs   r c Gs@t|}t|trd}d}d}nd}d}d}zs|s"|dd|t|\}}ttj|D]>}t|\}} | rG| d|vrG|sB|sD|}| }q.|r\||kr\||krZ|}| }q.|}|rh|d|vrh||}|| }q.|r|d|vr|r|dd|kr|||WS||WSttt fyt j d |g|Rw) NrNr/:rr0:rr ) r=r>r1r2r maprK TypeErrorAttributeError BytesWarning genericpath_check_arg_types) r4pathsr!sepscolonZ result_driveZ result_pathpZp_driveZp_pathr5r5r6r hsL       r cCst|}t|dkrt|trd}d}d}nd}d}d}|||}|dd|dkrq|dd |krq||d}|d krG|d d|fS|||d }||d kr]|d d|fS|d kret|}|d |||d fS|d d|kr|d d|dd fS|d d|fS) aSplit 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. rNrMrTrrrUrrVNrQ)r=r>rSr1r2rBfind)r`r!r$r_ZnormpindexZindex2r5r5r6r s.    $  r cCst|}t|}t|\}}t|}|r+||d|vr+|d8}|r+||d|vs|d|||d}}||p>|}|||fS)z~Split a pathname. Return tuple (head, tail) where tail is everything after the final slash. Either part may be empty.rQN)r=r>r7r rSrstrip)r`r^diheadtailr5r5r6r s   r cCs4t|}t|trt|dddSt|dddS)NrNrM.rrr)r=r>r1r2r[ _splitextr`r5r5r6r s  r cC t|dS)z)Returns the final component of a pathnamerQr rlr5r5r6r rcCrm)z-Returns the directory component of a pathnamerrnrlr5r5r6rrorc Cs6zt|}Wn tttfyYdSwt|jS)zhTest whether a path is a symbolic link. This will always return false for Windows prior to 6.0. F)r=lstatOSError ValueErrorrYstatS_ISLNKst_moder4str5r5r6rs  rc Cs*zt|}WdSttfyYdSw)zCTest whether a path exists. Returns True for broken symbolic linksFT)r=rprqrrrvr5r5r6r s  r)_getvolumepathnamecCspt|}t|}t|}t|\}}|r"|d|vr"| p!||vS||vr(dStr6||t||kSdS)zaTest whether a path is a mount point (a drive root, the root of a share, or a mounted volume)rTF)r=r>r7rr rxre)r4r^rootrestr5r5r6r!s  rcCsJt|}t|tr d}nd}||s|Sdt|}}||kr9||t|vr9|d7}||kr9||t|vs)dtjvrDtjd}n"dtjvrK|Sztjd}Wn ty]d}Ynwt |tjd}|dkr|d|}t|trzt |}tj d}||kr|t |kr|St t ||}t|trt|}|||d S) zLExpand ~ and ~user constructs. If user or $HOME is unknown, do nothing.~~rQZ USERPROFILEZHOMEPATHZ HOMEDRIVEZUSERNAMEN)r=r>r1r2rRrSr7environKeyErrorr rJgetrrrI)r4tildergnuserhomedriveZ target_userZ current_userr5r5r6r<s@              rcCs0t|}t|tr4d|vrd|vr|Sddl}t|j|jdd}d}d}d}d }d}ttd d}n#d |vr>d |vr>|Sddl}|j|jd}d }d }d}d}d }tj}|dd} d} t |} | | kr|| | d} | |kr|| dd}t |} z| | } | | |d| d7} Wnyt y| | |7} | d} Ynfw| |kr|| d| d|kr| | 7} | d7} nJ|| dd}t |} z| |} Wnt y| ||7} | d} Yn#w|d| } z|durt tjt | }n|| }Wnty|| |}Ynw| |7} n| |kr || d| d|kr:| | 7} | d7} n|| d| d|kr|| dd}t |} z| |} Wnt yp| |||7} | d} Ynw|d| } z|durt tjt | }n|| }Wnty||| |}Ynw| |7} nh|dd} | d7} || | d} | r| |vr| | 7} | d7} || | d} | r| |vsz|durt tjt | }n|| }Wnty|| }Ynw| |7} | r | d8} n| | 7} | d7} | | ksh| S)zfExpand shell variables of the forms $var, ${var} and %var%. Unknown variables are left unchanged.$%rNz_-ascii'{}environb$%'{}rQra)r=r>r1r2stringZ ascii_lettersZdigitsgetattrr~rSrdrrrIrJr)r4rZvarcharsZquoteZpercentZbraceZrbraceZdollarr~resrdZpathlencvarvaluer5r5r6rys                       Lrc CsNt|}t|trd}d}d}d}d}n d}d}d}d }d }||r&|S|||}t|\}}||r@||7}||}||}d }|t |kr||rW|||kr[||=n6|||kr|d kr{||d |kr{||d |d =|d 8}n|d kr| |r||=n |d 7}n|d 7}|t |ksM|s|s| ||| |S) z0Normalize path, eliminating double slashes, etc.rNrMrj..)s\\.\rOrrrr)z\\.\rPrrQ) r=r>r1r2rRrBr lstripr rSendswithappendr ) r4r!r$rr Zspecial_prefixesprefixcompsrgr5r5r6rsH              rcCs@t|}t|st|trt}nt}t||}t|S)zReturn 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. ) r=r>r r1r2getcwdbgetcwdr r)r4cwdr5r5r6_abspath_fallbacks    r)_getfullpathnamec Cs.ztt|WSttfyt|YSw)z&Return the absolute version of a path.)rrrqrrrr3r5r5r6r4s  r)_getfinalpathnamereadlinkF)strictcCst|SN)r)r4rr5r5r6r'?sr'c Csd}t}t||vrY|t|z|}t|}t|s/t|s&|}W|Sttt||}Wn"|yI}z |j |vrDWYd}~|Sd}~wt yRY|Swt||vs |S)N) rQrarb 2CWi&i(i)) setradd _nt_readlinkr rrr rwinerrorrr)r4 ignored_errorallowed_winerrorseenZold_pathexr5r5r6_readlink_deepBs4      rc Csd}d}|rszt|}|rt||WS|WS|yp}zO|j|vr#zt||d}||kr>|r5t||n|WWYd}~SWn |yHYnwt|\}}|r]|s]||WYd}~S|rdt||n|}WYd}~nd}~ww|s|S)N)rQrarbrrrr5Arr{iir}r)rr rrr )r4rrrirnew_pathnamer5r5r6_getfinalpathname_nonstrictls6    rc Cst|}t|tr!d}d}d}t}t|tttkr dSnd}d}d}t}t|ttkr5dS| |}|t urCt }d }n|rHd }nt }|sUt |sUt||}zt|}d }Wn|yx} z| j}t||d }WYd} ~ nd} ~ ww|s| |r| |r||t|d} n|t|d} zt| |kr| }W|SW|St y} z| j|kr| }WYd} ~ |SWYd} ~ |Sd} ~ ww|S) NrOs\\?\UNC\s\\s\\.\NULrPz\\?\UNC\z\\z\\.\NULTr5rr)rr1r2r=rrrIr&rrRr.FileNotFoundErrorrqr r rrrrS) r4rrZ unc_prefixZnew_unc_prefixrZ had_prefixrZinitial_winerrorrZspathr5r5r6r'sj        getwindowsversionrbrac CsXt|}t|trd}d}d}nd}d}d}|dur|}|s#tdt|}zott|}tt|}t|\}}t|\} } t|t| krQtd | |fd d | |D} d d | |D} d } t | | D]\}}t|t|krzn| d7} ql|gt | | | | d}|s|WSt |WSt ttttfytd||w)z#Return a relative version of a pathrNrjrrrrNzno path specifiedz&path is on mount %r, start on mount %rcSg|]}|r|qSr5r5.0xr5r5r6 zrelpath..cSrr5r5rr5r5r6rrrrQr))r=r>r1r2rrrrr rr ziprSr rXrYrZDeprecationWarningr[r\)r4startr!rr Z start_absZpath_absZ start_driveZ start_restZ path_driveZ path_rest start_list path_listrgZe1Ze2rel_listr5r5r6r)sJ         r)c s|stdtttj|}t|dtrdddndddzfd d |D}fd d |D}ztfd d |D\}Wn tyPtddwttdd |Ddkrbtdt |d \}}| }fdd |D}fdd |D}t |}t |}t|D]\} } | || kr|d| }n q|dt|}|r|n|} | |WSttfytjdg|Rw)zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencerrNrMrjrrrcs g|] }t|qSr5)r rBrK)rr`)r$r!r5r6r&s zcommonpath..csg|] \}}|qSr5rnrrfr`r!r5r6r'sc3s$|] \}}|ddkVqdS)NrQr5rrr5r6 *s"zcommonpath..z%Can't mix absolute and relative pathsNcss|]\}}|VqdSrr5rr5r5r6r1srQzPaths don't have the same drivecg|] }|r|kr|qSr5r5rrrr5r6r6csg|] }fdd|DqS)crr5r5rrr5r6r8rz)commonpath...r5)rrGrr5r6r8sr-)rrtuplerWr=r>r1r2rrSr rBr minmax enumerater rXrYr[r\) r]Z drivesplits split_pathsr rr4commons1s2rgrrr5)r$rr!r6r-sL     r-)_isdirr)9__doc__rr r%r!r"r$r#r&r=r?rsr[__all__r7Z_winapir8rCr9rDr:rEr ImportErrorr r r r r rkrrrrntrxrrrrrrrrrrr'rqrrhasattrrr(r)r-rrr5r5r5r6s      /8   =q2    *2 < 84