a [ÎdgŸã@s’ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZddlZddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"ddlm#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+e ,d ¡Z-e ,d ej.¡Z/e ,d ¡Z0e ,d ej.¡j1Z2d  3¡Z4gd¢Z5dZ6dZ7e7j8dj8ej9ŽedZ:dd„Z;dd„ZdDdd„Z?dEdd„Z@dedfdd „ZAdFd!d"„ZBd#d$„ZCe ,d%ej.¡ZDeCd&d'„ƒZEGd(d)„d)ƒZFGd*d+„d+eFƒZGGd,d-„d-eƒZHe ,d.¡jIZJd/d0„ZKd1d2„ZLdGd3d4„ZMd5d6„ZNGd7d8„d8ƒZOGd9d:„d:e jPƒZQejRjSfd;d<„ZTd=d>„ZUeMe6ƒeTƒZTd?d@„ZVdAdB„ZWdS)HéN©Úwraps) Ú CHECKOUT_DISTÚ DistributionÚ BINARY_DISTÚnormalize_pathÚ SOURCE_DISTÚ EnvironmentÚfind_distributionsÚ safe_nameÚ safe_versionÚ to_filenameÚ RequirementÚ DEVELOP_DISTÚEGG_DIST)Ú ssl_support)Úlog)ÚDistutilsError)Ú translate)ÚWheelz^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)Ú PackageIndexÚdistros_for_urlÚparse_bdist_wininstÚinterpret_distro_nameézs$            rc Csxtj |¡}|\}}}}}}tj | d¡d¡}|dkrX|dkrXtj | d¡d¡}d|vrp| dd¡\}}||fS)Nú/éÿÿÿÿzsourceforge.netÚdownloadéþÿÿÿú#é)ÚurllibrÚurlparseÚunquoteÚsplit) ÚurlÚpartsÚschemeÚserverÚpathÚ parametersÚqueryÚfragmentr*r r r!Úegg_info_for_urlVs r>ccs\t|ƒ\}}t|||ƒD] }|Vq|rXt |¡}|rXt|| d¡|tdD] }|VqLdS)Nr1)Ú precedence)r>Údistros_for_locationÚ EGG_FRAGMENTÚmatchrÚgroupr)r6Úmetadatar*r=ÚdistrBr r r!ras  ÿ rcCsä| d¡r|dd…}| d¡r8d|vr8t |||¡gS| d¡rxd|vrxt|ƒ}| ¡s^gSt||j|jtddgS| d¡rªt|ƒ\}}}|durªt ||||t |ƒSt D]0}| |¡r®|dt |ƒ …}t |||ƒSq®gS) Nú.egg.zipr%z.eggú-z.whlr1)ÚlocationÚ project_nameÚversionr?r#) r'rZ from_locationrZ is_compatiblerIrJrrrrÚ EXTENSIONSÚlen)rHÚbasenamerDZwheelZwin_baser+ÚplatformÚextr r r!r@os2  û  ÿ r@cCstt|ƒtj |¡|ƒS©N)r@rÚosr:rM)ÚfilenamerDr r r!Údistros_for_filenamesÿrSc cs|| d¡}|s,tdd„|dd…Dƒƒr,dStdt|ƒdƒD]8}t||d |d|…¡d ||d…¡|||dVq>dS)NrGcss|]}t d|¡VqdS)z py\d\.\d$N)ÚrerB)Ú.0Úpr r r!Ú ®óz(interpret_distro_name..ér1)Ú py_versionr?rN)r5ÚanyÚrangerLrÚjoin)rHrMrDrZr?rNr7rVr r r!r—s $ýrccsdtƒ}|j}|dur8t |j|¡D]}||ƒ|Vq"n(|D]"}||ƒ}||vr<||ƒ|Vq.wrapperr)rlrmr rkr!Ú unique_valuesÍsrnz(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>c csºt |¡D]d}| ¡\}}tttj| ¡ d¡ƒƒ}d|vsDd|vr t  |¡D]}t j   |t | d¡ƒ¡VqNq dD]@}| |¡}|dkrtt  ||¡}|rtt j   |t | d¡ƒ¡VqtdS)Nú,Zhomepager.r1)z Home PagezDownload URLr-)ÚRELÚfinditerÚgroupsr^ÚmapÚstrÚstripr&r5ÚHREFr2rÚurljoinÚ htmldecoderCÚfindÚsearch)r6ÚpagerBÚtagÚrelZrelsÚposr r r!Úfind_external_linksÞs   rc@s$eZdZdd„Zdd„Zdd„ZdS)ÚContentCheckercCsdSrPr ©ÚselfÚblockr r r!ÚfeedöszContentChecker.feedcCsdS©NTr ©r‚r r r!Úis_validüszContentChecker.is_validcCsdSrPr )r‚ÚreporterÚtemplater r r!ÚreportszContentChecker.reportN)Ú__name__Ú __module__Ú __qualname__r„r‡rŠr r r r!r€ñsr€c@sBeZdZe d¡Zdd„Zedd„ƒZdd„Z dd „Z d d „Z d S) Ú HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs||_t |¡|_||_dSrP)Ú hash_nameÚhashlibÚnewÚhashÚexpected)r‚rr“r r r!Ú__init__s zHashChecker.__init__cCsBtj |¡d}|stƒS|j |¡}|s0tƒS|fi| ¡¤ŽS)Nr-)r2rr3r€ÚpatternrzÚ groupdict)Úclsr6r=rBr r r!Úfrom_urls zHashChecker.from_urlcCs|j |¡dSrP)r’Úupdaterr r r!r„ szHashChecker.feedcCs|j ¡|jkSrP)r’Ú hexdigestr“r†r r r!r‡#szHashChecker.is_validcCs||j}||ƒSrP)r)r‚rˆr‰Úmsgr r r!rŠ&s zHashChecker.reportN) r‹rŒrrTÚcompiler•r”Ú classmethodr˜r„r‡rŠr r r r!rŽ sÿ rŽcs@eZdZdKdd„ZdLdd „ZdMd d „ZdNd d „Zdd„Zdd„Zdd„Z dd„Z dd„Z dOdd„Z dd„Z dP‡fdd„ Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„ZdQd(d)„ZdRd*d+„Zd,d-„Zd.Zd/d0„Zd1d2„ZdSd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Zd=d>„Ze dTd?d@„ƒZ!dAdB„Z"dCdD„Z#dEdF„Z$dGdH„Z%dIdJ„Z&‡Z'S)Urúhttps://pypi.org/simple/©Ú*NTcOsštj|g|¢Ri|¤Ž|dd| d¡ …|_i|_i|_i|_t d  t t |ƒ¡¡j |_ g|_|oxtjox|pxt ¡}|rŒt |¡|_n tjj|_dS)Nr,ú|)r r”r'Ú index_urlÚ scanned_urlsÚ fetched_urlsÚ package_pagesrTrœr]rsrrBÚallowsÚto_scanrZ is_availableZfind_ca_bundleZ opener_forÚopenerr2ÚrequestÚurlopen)r‚r¢ZhostsZ ca_bundleZ verify_sslriÚkwZuse_sslr r r!r”.sÿ ýzPackageIndex.__init__Fc Csâ||jvr|sdSd|j|<t|ƒs2| |¡dStt|ƒƒ}|r\| |¡sPdS| d|¡|sn|rn||jvr‚tt|j |ƒƒdS| |¡sšd|j|<dS|  d|¡d|j|<d}|  |||¡}|durÐdSt |t jjƒrø|jdkrø|  d|j¡d|j|j<d|j dd ¡ ¡vr(| ¡dS|j}| ¡}t |tƒsvt |t jjƒrXd }n|j d ¡phd }| |d ¡}| ¡t |¡D](} t j |t|   d ¡ƒ¡} | !| ¡qˆ| "|j#¡rÞt$|ddƒdkrÞ| %||¡}dS)NTzFound link: %sz Reading %sz.)ÚfilterrQr:rËrµr`ÚstarmapÚ scan_egg_link)r‚Z search_pathÚdirsZ egg_linksr r r!Úscan_egg_links–s þzPackageIndex.scan_egg_linkscCs¢ttj ||¡ƒ&}ttdttj|ƒƒƒ}Wdƒn1s>0Yt |ƒdkrXdS|\}}t tj ||¡ƒD]*}tjj|g|¢RŽ|_ t |_ | |¡qrdS)NrY)ÚopenrQr:r]rµrÖrsrtrurLr rHrr?r_)r‚r:rÕZ raw_linesÚlinesZegg_pathZ setup_pathrEr r r!rØ s4 zPackageIndex.scan_egg_linkcCs”d}| |j¡s|Stttjj|t|jƒd… d¡ƒƒ}t|ƒdksRd|dvrV|St |dƒ}t |dƒ}d|j   |  ¡i¡|<t|ƒt|ƒfS)N)NNr,rYr0r1rT)r(r¢rµrsr2rr4rLr5r r r¥Ú setdefaultr&r )r‚rÈZNO_MATCH_SENTINELr7ÚpkgÚverr r r!Ú_scan°s ÿ  zPackageIndex._scanc CsÀt |¡D]:}z"| tj |t| d¡ƒ¡¡Wq tyBYq 0q | |¡\}}|s\dSt ||ƒD]H}t |ƒ\}}|  d¡r¤|s¤|rš|d||f7}n |  |¡|  |¡qft dd„|¡S)Nr1r®ú.pyz #egg=%s-%scSsd| ddd¡S)Nz%sr1érY)rC)Úmr r r!ÚÜrXz,PackageIndex.process_index..)rvrqràr2rrwrxrCrrr>r'Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub) r‚r6r{rBrÞrßÚnew_urlr*Úfragr r r!rÄÂs$"    ÿzPackageIndex.process_indexcCs| d|¡dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)Úscan_all©r‚r6r r r!råßsþzPackageIndex.need_version_infocGs<|j|jvr,|r"|j|g|¢RŽ| d¡| |j¡dS)Nz6Scanning index of all packages (this may take a while))r¢r¤rÊr¸ræ©r‚r›rir r r!rëås ÿzPackageIndex.scan_allcCsz| |j|jd¡|j |j¡s:| |j|jd¡|j |j¡sR| |¡t|j |jd¡ƒD]}| |¡qfdS)Nr,r ) rær¢Ú unsafe_namer¥r¾rdrIÚnot_found_in_indexrµ)r‚Ú requirementr6r r r!Ú find_packagesîs zPackageIndex.find_packagescsR| ¡| |¡||jD]"}||vr0|S| d||¡qtt|ƒ ||¡S)Nz%s does not match %s)Úprescanrñrdr·ÚsuperrÚobtain)r‚rðZ installerrE©Ú __class__r r!rôýs zPackageIndex.obtaincCsL| |jd|¡| ¡sH| ¡t |¡td|jjtj   |¡fƒ‚dS)NzValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?) rŠr·r‡r¿rQÚunlinkrr’r)r:rM)r‚ÚcheckerrRÚtfpr r r!Ú check_hashsþ þÿzPackageIndex.check_hashcCsN|D]D}|jdus0t|ƒr0| d¡s0tt|ƒƒr<| |¡q|j |¡qdS)Núfile:)r§r³r(rµrræÚappend)r‚Zurlsr6r r r!Úadd_find_linkssÿþý ü zPackageIndex.add_find_linkscCs"|jrtt|j|jƒƒd|_dSrP)r§rµrsrær†r r r!rò%szPackageIndex.prescancCs<||jr|jd}}n |jd}}|||jƒ| ¡dS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rdr¸rÊrîrë)r‚rðÚmethr›r r r!rï+s þ zPackageIndex.not_found_in_indexcCs~t|tƒsjt|ƒ}|rR| | d¡||¡}t|ƒ\}}| d¡rN| |||¡}|Stj   |¡rb|St |ƒ}t |  ||¡ddƒS)Nr1rárH)rºrr³Ú _download_urlrCr>r'Ú gen_setuprQr:rÉr"rÃÚfetch_distribution)r‚rÚtmpdirr8Úfoundr*r=r r r!r.5s    zPackageIndex.downloadc s܈ d|¡i‰d}d ‡‡‡‡‡fdd„ }|rHˆ ¡ˆ |¡||ƒ}|s^|dur^|||ƒ}|dur€ˆjdurxˆ ¡||ƒ}|durž|sžˆ |¡||ƒ}|dur¾ˆ dˆr´dp¶d|¡nˆ d|¡|j|jdSdS) NzSearching for %scs’|dur ˆ}||jD]v}|jtkrFˆsF|ˆvrˆ d|¡dˆ|<q||vo\|jtkp\ˆ }|rˆ |jˆ¡}||_tj   |j¡r|SqdS)Nz&Skipping development or system egg: %sr1) rdr?rrÊrr.rHÚdownload_locationrQr:rÉ)ZreqÚenvrEÚtestÚloc©Ú develop_okr‚ZskippedÚsourcerr r!ryos$ÿþz-PackageIndex.fetch_distribution..findz:No local packages or working download links found for %s%sza source distribution of r®zBest match: %s)rH)N)r¸ròrñr§rÊZcloner) r‚rðrÚ force_scanr r Z local_indexrEryr rr!rWs2        ý zPackageIndex.fetch_distributioncCs"| ||||¡}|dur|jSdSrP)rrH)r‚rðrr r rEr r r!Úfetch£szPackageIndex.fetchc Cst |¡}|r*dd„t|| d¡dƒDƒp,g}t|ƒdkrîtj |¡}tj |¡|krŠtj  ||¡}ddl m }|||ƒsŠt   ||¡|}ttj  |d¡dƒ<} |  d|dj|djtj |¡df¡Wdƒn1sà0Y|S|rtd ||fƒ‚ntd ƒ‚dS) NcSsg|]}|jr|‘qSr )rJ)rUÚdr r r!Ú ²sÿz*PackageIndex.gen_setup..r1r)Úsamefilezsetup.pyÚwzIfrom setuptools import setup setup(name=%r, version=%r, py_modules=[%r]) z†Can't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rzpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rArBrrCrLrQr:rMÚdirnamer]Zsetuptools.command.easy_installrÚshutilÚcopy2rÛÚwriterIrJÚsplitextr) r‚rRr=rrBrÅrMÚdstrrÑr r r!r°s@  þý     þþÿ"þÿÿzPackageIndex.gen_setupi c Cs:| d|¡d}zt |¡}| |¡}t|tjjƒrLtd||j |j fƒ‚| ¡}d}|j }d}d|vr”|  d¡} t tt| ƒƒ}| |||||¡t|dƒ`} | |¡} | râ| | ¡|  | ¡|d7}| |||||¡q qâq | ||| ¡Wdƒn1s0Y|W|r"| ¡Sn|r4| ¡0dS) NzDownloading %szCan't download %s: %s %srr-zcontent-lengthzContent-LengthÚwbr1)r¸rŽr˜r¹rºr2r»r¼rr±r›Ú dl_blocksizeZget_allÚmaxrsÚintÚ reporthookrÛrÀr„rrúr¿) r‚r6rRÚfprør½ÚblocknumÚbsÚsizeZsizesrùrƒr r r!Ú _download_toÛsD   ÿ     .ýÿzPackageIndex._download_tocCsdSrPr )r‚r6rRrZblksizerr r r!rÿszPackageIndex.reporthookc Cs®| d¡rt|ƒSzt||jƒWSttjjfyˆ}zHd dd„|j Dƒ¡}|r`|  ||¡nt d||fƒ|‚WYd}~n*d}~0t j jy²}z|WYd}~Sd}~0t j jy}z4|rÚ|  ||j¡nt d||jfƒ|‚WYd}~n°d}~0tjjyT}z6|r,|  ||j¡nt d||jfƒ|‚WYd}~n^d}~0tjjtj fy¨}z2|r‚|  ||¡nt d||fƒ|‚WYd}~n d}~00dS)Nrûú cSsg|] }t|ƒ‘qSr )rt)rUÚargr r r!r rXz)PackageIndex.open_url..z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r(Ú local_openÚopen_with_authr¨rÚhttpÚclientÚ InvalidURLr]rirÊrr2r»r¼ÚURLErrorÚreasonZ BadStatusLineÚlineZ HTTPExceptionÚsocket)r‚r6ÚwarningÚvr›r r r!r¹sJ (ÿÿþÿüÿÿzPackageIndex.open_urlcCsæt|ƒ\}}|r0d|vr4| dd¡ dd¡}qnd}| d¡rJ|dd…}tj ||¡}|dksj| d ¡rv| ||¡S|d ksˆ| d ¡r”| ||¡S| d ¡rª|  ||¡S|d krÊt j   t j  |¡d¡S| |d¡| ||¡SdS)Nz..Ú.ú\Ú_Z__downloaded__rFr%Úsvnzsvn+Úgitzgit+zhg+rÑrYT)r>Úreplacer'rQr:r]r(Ú _download_svnÚ _download_gitÚ _download_hgr2r©Ú url2pathnamerr3r¶Ú_attempt_download)r‚r8r6rr)r=rRr r r!rÿ&s$        zPackageIndex._download_urlcCs| |d¡dSr…)rÂrìr r r!ræCszPackageIndex.scan_urlcCs6| ||¡}d| dd¡ ¡vr.| |||¡S|SdS)Nr¬r­r®)r r¾r&Ú_download_html)r‚r6rRr½r r r!r8Fs zPackageIndex._attempt_downloadcCsnt|ƒ}|D]>}| ¡r t d|¡rF| ¡t |¡| ||¡SqLq | ¡t |¡td|ƒ‚dS)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) rÛ���ru���rT���rz���r¿���rQ���r÷���r4��r���)r‚���r6���r½���rR���rÑ���r*��r ���r ���r!���r9��M��s����   zPackageIndex._download_htmlc�����������������C���s��t� dt¡�| dd¡d�}d}| ¡� d¡râd|v�râtj |¡\}}}}}} |sâ| d¡râd |d d�…�v�râ|d d�…� d d¡\}}t |ƒ\} } | râd | v�rº|  d d¡\} } d | | f�}nd | �}| }|||||| f}tj  |¡}|�  d||¡�t   d|||f�¡�|S�)Nz"SVN download support is deprecatedr0���r1���r���r®���zsvn:ú@z//r,���rY���ú:z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)ÚwarningsrÊ���Ú UserWarningr5���r&���r(���r2���r���r3���Ú _splituserÚ urlunparser¸���rQ���Úsystem)r‚���r6���rR���Zcredsr8���Únetlocr:���rV���ÚqrÇ���ÚauthÚhostÚuserZpwr7���r ���r ���r!���r4��\��s&����   zPackageIndex._download_svnc�����������������C���sp���t�j |�¡\}}}}}| dd¡d�}| dd¡d�}d�}d|v�rR| dd¡\}}t�j ||||df¡}�|�|fS�)Nú+r1���r-���r0���r���r:��r®���)r2���r���Úurlsplitr5���ÚrsplitÚ urlunsplit)r6���Ú pop_prefixr8���rA��r:���r<���rê���Úrevr ���r ���r!���Ú_vcs_split_rev_from_urlr��s����z$PackageIndex._vcs_split_rev_from_urlc�����������������C���sl���| �dd¡d�}|�j|dd\}}|� d||¡�t d||f�¡�|d�urh|� d|¡�t d ||f�¡�|S�) Nr0���r1���r���T©rJ��zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %s©r5���rL��r¸���rQ���r@��©r‚���r6���rR���rK��r ���r ���r!���r5��„��s���� þzPackageIndex._download_gitc�����������������C���sl���| �dd¡d�}|�j|dd\}}|� d||¡�t d||f�¡�|d�urh|� d|¡�t d ||f�¡�|S�) Nr0���r1���r���TrM��zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -qrN��rO��r ���r ���r!���r6��”��s���� þzPackageIndex._download_hgc�����������������G���s���t�j|g|¢R�Ž��d�S�rP���)r���r·���rí���r ���r ���r!���r·���¤��s����zPackageIndex.debugc�����������������G���s���t�j|g|¢R�Ž��d�S�rP���)r���r¸���rí���r ���r ���r!���r¸���§��s����zPackageIndex.infoc�����������������G���s���t�j|g|¢R�Ž��d�S�rP���)r���rÊ���rí���r ���r ���r!���rÊ���ª��s����zPackageIndex.warn)rž���rŸ���NT)F)F)F)N)N)FFFN)FF)N)F)(r‹���rŒ���r���r”���rÂ���r´���r¶���rÚ���rØ���rà���rÄ���rå���rë���rñ���rô���rú���rý���rò���rï���r.���r��r ��r���r��r ��r��r¹���rÿ���ræ���r8��r9��r4��Ú staticmethodrL��r5��r6��r·���r¸���rÊ���Ú __classcell__r ���r ���rõ���r!���r���+��sP�����þ  5      #��þ L )$ # r���z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�����������������C���s���|� �d¡}t |¡S�)Nr���)rC���r¬���Zunescape)rB���Zwhatr ���r ���r!���Ú decode_entity³��s���� rR��c�����������������C���s ���t�t|�ƒS�rP���)Ú entity_subrR��)Útextr ���r ���r!���rx���¸��s���� rx���c��������������������s���‡�fdd„}|S�)Nc��������������������s���‡�‡fdd„}|S�)Nc��������������� ������s>���t� ¡�}t� ˆ¡�zˆ�|�i�|¤ŽW�t� |¡�S�t� |¡�0�d�S�rP���)r+��ÚgetdefaulttimeoutÚsetdefaulttimeout)ri���rj���Z old_timeout)rl���Útimeoutr ���r!���Ú_socket_timeoutÆ��s����  þz@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr ���)rl���rX��©rW��rk���r!���rX��Å��s����z'socket_timeout.<locals>._socket_timeoutr ���)rW��rX��r ���rY��r!���Úsocket_timeoutÄ��s���� rZ��c�����������������C���s2���t�j |�¡}| ¡�}t |¡}| ¡�}| dd¡S�)NÚ r®���)r2���r���r4���ÚencodeÚbase64Z b64encoderÁ���r3��)rC��Zauth_sZ auth_bytesZ encoded_bytesÚencodedr ���r ���r!���Ú _encode_authÓ��s ����  r_��c�������������������@���s$���e�Zd�Zdd„�Zdd„�Zdd„�ZdS�)Ú Credentialc�����������������C���s���||�_�||�_d�S�rP���©ÚusernameÚpassword)r‚���rb��rc��r ���r ���r!���r”���í��s����zCredential.__init__c�����������������c���s���|�j�V��|�jV��d�S�rP���ra��r†���r ���r ���r!���Ú__iter__ñ��s����zCredential.__iter__c�����������������C���s ���dt�|�ƒ�S�)Nz%(username)s:%(password)s)Úvarsr†���r ���r ���r!���Ú__str__õ��s����zCredential.__str__N)r‹���rŒ���r���r”���rd��rf��r ���r ���r ���r!���r`��è��s���r`��c�������������������@���s0���e�Zd�Zdd„�Zedd„�ƒZdd„�Zdd„�Zd S�) Ú PyPIConfigc�����������������C���sN���t� g�d¢d¡}tj |�|¡�tj tj d¡d¡}tj  |¡rJ|�  |¡�d�S�)N)rb��rc��Ú repositoryr®���ú~z.pypirc) ÚdictÚfromkeysÚ configparserÚRawConfigParserr”���rQ���r:���r]���Ú expanduserrÉ���rÀ���)r‚���ÚdefaultsÚrcr ���r ���r!���r”���ú��s ���� zPyPIConfig.__init__c��������������������s&���‡�fdd„ˆ� �¡�D�ƒ}ttˆ�j|ƒƒS�)Nc��������������������s ���g�|�]}ˆ� �|d�¡ ¡�r|‘qS�)rh��)r¾���ru���)rU���Úsectionr†���r ���r!���r����s���ÿz2PyPIConfig.creds_by_repository.<locals>.<listcomp>)Zsectionsrj��rs���Ú_get_repo_cred)r‚���Zsections_with_repositoriesr ���r†���r!���Úcreds_by_repository��s���� ÿzPyPIConfig.creds_by_repositoryc�����������������C���s6���|� �|d¡ ¡�}|t|� �|d¡ ¡�|� �|d¡ ¡�ƒfS�)Nrh��rb��rc��)r¾���ru���r`��)r‚���rq��Zrepor ���r ���r!���rr����s ����þzPyPIConfig._get_repo_credc�����������������C���s*���|�j� ¡�D�]\}}| |¡r |��S�q d�S�rP���)rs��Úitemsr(���)r‚���r6���rh��Úcredr ���r ���r!���Úfind_credential��s���� zPyPIConfig.find_credentialN)r‹���rŒ���r���r”���Úpropertyrs��rr��rv��r ���r ���r ���r!���rg��ù��s ���  rg��c�����������������C���s@��t�j |�¡}|\}}}}}}| d¡r2tj d¡‚|dv�rHt|ƒ\} } nd�} | s„tƒ�  |�¡} | r„t | ƒ} | j |�f} t j dg| ¢R�Ž��| rÊdt| ƒ�} || ||||f} t�j | ¡}t�j |¡}| d| ¡�n t�j |�¡}| dt¡�||ƒ}| r<t�j |j¡\}}}}}}||kr<|| kr<||||||f} t�j | ¡|_|S�)Nr;��znonnumeric port: '')r%��Úhttpsz*Authenticating as %s for %s (from .pypirc)zBasic Z Authorizationz User-Agent)r2���r���r3���r'���r%��r&��r'��r>��rg��rv��rt���rb��r���r¸���r_��r?��r©���ZRequestZ add_headerÚ user_agentr6���)r6���r¨���Úparsedr8���rA��r:���Úparamsr<���rê���rC��Úaddressru��r¸���r7���ré���r©���r��Ús2Zh2Zpath2Zparam2Zquery2Zfrag2r ���r ���r!���r$����s8����          r$��c�����������������C���s ���|� �d¡\}}}�|r|nd�|�fS�)Nr:��)Ú rpartition)rD��rE��Údelimr ���r ���r!���r>��N��s����r>��c�����������������C���s���|�S�rP���r ���)r6���r ���r ���r!���Ú fix_sf_urlY��s����r€��c�������������� ���C���s,��t�j |�¡\}}}}}}t�j |¡}tj |¡r<t�j |�¡S�|  d¡rütj  |¡rüg�}t  |¡D�]x} tj  || ¡} | dkr²t | dƒ} |  ¡�} W�d���ƒ�n1�s¢0����Y���qòntj  | ¡rÆ| d7�} | dj| d¡�q`d} | j|�d  |¡d} d \}}n d \}}} d d i}t | ¡}t�j |�||||¡S�) Nr,���z index.htmlÚrz<a href="{name}">{name}</a>)r)���zB<html><head><title>{url}{files}r[)r6Úfiles)éÈZOK)r²zPath not foundz Not foundr­z text/html)r2rr3r©r7rQr:Úisfilerªr'rËrÍr]rÛrÀrüÚformatÚioÚStringIOr»r¼)r6r8r9r:Zparamr<rêrRr‚rÇÚfilepathrÚbodyrÆÚstatusÚmessager½Z body_streamr r r!r#]s.    & ÿ   r#)N)N)N)N)r)XÚsysrQrTr†rr+r]rr`r<rlr¬Z http.clientr%Ú urllib.parser2Zurllib.requestZ urllib.errorÚ functoolsrrZ pkg_resourcesrrrrrr r r r r rrrrZ distutilsrZdistutils.errorsrÚfnmatchrZsetuptools.wheelrrœrAÚIrvrçrBr³r5rKÚ__all__Z_SOCKET_TIMEOUTZ_tmplr…Ú version_inforyr"rr>rr@rSrrhrnrprr€rŽrrèrSrRrxrZr_r`rmrgr©rªr$r>r€r#r r r r!ÚsŒ <      ÿ ÿ   ! þ $   !  &/