
    Rh|                        d Z dZdZdZdZdZdZdZdZdd	l	Z	dd	l
Z
dd	lZdd	lZdd
l g dZd Z	 ddlmZmZmZ d Zd Zd Zd Zd Zd Zd Zej<                  j                   e_         d Zd Z  e!e	jD                  d      rd Z#nd Z#d Z$	 ddl%m&Z& d Z'd Z(d Z)	 dd l%m*Z* d! Z+d# Z,	 dd$l%m-Z- d% Z.	 dd&l%m/Z/m0Z1 e2fd'Z3e2fd(Z4d)d*d+Z5d-Z6d7d.Z7d/ Z8	 dd0l%m9Z: dd1l%m;Z< dd2l%m=Z> dd3l%m?Z@ 	 dd4l%mAZA d5 ZBy	# e$ r d ZY w xY w# e$ r d	Z&Y }w xY w# e$ r d" Z+Y xw xY w# e$ r e,Z.Y xw xY w# e$ r	 d)d*d,Z5Y pw xY w# e$ r Y Yw xY w# e$ r d6 ZBY y	w xY w)8zCommon pathname manipulations, WindowsNT/95 version.

Instead of importing this module directly, import os and refer to this
module as os.path.
...\;/z.;C:\binnul    N)*))normcaseisabsjoin
splitdrive	splitroot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
commonpath
isjunctionALLOW_MISSINGc                 &    t        | t              ryy)N   \/\/)
isinstancebytespaths    /usr/lib/python3.12/ntpath.py_get_bothsepsr;   $   s    $    )LCMapStringExLOCALE_NAME_INVARIANTLCMAP_LOWERCASEc                 X   t        j                  |       } | s| S t        | t              r]t	        j
                         }| j                  |d      j                  dd      } t        t        t        |       } | j                  |d      S t        t        t        | j                  dd            S )nNormalize case of pathname.

        Makes all characters lowercase and all slashes into backslashes.
        surrogateescaper   r   )osfspathr6   r7   sysgetfilesystemencodingdecodereplace_LCMapStringEx_LOCALE_NAME_INVARIANT_LCMAP_LOWERCASEencode)sencodings     r:   r
   r
   4   s    
 IIaLHa002H#45==c4HA5/4A88H&788!"8"2"#))C"68 8r<   c                    t        j                  |       } t        | t              rFt        j                  t        j
                  |       j                  dd      j                               S | j                  dd      j                         S )rA   r   r   )rC   rD   r6   r7   fsencodefsdecoderH   lower)rM   s    r:   r
   r
   G   sb    
 IIaLa;;r{{1~55c4@FFHIIyyd#))++r<   c                     t        j                  |       } t        | t              rd}d}d}nd}d}d}| dd j	                  ||      } | j                  |      s| j                  |d	      ry
y)zTest whether a path is absolute   \   /s   :\r   r   z:\N      TF)rC   rD   r6   r7   rH   
startswith)rM   r$   r'   	colon_seps       r:   r   r   X   sn    
		!A!U			"1fc"A 	||CALLA6r<   c                 8   t        j                  |       } t        | t              rd}d}d}nd}d}d}	 |s| d d |z    t	        |       \  }}}t        t         j                  |      D ]b  }t	        |      \  }	}
}|
r|	s|s|	}|
}|}|	r/|	|k7  r*|	j                         |j                         k7  r|	}|
}|}N|	}|r|d   |vr||z   }||z   }d |r|s|r|dd  ||z   vr||z   |z   S ||z   |z   S # t        t        t        f$ r t        j                  d	| g|   w xY w)
NrT   r4      :r   r5   :r   r   )rC   rD   r6   r7   r   maprR   	TypeErrorAttributeErrorBytesWarninggenericpath_check_arg_types)r9   pathsr$   sepscolonresult_driveresult_rootresult_pathpp_drivep_rootp_paths               r:   r   r   l   sd   99T?D$!!HsN1:4.k;RYY& 	/A&/l#GVV,#*L$$W4==?l&8&8&::#*L"(K"(K&{2d:)C/%.K+	/. \"#.edlB#%33k)K77~|4 $$VT:E:s   B/C, $C, ,-Dc                 .    t        |       \  }}}|||z   fS )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.

    )r   )rj   driveroottails       r:   r   r      s#    & "!E4$+r<   c                    t        j                  |       } t        | t              rd}d}d}d}d}n
