o ?Og)s@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)d*Z&d+d,Z'd-d.Z(zdd/l"m)Z)Wn eye(Z*Ynwd0d1Z*z dd2l"m+Z+m,Z-Wn eye*Z.Ynwd3d4Z/d5d6Z0d7d8d9d:Z.e1e d;oe 2d<d=kZ3dCd>d?Z4d@dAZ5z ddBl"m6Z7Wd SeyYd Sw)DzCommon 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 commonpathcCst|trdSdS)N\/\/) isinstancebytespathr4-/opt/alt/python310/lib64/python3.10/ntpath.py _get_bothseps#s r6) 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) osfspathr0r1sysgetfilesystemencodingdecodereplace_LCMapStringEx_LOCALE_NAME_INVARIANT_LCMAP_LOWERCASEencode)sencodingr4r4r5r3s    rcCs@t|}t|trtt|ddS|ddS)r:rr)r<r=r0r1fsencodefsdecoderAlowerrFr4r4r5rFs  cCsjt|}t|tr|dddrdSn |dddr!dSt|d}t|d ko4|d t|vS) zTest whether a path is absolute/\\\?\Trr\\?\r) r<r=r0r1rA startswithr lenr6rKr4r4r5r Ws   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) NrMr.:rr/:rr ) r<r=r0r1r maprJ TypeErrorAttributeError BytesWarning genericpath_check_arg_types) r3pathsr!sepscolonZ result_driveZ result_pathpZp_driveZp_pathr4r4r5r gsL       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. rMrLrSrrrTrrUNrP)r<r=rRr0r1rAfind)r_r!r$r^ZnormpindexZindex2r4r4r5r 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.rPN)r<r=r6r rRrstrip)r_r]diheadtailr4r4r5r s   r cCs4t|}t|trt|dddSt|dddS)NrMrL.rrr)r<r=r0r1rZ _splitextr_r4r4r5r s  r cC t|dS)z)Returns the final component of a pathnamerPr rkr4r4r5r rcCrl)z-Returns the directory component of a pathnamerrmrkr4r4r5rrnrc 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 ValueErrorrXstatS_ISLNKst_moder3str4r4r5rs  rc Cs*zt|}WdSttfyYdSw)zCTest whether a path exists. Returns True for broken symbolic linksFT)r<rorprqrur4r4r5r 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=r6rr rwrd)r3r]rootrestr4r4r5r 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.~~rPZ USERPROFILEZHOMEPATHZ HOMEDRIVEZUSERNAMEN)r<r=r0r1rQrRr6environKeyErrorr rIgetrrrH)r3tilderfnuserhomedriveZ target_userZ current_userr4r4r5r;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$%'{}rPr`)r<r=r0r1stringZ ascii_lettersZdigitsgetattrr}rRrcrqrHrIr~)r3rZvarcharsZquoteZpercentZbraceZrbraceZdollarr}resrcZpathlencvarvaluer4r4r5rxs                       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.rMrLri..)s\\.\rNrrrr)z\\.\rOrrP) r<r=r0r1rQrAr lstripr rRendswithappendr ) r3r!r$rr Zspecial_prefixesprefixcompsrfr4r4r5rsH              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 r0r1getcwdbgetcwdr r)r3cwdr4r4r5_abspath_fallbacks    r)_getfullpathnamec Cs.ztt|WSttfyt|YSw)z&Return the absolute version of a path.)rrrprqrr2r4r4r5r3s  r)_getfinalpathnamereadlinkc Csd}t}t||vrY|t|z|}t|}t|s/t|s&|}W|Sttt||}Wn"t yI}z |j |vrDWYd}~|Sd}~wt yRY|Swt||vs |S)N) rPr`ra 2CWi&i(i)) setradd _nt_readlinkr rrr rrpwinerrorrq)r3allowed_winerrorseenZold_pathexr4r4r5_readlink_deep@s4      rc Csd}d}|rqzt|}|rt||WS|WStyn}zM|j|vr#zt|}||kr<|r3t||n|WWYd}~SWn tyFYnwt|\}}|r[|s[||WYd}~S|rbt||n|}WYd}~nd}~ww|s|S)N)rPr`rarrrr5Arr{iir|)rr rprrr )r3rrhrnew_pathnamer4r4r5_getfinalpathname_nonstrictjs2    rF)strictc Csvt|}t|tr!d}d}d}t}t|tttkr dSnd}d}d}t}t|ttkr5dS| |}|sEt |sEt ||}zt |}d }Wnt yi}z|rX|j}t|}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) NrNs\\?\UNC\s\\s\\.\NULrOz\\?\UNC\z\\z\\.\NULr)rr0r1r<rrrHr&rrQr r rrprrrR) r3rrZ unc_prefixZnew_unc_prefixrZ had_prefixZinitial_winerrorrZspathr4r4r5r's^        r'getwindowsversionrar`c 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 pathrMrirrrrNzno path specifiedz&path is on mount %r, start on mount %rcSg|]}|r|qSr4r4.0xr4r4r5 zrelpath..cSrr4r4rr4r4r5rrrrPr))r<r=r0r1rqrrr rr ziprRr rWrXrYDeprecationWarningrZr[)r3startr!rr Z start_absZpath_absZ start_driveZ start_restZ path_driveZ path_rest start_list path_listrfZe1Ze2rel_listr4r4r5r)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 sequencerrMrLrirrrcs g|] }t|qSr4)r rArJ)rr_)r$r!r4r5rs zcommonpath..csg|] \}}|qSr4rmrrer_r!r4r5rsc3s$|] \}}|ddkVqdS)NrPr4rrr4r5 s"zcommonpath..z%Can't mix absolute and relative pathsNcss|]\}}|VqdSNr4rr4r4r5r&srPzPaths don't have the same drivecg|] }|r|kr|qSr4r4rrrr4r5r+csg|] }fdd|DqS)crr4r4rrr4r5r-rz)commonpath...r4)rrFrr4r5r-sr-)rqtuplerVr<r=r0r1rrRr rAr minmax enumerater rWrXrZr[) r\Z drivesplits split_pathsr rr3commons1s2rfrrr4)r$rr!r5r- sL     r-)_isdirr)8__doc__rr r%r!r"r$r#r&r<r>rrrZ__all__r6Z_winapir7rBr8rCr9rDr ImportErrorr r r r r rjrrrrntrwrrrrrrrrrrr'rrhasattrrr(r)r-rrr4r4r4r5s     /8   =q2  *1 4 84