_iɕdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZddlZddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+dd l,m-Z-ej\d Z/ej\d ej`Z1ej\d Z2ej\d ej`jfZ4djkZ6gdZ7dZ8dZ9e9judjtejveZdZ?d1dZ@d1dZAd1dZBdedfdZCdZDej\dej`ZE eDdZFGddZGGd d!eGZHGd"d#eZIej\d$jZKd%ZLd&ZMd2d'ZNd(ZOGd)d*ZPGd+d,e jZRejjfd-ZUd.ZVeNe8eUZUd/ZWd0ZXy)3z$PyPI and direct package downloading.Nwraps) CHECKOUT_DIST Distribution BINARY_DISTnormalize_path SOURCE_DIST Environmentfind_distributions safe_name safe_version to_filename Requirement DEVELOP_DISTEGG_DIST parse_version)logDistutilsError) translate)Wheelunique_everseenz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z([^<]+)\n\s+\(md5\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz) PackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_namez  && CG I  s 4/4c8|j}d\}}}|jdro|jdr|dd}d}nV|jddr |d d }|dd}d}n7|jd r|dd }d }n|jddr |d d }|dd}d }|||fS)z=Return (base,pyversion) or (None,None) for possible .exe name)NNN.exez .win32.exeNiwin32z .win32-pyiiz.win-amd64.exeiz win-amd64z .win-amd64-pyi)lowerendswith startswith)namer,basepy_verplats r&rrMs JJLE)D&$ ~~f >>, ':DD   k3 /"R[F:DD ^^, -:DD   os 3"R[F:DD  cdtjj|}|\}}}}}}tjj|j dd}|dk(r6|dk(r1tjj|j dd}d|vr|j dd\}}||fS)N/zsourceforge.netdownload#)urllibr"urlparseunquotesplit) urlpartsschemeserverpath parametersqueryfragmentr0s r&egg_info_for_urlrGes LL ! !# &E8=5FFD*eX <<   3 3 4D ""tz'9||##DJJsOB$78 d{C+h >r3c#Kt|\}}t|||D]}||rDtj|}|r,t ||j d|t D]}|yyyw)zEYield egg or source distribution objects that might be found at a URLr:) precedenceN)rGdistros_for_location EGG_FRAGMENTmatchrgroupr)r?metadatar0rFdistrLs r&rrpss%c*ND($S$9 :""8, -U[[^X-  sA,A.c&|jdr|dd}|jdrd|vrtj|||gS|jdrLd|vrHt|}|j sgSt||j |j tdzgS|jd r%t|\}}}|t||||t|StD]1}|j|s|dt| }t|||cSgS) z:Yield egg or source distribution objects based on basename.egg.zipNr+z.egg-z.whlr:)location project_nameversionrIr)) r-r from_locationr is_compatiblerTrUrrrr EXTENSIONSlen)rSbasenamerNwheelwin_baser1platformexts r&rJrJ~s$$CR= SH_**8XxHII SH_h""$I !"// #a<     %8%B"&(  ((Hfk8     S ! 3s8),H(8XF F Ir3chtt|tjj ||S)zEYield possible egg or source distribution objects based on a filename)rJrosrCrZ)filenamerNs r&distros_for_filenamerbs* x "''"2"28"z(interpret_distro_name..sKAbhh|Q7s "Nr:) py_versionrIr])r>anyrangerYisdigitrjoin)rSrZrNrjrIr]r@rgs r&rrs NN3 E #KqrKK3u:  8BQ<   !  J  r qr s AB!AB!c.tfd}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. c&t|i|SNr)argskwargsfuncs r&wrapperzunique_values..wrapperstT4V455r3r)rtrus` r& unique_valuesrvs"  4[66 Nr3z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c #Ktj|D]}|j\}}tt t j |jjd}d|vsd|vs_tj|D]<}tjj|t|jd>dD]l}|j|}|dk7stj!||}|s3tjj|t|jdnyw)zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,homepager7r:)z Home PagezDownload URLr6N)RELfinditergroupssetmapstrstripr,r>HREFr;r"urljoin htmldecoderMfindsearch)r?pagerLtagrelrelsposs r&find_external_linksrsd#<<>S3syy#))+"3"3C"89:  t!3s+ll**3 5;;q>0JKK, $5iin "9KKc*Ell**3 5;;q>0JKK 5sA4D?7A1D?)D?=D?c"eZdZdZdZdZdZy)ContentCheckerzP A null content checker that defines the interface for checking content cy)z3 Feed a block of data to the hash. Nselfblocks r&feedzContentChecker.feeds r3cy)zC Check the hash. Return False if validation fails. Trrs r&is_validzContentChecker.is_validsr3cy)zu Call reporter with information about the checker (hash name) substituted into the template. Nr)rreportertemplates r&reportzContentChecker.reports r3N)__name__ __module__ __qualname____doc__rrrrr3r&rrs  r3rcXeZdZejdZdZedZdZ dZ dZ y) HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cT||_tj||_||_yrq) hash_namehashlibnewhashexpected)rrrs r&__init__zHashChecker.__init__s "KK *   r3ctjj|d}|s tS|jj |}|s tS|di|j S)z5Construct a (possibly null) ContentChecker from a URLr6r)r;r"r<rpatternr groupdict)clsr?rFrLs r&from_urlzHashChecker.from_urls^<<((-b1!# # ""8,!# #'U__&''r3c:|jj|yrq)rupdaters r&rzHashChecker.feeds r3cP|jj|jk(Srq)r hexdigestrrs r&rzHashChecker.is_valid"syy""$ 55r3c0||jz}||Srq)r)rrrmsgs r&rzHashChecker.report%s'}r3N) rrrrecompilerr classmethodrrrrrr3r&rr s?bjj #G ! (( 6r3rc(eZdZdZ d&fd ZfdZd'dZd'dZd'dZdZ dZ d Z d Z d Z d(d Zd Zd(fd ZdZdZdZdZdZ d)dZd*dZdZdZdZdZd(dZdZdZdZdZ dZ!e"d'd Z#d!Z$d"Z%d#Z&d$Z'd%Z(xZ)S)+rz;A distribution index that scans web pages for download URLscVt||i||dd|jd z|_i|_i|_i|_tjdjtt|j|_ g|_tj j"|_y)Nr5|)superrr- index_url scanned_urls fetched_urls package_pagesrerrnr~rrLallowsto_scanr;requesturlopenopener)rrhosts ca_bundle verify_sslrrkw __class__s r&rzPackageIndex.__init__-s $%"%"S)Fy/A/A#/F+F%GGjj#i*?!@AGG  nn,, r3cl t|jt||S#t$rYywxYwrq)rrU Exceptionradd)rrOrs r&rzPackageIndex.add?s9  $,, 'w{4     s ' 33c ||jvr|syd|j|<t|s|j|ytt |}|r$|j |sy|j d||s|r||jvr tt|j|y|j |sd|j|<y|jd|d|j|<d}|j|||z}|yt|tjjr-|j dk(r|jd|j"zd|j|j$<d|j&j)d d j+vr|j-y|j$}|j/}t|t0sXt|tjjrd }n|j&j3d xsd }|j5|d }|j-t6j9|D]K} tj:j=|t?| jAd} |jC| M|jE|jFr$tI|dddk7r|jK||}yyy)z>$.. )ga.F#.M%%c40D/N )r3ctjj|s|jd|ytjj |rk|sitjj |}tj |D]2}|jtjj||d4t|}|r2|jd|tt|j|yy)Nz Not found: %sTz Found: %s)r`rCexistswarnisdirrealpathlistdirrrnrbrrr~r)rfnnestedrCitemrs r&rzPackageIndex.process_filename}sww~~b! IIor *  77== V77##B'D 4(%%bggll4&>E)%R(  JJ{B ' TXXu% & r3ct|}|xr"|jdjdk(}|s1|jtj j |dryd}|rt||z|j||y)Nr:fileTz Note: Bypassing %s (disallowed host; see https://setuptools.pypa.io/en/latest/deprecated/easy_install.html#restricting-downloads-with-allow-hosts for details). ) rrMr,rr;r"r<rr)rr?fatalsis_filers r&rzPackageIndex.url_oks} sO4 ((*f4 dkk&,,"7"7".s> D)~~k*5M) s9;)filterr`rCrr itertoolsstarmap scan_egg_link)r search_pathdirs egg_linkss r&scan_egg_linkszPackageIndex.scan_egg_linkssBbggmm[1  Y  t119 =>r3c ttjj||5}t t dt tj|}dddtdk7ry|\}}ttjj||D]C}tjj|g||_ t|_ |j|Ey#1swYxYw)Nri)openr`rCrnrrr~rrrYr rSr rIr)rrCr raw_lineslinesegg_path setup_pathrOs r&rzPackageIndex.scan_egg_links "'',,tU+ , c#))Y&?@AE- u:? $*&rww||D('CDDGGLL66DM)DO HHTNE- ,s .C$$C-c d}|j|js|Stttj j |t|jdjd}t|dk7sd|dvr|St|d}t|d}d|jj|ji|<t|t|fS)N)NNr5rir9r:rT)r.rrr~r;r"r=rYr>r r r setdefaultr,r)rrNO_MATCH_SENTINELr@pkgvers r&_scanzPackageIndex._scans&t~~.$ $S--tC4G4I/J/P/PQT/UVW u:?cU1Xo$ $a!58$?C%%ciik26t<3S!111r3c tj|D]J} |jtjj |t |jdL|j|\}}|syt||D]S}t|\}}|jdr!|s|r |d|d|z }n|j||j|Utjd|S#t$rYwxYw)z#Process the contents of a PyPI pager:r.pyz#egg=rRc.d|jdddzS)Nz%sr:ri)rM)ms r&z,PackageIndex.process_index..s2QWWQ15EEr3)rr{rr;r"rrrMr#rrGr-need_version_infoscan_urlPYPI_MD5sub) rr?rrLr r new_urlr0frags r&rzPackageIndex.process_indexs]]4(E  6<<//Z A5OPQ) ::c?S+35G)'2JD$}}U#DsC88G**3/ MM' "6|| Et  %  sAC33 C?>C?c(|jd|y)NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_allrr?s r&rzPackageIndex.need_version_infos   r3c|j|jvr&|r|j|g||jd|j |jy)Nz6Scanning index of all packages (this may take a while))rrrrrrrrrs r&rzPackageIndex.scan_allsG >>!2!2 2 #%% IIN O dnn%r3c|j|j|jzdz|jj |j s+|j|j|j zdz|jj |j s|j|t|jj |j dD]}|j|y)Nr5r) rr unsafe_namerrkeyrTnot_found_in_indexr)r requirementr?s r& find_packageszPackageIndex.find_packagess dnn{'>'>>DE!!%%koo6 MM$..;+C+CCcI J!!%%koo6  # #K 0**..{CDC MM# Er3c|j|j|||jD]}||vr|cS|jd||tt |||S)Nz%s does not match %s)prescanr%r"rrrobtain)rr$ installerrOrs r&r(zPackageIndex.obtainsa  ;')D{" JJ-{D A*\4/ YGGr3c0|j|jd|z|jsg|jt j |t |jjdtjj|dy)z- checker is a ContentChecker zValidating %%s checksum for %sz validation failed for z; possible download problem?N) rrrrr`unlinkrrr/rCrZ)rcheckerratfps r& check_hashzPackageIndex.check_hash su tzz#Ch#NO! IIK IIh  <<$$bgg&6&6x&@B "r3c|D]k}|j0t|r%|jdstt |r|j |Q|jj |my)z;Add `urls` to the list that will be prescanned for searchesNfile:)rrr.rrrappend)rurlsr?s r&add_find_linkszPackageIndex.add_find_linkssXC $!#>>'*,- c" ##C(r3c||jr)tt|j|jd|_y)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rrr~rrs r&r'zPackageIndex.prescan&s' << T]]DLL1 2 r3c||jr|jd}}n|jd}}|||j|j y)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r"rrr!r)rr$methrs r&r#zPackageIndex.not_found_in_index,sJ    #H#D ED S+))* r3czt|tst|}|rV|j|j d||}t |\}}|j dr|j|||}|Stjj|r|St|}t|j||ddS)aLocate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. r:rrSN)rrr _download_urlrMrGr- gen_setupr`rCrr'rfetch_distribution)rr$tmpdirrAfoundr0rFs r&r7zPackageIndex.download7s$$ ,%F**6<<?D&I!1$!7h==' NN5(FCE % ,T2t..tV.findws{CGG ??l2:7* D )* s{U;(F(Tf*-- v>C-0D*ww~~d&<&<=# %r3z:No local packages or working download links found for %s%sza source distribution of rzBest match: %s)rSrq)rr'r%rrcloner?) rr$r; force_scanrFrD local_indexrOrrEs ` ` `` @r&r:zPackageIndex.fetch_distributionYs4 $k2 $ $,  LLN   { + $D / [1D <||'  $D <   { + $D < IIL77=2  II& -::t'='=:> >r3cH|j||||}| |jSy)a3Obtain a file suitable for fulfilling `requirement` DEPRECATED; use the ``fetch_distribution()`` method now instead. For backward compatibility, this routine is identical but returns the ``location`` of the downloaded distribution instead of a distribution object. N)r:rS)rr$r;rHrFrOs r&fetchzPackageIndex.fetchs-&&{FJO  == r3c tj|}|xr6t||jddDcgc]}|jr|c}xsg}t |dk(rBt jj|}t jj||k7rwt jj||}t jj|r t jj||stj|||}tt jj|dd5} | j!d|dj"d|djdt jj%|ddddd|S|rt'd |d |t'd cc}w#1swY|SxYw) Nr:zsetup.pywz(from setuptools import setup setup(name=rz , version=z, py_modules=[z]) z9Can't unambiguously interpret project/version identifier zI; any dashes in the name or version should be escaped using underscores. zpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rKrLrrMrUrYr`rCrZdirnamernrsamefileshutilcopy2rwriterTsplitextr) rrarFr;rLdrrZdstrs r&r9zPackageIndex.gen_setups""8,  /xQNNA99N    u:?ww''1Hwwx(F2ggll684s+0@0@30OLL3/"Hbggll6:6< a--a((((215 =O  &.u6  !G K$=OsGAGGi c>|jd|d} tj|}|j|}t |t j jr(td|d|jd|j|j}d}|j}d}d|vr?|jd} ttt| }|j!|||||t#|d 5} |j%|} | r=|j'| | j)| |d z }|j!|||||nnR|j+||| ddd||r|j-SS#1swYxYw#|r|j-wwxYw) NzDownloading %szCan't download :  rr6zcontent-lengthzContent-Lengthwbr:)rrrrrr;rrrrr dl_blocksizeget_allmaxr~int reporthookrrrrRr.r) rr?rafpr,rblocknumbssizesizesr-rs r& _download_tozPackageIndex._download_toso "C(  !**3/Gs#B"fll445$25rwwGggiGH""BD7*(893sE?+XxTBh%GGBKE U+ %( A XxTJ37& &% s%C!F7A'E; F;FFFcyrqr)rr?rar`blksizerbs r&r^zPackageIndex.reporthook s r3c |jdr t|S t||jS#tt j jf$rh}dj|jDcgc] }t|ncc}wc}}|r|j||nt|d||Yd}~yd}~wtjj$r }|cYd}~Sd}~wtjj $rE}|r|j||j"ntd|d|j"|Yd}~yd}~wt j j$$rD}|r|j||j&nt|d|j&|Yd}~yd}~wt j j(t*f$r1}|r|j||ntd|d||Yd}~yd}~wwxYw)Nr0rXzDownload error for rWz7 returned a bad status line. The server might be down, )r. local_openopen_with_authrr#httpclient InvalidURLrnrrrrrr;rrURLErrorreason BadStatusLineline HTTPExceptionOSError)rr?warningvargrs r&rzPackageIndex.open_url s >>' "c? " T!#t{{3 3DKK223 B((7CH78C '3'$S%9:A(||%% H||$$  '188,$36A- {{((  '166*$"%qvv/+  ))73 T '1%$C%KLRSS& TsW4#G7B:0B 3B:: G7C!G7! G7;E G7!:F  &G7'G22G7ct|\}}|r,d|vr*|jddjdd}d|vr'nd}|jdr|dd}tjj ||}|dk(s|j d r|j||S|d k(s|j d r|j||S|j d r|j||S|d k(r?tjjtjj|dS|j|d|j!||S)Nz...\___downloaded__rQr+svnzsvn+gitzgit+zhg+rriT)rGreplacer-r`rCrnr. _download_svn _download_git _download_hgr;r url2pathnamer"r<r_attempt_download)rrAr?r;r/rFras r&r8zPackageIndex._download_url/s7*#.h $,||D#.66tSA$,$D == $9D77<<- U?f//7%%c84 4 u_ 1 1& 9%%c84 4   u %$$S(3 3 v >>..v||/D/DS/I!/LM M KKT "))#x8 8r3c(|j|dy)NT)rrs r&rzPackageIndex.scan_urlLs d#r3c|j||}d|jddjvr|j|||S|S)Nrrr)rdrr,_invalid_download_html)rr?rars r&rzPackageIndex._attempt_downloadOsJ##C2 W[[4::< <..sGXF FOr3cHtj|td|)NzUnexpected HTML page found at )r`r+r)rr?rras r&rz#PackageIndex._invalid_download_htmlVs! (=cUCDDr3ctd|)Nz/Invalid config, SVN download is not supported: r)rr? _filenames r&r~zPackageIndex._download_svnZsNseTUUr3c&tjj|\}}}}}|jddd}|jddd}d}d|vr|j dd\}}tjj ||||df}||fS)N+r:r6r9r@r)r;r"urlsplitr>rsplit urlunsplit)r? pop_prefixrAnetlocrCrErrevs r&_vcs_split_rev_from_urlz$PackageIndex._vcs_split_rev_from_url]s,2LL,A,A#,F)eTc1%b)zz#q!!$ $; C+ID#ll%%vvtUB&GHCxr3c|jddd}|j|d\}}|jd||tjd|d||-|jd |tjd |d ||S) Nr9r:rTrzDoing git clone from %s to %szgit clone --quiet rXzChecking out %szgit -C z checkout --quiet r>rrr`systemrr?rars r&rzPackageIndex._download_gitos>>#q)!,///ES 13A sH=> ? II' - II r3c|jddd}|j|d\}}|jd||tjd|d||.|jd |tjd |d |d |S) Nr9r:rTrzDoing hg clone from %s to %szhg clone --quiet rXzUpdating to %sz hg --cwd z up -C -r z -qrrs r&rzPackageIndex._download_hgs>>#q)!,///ES 0#x@ c8<= ? II& , II r3c0tj|g|yrq)rrrs r&rzPackageIndex.debugs #r3c0tj|g|yrq)rrrs r&rzPackageIndex.info tr3c0tj|g|yrq)rrrs r&rzPackageIndex.warnrr3)zhttps://pypi.org/simple/)*NT)Frq)FFFN)FF)*rrrrrrrrrrrrrrrr%r(r.r3r'r#r7r:rKr9rZrdr^rr8rrrr~ staticmethodrrrrrr __classcell__rs@r&rr*sE- -$!31j'  ? 2  : & H  )  PLM?^ ,\L"H  TD9:$EV"&&r3rz!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?cN|jd}tj|S)Nr)rMrunescape)rLwhats r& decode_entityrs ;;q>D == r3c"tt|S)a Decode HTML entities in the given text. >>> htmldecode( ... 'https://../package_name-0.1.2.tar.gz' ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' ) entity_subr)texts r&rrs mT **r3cfd}|S)Ncfd}|S)Nctj}tj |i|tj|S#tj|wxYwrq)socketgetdefaulttimeoutsetdefaulttimeout)rrrs old_timeoutrttimeouts r&_socket_timeoutz@socket_timeout.._socket_timeout.._socket_timeoutsN 224K  $ $W - 6T,V,((5((5s A A r)rtrrs` r&rz'socket_timeout.._socket_timeouts 6r3r)rrs` r&socket_timeoutrs  r3ctjj|}|j}t j |}|j }|jddS)a9 Encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False  r)r;r"r=encodebase64 b64encoderr})authauth_s auth_bytes encoded_bytesencodeds r& _encode_authrsR\\ ! !$ 'FJ$$Z0M""$G ??4 $$r3c"eZdZdZdZdZdZy) Credentialz: A username/password pair. Use like a namedtuple. c ||_||_yrqusernamepassword)rrrs r&rzCredential.__init__s    r3c#DK|j|jywrqrrs r&__iter__zCredential.__iter__smmmms cdt|zS)Nz%(username)s:%(password)s)varsrs r&__str__zCredential.__str__s*T$Z77r3N)rrrrrrrrr3r&rrs!8r3rc:eZdZfdZedZdZdZxZS) PyPIConfigc0tjgdd}t| |tj j tj jdd}tj j|r|j|yy)z% Load from ~/.pypirc )rr repositoryr~z.pypircN) dictfromkeysrrr`rCrn expanduserrr)rdefaultsrcrs r&rzPyPIConfig.__init__sf==!GL " WW\\"'',,S19 = 77>>"  IIbM r3c|jDcgc]$}|j|djr|&}}tt |j |Scc}w)Nr)sectionsrrrr~_get_repo_cred)rsectionsections_with_repositoriess r&creds_by_repositoryzPyPIConfig.creds_by_repositorysa ==?& *xx.446 * #& C++-GHII & s)Ac|j|dj}|t|j|dj|j|djfS)Nrrr)rrr)rrrepos r&rzPyPIConfig._get_repo_creds]xx.446Z HHWj ) / / 1 HHWj ) / / 1   r3cr|jjD]\}}|j|s|cSy)z If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)ritemsr.)rr?rcreds r&find_credentialzPyPIConfig.find_credentials4 !% 8 8 > > @ J~~j) !Ar3) rrrrpropertyrrrrrs@r&rrs( JJ r3rctjj|}|\}}}}}}|jdrtj j d|dvrt|\} } nd} | sJtj|} | r/t| } | j|f} tjdg| | rgdt| z} | ||||f} tjj| }tj j#|}|j%d| ntj j#|}|j%dt&||}| rftjj|j(\}}}}}}||k(r1| k(r,||||||f} tjj| |_|S) z4Open a urllib2 request, handling HTTP authentication:znonnumeric port: '')rjhttpsNz*Authenticating as %s for %s (from .pypirc)zBasic Authorizationz User-Agent)r;r"r<r-rjrkrl _splituserrrrrrrr urlunparserRequest add_header user_agentr?)r?rparsedrArrCparamsrErraddressrrr@rrr_s2h2path2param2query2frag2s r&riris\\ " "3 'F06-FFD&%skk$$%:;; """6* g |++C0 t9D==#%D HHA ID I ,t,,vud:,,))%0..((1?D1..((- |Z0 B 06||/D/DRVV/L,Bvvu  'user[:passwd]', 'host[:port]'.rN) rpartition)hostuserdelims r&rr@s0,D%Dd **td **r3c|Srqr)r?s r& fix_sf_urlrKs Jr3ctjj|\}}}}}}tjj |}t j j|rtjj|S|jdrt j j|rg}t j|D]} t j j|| } | dk(r't| d5} | j} dddnkt j j| r| dz } |jdj!| d} | j!|dj| } d \}}nd \}}} d d i}t#j$ }tj&j)|||||S#1swYxYw)z7Read a local path, with special support for directoriesr5z index.htmlrNz{name})r/zB{url}{files}r)r?files)OK)rzPath not foundz Not foundrz text/html)r;r"r<rrr`rCisfilerr-rrrnrrr1formatioStringIOrr)r?rArBrCparamrErrarrfilepathr_bodyrstatusmessager body_streams r&rhrhOsy/5||/D/DS/I,FFD%~~**40H ww~~h~~%%c** s  h 7H%Aww||Ha0HL (C(B779D)x(S LL6==1=E F&X ;;3dii.>;?D# B{+G++d#K << ! !#vw MM#)(s ?G  G rq)r)Yrsysr`rerrPrrrr configparserr http.clientrj urllib.parser;urllib.request urllib.error functoolsrr pkg_resourcesrrrrr r r r r rrrrr distutilsrdistutils.errorsrfnmatchrsetuptools.wheelr setuptools.extern.more_itertoolsrrrKIrrrLrr>rX__all___SOCKET_TIMEOUT_tmplr version_inforr'rrGrrJrbrrvrzrrrrrrrrrrrRawConfigParserrrrrirrrhrr3r&rs*   +"<rzz67 rzz3RTT: 2::J RZZ,bdd 3 9 9 . 4 4 6  F \\ W^^S-- .: 0  F.2kTXD bjjKRTTR LL$2.Br ;r nRZZ< = A A  + %*88"$--$N &~~55+^+10@Nr3