d}d}d}d	}d
}| j	                  ||      }|dd |k(  r||dd |k(  ri|dd j                         |k(  rdnd}|j                  ||      }|dk(  r| ||fS |j                  ||dz         }	|	dk(  r| ||fS | d|	 | |	|	dz    | |	dz   d fS || dd | dd fS |dd |k(  r!|dd |k(  r| dd | dd | dd fS | dd || dd fS ||| fS )a  Split a pathname into drive, root and tail. The drive is defined
    exactly as in splitdrive(). On Windows, the root may be a single path
    separator or an empty string. The tail contains anything after the root.
    For example:

        splitroot('//server/share/') == ('//server/share', '/', '')
        splitroot('C:/Users/Barney') == ('C:', '/', 'Users/Barney')
        splitroot('C:///spam///ham') == ('C:', '/', '//spam///ham')
        splitroot('Windows/notepad') == ('', '', 'Windows/notepad')
    rT   rU   r[      \\?\UNC\r<   r   r   r\   \\?\UNC\ NrW         r]   rV   )rC   rD   r6   r7   rH   upperfind)
rj   r$   r'   rf   
unc_prefixemptynormpstartindexindex2s
             r:   r   r      s    			!A!U$
#
IIfc"ERayC1: r*j8AaEJJsE*E{%&ZZUQY/F|%&Wf:q
3Qvz{^CC !BQ%12&&	qu	1:Ra5!Aa&!AB%'' Ra5%12&& eQr<   c                     t        j                  |       } t        |       }t        |       \  }}} t	        |       }|r| |dz
     |vr|dz  }|r| |dz
     |vr| d| | |d }}||z   |j                  |      z   |fS )z~Split a pathname.

    Return tuple (head, tail) where tail is everything after the final slash.
    Either part may be empty.rW   N)rC   rD   r;   r   lenrstrip)rj   re   driheadrq   s          r:   r   r      s    
 			!ADlGAq!AA
