a XC?hcn@sdZdZdZdZdZdZdZdZdZdd l Z dd l Z dd l Z dd l Z dd l Tgd Z d d ZddZddZddZddZddZddZe jje_ddZddZddZd d!Zzdd"lmZWneyd ZYn0d#d$Zd%d&Zd'd(Zd)d*Z d+d,Z!zdd-lm"Z"Wney.e!Z#Yn 0d.d/Z#zdd0lm$Z$m%Z&Wn"eynd1d2d3d4Z'Yn(0e(fd5d6Z)e(fd7d8Z*d1d2d9d4Z'e+e d:oe ,d;dZ.d?d@Z/zddAlm0Z1WneyYn0d S)CzCommon 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|trdSdSdS)N\/\/) isinstancebytespathr5+/opt/alt/python39/lib64/python3.9/ntpath.py _get_bothseps#s r7cCs8t|}t|tr$|ddS|ddSdS)zaNormalize case of pathname. Makes all characters lowercase and all slashes into backslashes./\rrN)osfspathr1r2replacelowersr5r5r6r-s  rcCsjt|}t|tr,|dddrBdSn|dddrBdSt|d}t|d koh|d t|vS) zTest whether a path is absoluter8r9\\?\Trr\\?\r) r:r;r1r2r< startswithr lenr7r>r5r5r6r >s   r c GsTt|}t|tr"d}d}d}n d}d}d}z|sD|dd|t|\}}ttj|D]~}t|\}} | r| d|vr|s|s|}| }q\n*|r||kr||kr|}| }q\|}|r|d|vr||}|| }q\|r|d|vr|r|dd|kr|||WS||WSttt fyNt j d |g|RYn0dS) Nr9r/:rr0:rr ) r:r;r1r2r mapr= TypeErrorAttributeError BytesWarning genericpath_check_arg_types) r4pathsr!sepscolonZ result_driveZ result_pathpZp_driveZp_pathr5r5r6r NsL       r cCst|}t|dkrt|tr0d}d}d}n d}d}d}|||}|dd|dkr|dd |kr||d}|d kr|d d|fS|||d }||d kr|d d|fS|d krt|}|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. r9r8rErrrFrrGNrB)r:r;rDr1r2r<find)rQr!r$rPZnormpindexZindex2r5r5r6r }s.   $  r cCsxt|}t|}t|\}}t|}|rD||d|vrD|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.rBN)r:r;r7r rDrstrip)rQrOdiheadtailr5r5r6r s   r cCs8t|}t|tr$t|dddSt|dddSdS)Nr9r8.rrr)r:r;r1r2rL _splitextrQr5r5r6r s  r cCs t|dS)z)Returns the final component of a pathnamerBr r]r5r5r6rsrcCs t|dS)z-Returns the directory component of a pathnamerr^r]r5r5r6rsrc Cs6zt|}Wntttfy(YdS0t|jS)zhTest whether a path is a symbolic link. This will always return false for Windows prior to 6.0. F)r:lstatOSError ValueErrorrJstatS_ISLNKst_moder4str5r5r6rs rc Cs,zt|}Wnttfy&YdS0dS)zCTest whether a path exists. Returns True for broken symbolic linksFT)r:r_r`rarer5r5r6rs r)_getvolumepathnamecCstt|}t|}t|}t|\}}|rD|d|vrD| pB||vS||vrPdStrl||t||kSdSdS)zaTest whether a path is a mount point (a drive root, the root of a share, or a mounted volume)rTFN)r:r;r7rr rgrV)r4rOrootrestr5r5r6rs  rcCst|}t|trd}nd}||s,|Sdt|}}||kr\||t|vr\|d7}q:dtjvrrtjd}nDdtjvr|Sztjd}Wntyd}Yn0t |tjd}t|trt |}|dkrt t ||d|}|||dS) zLExpand ~ and ~user constructs. If user or $HOME is unknown, do nothing.~~rBZ USERPROFILEZHOMEPATHZ HOMEDRIVEN) r:r;r1r2rCrDr7environKeyErrorr fsencoder)r4tilderXnuserhomedriver5r5r6r"s.           rcCs&t|}t|trhd|vr(d|vr(|Sddl}t|j|jdd}d}d}d}d }d}ttd d}nFd |vr|d |vr||Sddl}|j|jd}d }d }d}d}d }tj}|dd} d} t |} | | kr"|| | d} | |krV|| dd}t |} z&| | } | | |d| d7} Wn(t yP| | |7} | d} Yn0n| |krD|| d| d|kr| | 7} | d7} n|| dd}t |} z| |} Wn(t y| ||7} | d} Ynf0|d| } z.|dur t tjt | }n|| }Wn ty6|| |}Yn0| |7} n| |kr|| d| d|kr|| | 7} | d7} q|| d| d|krT|| dd}t |} z| |} Wn,t y| |||7} | d} Ynj0|d| } z.|durt tjt | }n|| }Wn$tyH||| |}Yn0| |7} n|dd} | d7} || | d} | r| |vr| | 7} | d7} || | d} qxz.|durt tjt | }n|| }Wnty|| }Yn0| |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$%'{}rBrR)r:r;r1r2stringZ ascii_lettersZdigitsgetattrrmrDrUrarofsdecodern)r4rZvarcharsZquoteZpercentZbraceZrbraceZdollarrmresrUZpathlencvarvaluer5r5r6rRs                         rc CsPt|}t|tr*d}d}d}d}d}nd}d}d}d }d }||rL|S|||}t|\}}||r||7}||}||}d }|t |kr,||r|||kr||=q|||kr"|d kr||d |kr||d |d =|d 8}n&|d kr| |r||=n|d 7}q|d 7}q|sB|sB| ||| |S) z0Normalize path, eliminating double slashes, etc.r9r8r[..)s\\.\r@rrrr)z\\.\rArrB) r:r;r1r2rCr<r lstripr rDendswithappendr ) r4r!r$rr Zspecial_prefixesprefixcompsrXr5r5r6rsF             rcCs@t|}t|s8t|tr&t}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 Cs2ztt|WSttfy,t|YS0dS)z&Return the absolute version of a path.N)rrr`rarr3r5r5r6r sr)_getfinalpathnamereadlinkF)strictcCst|SN)r)r4rr5r5r6r'sr'c Csd}t}t||vr|t|z:|}t|}t|s\t|sJ|}Wqttt||}Wq |y}z$|j |vrWYd}~qWYd}~q d}~0t yYqYq 0q |S)N) rBrRrS 2CWi&i(i)) setradd _nt_readlinkr rrr rwinerrorra)r4 ignored_errorallowed_winerrorseenZold_pathexr5r5r6_readlink_deeps&     rc Csd}d}|rzt|}|r$t||n|WS|y}z|j|vrDz8t||d}||krz|rht||n|WWYd}~SWn|yYn0t|\}}|r|s||WYd}~S|rt||n|}WYd}~qd}~00q|S)N) rBrRrSrrrrrr{iirlr)rr rrr )r4rrrZrnew_pathnamer5r5r6_getfinalpathname_nonstrictEs, $  *rc Cst|}t|trBd}d}d}t}t|tttkrjdSn(d}d}d}t}t|ttkrjdS| |}|t urt }d }n|rd }nt }|st |st||}zt|}d }Wn6|y} z| j}t||d }WYd} ~ n d} ~ 00|s| |r| |r&||t|d} n|t|d} zt| |krJ| }Wn6t y} z| j|krn| }WYd} ~ n d} ~ 00|S) Nr@s\\?\UNC\s\\s\\.\NULrAz\\?\UNC\z\\z\\.\NULTr5rr)rr1r2r:rrror&rrCr.FileNotFoundErrorr`r r rrrrD) r4rrZ unc_prefixZnew_unc_prefixrZ had_prefixrZinitial_winerrorrZspathr5r5r6r'tsT      getwindowsversionrSrRc Csdt|}t|tr"d}d}d}n d}d}d}|dur:|}|sFtdt|}ztt|}tt|}t|\}}t|\} } t|t| krtd | |fd d | |D} d d | |D} d } t | | D]$\}}t|t|krq| d7} q|gt | | | | d}|s(|WSt |WSt ttttfy^td||Yn0dS)z#Return a relative version of a pathr9r[rrrrNzno path specifiedz&path is on mount %r, start on mount %rcSsg|] }|r|qSr5r5.0xr5r5r6 zrelpath..cSsg|] }|r|qSr5r5rr5r5r6rrrrBr))r:r;r1r2rarrr rr ziprDr rIrJrKDeprecationWarningrLrM)r4startr!rr Z start_absZpath_absZ start_driveZ start_restZ path_driveZ path_rest start_list path_listrXZe1Ze2rel_listr5r5r6r)sH         r)c s|s tdtttj|}t|dtr8dddn dddz>fd d |D}fd d |D}ztfd d |D\}WntytddYn0ttdd |Ddkrtdt |d \}}| }fdd |D}fdd |D}t |}t |}t|D]*\} } | || kr(|d| }qdq(|dt|}|rr|n|} | |WSttfytjdg|RYn0dS)zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencerr9r8r[rrrcs g|]}t|qSr5)r r<r=)rrQ)r$r!r5r6rrzcommonpath..csg|]\}}|qSr5r^rrWrQr!r5r6rrc3s"|]\}}|ddkVqdS)NrBr5rrr5r6 rzcommonpath..z%Can't mix absolute and relative pathsNcss|]\}}|VqdSrr5rr5r5r6rrrBzPaths don't have the same drivecsg|]}|r|kr|qSr5r5rrrr5r6r rcsg|]}fdd|DqS)csg|]}|r|kr|qSr5r5rrr5r6rrz)commonpath...r5)rr?rr5r6rrr-)ratuplerHr:r;r1r2rrDr r<r minmax enumerater rIrJrLrM) rNZ drivesplits split_pathsr rsr4commons1s2rXrrr5)r$rr!r6r-sF    r-)_isdir)N)2__doc__rr r%r!r"r$r#r&r:sysrbrL__all__r7rr r r r r r\rrrrntrg ImportErrorrrrrrrrrrrr'r`rrhasattrrr(r)r-rrr5r5r5r6sp   /8    0q2  * /<  84