\bgədZddlmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZddlmZddlZddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd l-m.Z.d d l/m0Z0m1Z1dd l2m3Z3dd l4m5Z5e j6dZ7e j6de j8Z9e j6dZ:e j6de j8j;ZgdZ?dZ@dejAdejBjCdejBjDZEdZFdZGdZHd5dZId5dZJd5dZKde#dfdZLdZMe j6d e j8ZN eMd!ZOGd"d#ZPGd$d%ePZQGd&d'e%ZRe j6d(jSZTd)ZUd*ZVd6d+ZWd,ZXGd-d.eZYGd/d0ejZZ[ej\j]fd1Z^d2Z_eWe@e^Z^d3Z`d4ZadS)7z$PyPI and direct package downloading.) annotationsN) translatewraps) NamedTupleunique_everseen) BINARY_DIST CHECKOUT_DIST DEVELOP_DISTEGG_DIST SOURCE_DIST Distribution Environment Requirementfind_distributionsnormalize_path parse_version safe_name safe_version to_filename)Wheel)_cfg_read_utf8_with_fallback_read_utf8_with_fallback)log)DistutilsErrorz^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 setuptools/z Python-urllib/.cv tj|S#t$r}td||d}~wwxYw)Nz/Not a URL, existing file, or requirement spec: )rparse ValueErrorr)speces i/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/setuptools/package_index.pyparse_requirement_argr*HsV &&& nCG4 I   s 838c|}d\}}}|dr|dr |dd}d}n{|ddr|d d }|dd}d}nN|d r |dd }d }n,|ddr|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)r r Qs JJLLE)D&$ ~~f >>, ' ' :DDD   k3 / / "R%[F:DDD ^^, - - :DDD   os 3 3 "R%[F:DD  ctj|}|\}}}}}}tj|dd}|dkr>|dkr8tj|dd}d|vr|dd\}}||fS)N/zsourceforge.netdownload#r)urllibr%urlparseunquotesplit) urlparts_schemeserverpath _parameters_queryfragmentr3s r)egg_info_for_urlrIis L ! !# & &E;@8GVT; <   3 3 4 4D """tz'9'9|##DJJsOOB$788 d{{C++h >r6c#Kt|\}}t|||Ed{V|rOt|}|r5t ||d|t Ed{VdSdSdS)zEYield egg or source distribution objects that might be found at a URLNr) precedence)rIdistros_for_location EGG_FRAGMENTmatchr!groupr )rAmetadatar3rHrNs r)rrts%c**ND(#Cx888888888""8,,  ,U[[^^X-           r6c|dr |dd}|drd|vrtj|||gS|drOd|vrKt|}|sgSt||j|jtdzgS|d r.t|\}}}|t||||t|StD]B}||r+|dt| }t|||cSCgS) z:Yield egg or source distribution objects based on basename.egg.zipNr.z.egg-z.whlr)location project_nameversionrKr,) r0r from_locationr is_compatiblerUrVr r r!r EXTENSIONSlen)rTbasenamerPwheelwin_baser4platformexts r)rLrLs$$!CRC=  JSH__*8XxHHII   SH__h""$$ I !"/ #a<        %8%B%B"&(  ((Hfk8  GG   S ! ! G 3s88) ,H(8XFF F F F G Ir6cxtt|tj||S)zEYield possible egg or source distribution objects based on a filename)rLrosrEr[)filenamerPs r)distros_for_filenamercs3 x  "'"2"28"<"z(interpret_distro_name..s.KKAbh|Q77KKKKKKr6Nr) py_versionrKr^)r@anyrangerZisdigitrjoin)rTr[rPrkrKr^rBrhs r)r!r!s  NN3  E #KKqrrKKKKK3u::   8BQB<   ! !  E  JJ  rr qrr   r6c<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..wrappers ttT4V44555r6r)rurvs` r) unique_valuesrws5  4[[6666[6 Nr6z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c #Kt|D]}|\}}tt t j|d}d|vsd|vr_t|D]D}tj |t|dVEdD]|}||}|dkr_t||}|rBtj |t|dV}dS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,homepager:r)z Home PagezDownload URLr9N)RELfinditergroupssetmapstrstripr/r@HREFr=r%urljoin htmldecoderOfindsearch)rApagerNtagrelrelsposs r)find_external_linksrsMd##LL<<>>S3sy#))++"3"3C"8"899::   t!3!3s++ L Ll**3 5;;q>>0J0JKKKKKK4LLiinn "99KKc**E Ll**3 5;;q>>0J0JKKKKK LLr6c$eZdZdZdZdZdZdS)ContentCheckerzP A null content checker that defines the interface for checking content cdS)z3 Feed a block of data to the hash. Nselfblocks r)feedzContentChecker.feeds  r6cdS)zC Check the hash. Return False if validation fails. Trrs r)is_validzContentChecker.is_valids tr6cdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr)rreportertemplates r)reportzContentChecker.reports r6N)__name__ __module__ __qualname____doc__rrrrr6r)rrsK  r6rc^eZdZejdZd dZedZdZ dZ dZ d S) HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)returnNonecT||_tj||_||_dSrr) hash_namehashlibnewhashexpected)rrrs r)__init__zHashChecker.__init__s%"K **   r6ctj|d}|stS|j|}|stS|di|S)z5Construct a (possibly null) ContentChecker from a URLr9r)r=r%r>rpatternr groupdict)clsrArHrNs r)from_urlzHashChecker.from_urls{<((--b1 $!## # ""8,, $!## #s''U__&&'''r6c:|j|dSrr)rupdaters r)rzHashChecker.feed!s r6cF|j|jkSrr)r hexdigestrrs r)rzHashChecker.is_valid$sy""$$ 55r6c,||jz}||Srr)r)rrrmsgs r)rzHashChecker.report's'x}}r6Nrr) rrrrfcompilerr classmethodrrrrrr6r)rr sbj #G !!!! (([(   666r6rcdeZdZdZ d9d:fd Zfd Zd;ddZd?dZ d?dZ dZ dZ d?dZ d@d?dZd?dZd@fd Zd?dZd?dZdZd?d Zd!Z dAdBd&Z dCdDd(Zd)Zd*Zd+Zd?d,Zd@d-Zd.Zed/Zd0Z d1Z!d?d2Z"d3Z#d4Z$ed5Z%d?d6Z&d?d7Z'd?d8Z(xZ)S)Erz;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NT index_urlr verify_sslboolrrcrtj|i||dd|d z|_i|_i|_i|_tjd tt|j |_ g|_tjj|_dS)Nr8|)superrr0r scanned_urls fetched_urls package_pagesrfrrorrrNallowsto_scanr=requesturlopenopener)rrhosts ca_bundlerrskw __class__s r)rzPackageIndex.__init__/s $%"%%%"S)Fy/A/A#/F/F+F)F%GG"$"$#%j#i*?*?!@!@AAG  n, r6c t|jn#t$rYdSwxYwt|Srr)rrV Exceptionradd)rdistrs r)rzPackageIndex.addAsS  $, ' ' ' '   44 ww{{4   s  &&Fretrievec ||jvr|sdSd|j|<t|s||dStt |}|r-||sdS|d||s |r ||jvr$tt|j |dS||s d|j|<dS| d|d|j|<d}| |||z}|dSt|tjjr(|jdkr| d|jzd|j|j<d|jd d vr|dS|j}|}t|t0sTt|tjjrd }n|jd pd }||d }|t6|D]W} tj|t?| d} |!| X|"|j#r-tI|dddkr|%||}dSdSdS)z>$. ) ) 1ga.F.F#.M.M%%c400DDD 1 1.M.Mr6nestedc tj|s|d|dStj|rl|sjtj|}tj|D]6}|tj||d7t|}|r:| d|tt|j |dSdS)Nz Not found: %sTz Found: %s)rarEexistswarnisdirrealpathlistdirrrorcrrrr)rfnrrEitemrs r)rzPackageIndex.process_filenamesw~~b!!  IIor * * * F 7==   FV F7##B''D 4(( F F%%bgll4&>&>EEEE$R((  ' JJ{B ' ' ' TXu%% & & & & & ' 'r6fatalcNt|}|o*|ddk}|s8|tj|drdSd}|rt||z|||dS)NrfileTz Note: Bypassing %s (disallowed host; see https://setuptools.pypa.io/en/latest/deprecated/easy_install.html#restricting-downloads-with-allow-hosts for details). F) rrOr/rr=r%r>rr)rrArsis_filers r)rzPackageIndex.url_oks sOO4 ((**f4  dkk&,"7"7"<".sm  D))  ~~k**  5M       r6)filterrarErr itertoolsstarmap scan_egg_link)r search_pathdirs egg_linkss r)scan_egg_linkszPackageIndex.scan_egg_linkssYbgm[11     Y t19 = =>>>>>r6c ttj||}t t dt tj| }t|dkrdS|\}}ttj||D]?}tjj|g|R|_ t|_||@dS)Nrj)rrarErorrrrr splitlinesrZrrTrrKr)rrErcontentlinesegg_path _setup_pathrs r)rzPackageIndex.scan_egg_links*27<<e+D+DEEVD#ci1C1C1E1E"F"FGGHH u::?? F %+&rw||D('C'CDD  DGL6666DM)DO HHTNNNN  r6c d}||js|Stttjj|t|jdd}t|dks d|dvr|St|d}t|d}d|j | i|<t|t|fS)NNNr8rjr<rrT)r1rrrr=r%r?rZr@rrr setdefaultr/r)rrNO_MATCH_SENTINELrBpkgvers r)_scanzPackageIndex._scans&t~.. %$ $S-tC4G4G4I4I/J/P/PQT/U/UVVWW u::??cU1Xoo$ $a!!58$$?C%%ciikk266t<3S!1!111r6c \t|D]f} |tj|t |dW#t$rYcwxYw||\}}|sdSt||D]c}t|\}}| dr%|s#|r |d|d|z }n| || |dtd|S)z#Process the contents of a PyPI pagerr.pyz#egg=rSc6d|dddzS)Nz%srrj)rO)ms r)z,PackageIndex.process_index..s2QWWQ15E5EEr6)rr|rr=r%rrrOr&rrIr0need_version_infoscan_urlPYPI_MD5sub) rrArrNrrnew_urlr3frags r)rzPackageIndex.process_indexsN]]4((  E  6<//Z A5O5OPPQQQQ    ::c??S 2+355 # #G)'22JD$}}U## 0D 00GsssCC88GG**3/// MM' " " " "|| E Et   sAA22 A?>A?c2|d|dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_allrrAs r)rzPackageIndex.need_version_infos*       r6c|j|jvr%|r|j|g|R|d||jdS)Nz6Scanning index of all packages (this may take a while))rrrrr rrrss r)r&zPackageIndex.scan_allsa >!2 2 2 & #%%%%% IIN O O O dn%%%%%r6c||j|jzdz|j|js%||j|jzdz|j|js||t|j|jdD]}||dS)Nr8r) r r unsafe_namerrkeyrUnot_found_in_indexr)r requirementrAs r) find_packageszPackageIndex.find_packagess dn{'>>DEEE!%%ko66 K MM$.;+CCcI J J J!%%ko66 1  # #K 0 0 0*..{CCDD  C MM#      r6c|||||jD]!}||vr|cS|d||"t ||S)Nz%s does not match %s)prescanr/r,rrobtain)rr. installerrrs r)r2zPackageIndex.obtains  ;''') B BD{"" JJ-{D A A A Aww~~k9555r6c2||jd|z|sd|t j|t |jjdtj |ddS)z- checker is a ContentChecker zValidating %%s checksum for %sz validation failed for z; possible download problem?N) rrrrraunlinkrrr2rEr[)rcheckerrbtfps r) check_hashzPackageIndex.check_hash s tz#Ch#NOOO!!  IIKKK Ih    <$$$bg&6&6x&@&@&@&@B   r6c|D]y}|j@t|r1|dstt |r||_|j|zdS)z;Add `urls` to the list that will be prescanned for searchesNfile:)rrr1rrr append)rurlsrAs r)add_find_linkszPackageIndex.add_find_linkss ) )C $!#%>>'**%,,--%  c"""" ##C(((( ) )r6cp|jr'tt|j|jd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rrrr rs r)r1zPackageIndex.prescan)s3 < 3 T]DL11 2 2 2 r6c||jr |jd}}n |jd}}|||j|dS)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/sR    Y #H#DD #X#D S+)*** r6ct|tst|}|rV|||}t |\}}|dr||||}|Stj |r|St|}t| ||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. rrTN) rrr _download_urlrIr0 gen_setuprarErr*rfetch_distribution)rr'tmpdirschemefoundr3rHs r)r:zPackageIndex.download7s$$ ,, 3%%F 3**488!1$!7!7h==''D NN5(FCCE %% 3 ,T22t..tV<.findws{CG  $ $?l22:27** D  D)))s{U;(F(Tf*$-- v>>C-0D*w~~d&<==$# 4r6z:No local packages or working download links found for %s%sza source distribution of rzBest match: %s)rTrr)rMrN)rr~r1r/rrclonerP) rr.rErHrIrJ local_indexrrrTs ` ` `` @r)rDzPackageIndex.fetch_distributionYsr4 $k222%%           0  % LLNNN   { + + +4 $$D 2 /4 [11D <|' 4 $$D < <   { + + +4 $$D < IIL77=2    4 II& - - -::t'=:>> >r6 str | NonecH|||||}||jSdS)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)rDrT)rr.rErHrIrs r)fetchzPackageIndex.fetchs0&&{FJOO  = tr6c t|}|r.dt||ddDpg}t |dkrZt j|}t j||krvt j ||}t j |r t j ||stj |||}tt j |ddd5}|d|djd |djd t j|dd dddn #1swxYwY|S|rt'd |d |t'd)Nc g|] }|j | Sr)rV)rgds r) z*PackageIndex.gen_setup..s09r6rzsetup.pywzutf-8)encodingz(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.)rMrNr!rOrZrarEr[dirnamerorsamefileshutilcopy2openwriterUrVsplitextr) rrbrHrErNrr[dstrs r)rCzPackageIndex.gen_setups""8,,  .xQNN    u::??w''11Hwx((F22gll6844s++#0@0@30O0O#L3///"Hbgll6:66gNNN RV a---a(((((221555                O   .&.XXuu6  !G s AF..F25F2i c|d|d} t|}||}t |t jjr"td|d|j d|j |}d}|j }d}d|vrP| d} ttt| }||||||t#|d 5} ||} | rI|| | | |d z }||||||nnb|||| dddn #1swxYwY||r|SS#|r|wwxYw) NzDownloading %szCan't download :  rr9zcontent-lengthzContent-LengthwbTr)rrrrrr=rrrrr dl_blocksizeget_allmaxrint reporthookrdrrrer8r) rrArbfpr6rblocknumbssizesizesr7rs r) _download_tozPackageIndex._download_tos "C(((  !**3//Gs##B"fl455 $n25##rwwwGggiiGH"BD7**(8993sE??++XxTBBBh%% 8GGBKKE U+++ %((( A XxTJJJJ3777 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8   r   s1C3F8 A;F F8FF8FF88GcdSrrr)rrArbrrblksizerts r)rpzPackageIndex.reporthooks r6c|drt|S t||jS#tt jjf$r]}dd|j D}|r| ||nt|d||Yd}~dSd}~wtj j$r }|cYd}~Sd}~wtj j$rD}|r| ||jntd|d|j|Yd}~dSd}~wt jj$rC}|r| ||jnt|d|j|Yd}~dSd}~wt jjt(f$r:}|r| ||ntd|d||Yd}~dSd}~wwxYw)Nr:rjc,g|]}t|Sr)r)rgargs r)r]z)PackageIndex.open_url..s777CHH777r6zDownload error for riz7 returned a bad status line. The server might be down, )r1 local_openopen_with_authrr&httpclient InvalidURLrorsrrr=rrURLErrorreason BadStatusLineline HTTPExceptionOSError)rrAwarningvrs r)rzPackageIndex.open_urlsm >>' " " #c?? " T!#t{33 3DK23 B B B((7777788C B '3''''$SS%9::A('''''|%   HHHHHH|$     '18,,,,$n3633A-,,,,, {(     '16****$"%##qvv/+*****  )73 T T T T '1%%%%$nCCC%KLLRSS&%%%%% TsL;GAB..GC G G#9D""G98E77G/G  Gcjt|\}}|r3d|vr.|dddd}d|v.nd}|dr |dd}tj||}|||p|||S)Nz..r#\___downloaded__rRr.)rIreplacer0rarEro _download_vcs_download_other)rrArEr2 _fragmentrbs r)rBzPackageIndex._download_url4s+3//i  $$,,||D#..66tSAA$,,$D == $ $ 9D7<<--!!#x00WD4H4Hh4W4WWr6ctj|j}|d\}}}t ddgdgt |zz}tt|h|zdS)a  >>> rvcs = PackageIndex._resolve_vcs >>> rvcs('git+http://foo/bar') 'git' >>> rvcs('hg+https://foo/bar') 'hg' >>> rvcs('git:myhost') 'git' >>> rvcs('hg:myhost') >>> rvcs('http://foo/bar') +svngithgN) r=r%urlsplitrF partitionr~rnextiter)rArFpresep_postalloweds r) _resolve_vcszPackageIndex._resolve_vcsEsv&&s++2 **3//S%uenvS '99::D#))4000r6c ||}|sdS|dkrtd||d\}}}||\}}|d|d|d|t j|dd||gt|d |d d|g|d |d d d |dg}|2|d|t j|||S)Nrz/Invalid config, SVN download is not supported: r<zDoing z clone from z to rUz--quietz-Ccheckoutz--cwdupz-rz-q)rrz Checking out )rrr_vcs_split_rev_from_urlr subprocess check_calldict)rrA spec_filenamevcsrbrrev co_commandss r)rzPackageIndex._download_vcsXs6$$ 4 %<< G#GG '0055!Q//44S ?3??C??X??@@@sGYXFGGGdHj)SAWhdD#tD    ? II+c++ , , ,  !+c"2 3 3 3r6c0tj|j}|dkrAtjtj|jS||d| ||S)NrT) r=r%rrFr url2pathnamer>rEr_attempt_download)rrArbrFs r)rzPackageIndex._download_otherqsx&&s++2 V  >..v|/D/DS/I/I/NOO O C%%c8444r6c2||ddS)NT)rr's r)r zPackageIndex.scan_urlys d#####r6c|||}d|ddvr||||S|S)Nrrr)rvrr/_invalid_download_html)rrArbrs r)rzPackageIndex._attempt_download|sY##C22 W[[44::<< < <..sGXFF FOr6cNtj|td|)NzUnexpected HTML page found at )rar5r)rrArrbs r)rz#PackageIndex._invalid_download_htmls) (CcCCDDDr6cftj|}|jddd}|jd\}}}|d\}}}|r||fn|df\}} |||d } | | fS) a Given a possible VCS URL, return a clean URL and resolved revision if any. >>> vsrfu = PackageIndex._vcs_split_rev_from_url >>> vsrfu('git+https://github.com/pypa/setuptools@v69.0.0#egg-info=setuptools') ('https://github.com/pypa/setuptools', 'v69.0.0') >>> vsrfu('git+https://github.com/pypa/setuptools#egg-info=setuptools') ('https://github.com/pypa/setuptools', None) >>> vsrfu('http://foo/bar') ('http://foo/bar', None) rrr9r<@Nr)rFrErH) r=r%rrFr@rEr rpartition_replacegeturl) rArB clean_schemeno_fragment_pathrrrpost clean_pathrresolveds r)rz$PackageIndex._vcs_split_rev_from_urls %%c**|))#q11"5 "'!5!5c!:!:!Q)44S99S$),>3++4, C>> "  &(( }r6c*tj|g|RdSrr)rrr)s r)rzPackageIndex.debugs  #r6c*tj|g|RdSrr)rrr)s r)rzPackageIndex.info  tr6c*tj|g|RdSrr)rrr)s r)rzPackageIndex.warnrr6)rrNT)rrrrrr)F)rrrr)rrrr)rrrrrrr)FFFN)rHrrIrrJrrrK)FF)rHrrIrrrW)*rrrrrrrrrr rrrrr&r/r2r8r=r1r-r:rDrYrCrlrvrprrB staticmethodrrrr rrrrrr __classcell__rs@r)rr,s6EE4 -------$!!!!!3131313131j'''''  ???? 222    :    &&&&&    666666     ) ) ) )  P P PL! P?P?P?P?P?fMR     ,,,\L"""H     T T T TDXXX"11\1$2555$$$$EEE\>r6rz!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?cT|d}tj|S)Nr)rOrunescape)rNwhats r) decode_entityrs! ;;q>>D =  r6c,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 * **r6cfd}|S)Ncfd}|S)Nctj}tj |i|tj|S#tj|wxYwrr)socketgetdefaulttimeoutsetdefaulttimeout)rsrt old_timeoutrutimeouts r)_socket_timeoutz@socket_timeout.._socket_timeout.._socket_timeoutsd 244K  $W - - - 6tT,V,,(5555(5555s AAr)rurrs` r)rz'socket_timeout.._socket_timeouts* 6 6 6 6 6 6r6r)rrs` r)socket_timeoutrs$      r6ctj|}|}t j|}|}|ddS)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_authrs[\ ! !$ ' 'FJ$Z00M""$$G ??4 $ $$r6c0eZdZUdZded<ded<ddZdS) Credentialz A username/password pair. Displayed separated by `:`. >>> str(Credential('username', 'password')) 'username:password' rusernamepasswordrc$|jd|jS)N:)rrrs r)__str__zCredential.__str__s-11$-111r6N)rr)rrrr__annotations__rrr6r)rrsHMMMMMM222222r6rc@eZdZfdZedZdZdZxZS) PyPIConfigc`tgdd}t|tjtjdd}tj|rt||dSdS)z% Load from ~/.pypirc )rr repositoryr~z.pypircN) rfromkeysrrrarEro expanduserrr)rdefaultsrcrs r)rzPyPIConfig.__init__s==!G!G!GLL """ W\\"',,S119 = = 7>>"   3 (r 2 2 2 2 2 3 3r6cfdD}ttj|S)Ncdg|],}|d*|-S)r)rr)rgsectionrs r)r]z2PyPIConfig.creds_by_repository.. sI& & & xx..4466& & & & r6)sectionsrr_get_repo_cred)rsections_with_repositoriess` r)creds_by_repositoryzPyPIConfig.creds_by_repositorysR& & & & ==??& & & " C+-GHHIIIr6c||d}|t||d||dfS)Nrrr)rrr)rrrepos r)rzPyPIConfig._get_repo_credstxx..4466Z HHWj ) ) / / 1 1 HHWj ) ) / / 1 1    r6cv|jD]\}}||r|cSdS)z If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)ritemsr1)rrArcreds r)find_credentialzPyPIConfig.find_credentialsN !% 8 > > @ @   J~~j))   tr6) rrrrpropertyrrrrrs@r)rrst 3 3 3 3 3JJXJ   r6rctj|}|\}}}}}}|drtjd|dvrt|\} } nd\} } | sMt |} | r*t| } | j |f} tj dg| R| rodt| z} || ||||f} tj| }tj|}|d| ntj|}|dt&||}| rctj|j\}}}}}}||kr2|| kr,||||||f} tj| |_|S) z4Open a urllib2 request, handling HTTP authenticationrznonnumeric port: '')r~httpsrz*Authenticating as %s for %s (from .pypirc)zBasic Authorizationz User-Agent)r=r%r>r0r~rr _splituserrrrrrrr urlunparserRequest add_header user_agentrA)rArparsedrFnetlocrEparamsqueryr$raddressrrrBr#rrqs2h2path2param2query2frag2s r)r}r}#s\ " "3 ' 'F06-FFD&%s<k$$%:;;; """"6** gg$ g J||++C00  Jt99D=#%D HA ID I I I I .,t,,,vud:,))%00.((11?D1111.((-- |Z000 B 406|/D/DRV/L/L,Bvvu < 'user[:passwd]', 'host[:port]'.rN)r)hostuserdelims r)rrSs0,,D% #DDtd **r6c|Srrr)rAs r) fix_sf_urlr^s Jr6ctj|\}}}}}}tj|}t j|rtj|S| drt j |rg}t j |D]} t j || } | dkrt| } nzt j | r| dz } |d| d} | |d |} d\} }nd \} }} d d i}t!j| }tj|| |||S) z7Read a local path, with special support for directoriesr8z index.htmlz{name})r2zB{url}{files}r)rAfiles)OK)rzPath not foundz Not foundrz text/html)r=r%r>rrrarEisfilerr0rrrorr;formatioStringIOrr)rArC_serverrE_paramrG_fragrbrrfilepathbodyrstatusmessager body_streams r)r|r|bs4:L4I4I#4N4N1GWdFFE~**400H w~~hC~%%c*** s  C h 7 7CH%% @ @Aw||Ha00HL  /99x(( S LL6==1=EE F F F FWD;;3dii.>.>;??D# B{+G+d##K < ! !#vw M MMr6rr)r")br __future__rr configparserrr http.clientr~rrrarfrbrrsys urllib.errorr= urllib.parseurllib.requestfnmatchr functoolsrtypingrmore_itertoolsr setuptools pkg_resourcesr r r r rrrrrrrrrrsetuptools.wheelr unicode_utilsrr distutilsrdistutils.errorsrrrMIrr!rNrr@rY__all___SOCKET_TIMEOUT __version__ version_infomajorminorrr*r rIrrLrcr!rwr{rrrrr"rrrrrrRawConfigParserrrrr}rrr|rr6r)r?s7**""""""     ****** #"""""QQQQQQQQ++++++rz677 rz3RT:: 2:J  RZ,bd 3 3 9 . 4 4 6 6     s:1 s s#BRBX s s[^[k[q s s 0        F.2kTXD   bjKRTRR LLL$2.BB B B B B ;B B B NRZ< = = A  + + +    %%%* 2 2 2 2 2 2 2 2 %%%%%-%%%P &~5++++`+++100@@NNNNNr6