!A#d"	Q !A#d"2A!"$Dq54;;t$$d**r<   c                     t        j                  |       } t        | t              rt	        j
                  | ddd      S t	        j
                  | ddd      S )NrT   rU      .r   r   r   )rC   rD   r6   r7   rb   	_splitextrj   s    r:   r   r     sG    
		!A!U$$QtT::$$Qc377r<   c                     t        |       d   S )z)Returns the final component of a pathnamerW   r   r   s    r:   r   r         8A;r<   c                     t        |       d   S )z-Returns the directory component of a pathnamer   r   r   s    r:   r   r     r   r<   st_reparse_tagc                     	 t        j                  |       }t        |j                  t        j                  k(        S # t        t        t        f$ r Y yw xY wz!Test whether a path is a junctionF)	rC   lstatOSError
ValueErrorr`   boolr   statIO_REPARSE_TAG_MOUNT_POINTr9   sts     r:   r1   r1     sM    	$B B%%)H)HHII ^4 		s   = AAc                 .    t        j                  |        yr   )rC   rD   r8   s    r:   r1   r1   $  s    
		$r<   c                 Z    	 t        j                  |       }y# t        t        f$ r Y yw xY w)zCTest whether a path exists.  Returns True for broken symbolic linksFT)rC   r   r   r   r   s     r:   r   r   ,  s2    XXd^  Z  s    **)_getvolumepathnamec                 >   t        j                  |       } t        |       }t        |       } t	        |       \  }}}|r
|d   |v r| S |r|syt
        rL| j                  |      }t        |       j                  |      }|j                         |j                         k(  S y)zaTest whether a path is a mount point (a drive root, the root of a
    share, or a mounted volume)r   TF)rC   rD   r;   r!   r   r   r   casefold)r9   re   ro   rp   restxys          r:   r   r   B  s     99T?DD4=D!$E4qT!xDKKd#**40zz|qzz|++r<   c                 8   t        j                  |       } t        | t              rd}nd}| j	                  |      s| S dt        |       }}||k  r+| |   t        |       vr|dz  }||k  r| |   t        |       vrdt         j                  v rt         j                  d   }nEdt         j                  vr| S 	 t         j                  d   }t        |t         j                  d         }|dk7  rs| d| }t        |t              rt        j                  |      }t         j                  j                  d      }||k7  r%|t        |      k7  r| S t        t        |      |      }t        | t              rt        j                  |      }|| |d	 z   S # t        $ r d}Y w xY w)
zLExpand ~ and ~user constructs.

    If user or $HOME is unknown, do nothing.   ~~rW   USERPROFILEHOMEPATH	HOMEDRIVEru   USERNAMEN)rC   rD   r6   r7   rX   r   r;   environKeyErrorr   rQ   getr   r   rP   )r9   tilder   nuserhomero   target_usercurrent_users           r:   r   r   _  s{    99T?D$??5!c$iqA
a%DG=#66	Q a%DG=#66 

"::m,2::%	JJ{+E rzz*56Av1Qik5)++k2Kzz~~j1,& x11GH-{;H$;;x(d12h/  	E	s   6F FFc                    t        j                  |       } t        | t              rPd| vrd| vr| S ddl}t        |j
                  |j                  z   dz   d      }d}d}d}d	}d}t        t         d
d      }nDd| vrd| vr| S ddl}|j
                  |j                  z   dz   }d}d}d}d}d}t         j                  }| dd }	d}
t        |       }|
|k  r| |
|
dz    }||k(  r5| |
dz   d } t        |       }	 | j                  |      }
|	|| d|
dz    z   z  }	n||k(  r| |
dz   |
dz    |k(  r|	|z  }	|
dz  }
n| |
dz   d } t        |       }	 | j                  |      }
| d|
 }	 |:t        j                  t         j                  t        j                  |               }n||   }|	|z  }	n%||k(  r| |
dz   |
dz    |k(  r|	|z  }	|
dz  }
n| |
dz   |
dz    |k(  rr| |
dz   d } t        |       }	 | j                  |      }
| d|
 }	 |:t        j                  t         j                  t        j                  |               }n||   }|	|z  }	n| dd }|
dz  }
| |
|
dz    }|r||v r||z  }|
dz  }
| |
|
dz    }|r||v r	 |:t        j                  t         j                  t        j                  |               }n||   }|	|z  }	|r|
dz  }
n|	|z  }	|
dz  }
|
|k  r|	S # t        $ r |	|| z   z  }	|dz
  }
Y &w xY w# t        $ r ||z   |z   }Y jw xY w# t        $ r |	|| z   z  }	|dz
  }
Y Zw xY w# t        $ r ||z   |z   |z   }Y w xY w# t        $ r |	||z   | z   z  }	|dz
  }
Y w xY w# t        $ r ||z   }Y w xY w)zfExpand shell variables of the forms $var, ${var} and %var%.

    Unknown variables are left unchanged.   $   %r   Nz_-ascii   '   {   }environb$%'{}rW   rv   )rC   rD   r6   r7   stringascii_lettersdigitsgetattrr   r   r~   r   rP   rQ   r   )r9   r   varcharsquotepercentbracerbracedollarr   resr~   pathlencvarvalues                  r:   r   r     sH    99T?D$tD 0K--=DgN"j$/d?s$K''&--7$>**
r(CE$iG
'/uQw:	
#D$iG$

1q4
+++ '\EAIeai(G3q
E!GH~d)! JJw/E
 v,C8"?$&KK

2;;s;K0L$ME$+CLE 5LC&[EAIeai(F2q
eai	*e3E!GH~d)! JJv.E
 v,C>"?$&KK

2;;s;K0L$ME$+CLE 5LC2Ah
uqy)AM1HCQJEU519-A AM) "BJJr{{37G,H I ' uQJE1HC
W '/X JI  $q4x!$, $ 8 '# 78 " (7T>)C#aKE(@ $ > & 4v => " (6E>D00C#aKE(4   )"SLE)so   3K L AK5 (M ?AL) 8AM" K21K25L
	L
L&%L&)M ?M MM"M32M3)_path_normpathc                     t        j                  |       } t        | t              r5t        j                  t        t        j                  |                   xs dS t        |       xs dS )0Normalize path, eliminating double slashes, etc.r   r   )rC   rD   r6   r7   rP   r   rQ   r8   s    r:   r    r    5  sK    yydE";;~bkk$.?@AITId#*s*r<   c                    t        j                  |       } t        | t              r	d}d}d}d}nd}d}d}d}| j	                  ||      } t        |       \  }}} ||z   }| j                  |      }d	}	|	t        |      k  r_||	   r||	   |k(  r||	= n?||	   |k(  r2|	d	kD  r||	d
z
     |k7  r||	d
z
  |	d
z   = |	d
z  }	n|	d	k(  r|r||	= n|	d
z  }	n|	d
z  }	|	t        |      k  r_|s|s|j                  |       ||j                  |      z   S )r   rT   rU   r      ..r   r   r   r   r   rW   )
rC   rD   r6   r7   rH   r   r   r   appendr   )
r9   r$   r'   r"   r#   ro   rp   prefixcompsr   s
             r:   r    r      s3   yydE"CFFFCFFF||FC(%dOtT

3#e*n8uQx61!HqV#q5U1Q3Z61ac!A#gFA!VaFAQ #e*n eLL ''r<   c                     t        j                  |       } t        |       sEt        | t              rt        j
                         }nt        j                         }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.

    )	rC   rD   r   r6   r7   getcwdbgetcwdr   r    )r9   cwds     r:   _abspath_fallbackr   =  sM     99T?D;dE"**,C))+CCD>r<   )_getfullpathnamec                 l    	 t        t        |             S # t        t        f$ r t	        |       cY S w xY w)z&Return the absolute version of a path.)r   r    r   r   r   r8   s    r:   r!   r!   U  s5    	+#HTN33$ 	+$T**	+s    33)_getfinalpathnamereadlinkc                 p   d}t               }t        |       |vro|j                  t        |              	 | }t        |       } t	        |       s.t        |      s|} 	 | S t        t        t        |      |             } t        |       |vro| S # |$ r}|j                  |v rY d }~| S  d }~wt        $ r Y | S w xY w)N)rW   rv   rV             2   C   W   i&  i(  i)  )setr
   add_nt_readlinkr   r   r    r   r   winerrorr   )r9   ignored_errorallowed_winerrorseenold_pathexs         r:   _readlink_deepr   c  s     LutnD(HHXd^$#D) T{ "(+'  $D):D$ABD tnD(,  ! ;;"22
 	  s)   %B B B5B%$B%%B54B5c                 Z   d}| d d }| r	 t        |       } |rt        | |      S | S |S # |$ ry}|j                  |vr 	 t        | |      }|| k7  r|rt        ||      n|cY d }~S n# |$ r Y nw xY wt	        |       \  } }| r|s
| |z   cY d }~S |rt        ||      n|}Y d }~nd }~ww xY w| r)N)rW   rv   rV   r   r   r   r   5   A   r   r   {      i  i  r   r   )r   r   r   r   r   )r9   r   r   rq   r   new_pathnames          r:   _getfinalpathname_nonstrictr     s    $ X BQx:(.+/tD$'9T9, + ! :;;&66
  .d<I KH4'7;tHd3I ($  #4[
d $;&+/tD$'T):	 sM   ( ( B&B!!A%B&$B!%A-*B!,A--B!B&B!!B&F)strictc                   t        |       } t        | t              rId}d}d}t        j                         }t        |       t        t        j                  t                    k(  r7yd}d}d}t        j                         }t        |       t        t              k(  ry| j                  |      }|t        u r	t        }d	}n|rd
}nt        }|st        |       st        ||       } 	 t        |       } d}|sU| j                  |      rD| j                  |      r|| t)        |      d  z   }
n| t)        |      d  }
	 t        |
      | k(  r|
} | S | S # t         $ r,}	|rt        t#        |	            d t        |       } Y d }	~	d }	~	w|$ r#}	|	j$                  }t'        | |      } Y d }	~	d }	~	ww xY w# t         $ r}	Y d }	~	| S d }	~	wt        $ r}	|	j$                  k(  r|
} Y d }	~	| S d }	~	ww xY w)Ns   \\?\rs   s   \\s   \\.\NULz\\?\rt   z\\z\\.\NULT r   r   )r    r6   r7   rC   r   r
   rP   r)   r   rX   r2   FileNotFoundErrorr   r   r   r   r   strr   r   r   )r9   r   r   rz   new_unc_prefixr   
had_prefixr   initial_winerrorr   spaths              r:   r*   r*     s   ~dE"F(J$N**,C~"++g*>!??$F'J#N))+C~'!22#__V,
]"-MFM#M%+T?D	L$T*D   doof5 z*&c*o.>)??S[\*!$U+t3 D tG  	"
 c"g&D0D>D 	L!{{.t=JLD	L$      ! ;;"22 D!sB   "E 4F& 	F#"E88F# FF#&	G5GGGc                    t        |       S N)r!   )r9   r   s     r:   r*   r*   `  s    t}r<   Tc                 L   t        j                  |       } t        | t              rd}d}d}nd}d}d}||}| st	        d      t        j                  |      }	 t        t        |            }t        t        |             }t        |      \  }}}	t        |      \  }
}}t        |      t        |
      k7  rt	        d	|
