a  ze6@sddlmZddlZddlZddlZddlmZddlZddlZddl 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 0e1Z2da3e4ed r8d Z5n*ej67d rLdZ5nej6dkr^dZ5ndZ5e8dZ9e9sej:ddkrdej:ddZ9ndej:ddZ9de9Z;e5e9Ze8dZ?e?re?7dre?=dd@ddZ?nddZAeAZ?[Ae Bde jCe jDBZEe Bd e jCe jDBZFe Bd!ZGe Bd"ZHd#ZId$ZJe jKd%krld&d'ZLnd(d'ZLGd)d*d*eMZNeNZOGd+d,d,eMZPd-d.ZQd/d0ZReRZS[Rd3d1d2ZTdS)4)unicode_literalsN)message_from_file) __version__DistlibException) sysconfigZipFilefsdecode text_typefilter)InstalledDistribution)MetadataMETADATA_FILENAMEWHEEL_METADATA_FILENAMELEGACY_METADATA_FILENAME) FileOperator convert_path CSVReader CSVWriterCachecached_propertyget_cache_base read_exportstempdir get_platform)NormalizedVersionUnsupportedVersionErrorpypy_version_infoppjavajycliipcppy_version_nodot z%s_%sz%s%spy-_.SOABIzcpython-cCsRdtg}tdr|dtdr0|dtddkrH|dd |S) Nr#Py_DEBUGd WITH_PYMALLOCmPy_UNICODE_SIZEu) VER_SUFFIXrget_config_varappendjoin)partsr9[/opt/bitninja-python-dojo/embedded/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|SNr9or9r9r:ar@cCs|tjdS)Nr<)replaceossepr>r9r9r:r@crAc@s6eZdZddZddZddZd dd Zd d ZdS) MountercCsi|_i|_dSr=) impure_wheelslibsselfr9r9r:__init__gszMounter.__init__cCs||j|<|j|dSr=)rFrGupdate)rIpathname extensionsr9r9r:addks z Mounter.addcCs0|j|}|D]\}}||jvr|j|=qdSr=)rFpoprG)rIrLrMkvr9r9r:removeos   zMounter.removeNcCs||jvr|}nd}|Sr=)rG)rIfullnamepathresultr9r9r: find_moduleus zMounter.find_modulecCsj|tjvrtj|}nP||jvr,td|t||j|}||_|dd}t|dkrf|d|_ |S)Nzunable to find extension for %sr*rr) sysmodulesrG ImportErrorimpZ load_dynamic __loader__rsplitlen __package__)rIrSrUr8r9r9r: load_module|s       zMounter.load_module)N)__name__ __module__ __qualname__rJrNrRrVr_r9r9r9r:rEfs  rEc@seZdZdZdZdZd4ddZedd Zed d Z ed d Z e ddZ ddZ e ddZddZd5ddZddZddZddZd6ddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd7d,d-Zd.d/Zd0d1Zd8d2d3ZdS)9Wheelz@ Class to build and install from Wheel files (PEP 427). )rrsha256NFcCs8||_||_d|_tg|_dg|_dg|_t|_ |durRd|_ d|_ |j |_ nt|}|r|d}|d|_ |dd d |_ |d |_|j |_ ntj|\}}t|}|std ||rtj||_ ||_ |d}|d|_ |d|_ |d |_|d d|_|dd|_|dd|_dS)zB Initialise an instance using a (valid) filename. r3noneanyNdummyz0.1nmZvnr)r(ZbnzInvalid name or filename: %rr'r*Zbiar)signZ should_verifybuildverPYVERpyverabiarchrCgetcwddirnamenameversionfilename _filenameNAME_VERSION_REmatch groupdictrBrTsplit FILENAME_RErabspath)rIrtrjverifyr/inforqr9r9r:rJsD            zWheel.__init__cCs^|jrd|j}nd}d|j}d|j}d|j}|jdd}d|j|||||fS)zJ Build and return a filename from the various components. r(r3r*r)z%s-%s%s-%s-%s-%s.whl)rkr7rmrnrorsrBrr)rIrkrmrnrorsr9r9r:rts     zWheel.filenamecCstj|j|j}tj|Sr=)rCrTr7rqrtisfile)rIrTr9r9r:existssz Wheel.existsccs4|jD](}|jD]}|jD]}|||fVqqqdSr=)rmrnro)rIrmrnror9r9r:tagss   z Wheel.tagsc Cs4tj|j|j}d|j|jf}d|}td}t |d}| |}|d dd}t dd |D}t tg} d} | D]z} zbt|| } || 8} || }t|d } | rWdWqWdn1s0YWq|tyYq|0q|| std d | Wdn1s&0Y| S) N%s-%s %s.dist-infoutf-8r Wheel-Versionr*rcSsg|] }t|qSr9int.0ir9r9r: rAz"Wheel.metadata..)fileobjz8Invalid wheel, because metadata is missing: looked in %sz, )rCrTr7rqrtrrrscodecs getreaderrget_wheel_metadatarytuplerr posixpathopenr KeyError ValueError)rIrLname_verinfo_dirwrapperzfwheel_metadatawv file_versionfnsrUfnmetadata_filenamebfwfr9r9r:metadatas2      4 &zWheel.metadatacCsld|j|jf}d|}t|d}||&}td|}t|}Wdn1sZ0Yt|S)NrrWHEELr) rrrsrr7rrrrdict)rIrrrrrrmessager9r9r:rs  &zWheel.get_wheel_metadatacCsJtj|j|j}t|d}||}Wdn1s<0Y|S)Nr)rCrTr7rqrtrr)rIrLrrUr9r9r:r}s (z Wheel.infoc Cst|}|r||}|d|||d}}d|vrBt}nt}t|}|rfd|d}nd}||}||}nT|d}|d} |dks|| krd} n|||dd krd } nd} t| |}|S) Nspythonw rA  rr&s ) SHEBANG_RErwendlowerSHEBANG_PYTHONWSHEBANG_PYTHONSHEBANG_DETAIL_REgroupsfind) rIdatar/rshebangZdata_after_shebangZshebang_pythonargsZcrlfZtermr9r9r:process_shebang s,       zWheel.process_shebangcCsf|dur|j}ztt|}Wnty:td|Yn0||}t|d d}||fS)NzUnsupported hash algorithm: %r=ascii) hash_kindgetattrhashlibAttributeErrorrdigestbase64urlsafe_b64encoderstripdecode)rIrrhasherrUr9r9r:get_hash(s  zWheel.get_hashcCsjt|}ttj||}||ddft|$}|D]}||q8Wdn1s\0YdS)Nr3)listto_posixrCrTrelpathr6rwriterow)rIrecords record_pathbasepwriterrowr9r9r: write_record3s  zWheel.write_recordc Csg}|\}}tt|j}|D]d\}} t| d} | } Wdn1sL0Yd|| } tj| } | || | fqtj |d} | || |t tj |d}| || fdS)Nrbz%s=%sRECORD) rrrrreadrrCrTgetsizer6r7rr)rIr}libdir archive_pathsrdistinforraprfrrsizer9r9r: write_records;s   & zWheel.write_recordscCsZt|dtj8}|D]"\}}td|||||qWdn1sL0YdS)NwzWrote %s to %s in wheel)rzipfile ZIP_DEFLATEDloggerdebugwrite)rIrLrrrrr9r9r: build_zipKs zWheel.build_zipc" s|dur i}ttfdddd}|dkrFd}tg}tg}tg}nd}tg}d g}d g}|d ||_|d ||_|d ||_ |} d|j |j f} d| } d| } g} dD] }|vrq|}t j |rt |D]\}}}|D]}tt j ||}t j ||}tt j | ||}| ||f|dkr|dst|d}|}Wdn1st0Y||}t|d}||Wdq1s0Yqqq| }d}t |D]\}}}||kr:t|D]8\}}t|}|drt j ||}||=q,q|s:Jd|D]H}t|drVq>t j ||}tt j ||}| ||fq>qt |}|D]B}|dvrtt j ||}tt j | |}| ||fqd|p|jdtd|g}|jD] \}}}|d|||fqt j |d}t|d }|d |Wdn1sd0Ytt j | d}| ||fd!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=r9r>pathsr9r:r@YrAzWheel.build..)purelibplatlibrrfalsetruererfrmrnror%s.datar)rheadersscriptsr.exerwb .dist-infoz(.dist-info directory expected, not found)z.pycz.pyo)r INSTALLERZSHAREDrzWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%srr cSs*|d}|d}d|vr"|d7}||fS)Nrr<ri')count)trnr9r9r:sorters  zWheel.build..sorter)key)$rr IMPVERABIARCHrlgetrmrnrorrrsrCrTisdirwalkr r7rrr6endswithrrrr enumeratelistdir wheel_versionrrsortedrrqrtr)"rIrrrZlibkeyis_pureZ default_pyverZ default_abiZ default_archrrdata_dirrrrrTrootdirsfilesrrrprrrrrdnrrmrnrorrLr9rr:buildQs   (  0      0  z Wheel.buildcCs |dS)zl Determine whether an archive entry should be skipped when verifying or installing. )r<z /RECORD.jws)r)rIarcnamer9r9r: skip_entryszWheel.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 n1s0Y|d dd}tdd|D}||jkr|r||j||ddkr(|d}n|d}i}||X}t|d,}|D]}|d}|||<qPWd n1s~0YWd n1s0Yt | d}t | d}t | dd}t|d}d|_tj } g}!t}"|"|_d |_zFz |D],}#|#j}$t|$tr,|$}%n |$d }%| |%rFq||%}|drxt!|#j"|dkrxt#d|%|dr|ddd\}&}'||$}|$}(Wd n1s0Y|%|(|&\})}*|*|'krt#d|$|r|%&||frt'(d |%q|%&|o,|%)d! }+|%&|rd|%d"d\})},}-tj||,t*|-}.n$|%| |fvrvqtj|t*|%}.|+s||$}|+||.Wd n1s0Ytjd#krt,|.|#j-d$?d%@|!.|.|s\|dr\t|.d&>}|$}(|%|(|&\})}/|/|*kr|6d:i}?|>s|?r|dd}@tj>|@st?d;|@|_|>@D]*\}:}<|5C||}|r|!.||5D|!|d?||5WWtEF|"Wd St0y8t'Gd@|HYn0WtEF|"n tEF|"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``. warnerlib_onlyFZbytecode_hashed_invalidationrrrrrrrNrr*rcSsg|] }t|qSr9rrr9r9r:rrAz!Wheel.install..zRoot-Is-Purelibrrrstreamrr3r)dry_runTr&size mismatch for %s=digest mismatch for %szlib_only: skipping %srr<posixirzdigest mismatch on write for %sz.py)hashed_invalidationzByte-compilation failed)exc_infozlib_only: returning Nonez1.0zentry_points.txt)consoleguiz %s_scriptszwrap_%sz%s:%sz [%s],zAUnable to read legacy script metadata, so cannot generate scriptsrMzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %srlibprefixzinstallation failed.)Ir rrCrTr7rqrtrrrsrrrrrrrryrrrrrecordrWdont_write_bytecodetempfilemkdtemp source_dir target_dirinfolist isinstancer rrstr file_sizerrr startswithrrrr copy_streamchmod external_attrr6 byte_compile Exceptionwarningbasenamemakeset_executable_modeextendr}rvaluesrsuffixflagsjsonloadrritemsr rZwrite_shared_locationsZwrite_installed_filesshutilrmtree exceptionrollback)CrIrmakerkwargsr rr Zbc_hashed_invalidationrLrrr metadata_namewheel_metadata_name record_namerrbwfrrrrrrrreaderrrZdata_pfxZinfo_pfxZ script_pfxfileopZbcZoutfilesworkdirzinfor u_arcnamekindvaluerr)rZ is_scriptwhereroutfileZ newdigestZpycrZworknamer filenamesdistcommandsepZepdatarrPr-rQsconsole_scripts gui_scriptsZ script_dirscriptoptionsr9r9r:installs\        &    L        (      ,    & ,       (  .              z Wheel.installcCs8tdur4tjttddtjdd}t|atS)Nz dylib-cachez%s.%sr&) cacherCrTr7rr!rW version_infor)rIrr9r9r:_get_dylib_caches zWheel._get_dylib_cachec Cstj|j|j}d|j|jf}d|}t|d}t d}g}t |d.}z| |}||} t | } |} | |} tj| j| } tj| st| | D]\}}tj| t|}tj|sd}n6t|j}tj|}||}tj|j}||k}|r(||| |||fqWdn1sN0YWntynYn0Wdn1s0Y|S)NrrZ EXTENSIONSrrT)rCrTr7rqrtrrrsrrrrrr1r2rS prefix_to_dirrrmakedirsr3rrstatst_mtimedatetime fromtimestampgetinfo date_timeextractr6r)rIrLrrrrrUrrrrMrQrZ cache_baserrrdestr\Z file_timer}Z wheel_timer9r9r:_get_extensionss>             4&zWheel._get_extensionscCst|S)zM Determine if a wheel is compatible with the running system. ) is_compatiblerHr9r9r:r_szWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr9rHr9r9r: is_mountableszWheel.is_mountablecCstjtj|j|j}|s2d|}t||sJd|}t||t jvrbt d|nN|rtt j |nt j d||}|rtt jvrt j tt||dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)rCrTr{r7rqrtr_rr`rWrrr6insertr^_hook meta_pathrN)rIr6rLmsgrMr9r9r:mounts"   z Wheel.mountcCsrtjtj|j|j}|tjvr2td|n.r rr<..invalid entry in wheel: %rr&r rr)rCrTr7rqrtrrrsrrrrrrrryrrrr r rrrr!r"rr)rIrLrrrr:r;r<rrr=rrrrrrr>rrrArrBrCrDrr)rr9r9r:r|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 }|| krqhd |vrtd || | | tj| t|}|| |<qhWd n1s0Y|| |\}}|| fi|}|r|| |\}}|r<||kr<||||d urftjd d| d\}}t|n*tj|std|tj||j}t| }tj| |}||f}||| |||||d urt||Wd n1s0Y|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-INFOrT)rr rs)path_maprrsrTrr9r9r: get_versioncs  z!Wheel.update..get_versioncSsd}z|t|}|d}|dkr*d|}nTdd||dddD}|dd7<d |d|dd d |Df}Wntytd |Yn0|rt|d }||_| t }|j ||dtd||dS)Nr(rz%s+1cSsg|] }t|qSr9r)rrKr9r9r:rurAz8Wheel.update..update_version..rr*rz%s+%scss|]}t|VqdSr=)r!rr9r9r: xrAz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %rri)rTlegacyzVersion updated from %r to %r) rrryr7rrrr rsrrr)rsrTupdatedrQrr8Zmdrmr9r9r:update_versionms.         z$Wheel.update..update_versionrrrrrrgrhNz.whlz wheel-update-)r/rdirzNot a directory: %r)rCrTr7rqrtrrrsrrrrr r rrr\rrmkstempcloserrr3rrr4copyfile)rImodifierdest_dirr9rkrorLrrr<r@rrjrArrBrTZoriginal_versionr)modifiedcurrent_versionfdnewpathrrr}r9r9r:rKRs\        (        ,z Wheel.update)NFF)N)NN)F)N)r`rarb__doc__rrrJpropertyrtrrrrrr}rrrrrrrrPrSr^r_r`rerfr|rKr9r9r9r:rcs@ )        tn "  8rccCsZddl}|}g}|ddkrV|ddD]}||rFt|ndq.t|}|S)Nrglibcrr*)platformlibc_verryr6isdigitrr)r}verrUrKr9r9r:_get_glibc_versions rc Cshtg}td}ttjddddD]}|d|t|gq$g}tD]*\}}}| drN|| dddqN| t dkr| dt |dg}tg}tjd krtd 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]} |dt|df|| f|dkrtj dr| dd} t}t|dkr|dkr$|dt|df|d| f|dkrP|dt|df|d| f|dkr||dt|df|d| f|dt|df|d|d|d| ffqqt|D]L\}}|dt|fddf|dkr|dt|dfddfqt|D]L\}}|dd |fddf|dkr|dd |dfddfqt|S)!zG Return (pyver, abi, arch) tuples compatible with this Python. rrrr3z.abir*r&redarwinz(\w+)_(\d+)_(\d+)_(\w+)$)i386ppcfat)rrx86_64Zfat3)ppc64rfat64)rrintel)rrrrr universalz %s_%s_%s_%slinuxZlinux_)r&z manylinux1_%s)r& zmanylinux2010_%s)r&zmanylinux2014_%szmanylinux_%s_%s_%srfr')r4rangerWrRr6r7r!rZZ get_suffixesr#rysortrrarr}rerwrr IMP_PREFIXrBrr]rset)versionsmajorminorabisr/r)rUarchesr/rrromatchesrwrKrnr8rrsr9r9r:compatible_tagss                        " "rcCs\t|tst|}d}|dur"t}|D]0\}}}||jvr&||jvr&||jvr&d}qXq&|S)NFT)r rcCOMPATIBLE_TAGSrmrnro)wheelrrUrrnror9r9r:r_s r_)N)U __future__rrrrXemailrrrZr1loggingrCrrr4rWrrr3rrcompatrrr r r Zdatabaser rr rrrutilrrrrrrrrrrrsrr getLoggerr`rrQhasattrrr}r#r5r4rRrlrrBrrryr;compile IGNORECASEVERBOSErzrvrrrrrDrobjectrErbrcrrrr_r9r9r9r:s   0             #1 P