a q egzã@s¬ddlZddlmZddlZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZz ddlZWneyŠdZYn0ddlZddlZddlZddlZddlZz ddlZWneyÚddlZYn0ddlZddlmZddlmZmZmZmZm 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,m-Z-m.Z.m/Z/e  0e1¡Z2e  3d¡Z4e  3d¡Z5e  3d ¡Z6e  3d ¡Z7e  3d ¡Z8e  3d ¡Z9e  3d ¡Z:e  3d¡Z;dd„Zdd„Z?dd„Z@ddd„ZAdd„ZBdd„ZCdd „ZDejEd!d"„ƒZFejEd#d$„ƒZGejEd‘d&d'„ƒZHGd(d)„d)eIƒZJd*d+„ZKGd,d-„d-eIƒZLd.d/„ZMGd0d1„d1eIƒZNe  3d2e jO¡ZPd3d4„ZQd’d5d6„ZRd“d8d9„ZSd:d;„ZTdd?„ZVd@dA„ZWe  3dBe jX¡ZYe  3dC¡ZZd”dDdE„Z[e  3dF¡Z\dGdH„Z]dIdJ„Z^dKdL„Z_dMZ`dNdO„ZadPdQ„ZbGdRdS„dSeIƒZcGdTdU„dUeIƒZdGdVdW„dWeIƒZedXZfd•dYdZ„Zgd[d\„Zhd]ZiGd^d_„d_eIƒZje  3d`¡Zke  3da¡Zle  3db¡Zmdcdd„Zdedf„ZnerÐddglmoZpmqZqmrZrGdhdi„die$jsƒZsGdjdk„dkepƒZoGdldm„dmeoe&ƒZtGdndo„doe%juƒZuerúGdpdq„dqe%jvƒZvGdrds„dse%jwƒZwdtdu„ZxGdvdw„dweIƒZyGdxdy„dyeyƒZzGdzd{„d{eyƒZ{Gd|d}„d}e'ƒZ|Gd~d„deIƒZ}d€d„Z~Gd‚dƒ„dƒeIƒZd„d…„Z€d†d‡„Zdˆd‰„Z‚dŠd‹dŒdœZƒdŽd„Z„dS)–éN)Údeque)Úiglobé)ÚDistlibException)Ú string_typesÚ text_typeÚshutilÚ raw_inputÚStringIOÚcache_from_sourceÚurlopenÚurljoinÚhttplibÚ xmlrpclibÚ HTTPHandlerÚBaseConfiguratorÚ valid_identÚ ContainerÚ configparserÚURLErrorÚZipFileÚfsdecodeÚunquoteÚurlparsez^([\w\.-]+)\s*z^([\w\.*+-]+)\s*z^(<=?|>=?|={2,3}|[~!]=)\s*z*^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*z^or\b\s*z ^and\b\s*z(\S+)\s*z(([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)cs6dd„‰‡‡fdd„‰‡fdd„‰‡fdd„‰ˆ|ƒS) ae Parse a marker string and return a dictionary containing a marker expression. The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in the expression grammar, or strings. A string contained in quotes is to be interpreted as a literal string, and a string not contained in quotes is a variable (such as os_name). cSs.t |¡}|r,| ¡d}|| ¡d…}nú|s:tdƒ‚nì|d}|dvrVtd|ƒ‚d |d¡}|dd…}|g}|rì|d|krŠqqt|d|kr®| |¡|dd…}qtt |¡}|sÈtd|ƒ‚| | ¡d¡|| ¡d…}qtd |¡}td|ƒ‚| |¡d |¡}|dd…  ¡}||fS) Nrzunexpected end of inputz'"zinvalid expression: %sÚrzerror in string literal: %szunterminated string: %s) Ú IDENTIFIERÚmatchÚgroupsÚendÚ SyntaxErrorÚreplaceÚappendÚ STRING_CHUNKÚjoinÚlstrip)Ú remainingÚmÚresultÚqÚoqÚpartsÚs©r,ú6/usr/local/lib/python3.9/site-packages/distlib/util.pyÚ marker_var@s:               z parse_marker..marker_varcs´|rR|ddkrRˆ|dd… ¡ƒ\}}|ddkr@td|ƒ‚|dd… ¡}nZˆ|ƒ\}}|r¨t |¡}|srq¨| ¡d}|| ¡d…}ˆ|ƒ\}}|||dœ}q^|}||fS)Nrú(rú)úunterminated parenthesis: %s©ÚopÚlhsÚrhs)r$rÚ MARKER_OPrrr)r%r'r4r&r3r5)Úmarkerr.r,r-Ú marker_exprds       z!parse_marker..marker_exprcsRˆ|ƒ\}}|rJt |¡}|s qJ|| ¡d…}ˆ|ƒ\}}d||dœ}q ||fS)NÚandr2)ÚANDrr©r%r4r&r5)r8r,r-Ú marker_andws   z parse_marker..marker_andcsRˆ|ƒ\}}|rJt |¡}|s qJ|| ¡d…}ˆ|ƒ\}}d||dœ}q ||fS)NÚorr2)ÚORrrr;)r<r,r-r7‚s   zparse_marker..markerr,)Ú marker_stringr,)r7r<r8r.r-Ú parse_marker6s $ r@cCs0| ¡}|r| d¡rdSt |¡}|s4td|ƒ‚| ¡d}|| ¡d…}d}}}}|r:|ddkr:| dd¡}|dkr”td|ƒ‚|d|…} ||dd… ¡}g}| r0t | ¡}|sØtd | ƒ‚|  | ¡d¡| | ¡d…} | sq0| dd krtd | ƒ‚| dd… ¡} q¸|s:d}|r˜|dd krÀ|dd… ¡}t  |¡}|sztd |ƒ‚| ¡d}t |ƒ} | j rž| j sªtd|ƒ‚|| ¡d… ¡}nØdd„} |ddkrä| |ƒ\}}n´| dd¡}|dkrtd|ƒ‚|d|…} ||dd… ¡}t | ¡r@| | ƒ\}} nXt | ¡}|s\td| ƒ‚| ¡d} | | ¡d… ¡} | rŽtd| ƒ‚d| fg}|rÔ|ddkr¸td|ƒ‚|dd… ¡}t|ƒ\}}|rô|ddkrôtd|ƒ‚|s|}nd|d dd„|Dƒ¡f}t||||||dS)zŠ Parse a requirement passed in as a string. Return a Container whose attributes contain the various parts of the requirement. ú#Nzname expected: %srú[ú]rzunterminated extra: %szmalformed extra: %sú,zcomma expected in extras: %sú@zinvalid URI: %szInvalid URL: %scSsÊt |¡}d}|rÂg}| ¡d}|| ¡d…}t |¡}|sLtd|ƒ‚| ¡d}| ||f¡|| ¡d…}|rº|ddkrˆqº|dd… ¡}|sžqºt |¡}|std|ƒ‚q|sÂd}||fS)z| Return a list of operator, version tuples if any are specified, else None. Nrzinvalid version: %srDrúinvalid constraint: %s)Ú COMPARE_OPrrrÚVERSION_IDENTIFIERrr!r$)Ú ver_remainingr&Úversionsr3Úvr,r,r-Ú get_versionsÄs.      z'parse_requirement..get_versionsr/r0r1rFz~=ú;zinvalid requirement: %szunexpected trailing data: %sú%s %sú, cSsg|] }d|‘qS)rNr,)Ú.0Úconr,r,r-Ú óz%parse_requirement..)ÚnameÚextrasÚ constraintsr7ÚurlÚ requirement)ÚstripÚ startswithrrrrrÚfindr$r!Ú NON_SPACErÚschemeÚnetlocrGrHr@r#r)Úreqr%r&ÚdistnamerUÚ mark_exprrJÚuriÚir+ÚtrLÚ_rKÚrsr,r,r-Úparse_requirementsŠ                           rgcCs¨dd„}i}|D]’\}}}tj ||¡}t|ƒD]p}tj ||¡} t| ƒD]T} ||| ƒ} |durn| | d¡qJ||| ƒ} | tjjd¡ d¡} | d| || <qJq0q|S)z%Find destinations for resources filescSsD| tjjd¡}| tjjd¡}| |¡s.J‚|t|ƒd… d¡S©Nú/)r ÚosÚpathÚseprZÚlenr$)Úrootrkr,r,r-Ú get_rel_pathsz)get_resources_dests..get_rel_pathNri)rjrkr#rÚpopr rlÚrstrip)Úresources_rootÚrulesroÚ destinationsÚbaseÚsuffixÚdestÚprefixÚabs_baseÚabs_globÚabs_pathÚ resource_fileÚrel_pathÚrel_destr,r,r-Úget_resources_dests s    rcCs(ttdƒrd}ntjttdtjƒk}|S)NÚ real_prefixTÚ base_prefix)ÚhasattrÚsysrxÚgetattr©r'r,r,r-Úin_venv&s r†cCstj}t|tƒst|ƒ}|S©N)rƒÚ executableÚ isinstancerrr…r,r,r-Úget_executable0s  rŠcCsN|}t|ƒ}|}|s|r|}|r|d ¡}||vr6qJ|rd|||f}q|S)Nrz %c: %s %s)r Úlower)ÚpromptÚ allowed_charsÚ error_promptÚdefaultÚpr+Úcr,r,r-ÚproceedBs r’cCs8t|tƒr| ¡}i}|D]}||vr||||<q|Sr‡)r‰rÚsplit)ÚdÚkeysr'Úkeyr,r,r-Úextract_by_keyRs r—cCsvtjddkrt d¡|ƒ}| ¡}t|ƒ}zlt |¡}|ddd}| ¡D]B\}}| ¡D]0\}}d||f}t |ƒ} | dusˆJ‚| ||<q`qP|WSt y¶|  dd¡Yn0dd „} t   ¡} z| | |ƒWn:t jy| ¡t |¡}t|ƒ}| | |ƒYn0i}|  ¡D]R} i|| <}|  | ¡D]4\} }d| |f}t |ƒ} | dusbJ‚| || <q8q|S) Nréúutf-8Ú extensionszpython.exportsÚexportsz%s = %scSs$t|dƒr| |¡n | |¡dS)NÚ read_file)r‚rœÚreadfp)ÚcpÚstreamr,r,r-Ú read_streamps  z!read_exports..read_stream)rƒÚ version_infoÚcodecsÚ getreaderÚreadr ÚjsonÚloadÚitemsÚget_export_entryÚ ExceptionÚseekrÚ ConfigParserÚMissingSectionHeaderErrorÚcloseÚtextwrapÚdedentÚsections)rŸÚdataÚjdatar'ÚgroupÚentriesÚkrKr+Úentryr ržr–rTÚvaluer,r,r-Ú read_exports\sD         r¸cCs¨tjddkrt d¡|ƒ}t ¡}| ¡D]l\}}| |¡| ¡D]P}|j dur\|j }nd|j |j f}|j r†d|d  |j ¡f}|  ||j|¡qFq,| |¡dS)Nrr˜r™z%s:%sz%s [%s]rO)rƒr¡r¢Ú getwriterrr«r§Ú add_sectionÚvaluesrvrxÚflagsr#ÚsetrTÚwrite)r›rŸržrµrKr¶r+r,r,r-Ú write_exports‹s   r¿c cs.t ¡}z|VWt |¡n t |¡0dSr‡)ÚtempfileÚmkdtemprÚrmtree)Útdr,r,r-ÚtempdiržsrÄc cs8t ¡}zt |¡dVWt |¡n t |¡0dSr‡)rjÚgetcwdÚchdir)r”Úcwdr,r,r-rƧs  rÆéc cs8t ¡}zt |¡dVWt |¡n t |¡0dSr‡)ÚsocketÚgetdefaulttimeoutÚsetdefaulttimeout)ÚsecondsÚctor,r,r-Úsocket_timeout±s  rÎc@seZdZdd„Zddd„ZdS)Úcached_propertycCs ||_dSr‡)Úfunc)ÚselfrÐr,r,r-Ú__init__½szcached_property.__init__NcCs,|dur |S| |¡}t ||jj|¡|Sr‡)rÐÚobjectÚ __setattr__Ú__name__)rÑÚobjÚclsr·r,r,r-Ú__get__Âs  zcached_property.__get__)N)rÕÚ __module__Ú __qualname__rÒrØr,r,r,r-rÏ»srÏcCs~tjdkr|S|s|S|ddkr.td|ƒ‚|ddkrFtd|ƒ‚| d¡}tj|vrh| tj¡qP|srtjStjj|ŽS)aÐReturn 'pathname' as a name that will work on the native filesystem. The path is split on '/' and put back together again using the current directory separator. Needed because filenames in the setup script are always supplied in Unix style, and have to be converted to the local convention before we can actually use them in the filesystem. Raises ValueError on non-Unix-ish systems if 'pathname' either starts or ends with a slash. rirzpath '%s' cannot be absoluteéÿÿÿÿzpath '%s' cannot end with '/')rjrlÚ ValueErrorr“ÚcurdirÚremoverkr#)ÚpathnameÚpathsr,r,r-Ú convert_pathËs       rác@s”eZdZd$dd„Zdd„Zdd„Zdd „Zd%d d „Zd&dd„Zdd„Z dd„Z dd„Z dd„Z dd„Z d'dd„Zdd„Zdd„Zd d!„Zd"d#„Zd S)(Ú FileOperatorFcCs||_tƒ|_| ¡dSr‡)Údry_runr½ÚensuredÚ _init_record)rÑrãr,r,r-rÒèszFileOperator.__init__cCsd|_tƒ|_tƒ|_dS©NF)Úrecordr½Ú files_writtenÚ dirs_created©rÑr,r,r-råíszFileOperator._init_recordcCs|jr|j |¡dSr‡)rçrèÚadd)rÑrkr,r,r-Úrecord_as_writtenòszFileOperator.record_as_writtencCsHtj |¡s tdtj |¡ƒ‚tj |¡s0dSt |¡jt |¡jkS)aÎTell if the target is newer than the source. Returns true if 'source' exists and is more recently modified than 'target', or if 'source' exists and 'target' doesn't. Returns false if both exist and 'target' is the same age or younger than 'source'. Raise PackagingFileError if 'source' does not exist. Note that this test is not very accurate: files created in the same second will have the same "age". zfile '%r' does not existT)rjrkÚexistsrÚabspathÚstatÚst_mtime)rÑÚsourceÚtargetr,r,r-Únewerös  zFileOperator.newerTcCsŽ| tj |¡¡t d||¡|js€d}|rdtj |¡rDd|}n tj |¡rdtj  |¡sdd|}|rtt |dƒ‚t   ||¡|  |¡dS)z8Copy a file respecting dry-run and force flags. zCopying %s to %sNz%s is a symlinkz%s is a non-regular filez which would be overwritten)Ú ensure_dirrjrkÚdirnameÚloggerÚinforãÚislinkríÚisfilerÜrÚcopyfilerì)rÑÚinfileÚoutfileÚcheckÚmsgr,r,r-Ú copy_file s    zFileOperator.copy_fileNcCsŒtj |¡rJ‚| tj |¡¡t d||¡|js~|durJt|dƒ}nt j|d|d}zt   ||¡W|  ¡n |  ¡0|  |¡dS)NzCopying stream %s to %sÚwbÚw©Úencoding)rjrkÚisdirrôrõrör÷rãÚopenr¢rÚ copyfileobjr­rì)rÑÚinstreamrürÚ outstreamr,r,r-Ú copy_streams zFileOperator.copy_streamcCsp| tj |¡¡|jsbtj |¡r.t |¡t|dƒ}| |¡Wdƒn1sX0Y|  |¡dS)Nr) rôrjrkrõrãrírÞrr¾rì)rÑrkr±Úfr,r,r-Úwrite_binary_file)s   (zFileOperator.write_binary_filecCs| || |¡¡dSr‡)r Úencode)rÑrkr±rr,r,r-Úwrite_text_file2szFileOperator.write_text_filecCsntjdkstjdkrjtjdkrj|D]F}|jr:t d|¡q"t |¡j|B|@}t d||¡t ||¡q"dS)NÚposixÚjavazchanging mode of %szchanging mode of %s to %o) rjrTÚ_namerãrör÷rïÚst_modeÚchmod)rÑÚbitsÚmaskÚfilesr Úmoder,r,r-Úset_mode5szFileOperator.set_modecCs| dd|¡S)Nimiÿ)r)r+r r,r,r-ÚArSzFileOperator.cCs|tj |¡}||jvrxtj |¡sx|j |¡tj |¡\}}| |¡t  d|¡|j sft  |¡|j rx|j  |¡dS)Nz Creating %s)rjrkrîrärírër“rôrör÷rãÚmkdirrçré)rÑrkr”r r,r,r-rôCs    zFileOperator.ensure_dirc Cs¬t|| ƒ}t d||¡|jsž|s0| ||¡rX|s:d}n| |¡sHJ‚|t|ƒd…}i}|r†ttdƒr†t |tj ƒs~tj j }||d<tj |||dfi|¤Ž|  |¡|S)NzByte-compiling %s to %sÚPycInvalidationModeÚinvalidation_modeT)r rör÷rãrórZrmr‚Ú py_compiler‰rÚ CHECKED_HASHÚcompilerì) rÑrkÚoptimizeÚforcerxÚhashed_invalidationÚdpathÚdiagpathÚcompile_kwargsr,r,r-Ú byte_compileOs    zFileOperator.byte_compilecCs²tj |¡r®tj |¡r^tj |¡s^t d|¡|js@t  |¡|j r®||j vr®|j   |¡nPtj |¡rpd}nd}t d||¡|js’t  |¡|j r®||j vr®|j   |¡dS)NzRemoving directory tree at %sÚlinkÚfilezRemoving %s %s)rjrkrírrøröÚdebugrãrrÂrçrérÞrè)rÑrkr+r,r,r-Úensure_removedbs"       zFileOperator.ensure_removedcCsDd}|s@tj |¡r$t |tj¡}q@tj |¡}||kr:q@|}q|Sræ)rjrkríÚaccessÚW_OKrõ)rÑrkr'Úparentr,r,r-Ú is_writablews  zFileOperator.is_writablecCs"|js J‚|j|jf}| ¡|S)zV Commit recorded changes, turn off recording, return changes. )rçrèrérå)rÑr'r,r,r-Úcommitƒs  zFileOperator.commitcCs’|js†t|jƒD]}tj |¡rt |¡qt|jdd}|D]F}t  |¡}|rz|dgks^J‚tj  ||d¡}t  |¡t  |¡q>|  ¡dS)NT)ÚreverseÚ __pycache__r) rãÚlistrèrjrkrírÞÚsortedréÚlistdirr#Úrmdirrå)rÑr Údirsr”ÚflistÚsdr,r,r-Úrollbacks     zFileOperator.rollback)F)T)N)FFNF)rÕrÙrÚrÒrårìrórÿr r r rÚset_executable_moderôr%r)r-r.r8r,r,r,r-râæs         râcCs^|tjvrtj|}nt|ƒ}|dur,|}n.| d¡}t|| d¡ƒ}|D]}t||ƒ}qJ|S)NÚ.r)rƒÚmodulesÚ __import__r“r„rp)Ú module_nameÚ dotted_pathÚmodr'r*rr,r,r-Úresolve s    r@c@s6eZdZdd„Zedd„ƒZdd„Zdd„Zej Z d S) Ú ExportEntrycCs||_||_||_||_dSr‡©rTrxrvr¼)rÑrTrxrvr¼r,r,r-rÒ±szExportEntry.__init__cCst|j|jƒSr‡)r@rxrvrêr,r,r-r··szExportEntry.valuecCsd|j|j|j|jfS)NzrBrêr,r,r-Ú__repr__»szExportEntry.__repr__cCsDt|tƒsd}n0|j|jko>|j|jko>|j|jko>|j|jk}|Sræ)r‰rArTrxrvr¼)rÑÚotherr'r,r,r-Ú__eq__¾s  $ ÿzExportEntry.__eq__N) rÕrÙrÚrÒrÏr·rCrErÓÚ__hash__r,r,r,r-rA¯s  rAz·(?P([^\[]\S*)) \s*=\s*(?P(\w+)([:\.]\w+)*) \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? c Csàt |¡}|s0d}d|vs"d|vrÜtd|ƒ‚n¬| ¡}|d}|d}| d¡}|dkrf|d}}n"|dkrztd|ƒ‚| d¡\}}|d } | durºd|vs¨d|vr´td|ƒ‚g} nd d „|  d ¡Dƒ} t|||| ƒ}|S) NrBrCzInvalid specification '%s'rTÚcallableú:rrr¼cSsg|] }| ¡‘qSr,©rY)rPr r,r,r-rRêrSz$get_export_entry..rD)ÚENTRY_REÚsearchrÚ groupdictÚcountr“rA) Ú specificationr&r'r”rTrkÚcolonsrxrvr¼r,r,r-r¨Ðs8 ÿ  ÿÿr¨cCsÆ|dur d}tjdkr.dtjvr.tj d¡}n tj d¡}tj |¡rft |tj¡}|s t   d|¡n:zt  |¡d}Wn&t yžt j d |dd d }Yn0|s¸t  ¡}t   d |¡tj ||¡S) a¦ Return the default base location for distlib caches. If the directory does not exist, it is created. Use the suffix provided for the base directory, and default to '.distlib' if it isn't provided. On Windows, if LOCALAPPDATA is defined in the environment, then it is assumed to be a directory, and will be the parent directory of the result. On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home directory - using os.expanduser('~') - will be the parent directory of the result. The result is just the directory '.distlib' in the parent directory as determined above, or with the name specified with ``suffix``. Nz.distlibÚntÚ LOCALAPPDATAz $localappdataú~z(Directory exists but is not writable: %sTzUnable to create %s)Úexc_infoFz#Default location unusable, using %s)rjrTÚenvironrkÚ expandvarsÚ expanduserrr*r+röÚwarningÚmakedirsÚOSErrorrÀrÁr#)rvr'Úusabler,r,r-Úget_cache_baseïs&      r[TcCsJtj |rtj |¡n|¡\}}|r0| dd¡}| tjd¡}||dS)a Convert an absolute path to a directory name for use in a cache. The algorithm used is: #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. #. Any occurrence of ``os.sep`` is replaced with ``'--'``. #. ``'.cache'`` is appended. rHz---z--z.cache)rjrkÚ splitdriverîr rl)rkÚ use_abspathr”rr,r,r-Úpath_to_cache_dirs  r^cCs| d¡s|dS|Srh)Úendswith)r+r,r,r-Ú ensure_slash)s r`cCs`d}}d|vr>| dd¡\}}d|vr.|}n| dd¡\}}|rJt|ƒ}|rVt|ƒ}|||fS)NrErrH)Úrsplitr“r)r^ÚusernameÚpasswordrxr,r,r-Úparse_credentials/srdcCst d¡}t |¡|S)Né)rjÚumaskr…r,r,r-Úget_process_umask>s  rgcCs<d}d}t|ƒD]\}}t|tƒsd}q,q|dus8J‚|S)NTF)Ú enumerater‰r)Úseqr'rcr+r,r,r-Úis_string_sequenceDs  rjz3([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-([a-z0-9_.+-]+)z -py(\d\.?\d?)cCsÈd}d}t|ƒ dd¡}t |¡}|r@| d¡}|d| ¡…}|r˜t|ƒt|ƒdkr˜t t  |¡d|¡}|r˜|  ¡}|d|…||dd…|f}|durÄt  |¡}|rÄ| d¡| d¡|f}|S)zw Extract name, version, python version from a filename (no extension) Return name, version, pyver or None Nú ú-rz\br˜) rr ÚPYTHON_VERSIONrKr³ÚstartrmÚrerÚescaperÚPROJECT_NAME_AND_VERSION)ÚfilenameÚ project_namer'Úpyverr&Únr,r,r-Úsplit_filenameTs"   rvz-(?P[\w .-]+)\s*\(\s*(?P[^\s)]+)\)$cCs:t |¡}|std|ƒ‚| ¡}|d ¡ ¡|dfS)zÇ A utility method used to get name and version from a string. From e.g. a Provides-Dist value. :param p: A value in a form 'foo (1.0)' :return: The name and version as a tuple. z$Ill-formed name/version string: '%s'rTÚver)ÚNAME_VERSION_RErrrLrYr‹)rr&r”r,r,r-Úparse_name_and_versionrs  rycCsºtƒ}t|pgƒ}t|pgƒ}d|vr8| d¡||O}|D]x}|dkrT| |¡q<| d¡r”|dd…}||vr€t d|¡||vr´| |¡q<||vrªt d|¡| |¡q<|S)NÚ*rlrzundeclared extra: %s)r½rÞrërZrörW)Ú requestedÚ availabler'ÚrÚunwantedr,r,r-Ú get_extras‚s&        rc CsŠi}zNt|ƒ}| ¡}| d¡}| d¡s8t d|¡nt d¡|ƒ}t  |¡}Wn2t y„}zt  d||¡WYd}~n d}~00|S)Nz Content-Typezapplication/jsonz(Unexpected response for JSON request: %sr™z&Failed to get external data for %s: %s) r r÷ÚgetrZrör(r¢r£r¥r¦r©Ú exception)rWr'ÚrespÚheadersÚctÚreaderÚer,r,r-Ú_get_external_datažs  $r‡z'https://www.red-dove.com/pypi/projects/cCs*d|d ¡|f}tt|ƒ}t|ƒ}|S)Nz%s/%s/project.jsonr©Úupperr Ú_external_data_base_urlr‡)rTrWr'r,r,r-Úget_project_data¶s r‹cCs(d|d ¡||f}tt|ƒ}t|ƒS)Nz%s/%s/package-%s.jsonrrˆ)rTÚversionrWr,r,r-Úget_package_data½s rc@s*eZdZdZdd„Zd dd„Zdd„Zd S) ÚCachezæ A class implementing a cache for resources that need to live in the file system e.g. shared libraries. This class was moved from resources to here because it could be used by other modules, e.g. the wheel module. cCsPtj |¡st |¡t |¡jd@dkr6t d|¡tj tj  |¡¡|_ dS)zu Initialise an instance. :param base: The base directory where the cache should be located. é?rzDirectory '%s' is not privateN) rjrkrrXrïrrörWrîÚnormpathru)rÑrur,r,r-rÒÊs    zCache.__init__TcCs t||dS)zN Converts a resource prefix to a directory name in the cache. )r])r^)rÑrxr]r,r,r-Ú prefix_to_dirØszCache.prefix_to_dirc Cs†g}t |j¡D]p}tj |j|¡}z>tj |¡s>tj |¡rJt |¡ntj |¡r`t   |¡Wqt y~|  |¡Yq0q|S)z" Clear the cache. ) rjr3rurkr#rørùrÞrrrÂr©r!)rÑÚ not_removedÚfnr,r,r-ÚclearÞs   z Cache.clearN)T)rÕrÙrÚÚ__doc__rÒr‘r”r,r,r,r-rŽÃs rŽc@s:eZdZdZdd„Zddd„Zdd„Zd d „Zd d „Zd S)Ú EventMixinz1 A very simple publish/subscribe system. cCs i|_dSr‡)Ú _subscribersrêr,r,r-rÒôszEventMixin.__init__TcCsD|j}||vrt|gƒ||<n"||}|r6| |¡n | |¡dS)a` Add a subscriber for an event. :param event: The name of an event. :param subscriber: The subscriber to be added (and called when the event is published). :param append: Whether to append or prepend the subscriber to an existing subscriber list for the event. N)r—rr!Ú appendleft)rÑÚeventÚ subscriberr!ÚsubsÚsqr,r,r-rë÷s  zEventMixin.addcCs,|j}||vrtd|ƒ‚|| |¡dS)z™ Remove a subscriber for an event. :param event: The name of an event. :param subscriber: The subscriber to be removed. zNo subscribers: %rN)r—rÜrÞ)rÑr™ršr›r,r,r-rÞ s zEventMixin.removecCst|j |d¡ƒS)z Return an iterator for the subscribers for an event. :param event: The event to return subscribers for. r,)Úiterr—r€)rÑr™r,r,r-Úget_subscribersszEventMixin.get_subscribersc Ospg}| |¡D]J}z||g|¢Ri|¤Ž}Wn tyLt d¡d}Yn0| |¡qt d||||¡|S)a^ Publish a event and return a list of values returned by its subscribers. :param event: The event to publish. :param args: The positional arguments to pass to the event's subscribers. :param kwargs: The keyword arguments to pass to the event's subscribers. z"Exception during event publicationNz/publish %s: args = %s, kwargs = %s, result = %s)ržr©rörr!r()rÑr™ÚargsÚkwargsr'ršr·r,r,r-Úpublishs     zEventMixin.publishN)T) rÕrÙrÚr•rÒrërÞržr¡r,r,r,r-r–ïs   r–c@s^eZdZdd„Zdd„Zddd„Zdd „Zd d „Zd d „Zdd„Z e dd„ƒZ e dd„ƒZ dS)Ú SequencercCsi|_i|_tƒ|_dSr‡)Ú_predsÚ_succsr½Ú_nodesrêr,r,r-rÒ:szSequencer.__init__cCs|j |¡dSr‡)r¥rë©rÑÚnoder,r,r-Úadd_node?szSequencer.add_nodeFcCs®||jvr|j |¡|rªt|j |d¡ƒD]}| ||¡q,t|j |d¡ƒD]}| ||¡qPt|j ¡ƒD]\}}|sp|j|=qpt|j ¡ƒD]\}}|s”|j|=q”dS)Nr,)r¥rÞr½r£r€r¤r1r§)rÑr§Úedgesrr+rµrKr,r,r-Ú remove_nodeBs   zSequencer.remove_nodecCs<||ks J‚|j |tƒ¡ |¡|j |tƒ¡ |¡dSr‡)r£Ú setdefaultr½rër¤)rÑÚpredÚsuccr,r,r-rëRs z Sequencer.addcCs„||ks J‚z|j|}|j|}WntyBtd|ƒ‚Yn0z| |¡| |¡Wn"ty~td||fƒ‚Yn0dS)Nz%r not a successor of anythingz%r not a successor of %r)r£r¤ÚKeyErrorrÜrÞ)rÑr¬r­ÚpredsÚsuccsr,r,r-rÞWs     zSequencer.removecCs||jvp||jvp||jvSr‡)r£r¤r¥)rÑÚstepr,r,r-Úis_stepdszSequencer.is_stepcCs˜| |¡std|ƒ‚g}g}tƒ}| |¡|r| d¡}||vrb||krŽ| |¡| |¡q.| |¡| |¡|j |d¡}|  |¡q.t |ƒS)Nz Unknown: %rrr,) r²rÜr½r!rprÞrër£r€ÚextendÚreversed)rÑÚfinalr'ÚtodoÚseenr±r¯r,r,r-Ú get_stepsgs"         zSequencer.get_stepscsRdg‰g‰i‰i‰g‰|j‰‡‡‡‡‡‡‡fdd„‰ˆD]}|ˆvr8ˆ|ƒq8ˆS)Nrcsîˆdˆ|<ˆdˆ|<ˆdd7<ˆ |¡z ˆ|}WntyTg}Yn0|D]J}|ˆvr†ˆ|ƒtˆ|ˆ|ƒˆ|<qZ|ˆvrZtˆ|ˆ|ƒˆ|<qZˆ|ˆ|krêg}ˆ ¡}| |¡||krºqØqºt|ƒ}ˆ |¡dS©Nrr)r!r©ÚminrpÚtuple)r§Ú successorsÚ successorÚconnected_componentÚ component©ÚgraphÚindexÚ index_counterÚlowlinksr'ÚstackÚ strongconnectr,r-rÆ‹s,       z3Sequencer.strong_connections..strongconnect)r¤r¦r,rÀr-Ústrong_connections€s# zSequencer.strong_connectionscCsfdg}|jD]*}|j|}|D]}| d||f¡qq |jD]}| d|¡q>| d¡d |¡S)Nz digraph G {z %s -> %s;z %s;Ú}Ú )r£r!r¥r#)rÑr'r­r¯r¬r§r,r,r-Údot´s    z Sequencer.dotN)F) rÕrÙrÚrÒr¨rªrërÞr²r¸ÚpropertyrÇrÊr,r,r,r-r¢8s   3r¢)ú.tar.gzú.tar.bz2ú.tarú.zipú.tgzú.tbzú.whlc sh‡‡fdd„}tj ˆ¡‰tˆƒ‰d}|dur†| d¡r>d}nH| d¡rRd}d}n4| d¡rfd }d }n | d ¡rzd }d }n td|ƒ‚zÌ|dkrºt|d ƒ}|rä| ¡}|D] }||ƒqªn*t  ||¡}|rä|  ¡}|D] }||ƒqÖ|dkr*t j ddkr*|  ¡D]"} t| jtƒs| j d¡| _qdd„} | |_| ˆ¡W|rd| ¡n|rb| ¡0dS)NcsRt|tƒs| d¡}tj tj ˆ|¡¡}| ˆ¡rB|ˆtjkrNt d|ƒ‚dS)Nr™zpath outside destination: %r) r‰rÚdecoderjrkrîr#rZrlrÜ)rkr©Údest_dirÚplenr,r-Ú check_pathÊs   zunarchive..check_path)rÏrÒÚzip)rÌrÐÚtgzzr:gz)rÍrÑÚtbzzr:bz2rÎÚtarr}zUnknown format for %rrr˜r™c SsFzt ||¡WStjy@}ztt|ƒƒ‚WYd}~n d}~00dS)z9Run tarfile.tar_filter, but raise the expected ValueErrorN)ÚtarfileÚ tar_filterÚ FilterErrorrÜÚstr)ÚmemberrkÚexcr,r,r-Úextraction_filterûsz$unarchive..extraction_filter)rjrkrîrmr_rÜrÚnamelistrÜrÚgetnamesrƒr¡Ú getmembersr‰rTrrÓrâÚ extractallr­) Úarchive_filenamerÕÚformatrýr×ÚarchiverÚnamesrTÚtarinforâr,rÔr-Ú unarchiveÈsP             ÿrìc Cs’t ¡}t|ƒ}t|dƒd}t |¡D]H\}}}|D]8}tj ||¡}||d…} tj | |¡} | || ¡q4q&Wdƒn1s„0Y|S)z*zip a directory tree into a BytesIO objectrN) ÚioÚBytesIOrmrrjÚwalkrkr#r¾) Ú directoryr'ÚdlenÚzfrnr5rrTÚfullÚrelrwr,r,r-Úzip_dir s  .rõ)rÚKÚMÚGÚTÚPc@sreZdZdZddd„Zdd„Zdd „Zd d „Zd d „Ze dd„ƒZ e dd„ƒZ dd„Z e dd„ƒZ e dd„ƒZdS)ÚProgressÚUNKNOWNrédcCs<|dus||ksJ‚||_|_||_d|_d|_d|_dS)NrF)rºÚcurÚmaxÚstartedÚelapsedÚdone)rÑÚminvalÚmaxvalr,r,r-rÒ$s  zProgress.__init__cCsV|j|ksJ‚|jdus&||jks&J‚||_t ¡}|jdurF||_n ||j|_dSr‡)rºrÿrþÚtimerr)rÑÚcurvalÚnowr,r,r-Úupdate,s zProgress.updatecCs |dks J‚| |j|¡dS)Nr)rrþ)rÑÚincrr,r,r-Ú increment6s zProgress.incrementcCs| |j¡|Sr‡)rrºrêr,r,r-rn:s zProgress.startcCs |jdur| |j¡d|_dS)NT)rÿrrrêr,r,r-Ústop>s  z Progress.stopcCs|jdur|jS|jSr‡)rÿÚunknownrêr,r,r-ÚmaximumCszProgress.maximumcCsD|jr d}n4|jdurd}n$d|j|j|j|j}d|}|S)Nz100 %z ?? %gY@z%3d %%)rrÿrþrº)rÑr'rKr,r,r-Ú percentageGs zProgress.percentagecCs:|dkr|jdus|j|jkr$d}nt dt |¡¡}|S)Nrz??:??:??z%H:%M:%S)rÿrþrºrÚstrftimeÚgmtime)rÑÚdurationr'r,r,r-Úformat_durationRszProgress.format_durationcCs‚|jrd}|j}n^d}|jdur&d}nJ|jdks<|j|jkrBd}n.t|j|jƒ}||j|j}|d|j}d|| |¡fS)NÚDonezETA rÛrrz%s: %s)rrrÿrþrºÚfloatr)rÑrxrdr,r,r-ÚETA[s z Progress.ETAcCsL|jdkrd}n|j|j|j}tD]}|dkr6q@|d}q&d||fS)Nrgièg@@z%d %sB/s)rrþrºÚUNITS)rÑr'Úunitr,r,r-Úspeedns  zProgress.speedN)rrý)rÕrÙrÚr rÒrr rnr rËr rrrrr,r,r,r-rû!s      rûz \{([^}]*)\}z[^/\\,{]\*\*|\*\*[^/\\,}]z^[^{]*\}|\{[^}]*$cCs<t |¡rd}t||ƒ‚t |¡r4d}t||ƒ‚t|ƒS)zAExtended globbing function that supports ** and {opt1,opt2,opt3}.z7invalid glob %r: recursive glob "**" must be used alonez2invalid glob %r: mismatching set marker '{' or '}')Ú_CHECK_RECURSIVE_GLOBrKrÜÚ_CHECK_MISMATCH_SETÚ_iglob)Ú path_globrþr,r,r-r„s    rc cst |d¡}t|ƒdkrht|ƒdks,J|ƒ‚|\}}}| d¡D]$}td |||f¡ƒD] }|VqXq@nœd|vr†t|ƒD] }|Vqxn~| dd¡\}}|dkr¢d}|dkr°d}n| d¡}| d ¡}t |¡D]4\}}} tj   |¡}ttj  ||¡ƒD] } | VqöqÎdS) Nrr˜rDrz**r:rzriú\) Ú RICH_GLOBr“rmrr#Ú std_iglobr$rjrïrkr) rÚrich_path_globrxr½rvÚitemrkÚradicalÚdirrr“r,r,r-rs*         r)Ú HTTPSHandlerÚmatch_hostnameÚCertificateErrorc@seZdZdZdZdd„ZdS)ÚHTTPSConnectionNTcCs$t |j|jf|j¡}t|ddƒr0||_| ¡t  tj ¡}t tdƒrV|j tj O_ t|ddƒrr| |j|j¡i}|jr¨tj|_|j|jdttddƒr¨|j|d<|j|fi|¤Ž|_|jr |jr z$t|j ¡|jƒt d|j¡Wn.ty|j tj¡|j ¡‚Yn0dS) NÚ _tunnel_hostFÚ OP_NO_SSLv2Ú cert_file)ÚcafileÚHAS_SNIÚserver_hostnamezHost verified: %s)rÉÚcreate_connectionÚhostÚportÚtimeoutr„ÚsockÚ_tunnelÚsslÚ SSLContextÚPROTOCOL_SSLv23r‚Úoptionsr)Úload_cert_chainr*Úkey_fileÚca_certsÚ CERT_REQUIREDÚ verify_modeÚload_verify_locationsÚ wrap_socketÚ check_domainr%Ú getpeercertrör(r&ÚshutdownÚ SHUT_RDWRr­)rÑr2Úcontextr r,r,r-Úconnect·s0       zHTTPSConnection.connect)rÕrÙrÚr:r?rDr,r,r,r-r'²sr'c@s&eZdZd dd„Zdd„Zdd„ZdS) r$TcCst |¡||_||_dSr‡)ÚBaseHTTPSHandlerrÒr:r?)rÑr:r?r,r,r-rÒÕs zHTTPSHandler.__init__cOs(t|i|¤Ž}|jr$|j|_|j|_|S)a This is called to create a connection instance. Normally you'd pass a connection class to do_open, but it doesn't actually check for a class, and just expects a callable. As long as we behave just as a constructor would have, we should be OK. If it ever changes so that we *must* pass a class, we'll create an UnsafeHTTPSConnection class which just sets check_domain to False in the class definition, and choose which one to pass to do_open. )r'r:r?)rÑrŸr r'r,r,r-Ú _conn_makerÚs zHTTPSHandler._conn_makerc CsZz| |j|¡WStyT}z,dt|jƒvr>td|jƒ‚n‚WYd}~n d}~00dS)Nzcertificate verify failedz*Unable to verify server certificate for %s)Údo_openrFrrßÚreasonr&r/)rÑr_r†r,r,r-Ú https_openêsÿzHTTPSHandler.https_openN)T)rÕrÙrÚrÒrFrIr,r,r,r-r$Ós r$c@seZdZdd„ZdS)ÚHTTPSOnlyHandlercCstd|ƒ‚dS)NzAUnexpected HTTP request on what should be a secure connection: %s)r)rÑr_r,r,r-Ú http_openÿsÿzHTTPSOnlyHandler.http_openN)rÕrÙrÚrKr,r,r,r-rJýsrJc@seZdZddd„Zdd„ZdS)Ú TransportrcCs||_tj ||¡dSr‡)r1rrLrÒ©rÑr1Ú use_datetimer,r,r-rÒ szTransport.__init__cCsD| |¡\}}}|jr$||jdkr:||_|t |¡f|_|jdSr¹)Ú get_host_infoÚ _connectionÚ_extra_headersrÚHTTPConnection)rÑr/ÚhÚehÚx509r,r,r-Úmake_connection s zTransport.make_connectionN)r©rÕrÙrÚrÒrVr,r,r,r-rLs rLc@seZdZddd„Zdd„ZdS)Ú SafeTransportrcCs||_tj ||¡dSr‡)r1rrXrÒrMr,r,r-rÒszSafeTransport.__init__cCs`| |¡\}}}|si}|j|d<|jr6||jdkrV||_|tj|dfi|¤Žf|_|jdS)Nr1rr)rOr1rPrQrr')rÑr/rSrTr r,r,r-rVs zSafeTransport.make_connectionN)rrWr,r,r,r-rXs rXc@seZdZdd„ZdS)Ú ServerProxycKsx| dd¡|_}|dur^t|ƒd}| dd¡}|dkr@t}nt}|||d|d<}||_tjj ||fi|¤ŽdS)Nr1rrNÚhttps)rNÚ transport) rpr1rr€rXrLr[rrYrÒ)rÑrbr r1r]rNÚtclsrdr,r,r-rÒ*s  zServerProxy.__init__N)rÕrÙrÚrÒr,r,r,r-rY(srYcKs:tjddkr|d7}nd|d<d|d<t||fi|¤ŽS)Nrr˜ÚbrÚnewliner™r)rƒr¡r)r“rr r,r,r-Ú _csv_openAs  r_c@s4eZdZedƒedƒedƒdœZdd„Zdd„Zd S) ÚCSVBaserDú"rÉ)Ú delimiterÚ quotecharÚlineterminatorcCs|Sr‡r,rêr,r,r-Ú __enter__SszCSVBase.__enter__cGs|j ¡dSr‡)rŸr­)rÑrSr,r,r-Ú__exit__VszCSVBase.__exit__N)rÕrÙrÚrßÚdefaultsrerfr,r,r,r-r`Ls ýr`c@s(eZdZdd„Zdd„Zdd„ZeZdS)Ú CSVReadercKs`d|vr4|d}tjddkr,t d¡|ƒ}||_nt|ddƒ|_tj|jfi|j¤Ž|_dS)NrŸrr˜r™rkr}) rƒr¡r¢r£rŸr_Úcsvr…rg)rÑr rŸr,r,r-rÒ\szCSVReader.__init__cCs|Sr‡r,rêr,r,r-Ú__iter__gszCSVReader.__iter__cCsFt|jƒ}tjddkrBt|ƒD] \}}t|tƒs | d¡||<q |S©Nrr˜r™)Únextr…rƒr¡rhr‰rrÓ)rÑr'rcr!r,r,r-rljs   zCSVReader.nextN)rÕrÙrÚrÒrjrlÚ__next__r,r,r,r-rhZs rhc@seZdZdd„Zdd„ZdS)Ú CSVWritercKs(t|dƒ|_tj|jfi|j¤Ž|_dS)Nr)r_rŸriÚwriterrg)rÑr“r r,r,r-rÒws zCSVWriter.__init__cCsNtjddkr>g}|D]"}t|tƒr.| d¡}| |¡q|}|j |¡dSrk)rƒr¡r‰rr r!roÚwriterow)rÑÚrowr}r!r,r,r-rp{s   zCSVWriter.writerowN)rÕrÙrÚrÒrpr,r,r,r-rnusrncsHeZdZeejƒZded<d ‡fdd„ Zdd„Zdd „Zd d „Z ‡Z S) Ú ConfiguratorÚ inc_convertÚincNcs"tt|ƒ |¡|pt ¡|_dSr‡)ÚsuperrrrÒrjrÅru)rÑÚconfigru©Ú __class__r,r-rÒszConfigurator.__init__c s°‡‡fdd„‰ˆ d¡}t|ƒs*ˆ |¡}ˆ dd¡}ˆ dd¡}|r\t‡fdd„|Dƒƒ}‡‡fd d„ˆDƒ}t|ƒ}||i|¤Ž}|r¬| ¡D]\}} t||ˆ| ƒƒq’|S) Ncsvt|ttfƒr*t|ƒ‡fdd„|Dƒƒ}nHt|tƒrhd|vrHˆ |¡}qri}|D]}ˆ||ƒ||<qPn ˆ |¡}|S)Ncsg|] }ˆ|ƒ‘qSr,r,)rPrc©Úconvertr,r-rR˜rSzBConfigurator.configure_custom..convert..ú())r‰r1r»ÚtypeÚdictÚconfigure_customrz)Úor'rµ)rzrÑr,r-rz–s   z.Configurator.configure_custom..convertr{r:z[]r,csg|] }ˆ|ƒ‘qSr,r,)rPrryr,r-rR«rSz1Configurator.configure_custom..cs$g|]}t|ƒr|ˆˆ|ƒf‘qSr,)r)rPrµ)rvrzr,r-rR¬rS)rprGr@r»r}r§Úsetattr) rÑrvr‘ÚpropsrŸr§r r'rurKr,)rvrzrÑr-r~”s    zConfigurator.configure_customcCs4|j|}t|tƒr0d|vr0| |¡|j|<}|S)Nr{)rvr‰r}r~)rÑr–r'r,r,r-Ú __getitem__´s zConfigurator.__getitem__cCsZtj |¡stj |j|¡}tj|ddd}t |¡}Wdƒn1sL0Y|S)z*Default converter for the inc:// protocol.r}r™rN) rjrkÚisabsr#rur¢rr¥r¦)rÑr·r r'r,r,r-rsºs  (zConfigurator.inc_convert)N) rÕrÙrÚr}rÚvalue_convertersrÒr~r‚rsÚ __classcell__r,r,rwr-rr‹s   rrc@s*eZdZdZd dd„Zdd„Zdd „ZdS) ÚSubprocessMixinzC Mixin for running subprocesses and capturing their output FNcCs||_||_dSr‡)ÚverboseÚprogress)rÑr‡rˆr,r,r-rÒÈszSubprocessMixin.__init__cCsj|j}|j}| ¡}|sq^|dur.|||ƒq |s@tj d¡ntj | d¡¡tj ¡q | ¡dS)z¨ Read lines from a subprocess' output stream and either pass to a progress callable (if specified) or write progress information to sys.stderr. Nr:r™) rˆr‡ÚreadlinerƒÚstderrr¾rÓÚflushr­)rÑrŸrCrˆr‡r+r,r,r-r…Ìs  zSubprocessMixin.readercKsžtj|ftjtjdœ|¤Ž}tj|j|jdfd}| ¡tj|j|jdfd}| ¡|  ¡|  ¡|  ¡|j durˆ|  dd¡n|j ršt j d¡|S)N)ÚstdoutrŠrŒ)ròrŸrŠzdone.Úmainzdone. )Ú subprocessÚPopenÚPIPEÚ threadingÚThreadr…rŒrnrŠÚwaitr#rˆr‡rƒr¾)rÑÚcmdr rÚt1Út2r,r,r-Ú run_commandás  zSubprocessMixin.run_command)FN)rÕrÙrÚr•rÒr…r—r,r,r,r-r†Ãs r†cCst dd|¡ ¡S)z,Normalize a python package name a la PEP 503z[-_.]+rl)roÚsubr‹)rTr,r,r-Únormalize_nameñsr™c@s.eZdZdZdZd dd„Zdd„Zdd „ZdS) Ú PyPIRCFilezhttps://upload.pypi.org/legacy/ÚpypiNcCs.|durtj tj d¡d¡}||_||_dS)NrRz.pypirc)rjrkr#rVrrrW)rÑr“rWr,r,r-rÒszPyPIRCFile.__init__c Cs€i}tj |j¡r||jp|j}t ¡}| |j¡|  ¡}d|vr*|  dd¡}dd„|  d¡Dƒ}|gkr~d|vr|dg}nª|D]¤}d|i}|  |d¡|d<d |jfd |j fd fD].\}} |  ||¡rÚ|  ||¡||<q´| ||<q´|dkr ||jdfvr |j|d <q‚|d|kr‚|d |kr‚i}q‚nRd |vr|d }|  |d ¡rT|  |d ¡}n|j}|  |d¡|  |d ¡|||j dœ}|S)NÚ distutilsz index-serverscSs g|]}| ¡dkr| ¡‘qS)rrI)rPÚserverr,r,r-rRrSz#PyPIRCFile.read..rÉr›rrbÚ repositoryÚrealm)rcNz server-loginrc)rbrcržrrŸ)rjrkrírrrWÚDEFAULT_REPOSITORYrÚRawConfigParserr¤r°r€r“Ú DEFAULT_REALMÚ has_option) rÑr'ržrvr°Ú index_serversÚ_serversrr–rr,r,r-r¤ sJ    ÿ       ûzPyPIRCFile.readcCs€t ¡}|j}| |¡| d¡s,| d¡| dd|¡| dd|¡t|dƒ}| |¡Wdƒn1sr0YdS)Nr›rbrcr) rr¡rrr¤Ú has_sectionrºr½rr¾)rÑrbrcrvr“r r,r,r-rBs    zPyPIRCFile.update)NN)rÕrÙrÚr r¢rÒr¤rr,r,r,r-ršs  5ršcCst|jd ¡S)zG Read the PyPI access configuration as supported by distutils. )rW)ršrWr¤©rÂr,r,r-Ú _load_pypircOsr¨cCstƒ |j|j¡dSr‡)ršrrbrcr§r,r,r-Ú _store_pypircVsr©c CsútjdkrFdtj ¡vrdSdtj ¡vr.dSdtj ¡vr@dStjSdtjvrZtjdStjd ksnttd ƒsttjSt ¡\}}}}}| ¡  d d ¡}|  d d¡  d d¡}|dd…dkrÆd||fS|dd…dkr(|ddkrìd}dt |dƒd|dd…f}dddœ}|d|tj 7}nÄ|dd…dkrLdd l m }|ƒS|dd!…d"krŠd"}t d#tj¡}| |¡}|rì| ¡}nb|dd!…d$krìddl} zdd%lm} WntyÐddl} Yn0|  |  ¡|||¡\}}}d&|||fS)'aúReturn a string that identifies the current platform. This is used mainly to distinguish platform-specific build directories and platform-specific built distributions. Typically includes the OS name and version and the architecture (as supplied by 'os.uname()'), although the exact information included depends on the OS; eg. on Linux, the kernel version isn't particularly important. Examples of returned values: linux-i586 linux-alpha (?) solaris-2.6-sun4u Windows will return one of: win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) win32 (all others - specifically, sys.platform is returned) For other non-POSIX platforms, currently just returns 'sys.platform'. rPÚamd64ú win-amd64z(arm)ú win-arm32z(arm64)z win-arm64Ú_PYTHON_HOST_PLATFORMrÚunamerirrkrerlNéÚlinuxz%s-%sÚsunosrÚ5Úsolarisz%d.%sr˜éÚ32bitÚ64bit)iÿÿÿlÿÿÿÿz.%sÚaix)Ú aix_platforméÚcygwinz[\d.]+Údarwin)Ú sysconfigz%s-%s-%s)rjrTrƒrŒr‹ÚplatformrTr‚r®r ÚintÚmaxsizeÚ _aix_supportr¸rorÚASCIIrr³Ú _osx_supportrœr¼Ú ImportErrorÚget_platform_osxÚget_config_vars) Úosnamer/ÚreleaserŒÚmachineÚbitnessr¸Úrel_rer&rÂr¼r,r,r-Úget_host_platform`sP         rËÚwin32r«r¬)Úx86Úx64ÚarmcCs2tjdkrtƒStj d¡}|tvr*tƒSt|S)NrPÚVSCMD_ARG_TGT_ARCH)rjrTrËrTr€Ú_TARGET_TO_PLAT)Úcross_compilation_targetr,r,r-Ú get_platformºs   rÓ)NN)rÈ)N)T)N)NT)…r¢Ú collectionsrÚ contextlibriÚglobrrrír¥ÚloggingrjrrorÉr4rÃrŽrƒrÜrÀr®r‘Zdummy_threadingrrrÚcompatrrrr r r r r rrrrrrrrrrrrÚ getLoggerrÕrörrrHrGr6r>r:r\r"r@rgrr†rŠr’r—r¸r¿ÚcontextmanagerrÄrÆrÎrÓrÏrárâr@rAÚVERBOSErJr¨r[r^r`rdrgrjÚIrqrmrvrxryrr‡rŠr‹rrŽr–r¢ÚARCHIVE_EXTENSIONSrìrõrrûrrrrr$rEr%r&r'rJrLrXrYr_r`rhrnrrr†r™ršr¨r©rËrÑrÓr,r,r,r-Úsî        X         Z|   /   ;ü )  ÿ   ,I D^    !*  8.M Tý