d
|      |	j                  |      D cg c]  }|s|	 }}|j                  |      D cg c]  }|s|	 }}d}t        ||      D ]#  \  }}t        |      t        |      k7  r n|dz  }% |gt        |      |z
  z  ||d z   }|s|S t        | S c c}w c c}w # t        t        t        t        t         f$ r t#        j$                  d| |        w xY w)z#Return a relative version of a pathrT   r   r   r   r   r   Nzno path specifiedzpath is on mount z, start on mount r   rW   r,   )rC   rD   r6   r7   r   r!   r    r   r
   r   zipr   r   r_   r`   ra   DeprecationWarningrb   rc   )r9   r}   r$   r"   r#   	start_abspath_absstart_drive_
start_rest
path_drive	path_restr   
start_list	path_listr   e1e2rel_lists                      r:   r,   r,   	  s   99T?D$},--IIeEHUO,	8D>*%.y%9"Q
#,X#6 
AyK HZ$88K) * * ",!1!1#!6<A!a<
< ) 4:1Q:	:*i0 	FB|x|+FA	
 8s:q01IabMAMX =: z><AST $$Ye<s>   BE, E"#E"'E, <E'E'AE, E, "
E, ,7F#c           
      `   | st        d      t        t        t        j                  |             } t        | d   t              rd}d}d}nd}d}d}	 | D cg c]+  }t        |j                  ||      j                               - }}|D cg c]  \  }}}|j                  |       }}}}t        |D ch c]  \  }}}|
 c}}}      d	k7  rt        d
      t        |D ch c]  \  }}}|
 c}}}      d	k7  rt        d      t        | d   j                  ||            \  }	}
}|j                  |      }|D cg c]  }|s||k7  s| }}|D cg c]  }|D cg c]  }|s||k7  s| c} }}}t        |      }t        |      }t        |      D ]  \  }}|||   k7  s|d| } n |dt        |       }|	|
z   |j                  |      z   S c c}w c c}}}w c c}}}w c c}}}w c c}w c c}w c c}}w # t         t"        f$ r t%        j&                  dg|    w xY w)zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencer   rT   rU   r   r   r   r   rW   z%Can't mix absolute and relative pathszPaths don't have the same driveNr0   )r   tupler^   rC   rD   r6   r7   r   rH   rR   r   r   minmax	enumerater   r_   r`   rb   rc   )rd   r$   r'   r"   rj   drivesplitsr   r   split_pathsro   rp   r9   commonr   rM   s1s2r   s                     r:   r0   r0   A  s+    @AA#bii'(E%(E"JOPQy63!7!=!=!?@PP3>??1aqwws|??--gaA-.!3DEE
 --gaA-.!3>??%eAh&6&6vs&CDtTC#9qQ&[!99DOPq1:aa6k:PPbM 	&DAqBqEz	&
 HSW%Ft|chhv...5 Q?- .
 ::P ~& $$\:E:s   H 0GH G!*H 9G("H (G/5AH G6G6G6H 	H %G;-G;3G;7H <2H /,H H ;H  H 'H-)_path_isdir)_path_isfile)_path_islink)_path_exists)_path_isdevdrivec                 J    	 t        t        |             S # t        $ r Y yw xY wz@Determines whether the specified path is on a Windows Dev Drive.F)r   r!   r   r8   s    r:   
isdevdriver#    s(    	#GDM22 		s    	""c                      yr"  r   r8   s    r:   r#  r#    s     r<   r  )C__doc__r"   r#   r(   r$   r%   r'   r&   r)   rC   rE   r   rb   __all__r;   _winapir=   rI   r>   rJ   r?   rK   r
   ImportErrorr   r   r   r   r   r   r   r   r   hasattrstat_resultr1   r   ntr   r   r   r   r   r    r   r   r!   r   r   r   r   r   r   r*   r+   r,   r0   r  r   r  r   r  r   r  r   r   r#  r   r<   r:   <module>r,     s   
		

	

 	 
   !,- -
8H(+b.1r+*8 ((00 
 2>>+,J$%:-zj`.+!P+"+#+g> ,3 (T 9@ 0d "' DP " +p.b
	 ()))#C  	,,	,t  ^  #("(#(D   G   !& x  		  s}   C: D D +D# 5D0 E 0E :DDDDD D #D-,D-0D>=D>E	E	EE