a €™Re¿§ã@sœddlmZddlZddlZddlZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlmZmZm Z m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd l-m.Z.m/Z/e  0e1¡Z2da3e4ed ƒr8d Z5n*ej6 7d ¡rLdZ5nej6dkr^dZ5ndZ5e 8d¡Z9e9s„dej:dd…Z9de9Z;e5e9Ze 8d¡Z?e?rÞe? 7d¡rÞe? =dd¡ @d¡dZ?ndd„ZAeAƒZ?[Ae  Bde jCe jDB¡ZEe  Bde jCe jDB¡ZFe  Bd¡ZGe  Bd ¡ZHd!ZId"ZJe jKd#krHd$d%„ZLnd&d%„ZLGd'd(„d(eMƒZNeNƒZOGd)d*„d*eMƒZPd+d,„ZQd-d.„ZReRƒZS[Rd1d/d0„ZTdS)2é)Úunicode_literalsN)Úmessage_from_fileé)Ú __version__ÚDistlibException)Ú sysconfigÚZipFileÚfsdecodeÚ text_typeÚfilter)ÚInstalledDistribution)ÚMetadataÚMETADATA_FILENAMEÚWHEEL_METADATA_FILENAMEÚLEGACY_METADATA_FILENAME) Ú FileOperatorÚ convert_pathÚ CSVReaderÚ CSVWriterÚCacheÚcached_propertyÚget_cache_baseÚ read_exportsÚtempdirÚ get_platform)ÚNormalizedVersionÚUnsupportedVersionErrorÚpypy_version_infoÚppÚjavaÚjyÚcliÚipÚcpÚpy_version_nodotz%s%séÚpyú-Ú_Ú.ÚSOABIzcpython-cCsRdtg}t d¡r| d¡t d¡r0| d¡t d¡dkrH| d¡d  |¡S) Nr#ÚPy_DEBUGÚdÚ WITH_PYMALLOCÚmÚPy_UNICODE_SIZEéÚuÚ)Ú VER_SUFFIXrÚget_config_varÚappendÚjoin)Úparts©r8úˆ/builddir/build/BUILDROOT/alt-python39-pip-21.3.1-2.el8.x86_64/opt/alt/python39/lib/python3.9/site-packages/pip/_vendor/distlib/wheel.pyÚ _derive_abi<s     r:zz (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))? -(?P\w+\d+(\.\w+\d+)*) -(?P\w+) -(?P\w+(\.\w+)*) \.whl$ z7 (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))?$ s \s*#![^\r\n]*s^(\s*#!("[^"]+"|\S+))\s+(.*)$s#!pythons #!pythonwú/cCs|S©Nr8©Úor8r8r9Ú^ór?cCs| tjd¡S)Nr;)ÚreplaceÚosÚsepr=r8r8r9r?`r@c@s6eZdZdd„Zdd„Zdd„Zd dd „Zd d „ZdS) ÚMountercCsi|_i|_dSr<)Ú impure_wheelsÚlibs©Úselfr8r8r9Ú__init__dszMounter.__init__cCs||j|<|j |¡dSr<)rErFÚupdate)rHÚpathnameÚ extensionsr8r8r9Úaddhs z Mounter.addcCs0|j |¡}|D]\}}||jvr|j|=qdSr<)rEÚpoprF)rHrKrLÚkÚvr8r8r9Úremovels   zMounter.removeNcCs||jvr|}nd}|Sr<)rF)rHÚfullnameÚpathÚresultr8r8r9Ú find_modulers zMounter.find_modulecCsj|tjvrtj|}nP||jvr,td|ƒ‚t ||j|¡}||_| dd¡}t|ƒdkrf|d|_ |S)Nzunable to find extension for %sr)rr) ÚsysÚmodulesrFÚ ImportErrorÚimpZ load_dynamicÚ __loader__ÚrsplitÚlenÚ __package__)rHrRrTr7r8r8r9Ú load_moduleys       zMounter.load_module)N)Ú__name__Ú __module__Ú __qualname__rIrMrQrUr^r8r8r8r9rDcs  rDc@sîeZdZdZdZdZd4dd„Zedd „ƒZed d „ƒZ ed d „ƒZ e dd„ƒZ dd„Z e dd„ƒZdd„Zd5dd„Zdd„Zdd„Zdd„Zd6dd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd7d,d-„Zd.d/„Zd0d1„Zd8d2d3„ZdS)9ÚWheelz@ Class to build and install from Wheel files (PEP 427). )rrÚsha256NFcCs8||_||_d|_tg|_dg|_dg|_t ¡|_ |durRd|_ d|_ |j |_ nât |¡}|rš| d¡}|d|_ |d d d ¡|_ |d |_|j |_ nštj |¡\}}t |¡}|sÄtd |ƒ‚|rÖtj |¡|_ ||_ | d¡}|d|_ |d|_ |d |_|d  d¡|_|d d¡|_|d d¡|_dS)zB Initialise an instance using a (valid) filename. r2ÚnoneÚanyNÚdummyz0.1ÚnmZvnr(r'ZbnzInvalid name or filename: %rr&r)ZbiÚar)ÚsignZ should_verifyÚbuildverÚPYVERÚpyverÚabiÚarchrBÚgetcwdÚdirnameÚnameÚversionÚfilenameÚ _filenameÚNAME_VERSION_REÚmatchÚ groupdictrArSÚsplitÚ FILENAME_RErÚabspath)rHrsriÚverifyr.Úinforpr8r8r9rI‘sD        ÿ    zWheel.__init__cCs^|jrd|j}nd}d |j¡}d |j¡}d |j¡}|j dd¡}d|j|||||fS)zJ Build and return a filename from the various components. r'r2r)r(z%s-%s%s-%s-%s-%s.whl)rjr6rlrmrnrrrArq)rHrjrlrmrnrrr8r8r9rsºs     ÿzWheel.filenamecCstj |j|j¡}tj |¡Sr<)rBrSr6rprsÚisfile)rHrSr8r8r9ÚexistsËsz Wheel.existsccs4|jD](}|jD]}|jD]}|||fVqqqdSr<)rlrmrn)rHrlrmrnr8r8r9ÚtagsÐs   z Wheel.tagsc Cs4tj |j|j¡}d|j|jf}d|}t d¡}t |dƒà}|  |¡}|d  dd¡}t dd „|Dƒƒ}t tg} d} | D]z} zbt || ¡} | | ¡8} || ƒ}t|d } | rÂWdƒWqøWdƒn1sÖ0YWq|tyôYq|0q|| std d  | ¡ƒ‚Wdƒn1s&0Y| S) Nú%s-%sú %s.dist-infoúutf-8Úrú Wheel-Versionr)rcSsg|] }t|ƒ‘qSr8©Úint©Ú.0Úir8r8r9Ú àr@z"Wheel.metadata..)Úfileobjz8Invalid wheel, because metadata is missing: looked in %sz, )rBrSr6rprsrqrrÚcodecsÚ getreaderrÚget_wheel_metadatarxÚtuplerrÚ posixpathÚopenr ÚKeyErrorÚ ValueError)rHrKÚname_verÚinfo_dirÚwrapperÚzfÚwheel_metadataÚwvÚ file_versionÚfnsrTÚfnÚmetadata_filenameÚbfÚwfr8r8r9Úmetadata×s2      4 ÿ&zWheel.metadatacCsld|j|jf}d|}t |d¡}| |¡&}t d¡|ƒ}t|ƒ}Wdƒn1sZ0Yt|ƒS)Nr€rÚWHEELr‚) rqrrrr6r‘rŒrrÚdict)rHr—r”r•rržrŸÚmessager8r8r9rŽ÷s  &zWheel.get_wheel_metadatacCsJtj |j|j¡}t|dƒ}| |¡}Wdƒn1s<0Y|S)Nrƒ)rBrSr6rprsrrŽ)rHrKr—rTr8r8r9r|s (z Wheel.infoc CsÔt |¡}|r|| ¡}|d|…||d…}}d| ¡vrBt}nt}t |¡}|rfd| ¡d}nd}||}||}nT| d¡}| d¡} |dks || kr¦d} n|||d…d krÀd } nd} t| |}|S) Nspythonwó éÿÿÿÿr@ó ó rr%s ) Ú SHEBANG_RErvÚendÚlowerÚSHEBANG_PYTHONWÚSHEBANG_PYTHONÚSHEBANG_DETAIL_REÚgroupsÚfind) rHÚdatar.r©ÚshebangZdata_after_shebangZshebang_pythonÚargsZcrÚlfZtermr8r8r9Úprocess_shebangs,       zWheel.process_shebangcCsf|dur|j}ztt|ƒ}Wnty:td|ƒ‚Yn0||ƒ ¡}t |¡ d¡  d¡}||fS)NzUnsupported hash algorithm: %ró=Úascii) Ú hash_kindÚgetattrÚhashlibÚAttributeErrorrÚdigestÚbase64Úurlsafe_b64encodeÚrstripÚdecode)rHr°r·ÚhasherrTr8r8r9Úget_hash%s  zWheel.get_hashcCsjt|ƒ}ttj ||¡ƒ}| |ddf¡t|ƒ$}|D]}| |¡q8Wdƒn1s\0YdS)Nr2)ÚlistÚto_posixrBrSÚrelpathr5rÚwriterow)rHÚrecordsÚ record_pathÚbaseÚpÚwriterÚrowr8r8r9Ú write_record0s  zWheel.write_recordc CsÂg}|\}}tt|jƒ}|D]d\}} t| dƒ} |  ¡} Wdƒn1sL0Yd| | ¡} tj | ¡} |  || | f¡qtj  |d¡} |  || |¡t tj  |d¡ƒ}|  || f¡dS)NÚrbz%s=%sÚRECORD) r¸r¹r·r‘ÚreadrÁrBrSÚgetsizer5r6rÌrÃ)rHr|ÚlibdirÚ archive_pathsrÆÚdistinfor•rÀÚaprÉÚfr°r»Úsizer8r8r9Ú write_records8s   & zWheel.write_recordscCsZt|dtjƒ8}|D]"\}}t d||¡| ||¡qWdƒn1sL0YdS)NÚwzWrote %s to %s in wheel)rÚzipfileÚ ZIP_DEFLATEDÚloggerÚdebugÚwrite)rHrKrÒr—rÔrÉr8r8r9Ú build_zipHs zWheel.build_zipc" sÖ|dur i}tt‡fdd„dƒƒd}|dkrFd}tg}tg}tg}nd}tg}d g}d g}| d |¡|_| d |¡|_| d |¡|_ ˆ|} d|j |j f} d| } d| } g} dD] }|ˆvrÆq¶ˆ|}t j  |¡r¶t  |¡D]Ü\}}}|D]Ì}tt j  ||¡ƒ}t j  ||¡}tt j  | ||¡ƒ}|  ||f¡|dkrò| d¡sòt|dƒ}| ¡}Wdƒn1st0Y| |¡}t|dƒ}| |¡Wdƒqò1s´0Yqòqäq¶| }d}t  |¡D]´\}}}||kr:t|ƒD]8\}}t|ƒ}| d¡ròt j  ||¡}||=q,qò|s:Jdƒ‚|D]H}t|ƒ d¡rVq>t j  ||¡}tt j  ||¡ƒ}|  ||f¡q>qÖt  |¡}|D]B}|dvrštt j  ||¡ƒ}tt j  | |¡ƒ}|  ||f¡qšd|pê|jdtd|g}|jD] \}}}| d|||f¡qt j  |d¡}t|dƒ }| d  |¡¡Wdƒn1sd0Ytt j  | d¡ƒ}|  ||f¡d!d"„} t| | d#} |  || f| | ¡t j  |j!|j"¡}!| #|!| ¡|!S)$z‰ Build a wheel from files in specified paths, and use any specified tags when determining the name of the wheel. Ncs|ˆvSr<r8r=©Úpathsr8r9r?Vr@zWheel.build..)ÚpurelibÚplatlibrrâÚfalseÚtruerdrerlrmrnr€ú%s.datar)r°ÚheadersÚscriptsrçú.exerÍÚwbú .dist-infoz(.dist-info directory expected, not found)z.pycz.pyo)rÎÚ INSTALLERZSHAREDr¡zWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%sr¡rØÚ cSs*|d}| d¡}d|vr"|d7}||fS)Nrr;rêi')Úcount)ÚtrÔÚnr8r8r9Úsorter²s  zWheel.build..sorter)Úkey)$rÂr ÚIMPVERÚABIÚARCHrkÚgetrlrmrnrqrrrBrSÚisdirÚwalkr r6rÄrÃr5Úendswithr‘rÏr´rÝÚ enumerateÚlistdirÚ wheel_versionrrÚsortedr×rprsrÞ)"rHràrrûZlibkeyÚis_pureZ default_pyverZ default_abiZ default_archrÑr”Údata_dirr•rÒrñrSÚrootÚdirsÚfilesrœrÉÚrprÔrÕr°rÓr‰Údnr˜rlrmrnrðrKr8rßr9ÚbuildNsš   (  0     ý 0  z Wheel.buildcCs | d¡S)zl Determine whether an archive entry should be skipped when verifying or installing. )r;z /RECORD.jws)rø)rHÚarcnamer8r8r9Ú skip_entryÂszWheel.skip_entrycC Ksx|j}| d¡}| dd¡}| dd¡}tj |j|j¡}d|j|jf} d| } d| } t  | t ¡} t  | d¡} t  | d ¡}t   d ¡}t |d ƒÎ}| | ¡ }||ƒ}t|ƒ}Wd ƒn1sÆ0Y|d  dd¡}tdd„|Dƒƒ}||jkr|r||j|ƒ|ddkr(|d}n|d}i}| |¡X}t|d,}|D]}|d}|||<qPWd ƒn1s~0YWd ƒn1sž0Yt  | d¡}t  | d¡}t  | dd¡}t|d}d|_tj } g}!t ¡}"|"|_d |_zFz | ¡D],}#|#j}$t|$tƒr,|$}%n |$ d ¡}%|  |%¡rFq||%}|drxt!|#j"ƒ|dkrxt#d|%ƒ‚|drð|d dd¡\}&}'| |$¡}| $¡}(Wd ƒn1sÀ0Y| %|(|&¡\})}*|*|'krðt#d|$ƒ‚|r|% &||f¡rt' (d |%¡q|% &|¡o,|% )d!¡ }+|% &|¡rd|% d"d¡\})},}-tj ||,t*|-ƒ¡}.n$|%| |fvrvqtj |t*|%ƒ¡}.|+s°| |$¡}| +||.¡Wd ƒn1s¼0Ytjd#krèt ,|.|#j-d$?d%@¡|! .|.¡|s\|dr\t|.d&ƒ>}| $¡}(| %|(|&¡\})}/|/|*kr|6 d:i¡}?|>sò|?r’| dd¡}@tj >|@¡st?d;ƒ‚|@|_|> @¡D]*\}:}<|5 C||¡}|rà|! .|¡|5 D|!|d?|¡|5WWtE F|"¡Wd ƒSt0y8t' Gd@¡| H¡‚Yn0WtE F|"¡n tE F|"¡0Wd ƒn1sj0Yd S)Aa~ Install a wheel to the specified paths. If kwarg ``warner`` is specified, it should be a callable, which will be called with two tuples indicating the wheel version of this software and the wheel version in the file, if there is a discrepancy in the versions. This can be used to issue any warnings to raise any exceptions. If kwarg ``lib_only`` is True, only the purelib/platlib files are installed, and the headers, scripts, data and dist-info metadata are not written. If kwarg ``bytecode_hashed_invalidation`` is True, written bytecode will try to use file-hash based invalidation (PEP-552) on supported interpreter versions (CPython 2.7+). The return value is a :class:`InstalledDistribution` instance unless ``options.lib_only`` is True, in which case the return value is ``None``. ÚwarnerÚlib_onlyFZbytecode_hashed_invalidationr€rårr¡rÎr‚rƒNr„r)rcSsg|] }t|ƒ‘qSr8r…r‡r8r8r9rŠør@z!Wheel.install..zRoot-Is-Purelibrärárâ©Ústreamrr2rç)Údry_runTr%úsize mismatch for %sú=údigest mismatch for %szlib_only: skipping %srèr;ÚposixéiÿrÍzdigest mismatch on write for %sz.py)Úhashed_invalidationzByte-compilation failed)Úexc_infozlib_only: returning Nonez1.0zentry_points.txt)ÚconsoleÚguiz %s_scriptszwrap_%sz%s:%sz [%s]ú,zAUnable to read legacy script metadata, so cannot generate scriptsrLzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %srÚlibÚprefixzinstallation failed.)Ir rõrBrSr6rprsrqrrrrrŒrrr‘rrxrrûrrÚrecordrVÚdont_write_bytecodeÚtempfileÚmkdtempÚ source_dirÚ target_dirÚinfolistÚ isinstancer r¿rÚstrÚ file_sizerrÏrÁÚ startswithrÛrÜrørÚ copy_streamÚchmodÚ external_attrr5Ú byte_compileÚ ExceptionÚwarningÚbasenameÚmakeÚset_executable_modeÚextendr|rÚvaluesrÚsuffixÚflagsÚjsonÚloadrör“Úitemsr r¢Zwrite_shared_locationsZwrite_installed_filesÚshutilÚrmtreeÚ exceptionÚrollback)CrHràÚmakerÚkwargsr rrZbc_hashed_invalidationrKr”rþr•Ú metadata_nameÚwheel_metadata_nameÚ record_namer–r—ÚbwfrŸr£r™ršrÑrÆržÚreaderrËrÉZdata_pfxZinfo_pfxZ script_pfxÚfileopZbcZoutfilesÚworkdirÚzinforÚ u_arcnameÚkindÚvaluer°r(r»Z is_scriptÚwhererÚoutfileZ newdigestZpycrœZworknamerÚ filenamesÚdistÚcommandsÚepZepdatarñrOr,rPÚsÚconsole_scriptsÚ gui_scriptsZ script_dirÚscriptÚoptionsr8r8r9ÚinstallÒs\        &    L      ÿ  ( ÿ   ÿ  ,    þ&ÿÿ ,       (  .           ÿ ú  z Wheel.installcCs8tdur4tj tƒtdƒdtjdd…¡}t|ƒatS)Nz dylib-cachez%s.%sr%) ÚcacherBrSr6rr rVÚ version_infor)rHrÈr8r8r9Ú_get_dylib_cache¿s ÿzWheel._get_dylib_cachec Cs”tj |j|j¡}d|j|jf}d|}t |d¡}t  d¡}g}t |dƒ.}z|  |¡æ}||ƒ} t   | ¡} | ¡} |  |¡} tj | j| ¡} tj | ¡s¬t | ¡|  ¡D]‚\}}tj | t|ƒ¡}tj |¡sàd}n6t |¡j}tj |¡}| |¡}tj|jŽ}||k}|r(| || ¡| ||f¡q´Wdƒn1sN0YWntynYn0Wdƒn1s†0Y|S)Nr€rZ EXTENSIONSr‚rƒT)rBrSr6rprsrqrrrrŒrrr‘r0r1rRÚ prefix_to_dirrÈröÚmakedirsr2rr~ÚstatÚst_mtimeÚdatetimeÚ fromtimestampÚgetinfoÚ date_timeÚextractr5r’)rHrKr”r•rr–rTr—ržrŸrLrPrZ cache_baserqrÄÚdestr[Z file_timer|Z wheel_timer8r8r9Ú_get_extensionsÈs>             4&zWheel._get_extensionscCst|ƒS)zM Determine if a wheel is compatible with the running system. )Ú is_compatiblerGr8r8r9r^êszWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr8rGr8r8r9Ú is_mountableðszWheel.is_mountablecCs´tj tj |j|j¡¡}| ¡s2d|}t|ƒ‚| ¡sJd|}t|ƒ‚|t jvrbt   d|¡nN|rtt j  |¡nt j  d|¡| ¡}|r°tt jvr¤t j  t¡t ||¡dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)rBrSrzr6rprsr^rr_rVrÛrÜr5Úinsertr]Ú_hookÚ meta_pathrM)rHr5rKÚmsgrLr8r8r9Úmountös"   z Wheel.mountcCsrtj tj |j|j¡¡}|tjvr2t d|¡n.r rr;ú..úinvalid entry in wheel: %rr%r r r)rBrSr6rprsrqrrrrrŒrrr‘rrxrrrrr r¿rrr r!rÏrÁ)rHrKr”rþr•r9r:r;r–r—r<rŸr£r™ršrÆržr=rËrÉr@rrArBrCr°r(r»r8r8r9r{s\     &  J    ÿ ÿ  ( ÿz Wheel.verifyc Ksdd„}dd„}tj |j|j¡}d|j|jf}d|}t |d¡} tƒ¢} t |dƒ†} i} |   ¡D]h} | j}t |t ƒr‚|}n |  d ¡}|| kr–qhd |vrªtd |ƒ‚|  | | ¡tj | t|ƒ¡}|| |<qhWd ƒn1sæ0Y|| |ƒ\}}|| fi|¤Ž}|râ|| |ƒ\}}|r<||kr<|||ƒ|d urftjd d| d\}}t |¡n*tj |¡s€td|ƒ‚tj ||j¡}t|  ¡ƒ}tj | |¡}||f}| || |¡| ||¡|d urât ||¡Wd ƒn1sø0Y|S)a‘ Update the contents of a wheel in a generic way. The modifier should be a callable which expects a dictionary argument: its keys are archive-entry paths, and its values are absolute filesystem paths where the contents the corresponding archive entries can be found. The modifier is free to change the contents of the files pointed to, add new entries and remove entries, before returning. This method will extract the entire contents of the wheel to a temporary location, call the modifier, and then use the passed (and possibly updated) dictionary to write a new wheel. If ``dest_dir`` is specified, the new wheel is written there -- otherwise, the original wheel is overwritten. The modifier should return True if it updated the wheel, else False. This method returns the same value the modifier returns. cSsHd}}d|tf}||vr$d|}||vr@||}t|dj}||fS)Nz%s/%sz %s/PKG-INFO©rS)rr rr)Úpath_mapr•rrrSrñr8r8r9Ú get_version`s  z!Wheel.update..get_versioncSsÞd}z|t|ƒ}| d¡}|dkr*d|}nTdd„||dd… d¡Dƒ}|dd7<d |d|…d d d „|Dƒ¡f}Wntyžt d |¡Yn0|rÚt|d }||_|  t ¡}|j ||dt d||¡dS)Nr'rz%s+1cSsg|] }t|ƒ‘qSr8r…)rˆrJr8r8r9rŠrr@z8Wheel.update..update_version..rr)r¥z%s+%scss|]}t|ƒVqdSr<)r r‡r8r8r9Ú ur@z7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %rrh)rSÚlegacyzVersion updated from %r to %r) rr¯rxr6rrÛrÜr rrrørrÝ)rrrSÚupdatedrPr‰r7Zmdrlr8r8r9Úupdate_versionjs.    ÿ  ÿ   ÿz$Wheel.update..update_versionr€rrÎrƒr‚rfrgNz.whlz wheel-update-)r.rÚdirzNot a directory: %r)rBrSr6rprsrqrrrrrrrr r¿rr[rrÚmkstempÚcloserörÂr2r×rÞr3Úcopyfile)rHÚmodifierÚdest_dirr8rjrnrKr”r•r;r?r—rir@rrArSZoriginal_versionr(ÚmodifiedÚcurrent_versionÚfdÚnewpathrÒrÓr|r8r8r9rJOs\       ÿ (  þ      ,z Wheel.update)NFF)N)NN)F)N)r_r`raÚ__doc__rûr·rIÚpropertyrsr~rrr rŽr|r´rÁrÌr×rÞrrrOrRr]r^r_rdrer{rJr8r8r8r9rb‰s@ )        tn "  8rbcCsZddl}| ¡}g}|ddkrV|d d¡D]}| | ¡rFt|ƒnd¡q.t|ƒ}|S)NrÚglibcrr))ÚplatformÚlibc_verrxr5Úisdigitr†r)r|ÚverrTrJr8r8r9Ú_get_glibc_version´s r€c Cshtg}td}ttjddddƒD]}| d |t|ƒg¡¡q$g}t ¡D]*\}}}|  d¡rN| |  dd¡d¡qN|  ¡t dkr–|  dt ¡| d¡g}tg}tjd krŽt d t¡}|rŽ| ¡\} }}} t|ƒ}| g} | d vrø|  d ¡| d vr |  d¡| dvr |  d¡| dvr4|  d¡| dvrH|  d¡|dkrŽ| D]*} d| ||| f} | tkrV| | ¡qV|d8}qH|D]}|D]} | d t|df¡|| f¡|dkrœtj  d¡rœ|  dd¡} tƒ}t|ƒdkrœ|dkr$| d t|df¡|d| f¡|dkrP| d t|df¡|d| f¡|dkr|| d t|df¡|d| f¡| d t|df¡|d|d|d| ff¡qœq’t|ƒD]L\}}| d t|f¡ddf¡|dkr¼| d t|df¡ddf¡q¼t|ƒD]L\}}| d d |f¡ddf¡|dkr| d d |df¡ddf¡qt|ƒS)!zG Return (pyver, abi, arch) tuples compatible with this Python. rrr¥r2z.abir)r%rdÚdarwinz(\w+)_(\d+)_(\d+)_(\w+)$)Úi386ÚppcÚfat)r‚rƒÚx86_64Zfat3)Úppc64r…Úfat64)r‚r…Úintel)r‚r…rˆrƒr†Ú universalz %s_%s_%s_%sÚlinuxZlinux_)r%éz manylinux1_%s)r%é zmanylinux2010_%s)r%ézmanylinux2014_%szmanylinux_%s_%s_%srer&)r3ÚrangerVrQr5r6r rYZ get_suffixesr"rxÚsortrór`rôr|Úrervr®r†Ú IMP_PREFIXrAr€r\rùÚset)ÚversionsÚmajorÚminorÚabisr.r(rTÚarchesr.rqrnÚmatchesrvrJrmr7r‰rrr8r8r9Úcompatible_tags¾sŠ                     ÿ ÿ ÿÿÿ " "r™cCs\t|tƒst|ƒ}d}|dur"t}|D]0\}}}||jvr&||jvr&||jvr&d}qXq&|S)NFT)rrbÚCOMPATIBLE_TAGSrlrmrn)ÚwheelrrTrrmrnr8r8r9r^s r^)N)UÚ __future__rr¼rŒrWÚemailrr¹rYr0ÚloggingrBrrr3rVrrÙr2rrÚcompatrrr r r Zdatabaser r r rrrÚutilrrrrrrrrrrrrrrÚ getLoggerr_rÛrPÚhasattrr‘r|r"r4r3rQrkròrArôrórxr:ÚcompileÚ IGNORECASEÚVERBOSEryrur¨r­r¬r«rCrÃÚobjectrDrarbr€r™ršr^r8r8r8r9ÚsŠ   0       ø  ü    #1 P