/opt/alt/python37/lib/python3.7/site-packages/distlib/__pycache__
NameSizeModeActions
compat.cpython-37.opt-1.pyc315290644editdlrm
compat.cpython-37.pyc315680644editdlrm
database.cpython-37.opt-1.pyc427950644editdlrm
database.cpython-37.pyc427950644editdlrm
index.cpython-37.opt-1.pyc170790644editdlrm
index.cpython-37.pyc170790644editdlrm
locators.cpython-37.opt-1.pyc384860644editdlrm
locators.cpython-37.pyc385280644editdlrm
manifest.cpython-37.opt-1.pyc101380644editdlrm
manifest.cpython-37.pyc102500644editdlrm
markers.cpython-37.opt-1.pyc49640644editdlrm
markers.cpython-37.pyc50050644editdlrm
metadata.cpython-37.opt-1.pyc272700644editdlrm
metadata.cpython-37.pyc273370644editdlrm
resources.cpython-37.opt-1.pyc108340644editdlrm
resources.cpython-37.pyc108340644editdlrm
scripts.cpython-37.opt-1.pyc110740644editdlrm
scripts.cpython-37.pyc110740644editdlrm
util.cpython-37.opt-1.pyc509710644editdlrm
util.cpython-37.pyc513520644editdlrm
version.cpython-37.opt-1.pyc203660644editdlrm
version.cpython-37.pyc204340644editdlrm
wheel.cpython-37.opt-1.pyc265000644editdlrm
wheel.cpython-37.pyc265740644editdlrm
__init__.cpython-37.opt-1.pyc10020644editdlrm
__init__.cpython-37.pyc10020644editdlrm
Edit: /opt/alt/python37/lib/python3.7/site-packages/distlib/__pycache__/util.cpython-37.pyc (51352B)
B :—°aÖã@s²ddlZddlmZddlZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZy ddlZWnek rŒdZYnXddlZddlZddlZddlZddlZy ddlZWnek rÞddlZYnXddlZddlmZddlmZmZmZmZm 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/m0Z0e  1e2¡Z3e  4d¡Z5e  4d¡Z6e  4d ¡Z7e  4d ¡Z8e  4d ¡Z9e  4d ¡Z:e  4d ¡Z;e  4d¡Zdd„Z?dd„Z@dd„ZAddd„ZBdd„ZCdd„ZDdd „ZEejFd!d"„ƒZGejFd#d$„ƒZHejFd‘d&d'„ƒZIGd(d)„d)eJƒZKd*d+„ZLGd,d-„d-eJƒZMd.d/„ZNGd0d1„d1eJƒZOe  4d2e jP¡ZQd3d4„ZRd’d5d6„ZSd7d8„ZTd9d:„ZUd;d<„ZVd=d>„ZWd?d@„ZXe  4dAe jY¡ZZe  4dB¡Z[d“dCdD„Z\e  4dE¡Z]dFdG„Z^dHdI„Z_dJdK„Z`dLZadMdN„ZbdOdP„ZcGdQdR„dReJƒZdGdSdT„dTeJƒZeGdUdV„dVeJƒZfdWZgd”dYdZ„Zhd[d\„Zid]ZjGd^d_„d_eJƒZke  4d`¡Zle  4da¡Zme  4db¡Zndcdd„Zdedf„ZoerÖddglmpZqmrZrmsZsGdhdi„die$jtƒZtGdjdk„dkeqƒZpGdldm„dmepe'ƒZuGdndo„doe%jvƒZverGdpdq„dqe%jwƒZwGdrds„dse%jxƒZxdtdu„ZyGdvdw„dweJƒZzGdxdy„dyezƒZ{Gdzd{„d{ezƒZ|Gd|d}„d}e(ƒZ}Gd~d„deJƒZ~d€d„ZGd‚dƒ„dƒeJƒZ€d„d…„Zd†d‡„Z‚dˆ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Ú splittypeÚ 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). cSs0t |¡}|r,| ¡d}|| ¡d…}nü|s:tdƒ‚nî|d}|dkrVtd|ƒ‚d |d¡}|dd…}|g}xŽ|rì|d|krŠPqv|d|kr®| |¡|dd…}qvt |¡}|sÈtd|ƒ‚| | ¡d¡|| ¡d…}qvWd |¡}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ÚqZoqÚpartsÚs©r,ú=/opt/alt/python37/lib/python3.7/site-packages/distlib/util.pyÚ marker_varAs:               z parse_marker..marker_varcs¸|rR|ddkrRˆ|dd… ¡ƒ\}}|ddkr@td|ƒ‚|dd… ¡}n^ˆ|ƒ\}}xL|rªt |¡}|stP| ¡d}|| ¡d…}ˆ|ƒ\}}|||dœ}q`W|}||fS)Nrú(rú)zunterminated parenthesis: %s)ÚopÚlhsÚrhs)r%r Ú MARKER_OPrrr)r&r(r2r'r1r3)Úmarkerr.r,r-Ú marker_expres       z!parse_marker..marker_exprcsVˆ|ƒ\}}x@|rLt |¡}|s"P|| ¡d…}ˆ|ƒ\}}d||dœ}qW||fS)NÚand)r1r2r3)ÚANDrr)r&r2r'r3)r6r,r-Ú marker_andxs   z parse_marker..marker_andcsVˆ|ƒ\}}x@|rLt |¡}|s"P|| ¡d…}ˆ|ƒ\}}d||dœ}qW||fS)NÚor)r1r2r3)ÚORrr)r&r2r'r3)r9r,r-r5ƒs   zparse_marker..markerr,)Z marker_stringr,)r5r9r6r.r-Ú parse_marker8s $ r<cCs2| ¡}|r| d¡rdSt |¡}|s4td|ƒ‚| ¡d}|| ¡d…}d}}}}|r<|ddkr<| dd¡}|dkr”td|ƒ‚|d|…} ||dd… ¡}g}xx| r0t | ¡}|sÚtd | ƒ‚|  | ¡d¡| | ¡d…} | sP| dd krtd | ƒ‚| dd… ¡} qºW|s.get_versionsr/r0zunterminated parenthesis: %szinvalid constraint: %sz~=ú;zinvalid requirement: %szunexpected trailing data: %sz%s %sz, cSsg|] }d|‘qS)z%s %sr,)Ú.0Zconr,r,r-ú sz%parse_requirement..)ÚnameÚextrasZ constraintsr5ÚurlZ requirement)ÚstripÚ startswithrrr rrÚfindr%r"Ú NON_SPACErÚschemeÚnetlocrBrCr<r$r)Úreqr&r'ZdistnamerKZ mark_exprrDÚuriÚir+ÚtrFÚ_rEZrsr,r,r-Úparse_requirement‘sŒ                           rXcCs´dd„}i}x¢|D]š\}}}tj ||¡}x€t|ƒD]t}tj ||¡} x`t| ƒD]T} ||| ƒ} |dkrt| | d¡qP||| ƒ} | tjjd¡ d¡} | d| || <qPWq4WqW|S)z%Find destinations for resources filescSsD| tjjd¡}| tjjd¡}| |¡s.t‚|t|ƒd… d¡S)Nú/)r!ÚosÚpathÚseprNÚAssertionErrorÚlenr%)Úrootr[r,r,r-Ú get_rel_pathsz)get_resources_dests..get_rel_pathNrY)rZr[r$rÚpopr!r\Úrstrip)Zresources_rootZrulesr`Z destinationsÚbaseÚsuffixÚdestÚprefixZabs_baseZabs_globZabs_pathZ resource_fileZrel_pathZrel_destr,r,r-Úget_resources_destss  rgcCs(ttdƒrd}ntjttdtjƒk}|S)NZ real_prefixTÚ base_prefix)ÚhasattrÚsysrfÚgetattr)r(r,r,r-Úin_venv(s rlcCstj}t|tƒst|ƒ}|S)N)rjÚ executableÚ isinstancerr)r(r,r,r-Úget_executable2s  rocCsR|}xHt|ƒ}|}|s|r|}|r|d ¡}||kr8P|rd|||f}qW|S)Nrz %c: %s %s)r Úlower)ÚpromptZ allowed_charsZ error_promptÚdefaultÚpr+Úcr,r,r-ÚproceedDs rucCs<t|tƒr| ¡}i}x |D]}||kr||||<qW|S)N)rnrÚsplit)ÚdÚkeysr(Úkeyr,r,r-Úextract_by_keyTs  rzcCsˆtjddkrt d¡|ƒ}| ¡}t|ƒ}yrt |¡}|ddd}xR| ¡D]F\}}x<| ¡D]0\}}d||f}t |ƒ} | dk sŒt ‚| ||<qdWqRW|St k r¾|  dd¡YnXdd „} t  ¡} y| | |ƒWn<t jk r| ¡t |¡}t|ƒ}| | |ƒYnXi}xb|  ¡D]V} i|| <}xB|  | ¡D]4\} }d| |f}t |ƒ} | dk spt ‚| || <qFWq*W|S) Nrézutf-8Ú extensionszpython.exportsÚexportsz%s = %scSs$t|dƒr| |¡n | |¡dS)NÚ read_file)rir~Zreadfp)ÚcpÚstreamr,r,r-Ú read_streamqs  z!read_exports..read_stream)rjÚ version_infoÚcodecsÚ getreaderÚreadr ÚjsonÚloadÚitemsÚget_export_entryr]Ú ExceptionÚseekrÚ ConfigParserZMissingSectionHeaderErrorÚcloseÚtextwrapÚdedentÚsections)r€ÚdataZjdatar(ÚgroupÚentriesÚkrEr+ÚentryrrryrJÚvaluer,r,r-Ú read_exports]sD      r—cCs°tjddkrt d¡|ƒ}t ¡}x|| ¡D]p\}}| |¡x\| ¡D]P}|j dkr`|j }nd|j |j f}|j rŠd|d  |j ¡f}|  ||j|¡qJWq.W| |¡dS)Nrr{zutf-8z%s:%sz%s [%s]z, )rjr‚rƒÚ getwriterrrŒrˆÚ add_sectionÚvaluesrdrfÚflagsr$ÚsetrJÚwrite)r}r€rr”rEr•r+r,r,r-Ú write_exportsŒs  ržc cs$t ¡}z |VWdt |¡XdS)N)ÚtempfileÚmkdtemprÚrmtree)Ztdr,r,r-ÚtempdirŸs r¢c cs.t ¡}zt |¡dVWdt |¡XdS)N)rZÚgetcwdÚchdir)rwÚcwdr,r,r-r¤§s   r¤éc cs.t ¡}zt |¡dVWdt |¡XdS)N)ÚsocketZgetdefaulttimeoutZsetdefaulttimeout)ZsecondsZctor,r,r-Úsocket_timeout±s   r¨c@seZdZdd„Zddd„ZdS)Úcached_propertycCs ||_dS)N)Úfunc)Úselfrªr,r,r-Ú__init__¼szcached_property.__init__NcCs,|dkr |S| |¡}t ||jj|¡|S)N)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¡}xtj|krj| tj¡qRW|svtjStjj|Ž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. rYrzpath '%s' cannot be absoluteéÿÿÿÿzpath '%s' cannot end with '/')rZr\Ú ValueErrorrvÚcurdirÚremover[r$)Ú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ƒ|_| ¡dS)N)Ú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 |¡dS)N)rÀrÁÚadd)r«r[r,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)rZr[Ú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_dirrZr[ÚdirnameÚloggerÚinfor½ÚislinkrÅÚisfiler¶rZcopyfilerÄ)r«ZinfileÚoutfileÚcheckÚmsgr,r,r-Ú copy_files    zFileOperator.copy_fileNcCs„tj |¡rt‚| tj |¡¡t d||¡|jsv|dkrJt |dƒ}nt j |d|d}zt   ||¡Wd|  ¡X| |¡dS)NzCopying stream %s to %sÚwbÚw)Úencoding)rZr[Úisdirr]rÌrÍrÎrÏr½ÚopenrƒrZ copyfileobjrrÄ)r«ZinstreamrÒrØZ outstreamr,r,r-Ú copy_streams  zFileOperator.copy_streamc Cs\| tj |¡¡|jsNtj |¡r.t |¡t|dƒ}| |¡WdQRX|  |¡dS)NrÖ) rÌrZr[rÍr½rÅr¸rÚrrÄ)r«r[r‘Úfr,r,r-Úwrite_binary_file's   zFileOperator.write_binary_filecCs| || |¡¡dS)N)rÝÚencode)r«r[r‘rØr,r,r-Úwrite_text_file0szFileOperator.write_text_filecCsrtjdkstjdkrntjdkrnxN|D]F}|jr?ózFileOperator.cCs|tj |¡}||jkrxtj |¡sx|j |¡tj |¡\}}| |¡t  d|¡|j sft  |¡|j rx|j  |¡dS)Nz Creating %s)rZr[rÆr¾rÅrÃrvrÌrÎrÏr½ÚmkdirrÀrÂ)r«r[rwrÜr,r,r-rÌAs    zFileOperator.ensure_dirc Cs˜t|| ƒ}t d||¡|jsŠ|s0| ||¡rX|s:d}n| |¡sHt‚|t|ƒd…}i}|rvtt dƒrvt j j |d<t j |||df|Ž|  |¡|S)NzByte-compiling %s to %sÚPycInvalidationModeÚinvalidation_modeT)r rÎrÏr½rËrNr]r^riÚ py_compileríÚ CHECKED_HASHÚcompilerÄ) r«r[ÚoptimizeÚforcerfZhashed_invalidationZdpathZdiagpathZcompile_kwargsr,r,r-Ú byte_compileMs   zFileOperator.byte_compilecCs²tj |¡r®tj |¡r^tj |¡s^t d|¡|js@t  |¡|j r®||j kr®|j   |¡nPtj |¡rpd}nd}t d||¡|js’t  |¡|j r®||j kr®|j   |¡dS)NzRemoving directory tree at %sÚlinkÚfilezRemoving %s %s)rZr[rÅrÙrÐrÎÚdebugr½rr¡rÀrÂr¸rÁ)r«r[r+r,r,r-Úensure_removed^s"       zFileOperator.ensure_removedcCsHd}x>|sBtj |¡r&t |tj¡}Ptj |¡}||kr)rJrfrdr›)r«r,r,r-Ú__repr__µs zExportEntry.__repr__cCsDt|tƒsd}n0|j|jko>|j|jko>|j|jko>|j|jk}|S)NF)rnr rJrfrdr›)r«Úotherr(r,r,r-Ú__eq__¹s     zExportEntry.__eq__N) r¯r³r´r¬r©r–r rr­Ú__hash__r,r,r,r-r ªs   r z¸(?P(\w|[-.+])+) \s*=\s*(?P(\w+)([:\.]\w+)*) \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? c Csàt |¡}|s0d}d|ks"d|krÜtd|ƒ‚n¬| ¡}|d}|d}| d¡}|dkrf|d}}n"|dkrztd|ƒ‚| d¡\}}|d } | dkrºd|ks¨d|kr´td|ƒ‚g} nd d „|  d ¡Dƒ} t|||| ƒ}|S) Nr>r?zInvalid specification '%s'rJÚcallableú:rrr›cSsg|] }| ¡‘qSr,)rM)rHrÜr,r,r-rIåsz$get_export_entry..r@)ÚENTRY_REÚsearchrÚ groupdictÚcountrvr ) Z specificationr'r(rwrJr[Zcolonsrfrdr›r,r,r-r‰Ës2    r‰cCsÈ|dkr d}tjdkr.dtjkr.tj d¡}n tj d¡}tj |¡rft |tj¡}|s¢t   d|¡n| dd¡\}}d|kr.|}n| dd¡\}}|rJt|ƒ}|rVt|ƒ}|||fS)NrArr)Úrsplitrvr)rRÚusernameÚpasswordrfr,r,r-Úparse_credentials*sr(cCst d¡}t |¡|S)Né)rZÚumask)r(r,r,r-Úget_process_umask9s  r+cCs>d}d}x$t|ƒD]\}}t|tƒsd}PqW|dk s:t‚|S)NTF)Ú enumeraternrr])Úseqr(rUr+r,r,r-Úis_string_sequence>s  r.z3([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}|dkrÄ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_VERSIONrr’Ústartr^ÚrerÚescaperÚPROJECT_NAME_AND_VERSION)ÚfilenameZ project_namer(Zpyverr'Únr,r,r-Úsplit_filenameMs"   r8z-(?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'rJZver)ÚNAME_VERSION_RErrrrMrp)rsr'rwr,r,r-Úparse_name_and_versionis  r:cCs¾tƒ}t|pgƒ}t|pgƒ}d|kr8| d¡||O}x€|D]x}|dkrV| |¡q>| d¡r–|dd…}||kr‚t d|¡||kr¶| |¡q>||kr¬t d|¡| |¡q>W|S)NÚ*r0rzundeclared extra: %s)rœr¸rÃrNrÎr)Z requestedZ availabler(ÚrZunwantedr,r,r-Ú get_extrasxs&        r=c Csˆi}yNt|ƒ}| ¡}| d¡}| d¡s8t d|¡nt d¡|ƒ}t  |¡}Wn0t k r‚}zt  d||¡Wdd}~XYnX|S)Nz Content-Typezapplication/jsonz(Unexpected response for JSON request: %szutf-8z&Failed to get external data for %s: %s) r rÏÚgetrNrÎr÷rƒr„r†r‡rŠÚ exception)rLr(ZrespZheadersZctÚreaderÚer,r,r-Ú_get_external_data‘s   rBz'https://www.red-dove.com/pypi/projects/cCs*d|d ¡|f}tt|ƒ}t|ƒ}|S)Nz%s/%s/project.jsonr)Úupperr Ú_external_data_base_urlrB)rJrLr(r,r,r-Úget_project_data§s rEcCs(d|d ¡||f}tt|ƒ}t|ƒS)Nz%s/%s/package-%s.jsonr)rCr rDrB)rJÚversionrLr,r,r-Úget_package_data­s rGc@s(eZdZdZdd„Zdd„Zdd„ZdS) Ú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) rZr[rÙrrÇrãrÎrrÆÚnormpathrc)r«rcr,r,r-r¬ºs    zCache.__init__cCst|ƒS)zN Converts a resource prefix to a directory name in the cache. )r")r«rfr,r,r-Ú prefix_to_dirÈszCache.prefix_to_dirc CsŒg}x‚t |j¡D]r}tj |j|¡}y>tj |¡s@tj |¡rLt |¡ntj |¡rbt   |¡Wqt k r‚|  |¡YqXqW|S)z" Clear the cache. ) rZrrcr[r$rÐrÑr¸rÙrr¡rŠr")r«Z not_removedÚfnr,r,r-ÚclearÎs  z Cache.clearN)r¯r³r´Ú__doc__r¬rKrMr,r,r,r-rH³srHc@s:eZdZdZdd„Zddd„Zdd„Zd d „Zd d „Zd S)Ú EventMixinz1 A very simple publish/subscribe system. cCs i|_dS)N)Ú _subscribers)r«r,r,r-r¬ãszEventMixin.__init__TcCsD|j}||krt|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)rPrr"Ú appendleft)r«ÚeventÚ subscriberr"ÚsubsZsqr,r,r-rÃæs  zEventMixin.addcCs,|j}||krtd|ƒ‚|| |¡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)rPr¶r¸)r«rRrSrTr,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,)ÚiterrPr>)r«rRr,r,r-Úget_subscribersszEventMixin.get_subscribersc Ospg}xT| |¡D]F}y||f|ž|Ž}Wn"tk rJt d¡d}YnX| |¡qWt 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)rVrŠrÎr?r"r÷)r«rRÚargsÚkwargsr(rSr–r,r,r-Úpublish s    zEventMixin.publishN)T) r¯r³r´rNr¬rÃr¸rVrYr,r,r,r-rOßs   rOc@s^eZdZdd„Zdd„Zddd„Zdd „Zd d „Zd d „Zdd„Z e dd„ƒZ e dd„ƒZ dS)Ú SequencercCsi|_i|_tƒ|_dS)N)Ú_predsÚ_succsrœÚ_nodes)r«r,r,r-r¬(szSequencer.__init__cCs|j |¡dS)N)r]rÃ)r«Únoder,r,r-Úadd_node-szSequencer.add_nodeFcCs¾||jkr|j |¡|rºx&t|j |d¡ƒD]}| ||¡q.Wx&t|j |d¡ƒD]}| ||¡qVWx&t|j ¡ƒD]\}}|sz|j|=qzWx&t|j ¡ƒD]\}}|s¢|j|=q¢WdS)Nr,)r]r¸rœr[r>r\rrˆ)r«r^Zedgesrsr+r”rEr,r,r-Ú remove_node0s   zSequencer.remove_nodecCs<||ks t‚|j |tƒ¡ |¡|j |tƒ¡ |¡dS)N)r]r[Ú setdefaultrœrÃr\)r«ÚpredÚsuccr,r,r-rÃ@s z Sequencer.addcCsˆ||ks t‚y|j|}|j|}Wn tk rDtd|ƒ‚YnXy| |¡| |¡Wn$tk r‚td||fƒ‚YnXdS)Nz%r not a successor of anythingz%r not a successor of %r)r]r[r\ÚKeyErrorr¶r¸)r«rbrcÚpredsZsuccsr,r,r-r¸Es   zSequencer.removecCs||jkp||jkp||jkS)N)r[r\r])r«Ústepr,r,r-Úis_stepRszSequencer.is_stepcCsœ| |¡std|ƒ‚g}g}tƒ}| |¡xd|r’| d¡}||krd||kr| |¡| |¡q0| |¡| |¡|j |d¡}|  |¡q0Wt |ƒS)Nz Unknown: %rrr,) rgr¶rœr"rar¸rÃr[r>ÚextendÚreversed)r«Úfinalr(ZtodoÚseenrfrer,r,r-Ú get_stepsVs"        zSequencer.get_stepscsVdg‰g‰i‰i‰g‰|j‰‡‡‡‡‡‡‡fdd„‰xˆD]}|ˆkr:ˆ|ƒq:WˆS)Nrcsøˆdˆ|<ˆdˆ|<ˆdd7<ˆ |¡y ˆ|}Wntk rVg}YnXxR|D]J}|ˆkrŠˆ|ƒtˆ|ˆ|ƒˆ|<q^|ˆkr^tˆ|ˆ|ƒˆ|<q^Wˆ|ˆ|krôg}x ˆ ¡}| |¡||krÂPqÂWt|ƒ}ˆ |¡dS)Nrr)r"rŠÚminraÚtuple)r^Z successorsZ successorZconnected_componentZ component)ÚgraphÚindexÚ index_counterÚlowlinksr(ÚstackÚ strongconnectr,r-rtzs.       z3Sequencer.strong_connections..strongconnect)r\)r«r^r,)rorprqrrr(rsrtr-Ústrong_connectionsos"  zSequencer.strong_connectionscCsrdg}x8|jD].}|j|}x|D]}| d||f¡q"WqWx|jD]}| d|¡qHW| d¡d |¡S)Nz digraph G {z %s -> %s;z %s;ú}Ú )r[r"r]r$)r«r(rcrerbr^r,r,r-Údot¢s     z Sequencer.dotN)F) r¯r³r´r¬r_r`rÃr¸rgrlÚpropertyrurxr,r,r,r-rZ's   3rZ)z.tar.gzz.tar.bz2z.tarz.zipz.tgzz.tbzz.whlTc sX‡‡fdd„}tj ˆ¡‰tˆƒ‰d}|dkr†| d¡r>d}nH| d¡rRd}d}n4| d¡rfd }d }n | d ¡rzd }d }n td|ƒ‚z¼|dkr¾t|d ƒ}|rì| ¡}xD|D] }||ƒq¬Wn.t  ||¡}|rì|  ¡}x|D] }||ƒqÜW|dkr6t j ddkr6x.|  ¡D]"} t| jtƒs| j d¡| _qW| ˆ¡Wd|rR| ¡XdS)NcsRt|tƒs| d¡}tj tj ˆ|¡¡}| ˆ¡rB|ˆtjkrNt d|ƒ‚dS)Nzutf-8zpath outside destination: %r) rnrÚdecoderZr[rÆr$rNr\r¶)r[rs)Údest_dirÚplenr,r-Ú check_path·s   zunarchive..check_path)z.zipz.whlÚzip)z.tar.gzz.tgzZtgzzr:gz)z.tar.bz2z.tbzZtbzzr:bz2z.tarZtarr<zUnknown format for %rrr{zutf-8)rZr[rÆr^r#r¶rZnamelistÚtarfilerÚZgetnamesrjr‚Z getmembersrnrJrrzZ extractallr) Zarchive_filenamer{ÚformatrÓr}ÚarchiverèÚnamesrJZtarinfor,)r{r|r-Ú unarchiveµsH           rƒc Cs†t ¡}t|ƒ}t|dƒb}xZt |¡D]L\}}}x@|D]8}tj ||¡}||d…} tj | |¡} | || ¡q8Wq(WWdQRX|S)z*zip a directory tree into a BytesIO objectr×N) ÚioÚBytesIOr^rrZÚwalkr[r$r) Z directoryr(ZdlenZzfr_rrçrJZfullZrelrer,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)ÚProgressZUNKNOWNrédcCs<|dks||kst‚||_|_||_d|_d|_d|_dS)NrF)r]rmÚcurÚmaxÚstartedÚelapsedÚdone)r«ZminvalZmaxvalr,r,r-r¬s  zProgress.__init__cCsV|j|kst‚|jdks&||jks&t‚||_t ¡}|jdkrF||_n ||j|_dS)N)rmr]rrÚtimer‘r’)r«ZcurvalZnowr,r,r-Úupdate s zProgress.updatecCs |dks t‚| |j|¡dS)Nr)r]r•r)r«Zincrr,r,r-Ú increments zProgress.incrementcCs| |j¡|S)N)r•rm)r«r,r,r-r2s zProgress.startcCs |jdk r| |j¡d|_dS)NT)rr•r“)r«r,r,r-Ústops  z Progress.stopcCs|jdkr|jS|jS)N)rÚunknown)r«r,r,r-Úmaximum!szProgress.maximumcCsD|jr d}n4|jdkrd}n$d|j|j|j|j}d|}|S)Nz100 %z ?? %gY@z%3d %%)r“rrrm)r«r(rEr,r,r-Ú percentage%s zProgress.percentagecCs:|dkr|jdks|j|jkr$d}nt dt |¡¡}|S)Nrz??:??:??z%H:%M:%S)rrrmr”ZstrftimeZgmtime)r«Zdurationr(r,r,r-Úformat_duration0szProgress.format_durationcCs‚|jrd}|j}n^d}|jdkr&d}nJ|jdks<|j|jkrBd}n.t|j|jƒ}||j|j}|d|j}d|| |¡fS)NZDonezETA rµrrz%s: %s)r“r’rrrmÚfloatr›)r«rfrVr,r,r-ÚETA9s z Progress.ETAcCsN|jdkrd}n|j|j|j}xtD]}|dkr6P|d}q(Wd||fS)Nrgièg@@z%d %sB/s)r’rrmÚUNITS)r«r(Zunitr,r,r-ÚspeedLs   zProgress.speedN)rrŽ)r¯r³r´r˜r¬r•r–r2r—ryr™ršr›rrŸr,r,r,r-rÿs     rz \{([^}]*)\}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_GLOBrr¶Ú_CHECK_MISMATCH_SETÚ_iglob)Ú path_globrÔr,r,r-ras    rc cst |d¡}t|ƒdkrpt|ƒdks,t|ƒ‚|\}}}xâ| d¡D](}x"td |||f¡ƒD] }|Vq\WqBWnªd|kr’x t|ƒD] }|Vq‚Wnˆ| dd¡\}}|dkr®d}|dkr¼d}n| d¡}| d ¡}xHt  |¡D]:\}}} tj   |¡}x"ttj  ||¡ƒD] } | VqWqÜWdS) Nrr{r@rz**rr;rYú\) Ú RICH_GLOBrvr^r]r¢r$Ú std_iglobr%rZr†r[rJ) r£Zrich_path_globrfrœrdÚitemr[ZradicalÚdirrçrLr,r,r-r¢ls*       r¢)Ú HTTPSHandlerÚmatch_hostnameÚCertificateErrorc@seZdZdZdZdd„ZdS)ÚHTTPSConnectionNTcCst |j|jf|j¡}t|ddƒr0||_| ¡t  tj ¡}t tdƒrV|j tj O_ |jrl| |j|j¡i}|jr¢tj|_|j|jdttddƒr¢|j|d<|j|f|Ž|_|jr|jry$t|j ¡|jƒt d|j¡Wn0tk r|j tj¡|j ¡‚YnXdS)NZ _tunnel_hostFÚ OP_NO_SSLv2)ZcafileZHAS_SNIZserver_hostnamezHost verified: %s)r§Zcreate_connectionÚhostZportÚtimeoutrkÚsockZ_tunnelÚsslZ SSLContextZPROTOCOL_SSLv23riZoptionsr­Z cert_fileZload_cert_chainZkey_fileÚca_certsZ CERT_REQUIREDZ verify_modeZload_verify_locationsZ wrap_socketÚ check_domainrªZ getpeercertrÎr÷r«ZshutdownZ SHUT_RDWRr)r«r°ÚcontextrXr,r,r-Úconnect•s0      zHTTPSConnection.connect)r¯r³r´r²r³rµr,r,r,r-r¬sr¬c@s&eZdZd dd„Zdd„Zdd„ZdS) r©TcCst |¡||_||_dS)N)ÚBaseHTTPSHandlerr¬r²r³)r«r²r³r,r,r-r¬²s zHTTPSHandler.__init__cOs$t||Ž}|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«rWrXr(r,r,r-Ú _conn_maker·s zHTTPSHandler._conn_makerc CsVy| |j|¡Stk rP}z$dt|jƒkr>td|jƒ‚n‚Wdd}~XYnXdS)Nzcertificate verify failedz*Unable to verify server certificate for %s)Zdo_openr·rÚstrÚreasonr«r®)r«rSrAr,r,r-Ú https_openÇs zHTTPSHandler.https_openN)T)r¯r³r´r¬r·rºr,r,r,r-r©±s r©c@seZdZdd„ZdS)ÚHTTPSOnlyHandlercCstd|ƒ‚dS)NzAUnexpected HTTP request on what should be a secure connection: %s)r)r«rSr,r,r-Ú http_openÛszHTTPSOnlyHandler.http_openN)r¯r³r´r¼r,r,r,r-r»Úsr»c@seZdZddd„Zdd„ZdS)Ú TransportrcCs||_tj ||¡dS)N)r¯rr½r¬)r«r¯Ú use_datetimer,r,r-r¬ãszTransport.__init__cCsD| |¡\}}}|jr$||jdkr:||_|t |¡f|_|jdS)Nrr)Ú get_host_infoÚ _connectionÚ_extra_headersrZHTTPConnection)r«r®ÚhÚehZx509r,r,r-Úmake_connectionçs zTransport.make_connectionN)r)r¯r³r´r¬rÄr,r,r,r-r½âs r½c@seZdZddd„Zdd„ZdS)Ú SafeTransportrcCs||_tj ||¡dS)N)r¯rrÅr¬)r«r¯r¾r,r,r-r¬ðszSafeTransport.__init__cCs\| |¡\}}}|si}|j|d<|jr6||jdkrR||_|tj|df|Žf|_|jdS)Nr¯rr)r¿r¯rÀrÁrr¬)r«r®rÂrÃrXr,r,r-rÄôs   zSafeTransport.make_connectionN)r)r¯r³r´r¬rÄr,r,r,r-rÅïs rÅc@seZdZdd„ZdS)Ú ServerProxycKst| dd¡|_}|dk r^t|ƒd}| dd¡}|dkr@t}nt}|||d|d<}||_tjj ||f|ŽdS)Nr¯rr¾Zhttps)r¾Ú transport) rar¯rr>rÅr½rÇrrÆr¬)r«rTrXr¯rQr¾ZtclsrVr,r,r-r¬s  zServerProxy.__init__N)r¯r³r´r¬r,r,r,r-rÆsrÆcKs6tjddkr|d7}nd|d<d|d<t||f|ŽS)Nrr{ÚbrÚnewlinezutf-8rØ)rjr‚rÚ)rLrèrXr,r,r-Ú _csv_opens  rÊc@s4eZdZedƒedƒedƒdœZdd„Zdd„Zd S) ÚCSVBaser@ú"rw)Z delimiterZ quotecharZlineterminatorcCs|S)Nr,)r«r,r,r-Ú __enter__(szCSVBase.__enter__cGs|j ¡dS)N)r€r)r«rr,r,r-Ú__exit__+szCSVBase.__exit__N)r¯r³r´r¸ÚdefaultsrÍrÎr,r,r,r-rË!s  rËc@s(eZdZdd„Zdd„Zdd„ZeZdS)Ú CSVReadercKs\d|kr4|d}tjddkr,t d¡|ƒ}||_nt|ddƒ|_tj|jf|jŽ|_dS)Nr€rr{zutf-8r[r<) rjr‚rƒr„r€rÊÚcsvr@rÏ)r«rXr€r,r,r-r¬0szCSVReader.__init__cCs|S)Nr,)r«r,r,r-Ú__iter__;szCSVReader.__iter__cCsJt|jƒ}tjddkrFx,t|ƒD] \}}t|tƒs"| d¡||<q"W|S)Nrr{zutf-8)Únextr@rjr‚r,rnrrz)r«r(rUr§r,r,r-rÓ>s   zCSVReader.nextN)r¯r³r´r¬rÒrÓÚ__next__r,r,r,r-rÐ/s rÐc@seZdZdd„Zdd„ZdS)Ú CSVWritercKs$t|dƒ|_tj|jf|jŽ|_dS)Nr×)rÊr€rÑÚwriterrÏ)r«rLrXr,r,r-r¬Is zCSVWriter.__init__cCsRtjddkrBg}x*|D]"}t|tƒr0| d¡}| |¡qW|}|j |¡dS)Nrr{zutf-8)rjr‚rnrrÞr"rÖÚwriterow)r«Úrowr<r§r,r,r-r×Ms   zCSVWriter.writerowN)r¯r³r´r¬r×r,r,r,r-rÕHsrÕcsHeZdZeejƒZded<d ‡fdd„ Zdd„Zdd „Zd d „Z ‡Z S) Ú ConfiguratorÚ inc_convertZincNcs"tt|ƒ |¡|pt ¡|_dS)N)ÚsuperrÙr¬rZr£rc)r«Úconfigrc)Ú __class__r,r-r¬`szConfigurator.__init__c s°‡‡fdd„‰ˆ d¡}t|ƒs*ˆ |¡}ˆ dd¡}ˆ dd¡}|r\t‡fdd„|Dƒƒ}‡‡fd d„ˆDƒ}t|ƒ}|||Ž}|r¬x$| ¡D]\}} t||ˆ| ƒƒqW|S) Ncszt|ttfƒr*t|ƒ‡fdd„|Dƒƒ}nLt|tƒrld|krHˆ |¡}qvi}x(|D]}ˆ||ƒ||<qRWn ˆ |¡}|S)Ncsg|] }ˆ|ƒ‘qSr,r,)rHrU)Úconvertr,r-rIgszBConfigurator.configure_custom..convert..z())rnrrnÚtypeÚdictÚconfigure_customrÞ)Úor(r”)rÞr«r,r-rÞes    z.Configurator.configure_custom..convertz()rz[]r,csg|] }ˆ|ƒ‘qSr,r,)rHrâ)rÞr,r-rIzsz1Configurator.configure_custom..cs$g|]}t|ƒr|ˆˆ|ƒf‘qSr,)r)rHr”)rÜrÞr,r-rI{s)rarr rnràrˆÚsetattr) r«rÜrtZpropsrWrˆrXr(r7rEr,)rÜrÞr«r-ráds     zConfigurator.configure_customcCs4|j|}t|tƒr0d|kr0| |¡|j|<}|S)Nz())rÜrnràrá)r«ryr(r,r,r-Ú __getitem__ƒs zConfigurator.__getitem__c CsFtj |¡stj |j|¡}tj|ddd}t |¡}WdQRX|S)z*Default converter for the inc:// protocol.r<zutf-8)rØN) rZr[Úisabsr$rcrƒrÚr†r‡)r«r–rÜr(r,r,r-rÚ‰s  zConfigurator.inc_convert)N) r¯r³r´ràrZvalue_convertersr¬rárärÚÚ __classcell__r,r,)rÝr-rÙ[s  rÙc@s*eZdZdZd dd„Zdd„Zdd „ZdS) ÚSubprocessMixinzC Mixin for running subprocesses and capturing their output FNcCs||_||_dS)N)ÚverboseÚprogress)r«rèrér,r,r-r¬–szSubprocessMixin.__init__cCsn|j}|j}xT| ¡}|sP|dk r0|||ƒq|sBtj d¡ntj | d¡¡tj ¡qW| ¡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. Nrzutf-8) rérèÚreadlinerjÚstderrrrzÚflushr)r«r€r´rérèr+r,r,r-r@šs zSubprocessMixin.readercKsžtj|ftjtjdœ|—Ž}tj|j|jdfd}| ¡tj|j|jdfd}| ¡|  ¡|  ¡|  ¡|j dk rˆ|  dd¡n|j ršt j d¡|S)N)Ústdoutrërí)rÊrWrëzdone.Úmainzdone. )Ú subprocessÚPopenÚPIPEÚ threadingZThreadr@rír2rëÚwaitr$rérèrjr)r«ÚcmdrXrsZt1Zt2r,r,r-Ú run_command¯s   zSubprocessMixin.run_command)FN)r¯r³r´rNr¬r@rõr,r,r,r-rç’s rçcCst dd|¡ ¡S)z,Normalize a python package name a la PEP 503z[-_.]+r0)r3Úsubrp)rJr,r,r-Únormalize_nameÀsr÷c@s.eZdZdZdZd dd„Zdd„Zdd „ZdS) Ú PyPIRCFilezhttps://upload.pypi.org/legacy/ÚpypiNcCs.|dkrtj tj d¡d¡}||_||_dS)Nrz.pypirc)rZr[r$rr6rL)r«rLrLr,r,r-r¬ÔszPyPIRCFile.__init__c Csˆi}tj |j¡r„|jp|j}t ¡}| |j¡|  ¡}d|kr2|  dd¡}dd„|  d¡Dƒ}|gkr~d|kr|dg}n²x°|D]¨}d|i}|  |d¡|d<xHd |jfd |j fd fD].\}} |  ||¡rÞ|  ||¡||<q¸| ||<q¸W|dkr||jdfkr|j|d <q„|d|kr„|d |kr„i}q„WnRd |kr„d }|  |d ¡r\|  |d ¡}n|j}|  |d¡|  |d ¡|||j dœ}|S)NÚ distutilsz index-serverscSs g|]}| ¡dkr| ¡‘qS)r)rM)rHÚserverr,r,r-rIæsz#PyPIRCFile.read..rwrùrûr&Ú repositoryÚrealm)r'Nz server-loginr')r&r'rürûrý)rZr[rÅr6rLÚDEFAULT_REPOSITORYrÚRawConfigParserr…rr>rvÚ DEFAULT_REALMZ has_option) r«r(rürÜrZ index_serversZ_serversrûryrrr,r,r-r…ÚsN                 zPyPIRCFile.readc Cslt ¡}|j}| |¡| d¡s,| d¡| dd|¡| dd|¡t|dƒ}| |¡WdQRXdS)Nrùr&r'r×) rrÿr6r…Z has_sectionr™rœrÚr)r«r&r'rÜrLrÜr,r,r-r•s    zPyPIRCFile.update)NN)r¯r³r´rþrr¬r…r•r,r,r,r-røÏs  :røcCst|jd ¡S)zG Read the PyPI access configuration as supported by distutils. )rL)rørLr…)rpr,r,r-Ú _load_pypirc srcCstƒ |j|j¡dS)N)rør•r&r')rpr,r,r-Ú _store_pypirc&src CsÖtjdkrFdtj ¡krdSdtj ¡kr.dSdtj ¡kr@dStjSdtjkrZtjdStjd 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È| ¡}n>|dd!…d$krÈddl} ddl} |  | j ¡|||¡\}}}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'. rZamd64z win-amd64z(arm)z win-arm32z(arm64)z win-arm64Z_PYTHON_HOST_PLATFORMràÚunamerYrr/rWr0NéZlinuxz%s-%sZsunosrÚ5Zsolarisz%d.%sr{éZ32bitZ64bit)iÿÿÿlÿÿÿÿz.%sZaix)Ú aix_platforméÚcygwinz[\d.]+Údarwinz%s-%s-%s)rZrJrjrFrpÚplatformrrirr!ÚintÚmaxsizeZ _aix_supportrr3rñÚASCIIrr’Ú _osx_supportZdistutils.sysconfigZget_platform_osxZ sysconfigZget_config_vars) Zosnamer®ÚreleaserFÚmachineZbitnessrZrel_rer'rrúr,r,r-Úget_host_platform.sL         rZwin32z win-amd64z win-arm32)Zx86Zx64ZarmcCs2tjdkrtƒStj d¡}|tkr*tƒSt|S)NrZVSCMD_ARG_TGT_ARCH)rZrJrrr>Ú_TARGET_TO_PLAT)Zcross_compilation_targetr,r,r-Ú get_platform†s   r)NN)r¦)N)N)NT)†rƒÚ collectionsrÚ contextlibrÑZglobrr¦r„r†ZloggingrZrïr3r§r±Ú ImportErrorrïrjrrŸrŽròZdummy_threadingr”rrÚcompatrrrr r r r r rrrrrrrrrrrrrZ getLoggerr¯rÎrñrrCrBr4r;r8rPr#r<rXrgrlrorurzr—ržÚcontextmanagerr¢r¤r¨r­r©r»r¼r r ÚVERBOSErr‰r r"r$r(r+r.ÚIr5r1r8r9r:r=rBrDrErGrHrOrZZARCHIVE_EXTENSIONSrƒr‡ržrr¥r r¡r¢r©r¶rªr«r¬r»r½rÅrÆrÊrËrÐrÕrÙrçr÷rørrrrrr,r,r,r-Úsâ      \         Y}   /  8  )    ,H  6]    !)  7.QR