o 0ixm@s(dZdZdZdZdZdZdZdZdZdd 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)Z&d a'd a(d*d+Z)d,d-Z*d.d/Z+zdd0l"m,Z,Wn eye+Z-Ynwd1d2Z-z dd3l"m.Z.m/Z0Wneyd4d5d6d7Z1Ynwe2fd8d9Z3e2fd:d;Z4d4d5dd?kZ7dEd@dAZ8dBdCZ9z ddDl"m:Z;Wd SeyYd Sw)FzCommon 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@              rz.'[^']*'?|%(%|[^%]*%?)|\$(\$|[-\w]+|\{[^}]*\}?)cst|}t|tr5d|vrd|vr|Sts$ddl}|t|j j at}ddddt tddn%d|vr?d |vr?|St sMddl}|t|j j a t }d d d dtj fd d }|||S)zfExpand shell variables of the forms $var, ${var} and %var%. Unknown variables are left unchanged.$%rN{}environb$%{}cs|j}|dur |dS||}|dkr)|kr|S|s"|dS|dd}n|kr/|S|rC|s=|dS|dd}zdurTttjt|WS|WStye|dYSw)NrrQrV) lastindexendswithrRr=rIr~rJr)mrnameZbraceZdollarr~ZpercentZrbracer5r6repls.       zexpandvars..repl)r=r>r1r2_varsubbrecompile _varpatternrFASCIIsubgetattr_varsubr~)r4rrrr5rr6r}s4   rc 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 rSrappendr ) 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.)rrrqrrrr3r5r5r6rs  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_deeps4      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_pathrr5r5r6_getfinalpathname_nonstrict@s6    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'rsj        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!r5r6rs zcommonpath..csg|] \}}|qSr5rnrrfr`r!r5r6rsc3s$|] \}}|ddkVqdS)NrQr5rrr5r6 s"zcommonpath..z%Can't mix absolute and relative pathsNcss|]\}}|VqdSrr5rr5r5r6rsrQzPaths don't have the same drivecg|] }|r|kr|qSr5r5rcrr5r6r csg|] }fdd|DqS)crr5r5rrr5r6r rz)commonpath...r5)rrGrr5r6r sr-)rrtuplerWr=r>r1r2rrSr rBr minmax enumerater rXrYr[r\) r]Z drivesplits split_pathsr rr4commons1s2rgrrr5)r$rr!r6r-sL     r-)_isdirr)<__doc__rr r%r!r"r$r#r&r=r?rsr[__all__r7Z_winapir8rCr9rDr:rEr ImportErrorr r r r r rkrrrrntrxrrrrrrrrrrrrrr'rqrrhasattrrr(r)r-rrr5r5r5r6s      /8   =A2    *2 < 84