Ë
    nûàg·˜  ã                  ór  — d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlZddl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, dd	l-m.Z. d
dl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5  ejl                  d«      Z7 ejl                  dejp                  «      Z9 ejl                  d«      Z: ejl                  dejp                  «      jv                  Z<dj{                  «       Z>g d¢Z?dZ@dej‚                  › dej„                  j†                  › dej„                  jˆ                  › �ZEd„ ZFd„ ZGd„ ZHd5d„ZId5d„ZJd5d„ZKde#dfd„ZLd„ ZM ejl                  d ejp                  «      ZN	 eMd!„ «       ZO G d"„ d#«      ZP G d$„ d%eP«      ZQ G d&„ d'e%«      ZR ejl                  d(«      j¦                  ZTd)„ ZUd*„ ZVd6d+„ZWd,„ ZX G d-„ d.e«      ZY G d/„ d0ej´                  «      Z[ej¸                  jº                  fd1„Z^d2„ Z_  eWe@«      e^«      Z^d3„ Z`d4„ Zay)7z$PyPI and direct package downloading.é    )ÚannotationsN)Ú	translate©Úwraps)Ú
NamedTuple©Úunique_everseen)ÚBINARY_DISTÚCHECKOUT_DISTÚDEVELOP_DISTÚEGG_DISTÚSOURCE_DISTÚDistributionÚEnvironmentÚRequirementÚfind_distributionsÚnormalize_pathÚparse_versionÚ	safe_nameÚsafe_versionÚto_filename)ÚWheelé   )Ú_cfg_read_utf8_with_fallbackÚ_read_utf8_with_fallback)Úlog)ÚDistutilsErrorz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)zƒ<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz)ÚPackageIndexÚdistros_for_urlÚparse_bdist_wininstÚinterpret_distro_nameé   zsetuptools/z Python-urllib/ú.c                ón   — 	 t        j                  | «      S # t        $ r}t        d| ›�«      |‚d }~ww xY w)Nz/Not a URL, existing file, or requirement spec: )r   ÚparseÚ
ValueErrorr   )ÚspecÚes     úV/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/setuptools/package_index.pyÚparse_requirement_argr*   H   sB   € ðÜ× Ñ  Ó&Ð&øÜò ÜØ=¸d¸XÐFó
àð	ûðús   ‚ —	4 /¯4c                ó8  — | j                  «       }d\  }}}|j                  d«      ro|j                  d«      r| dd }d}nV|j                  dd«      r| d	d
 }| dd }d}n7|j                  d«      r| dd }d}n|j                  dd«      r| d	d
 }| dd }d}|||fS )z=Return (base,pyversion) or (None,None) for possible .exe name)NNNú.exez
.win32.exeNiöÿÿÿÚwin32z	.win32-pyiðÿÿÿiùÿÿÿéüÿÿÿz.win-amd64.exeiòÿÿÿz	win-amd64z.win-amd64-pyiìÿÿÿ)ÚlowerÚendswithÚ
startswith)Únamer/   ÚbaseÚpy_verÚplats        r)   r    r    Q   sÃ   € ð �J‰J‹L€EØ)Ñ€Dˆ&�$à‡~�~�fÔØ�>‰>˜,Ô'Ø˜˜�:ˆDØ‰DØ×Ñ˜k¨3Ô/Ø˜"˜R�[ˆFØ˜˜�:ˆDØ‰DØ�^‰^Ð,Ô-Ø˜˜�:ˆDØ‰DØ×Ñ˜o¨sÔ3Ø˜"˜R�[ˆFØ˜˜�:ˆDØˆDØ�˜ÐÐó    c                ód  — t         j                  j                  | «      }|\  }}}}}}t         j                  j                  |j	                  d«      d   «      }|dk(  r6|dk(  r1t         j                  j                  |j	                  d«      d   «      }d|v r|j	                  dd«      \  }}||fS )Nú/éÿÿÿÿzsourceforge.netÚdownloadéþÿÿÿú#r   )Úurllibr%   ÚurlparseÚunquoteÚsplit)	ÚurlÚpartsÚ_schemeÚserverÚpathÚ_parametersÚ_queryÚfragmentr3   s	            r)   Úegg_info_for_urlrI   i   sŸ   € Ü�L‰L×!Ñ! #Ó&€EØ;@Ñ8€GˆV�T˜;¨°Ü�<‰<×Ñ §
¡
¨3£°Ñ 3Ó4€DØÐ"Ò" t¨zÒ'9Ü�|‰|×#Ñ# D§J¡J¨s£O°BÑ$7Ó8ˆØ
ˆd�{ØŸ™ C¨Ó+‰ˆˆhØ�ˆ>Ðr6   c              #  óä   K  — t        | «      \  }}t        | ||«      E d{  –—†  |rCt        j                  |«      }|r+t	        | |j                  d«      |t        ¬«      E d{  –—†  yyy7 ŒJ7 Œ	­w)zEYield egg or source distribution objects that might be found at a URLNr   )Ú
precedence)rI   Údistros_for_locationÚEGG_FRAGMENTÚmatchr!   Úgroupr   )rA   Úmetadatar3   rH   rN   s        r)   r   r   t   st   è ø€ ä% cÓ*�N€Dˆ(Ü# C¨¨xÓ8×8Ð8ÙÜ×"Ñ" 8Ó,ˆÙÜ,Ø�U—[‘[ “^ X¼-ô÷ ñ ð ð ð 9øðús"   ‚A0¡A,¢AA0Á$A.Á%A0Á.A0c                ó&  — |j                  d«      r|dd }|j                  d«      rd|v rt        j                  | ||«      gS |j                  d«      rLd|v rHt        |«      }|j	                  «       sg S t        | |j
                  |j                  t        dz   ¬«      gS |j                  d	«      r%t        |«      \  }}}|�t        | |||t        |«      S t        D ]1  }|j                  |«      sŒ|dt        |«        }t        | ||«      c S  g S )
z:Yield egg or source distribution objects based on basenameú.egg.zipNr.   z.eggú-z.whlr   )ÚlocationÚproject_nameÚversionrK   r,   )r0   r   Úfrom_locationr   Úis_compatiblerU   rV   r   r    r!   r
   Ú
EXTENSIONSÚlen)rT   ÚbasenamerP   ÚwheelÚwin_baser4   ÚplatformÚexts           r)   rL   rL   €   s+  € à×Ñ˜Ô$Ø˜C˜R�=ˆØ×Ñ˜Ô  S¨H¡_ä×*Ñ*¨8°X¸xÓHÐIÐIØ×Ñ˜Ô  S¨H¡_Ü�h“ˆØ×"Ñ"Ô$ØˆIäØ!Ø"×/Ñ/ØŸ™ä# a™<ôð
ð 	
ð ×Ñ˜Ô Ü%8¸Ó%BÑ"ˆ�&˜(ØÐÜ(Ø˜( H¨f´kÀ8óð ô
 ò GˆØ×Ñ˜SÕ!Ø ¤3 s£8 )Ð,ˆHÜ(¨°8¸XÓFÒFðGð €Ir6   c                óh   — t        t        | «      t        j                  j	                  | «      |«      S )zEYield possible egg or source distribution objects based on a filename)rL   r   ÚosrE   r[   )ÚfilenamerP   s     r)   Údistros_for_filenamerc   £   s*   € äÜ�xÓ ¤"§'¡'×"2Ñ"2°8Ó"<¸hóð r6   c           
   #  óF  K  — |j                  d«      }|st        d„ |dd D «       «      ryt        t        |«      «      D ]  }||   dd j	                  «       sŒ n t        |«      }t        | |dj                  |d| «      dj                  ||d «      |||¬«      –— y­w)zÏGenerate the interpretation of a source distro name

    Note: if `location` is a filesystem filename, you should call
    ``pkg_resources.normalize_path()`` on it before passing it to this
    routine!
    rS   c              3  óH   K  — | ]  }t        j                  d |«      –— Œ y­w)z	py\d\.\d$N)ÚrerN   )Ú.0Úps     r)   ú	<genexpr>z(interpret_distro_name.<locals>.<genexpr>µ   s   è ø€ ÒK¸AœbŸh™h |°Q×7ÑKùs   ‚ "é   Nr   )Ú
py_versionrK   r^   )r@   ÚanyÚrangerZ   Úisdigitr   Újoin)rT   r[   rP   rk   rK   r^   rB   rh   s           r)   r!   r!   ª   s­   è ø€ ð �N‰N˜3Ó€EÙœ#ÑKÀÀqÀrÀÔKÔKàô ”3�u“:Óò ˆØ�‰8�B�Qˆ<×ÑÕ!Ùðô �‹Jˆä
ØØØ�‰��r˜�ÓØ�‰��q�r�ÓØØØôó ùs   ‚AB!ÁAB!c                ó.   ‡ — t        ‰ «      ˆ fd„«       }|S )zs
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    c                 ó&   •— t         ‰| i |¤Ž«      S ©Nr   )ÚargsÚkwargsÚfuncs     €r)   Úwrapperzunique_values.<locals>.wrapperÒ   s   ø€ ä™t TÐ4¨VÑ4Ó5Ð5r6   r   )ru   rv   s   ` r)   Úunique_valuesrw   Ì   s"   ø€ ô ˆ4ƒ[ó6ó ð6ð €Nr6   z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c           
   #  ó‚  K  — t         j                  |«      D ]²  }|j                  «       \  }}t        t	        t
        j                  |j                  «       j                  d«      «      «      }d|v sd|v sŒ_t        j                  |«      D ]<  }t        j                  j                  | t        |j                  d«      «      «      –— Œ> Œ´ dD ]l  }|j                  |«      }|dk7  sŒt        j!                  ||«      }|sŒ3t        j                  j                  | t        |j                  d«      «      «      –— Œn y­w)zEFind rel="homepage" and rel="download" links in `page`, yielding URLsú,Úhomepager:   r   )z<th>Home Pagez<th>Download URLr9   N)ÚRELÚfinditerÚgroupsÚsetÚmapÚstrÚstripr/   r@   ÚHREFr=   r%   ÚurljoinÚ
htmldecoderO   ÚfindÚsearch)rA   ÚpagerN   ÚtagÚrelÚrelsÚposs          r)   Úfind_external_linksrŒ   ß   s  è ø€ ô —‘˜dÓ#ò LˆØ—<‘<“>‰ˆˆSÜ”3”s—y‘y #§)¡)£+×"3Ñ"3°CÓ"8Ó9Ó:ˆØ˜Ñ ¨tÒ!3ÜŸ™ sÓ+ò L�Ü—l‘l×*Ñ*¨3´
¸5¿;¹;Àq»>Ó0JÓKÓKñLð	Lð 5ò LˆØ�i‰i˜‹nˆØ�"‹9Ü—K‘K  cÓ*ˆEÚÜ—l‘l×*Ñ*¨3´
¸5¿;¹;Àq»>Ó0JÓKÓKñLùs   ‚A4D?Á7A1D?Ã)D?Ä=D?c                  ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚContentCheckerzP
    A null content checker that defines the interface for checking content
    c                 ó   — y)z3
        Feed a block of data to the hash.
        N© ©ÚselfÚblocks     r)   ÚfeedzContentChecker.feed÷   s   € ð 	r6   c                 ó   — y)zC
        Check the hash. Return False if validation fails.
        Tr�   ©r’   s    r)   Úis_validzContentChecker.is_validý   s   € ð r6   c                 ó   — y)zu
        Call reporter with information about the checker (hash name)
        substituted into the template.
        Nr�   )r’   ÚreporterÚtemplates      r)   ÚreportzContentChecker.report  s   € ð
 	r6   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r”   r—   r›   r�   r6   r)   rŽ   rŽ   ò   s   „ ñòòór6   rŽ   c                  óZ   — e Zd Z ej                  d«      Zdd„Zed„ «       Zd„ Z	d„ Z
d„ Zy)	ÚHashCheckerzK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)c                óT   — || _         t        j                  |«      | _        || _        y rr   )Ú	hash_nameÚhashlibÚnewÚhashÚexpected)r’   r£   r§   s      r)   Ú__init__zHashChecker.__init__  s    € Ø"ˆŒÜ—K‘K 	Ó*ˆŒ	Ø ˆ�r6   c                óØ   — t         j                  j                  |«      d   }|s
t        «       S | j                  j                  |«      }|s
t        «       S  | di |j                  «       ¤ŽS )z5Construct a (possibly null) ContentChecker from a URLr9   r�   )r=   r%   r>   rŽ   Úpatternr†   Ú	groupdict)ÚclsrA   rH   rN   s       r)   Úfrom_urlzHashChecker.from_url  s^   € ô —<‘<×(Ñ(¨Ó-¨bÑ1ˆÙÜ!Ó#Ð#Ø—‘×"Ñ" 8Ó,ˆÙÜ!Ó#Ð#ÙÑ'�U—_‘_Ó&Ñ'Ð'r6   c                ó:   — | j                   j                  |«       y rr   )r¦   Úupdater‘   s     r)   r”   zHashChecker.feed!  s   € Ø�	‰	×Ñ˜Õr6   c                óP   — | j                   j                  «       | j                  k(  S rr   )r¦   Ú	hexdigestr§   r–   s    r)   r—   zHashChecker.is_valid$  s   € Ø�y‰y×"Ñ"Ó$¨¯©Ñ5Ð5r6   c                ó0   — || j                   z  } ||«      S rr   )r£   )r’   r™   rš   Úmsgs       r)   r›   zHashChecker.report'  s   € Ø˜Ÿ™Ñ'ˆÙ˜‹}Ðr6   N©ÚreturnÚNone)rœ   r�   rž   rf   Úcompilerª   r¨   Úclassmethodr­   r”   r—   r›   r�   r6   r)   r¡   r¡     s?   „ Øˆb�j‰jð	#ó€Gó
!ð
 ñ(ó ð(ò ò6ór6   r¡   c                  óz  ‡ — e Zd ZdZ	 	 	 	 d&	 	 	 	 	 d'ˆ fd„Zˆ fd„Zd(d)d„Zd(d*d„Zd(d+d„Zd,d„Z	d,d„Z
d	„ Zd
„ Zd,d„Zd-d,d„Zd,d„Zd-ˆ fd„	Zd,d„Zd,d„Zd„ Zd,d„Zd„ Z	 	 	 	 d.	 	 	 	 	 	 	 d/d„Z	 d0	 	 	 	 	 d1d„Zd„ ZdZd„ Zd,d„Zd-d„Zd„ Zed„ «       Zd„ Z d„ Z!d,d„Z"d „ Z#d!„ Z$ed"„ «       Z%d,d#„Z&d,d$„Z'd,d%„Z(ˆ xZ)S )2r   z;A distribution index that scans web pages for download URLsc                óV  •— t        ‰| �  |i |¤Ž |dd |j                  d«        z   | _        i | _        i | _        i | _        t        j                  dj                  t        t        |«      «      «      j                  | _        g | _        t        j                   j"                  | _        y )Nr8   ú|)Úsuperr¨   r0   Ú	index_urlÚscanned_urlsÚfetched_urlsÚpackage_pagesrf   r·   ro   r   r   rN   ÚallowsÚto_scanr=   ÚrequestÚurlopenÚopener)r’   r½   ÚhostsÚ	ca_bundleÚ
verify_sslrs   ÚkwÚ	__class__s          €r)   r¨   zPackageIndex.__init__/  s�   ø€ ô 	‰Ñ˜$Ð% "Ò%Ø" SÐ)F¨y×/AÑ/AÀ#Ó/FÐ+FÐ%GÑGˆŒØ"$ˆÔØ"$ˆÔØ#%ˆÔÜ—j‘j §¡¬#¬i¸Ó*?Ó!@ÓA×GÑGˆŒØˆŒÜ—n‘n×,Ñ,ˆ�r6   c                ól   •— 	 t        |j                  «       t        ‰| �  |«      S # t        $ r Y y w xY wrr   )r   rV   Ú	Exceptionr¼   Úadd)r’   ÚdistrÊ   s     €r)   rÍ   zPackageIndex.addA  s9   ø€ ð	Ü˜$Ÿ,™,Ô'ô ‰w‰{˜4Ó Ð øô ò 	Ùð	ús   ƒ' §	3²3c           	     óÈ  — || j                   v r|syd| j                   |<   t        |«      s| j                  |«       yt        t	        |«      «      }|r$| j                  |«      sy| j                  d|«       |s|r|| j                  v r t        t        | j                  |«      «       y| j                  |«      sd| j                  |<   y| j                  d|«       d| j                  |<   d}| j                  |||z  «      }|€yt        |t        j                  j                  «      r-|j                   dk(  r| j                  d|j"                  › �«       d| j                  |j$                  <   d|j&                  j)                  d	d
«      j+                  «       vr|j-                  «        y|j$                  }|j/                  «       }t        |t0        «      sXt        |t        j                  j                  «      rd}n|j&                  j3                  d«      xs d}|j5                  |d«      }|j-                  «        t6        j9                  |«      D ]K  }	t        j:                  j=                  |t?        |	jA                  d«      «      «      }
| jC                  |
«       ŒM |jE                  | jF                  «      r$tI        |dd«      dk7  r| jK                  ||«      }yyy)z<Evaluate a URL as a possible download, and maybe retrieve itNTzFound link: %sz
Reading %sz<Download error on %s: %%s -- Some packages may not be found!i‘  zAuthentication error: Úhtmlúcontent-typeÚ zlatin-1ÚcharsetÚignorer   Úcodeé”  )&r¾   Ú
URL_SCHEMEÚprocess_filenameÚlistr   Úurl_okÚdebugr¿   r   rÍ   ÚinfoÚopen_urlÚ
isinstancer=   ÚerrorÚ	HTTPErrorrÕ   r³   rA   ÚheadersÚgetr/   ÚcloseÚreadr€   Ú	get_paramÚdecoder‚   r|   r%   rƒ   r„   rO   Úprocess_urlr1   r½   ÚgetattrÚprocess_index)r’   rA   ÚretrieveÚdistsÚtmplÚfr3   r‡   rÓ   rN   Úlinks              r)   rç   zPackageIndex.process_urlJ  sX  € à�$×#Ñ#Ñ#©HØØ!%ˆ×Ñ˜#ÑÜ˜#ŒØ×!Ñ! #Ô&Øäœ¨Ó-Ó.ˆEÙØ—{‘{ 3Ô'ØØ—
‘
Ð+¨SÔ1á™ C¨4×+<Ñ+<Ñ$<Ü”�T—X‘X˜uÓ%Ô&Øà�{‰{˜3ÔØ%)ˆD×Ñ˜cÑ"Øà�	‰	�, Ô$Ø!%ˆ×Ñ˜#ÑØMˆØ�M‰M˜#˜t c™zÓ*ˆØˆ9ØÜ�aœŸ™×/Ñ/Ô0°Q·V±V¸s²]Ø�I‰IÐ.¨q¯u©u¨gÐ6Ô7Ø#'ˆ×Ñ˜!Ÿ%™%Ñ Ø˜Ÿ™Ÿ™ ~°rÓ:×@Ñ@ÓBÑBØ�G‰GŒIØà�u‰uˆØ�v‰v‹xˆÜ˜$¤Ô$ä˜!œVŸ\™\×3Ñ3Ô4à#‘àŸ)™)×-Ñ-¨iÓ8ÒE¸I�Ø—;‘;˜w¨Ó1ˆDØ	�‰Œ	Ü—]‘] 4Ó(ò 	#ˆEÜ—<‘<×'Ñ'¨¬j¸¿¹ÀQ»Ó.HÓIˆDØ×Ñ˜TÕ"ð	#ð �>‰>˜$Ÿ.™.Ô)¬g°a¸ÀÓ.FÈ#Ò.MØ×%Ñ% c¨4Ó0‰Dð /NÐ)r6   c                óú  — t         j                  j                  |«      s| j                  d|«       y t         j                  j	                  |«      rk|sit         j                  j                  |«      }t        j                  |«      D ]2  }| j                  t         j                  j                  ||«      d«       Œ4 t        |«      }|r2| j                  d|«       t        t        | j                  |«      «       y y )NzNot found: %sTz	Found: %s)ra   rE   ÚexistsÚwarnÚisdirÚrealpathÚlistdirrØ   ro   rc   rÛ   rÙ   r   rÍ   )r’   ÚfnÚnestedrE   Úitemrë   s         r)   rØ   zPackageIndex.process_filename  s·   € ä�w‰w�~‰~˜bÔ!Ø�I‰I�o rÔ*Øä�7‰7�=‰=˜Ô¡VÜ—7‘7×#Ñ# BÓ'ˆDÜŸ
™
 4Ó(ò F�Ø×%Ñ%¤b§g¡g§l¡l°4¸Ó&>ÀÕEðFô % RÓ(ˆÙØ�J‰J�{ BÔ'Ü”�T—X‘X˜uÓ%Õ&ð r6   c                ó  — t        |«      }|xr" |j                  d«      j                  «       dk(  }|s1| j                  t        j
                  j                  |«      d   «      ryd}|rt        ||z  «      ‚| j                  ||«       y)Nr   ÚfileTz¡
Note: Bypassing %s (disallowed host; see https://setuptools.pypa.io/en/latest/deprecated/easy_install.html#restricting-downloads-with-allow-hosts for details).
F)	r×   rO   r/   rÁ   r=   r%   r>   r   rñ   )r’   rA   ÚfatalÚsÚis_filer³   s         r)   rÚ   zPackageIndex.url_ok�  s€   € Ü�s‹OˆØÒ4˜Ÿ™ ›
×(Ñ(Ó*¨fÑ4ˆÙ�d—k‘k¤&§,¡,×"7Ñ"7¸Ó"<¸QÑ"?Ô@ØðWð 	ñ
 Ü   s¡Ó+Ð+à�I‰I�c˜3ÔØr6   c                ó°   — t        t        j                  j                  |«      }d„ |D «       }t	        t        j                  | j                  |«      «       y )Nc              3  óz   K  — | ]3  }t        j                  |«      D ]  }|j                  d «      r||f–— Œ Œ5 y­w)z	.egg-linkN)ra   rô   r0   )rg   rE   Úentrys      r)   ri   z.PackageIndex.scan_egg_links.<locals>.<genexpr>¡  sF   è ø€ ò 
àÜŸ™ DÓ)ò
ð Ø�~‰~˜kÔ*ð �5ŒMð
Øñ
ùs   ‚9;)Úfilterra   rE   rò   rÙ   Ú	itertoolsÚstarmapÚscan_egg_link)r’   Úsearch_pathÚdirsÚ	egg_linkss       r)   Úscan_egg_linkszPackageIndex.scan_egg_linksŸ  sB   € Ü”b—g‘g—m‘m [Ó1ˆñ
àô
ˆ	ô 	ŒY×Ñ˜t×1Ñ1°9Ó=Õ>r6   c           
     óÒ  — t        t        j                  j                  ||«      «      }t	        t        d t        t        j                  |j                  «       «      «      «      }t        |«      dk7  ry |\  }}t        t        j                  j                  ||«      «      D ]C  }t        j                  j                  |g|¢­Ž |_        t        |_        | j                  |«       ŒE y )Nrj   )r   ra   rE   ro   rÙ   r   r   r€   r�   Ú
splitlinesrZ   r   rT   r   rK   rÍ   )r’   rE   rÿ   ÚcontentÚlinesÚegg_pathÚ_setup_pathrÎ   s           r)   r  zPackageIndex.scan_egg_link©  s¦   € Ü*¬2¯7©7¯<©<¸¸eÓ+DÓEˆä”V˜D¤#¤c§i¡i°×1CÑ1CÓ1EÓ"FÓGÓHˆäˆu‹:˜Š?àà %Ñˆ�+ä&¤r§w¡w§|¡|°D¸(Ó'CÓDò 	ˆDÜŸG™GŸL™L¨Ð6°Ò6ˆDŒMÜ)ˆDŒOØ�H‰H�T�Nñ	r6   c           	     óÐ  — d}|j                  | j                  «      s|S t        t        t        j
                  j                  |t        | j                  «      d  j                  d«      «      «      }t        |«      dk7  sd|d   v r|S t        |d   «      }t        |d   «      }d| j                  j                  |j                  «       i «      |<   t        |«      t        |«      fS )N©NNr8   rj   r<   r   r   T)r1   r½   rÙ   r   r=   r%   r?   rZ   r@   r   r   rÀ   Ú
setdefaultr/   r   )r’   rî   ÚNO_MATCH_SENTINELrB   ÚpkgÚvers         r)   Ú_scanzPackageIndex._scan¹  sÇ   € à&ÐØ�‰˜tŸ~™~Ô.Ø$Ð$ä”SœŸ™×-Ñ-¨t´C¸¿¹Ó4GÐ4IÐ/J×/PÑ/PÐQTÓ/UÓVÓWˆÜˆu‹:˜Š?˜c U¨1¡X™oØ$Ð$ô ˜˜a™Ó!ˆÜ˜5 ™8Ó$ˆØ?Cˆ×Ñ×%Ñ% c§i¡i£k°2Ó6°tÑ<Ü˜3Ó¤¨SÓ!1Ð1Ð1r6   c                ó  — t         j                  |«      D ]J  }	 | j                  t        j                  j                  |t        |j                  d«      «      «      «       ŒL | j                  |«      \  }}|syt        ||«      D ]S  }t        |«      \  }}|j                  d«      r!|s|r|d|› d|› �z  }n| j                  |«       | j                  |«       ŒU t        j                  d„ |«      S # t        $ r Y Œèw xY w)z#Process the contents of a PyPI pager   rÒ   ú.pyz#egg=rS   c                óB   —  dj                   | j                  ddd«      Ž S )Nz<a href="{}#md5={}">{}</a>r   é   rj   )ÚformatrO   )Úms    r)   ú<lambda>z,PackageIndex.process_index.<locals>.<lambda>ã  s"   € Ð9Ð2×9Ñ9¸1¿7¹7À1ÀaÈÓ;KÐL€ r6   )r‚   r|   r  r=   r%   rƒ   r„   rO   r&   rŒ   rI   r0   Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub)	r’   rA   r‡   rN   r  r  Únew_urlr3   Úfrags	            r)   ré   zPackageIndex.process_indexÉ  sø   € ô —]‘] 4Ó(ò 	ˆEðØ—
‘
œ6Ÿ<™<×/Ñ/°´ZÀÇÁÈAÃÓ5OÓPÕQð	ð —:‘:˜c“?‰ˆˆSÙØô +¨3°Ó5ò 	#ˆGä)¨'Ó2‰JˆD�$Ø�}‰}˜UÔ#©DÙØ  s e¨1¨S¨EÐ2Ñ2‘Gà×*Ñ*¨3Ô/Ø�M‰M˜'Õ"ð	#ô �|‰|ÙLÈdó
ð 	
øô% ò Ùðús   šAC3Ã3	C?Ã>C?c                ó(   — | j                  d|«       y )NzPPage at %s links to .py file(s) without version info; an index scan is required.)Úscan_all©r’   rA   s     r)   r  zPackageIndex.need_version_infoæ  s   € Ø�‰ð àõ	
r6   c                ó¶   — | j                   | j                  vr&|r | j                  |g|¢­Ž  | j                  d«       | j	                  | j                   «       y )Nz6Scanning index of all packages (this may take a while))r½   r¿   rñ   rÜ   r  ©r’   r³   rs   s      r)   r#  zPackageIndex.scan_allí  sG   € Ø�>‰> ×!2Ñ!2Ñ2ÙØ�—	‘	˜#Ð% Ó%Ø�I‰IÐNÔOØ�‰�d—n‘nÕ%r6   c                óð  — | j                  | j                  |j                  z   dz   «       | j                  j	                  |j
                  «      s+| j                  | j                  |j                  z   dz   «       | j                  j	                  |j
                  «      s| j                  |«       t        | j                  j	                  |j
                  d«      «      D ]  }| j                  |«       Œ y )Nr8   r�   )	r  r½   Úunsafe_namerÀ   râ   ÚkeyrU   Únot_found_in_indexrÙ   )r’   ÚrequirementrA   s      r)   Úfind_packageszPackageIndex.find_packagesô  s·   € Ø�‰�d—n‘n {×'>Ñ'>Ñ>ÀÑDÔEà×!Ñ!×%Ñ% k§o¡oÔ6à�M‰M˜$Ÿ.™.¨;×+CÑ+CÑCÀcÑIÔJà×!Ñ!×%Ñ% k§o¡oÔ6à×#Ñ# KÔ0ä˜×*Ñ*×.Ñ.¨{¯©ÀÓCÓDò 	ˆCà�M‰M˜#Õñ	r6   c                óÄ   •— | j                  «        | j                  |«       | |j                     D ]  }||v r|c S | j                  d||«       Œ t        ‰| �  ||«      S )Nz%s does not match %s)Úprescanr,  r)  rÛ   r¼   Úobtain)r’   r+  Ú	installerrÎ   rÊ   s       €r)   r/  zPackageIndex.obtain  se   ø€ Ø�‰ŒØ×Ñ˜;Ô'Ø˜Ÿ™Ñ)ò 	BˆDØ�{Ñ"Ø’Ø�J‰JÐ-¨{¸DÕAð	Bô ‰w‰~˜k¨9Ó5Ð5r6   c                ó0  — |j                  | j                  d|› �«       |j                  «       sg|j                  «        t	        j
                  |«       t        |j                  j                  › dt        j                  j                  |«      › d�«      ‚y)z-
        checker is a ContentChecker
        zValidating %s checksum for z validation failed for z; possible download problem?N)r›   rÛ   r—   rã   ra   Úunlinkr   r¦   r2   rE   r[   )r’   Úcheckerrb   Útfps       r)   Ú
check_hashzPackageIndex.check_hash  sƒ   € ð 	�‰�t—z‘zÐ%@ÀÀ
Ð#KÔLØ×ÑÔ!Ø�I‰IŒKÜ�I‰I�hÔÜ Ø—<‘<×$Ñ$Ð%Ð%<¼R¿W¹W×=MÑ=MÈhÓ=WÐ<Xð Y-ð -óð ð "r6   c                óä   — |D ]k  }| j                   �0t        |«      r%|j                  d«      st        t	        |«      «      r| j                  |«       ŒQ| j                   j                  |«       Œm y)z;Add `urls` to the list that will be prescanned for searchesNúfile:)rÂ   r×   r1   rÙ   r   r  Úappend)r’   ÚurlsrA   s      r)   Úadd_find_linkszPackageIndex.add_find_links  s]   € àò 	)ˆCà—‘Ð$Ü! #”Ø—>‘> 'Ô*Üœ¨Ó,Ô-ð —‘˜cÕ"ð —‘×#Ñ# CÕ(ñ	)r6   c                ó|   — | j                   r)t        t        | j                  | j                   «      «       d| _         y)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rÂ   rÙ   r   r  r–   s    r)   r.  zPackageIndex.prescan(  s'   € à�<Š<Ü”�T—]‘] D§L¡LÓ1Ô2Øˆ�r6   c                ó¢   — | |j                      r| j                  d}}n| j                  d}} |||j                  «       | j	                  «        y )Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r)  rÜ   rñ   r(  r#  )r’   r+  Úmethr³   s       r)   r*  zPackageIndex.not_found_in_index.  sC   € Ø�—‘Ò ØŸ	™	Ð#H�#‰DàŸ	™	Ð#X�#ˆDÙˆS�+×)Ñ)Ô*Ø�‰�r6   c                óZ  — t        |t        «      st        |«      }|rF| j                  ||«      }t	        |«      \  }}|j                  d«      r| j                  |||«      }|S t        j                  j                  |«      r|S t        |«      }t        | j                  ||«      dd«      S )a  Locate and/or download `spec` to `tmpdir`, returning a local path

        `spec` may be a ``Requirement`` object, or a string containing a URL,
        an existing local filename, or a project/version requirement spec
        (i.e. the string form of a ``Requirement`` object).  If it is the URL
        of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one
        that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is
        automatically created alongside the downloaded file.

        If `spec` is a ``Requirement`` object or a string containing a
        project/version requirement spec, this method returns the location of
        a matching distribution (possibly after downloading it to `tmpdir`).
        If `spec` is a locally existing file or directory name, it is simply
        returned unchanged.  If `spec` is a URL, it is downloaded to a subpath
        of `tmpdir`, and the local filename is returned.  Various errors may be
        raised if a problem occurs during downloading.
        r  rT   N)rÞ   r   r×   Ú_download_urlrI   r0   Ú	gen_setupra   rE   rð   r*   rè   Úfetch_distribution)r’   r'   ÚtmpdirÚschemeÚfoundr3   rH   s          r)   r:   zPackageIndex.download6  s™   € ô$ ˜$¤Ô,Ü Ó%ˆFÙà×*Ñ*¨4°Ó8�Ü!1°$Ó!7‘��hØ—=‘= Ô'Ø ŸN™N¨5°(¸FÓC�EØ�Ü—‘—‘ Ô%à�ä,¨TÓ2�Ü�t×.Ñ.¨t°VÓ<¸jÈ$ÓOÐOr6   c                óì  ‡ ‡‡‡‡	— ‰ j                  d|«       t        «       Š	d}d	d
ˆˆ ˆ	ˆˆfd„}|r)‰ j                  «        ‰ j                  |«        ||«      }|s|�	 |||«      }|€$‰ j                  �‰ j                  «         ||«      }|€|s‰ j                  |«        ||«      }|€‰ j                  d‰xr dxs d|«       y‰ j                  d|«       |j                  |j                  ¬«      S )a|  Obtain a distribution suitable for fulfilling `requirement`

        `requirement` must be a ``pkg_resources.Requirement`` instance.
        If necessary, or if the `force_scan` flag is set, the requirement is
        searched for in the (online) package index as well as the locally
        installed packages.  If a distribution matching `requirement` is found,
        the returned distribution's ``location`` is the value you would have
        gotten from calling the ``download()`` method with the matching
        distribution's URL or filename.  If no matching distribution is found,
        ``None`` is returned.

        If the `source` flag is set, only source distributions and source
        checkout links will be considered.  Unless the `develop_ok` flag is
        set, development and system eggs (i.e., those using the ``.egg-info``
        format) will be ignored.
        zSearching for %sNc                ó’  •— |€‰}|| j                      D ]°  }|j                  t        k(  r*‰s(|‰vr#‰j                  d|«       ‰j	                  |«       Œ@|| v xr |j                  t
        k  xs ‰ }|sŒa‰j                  |j                  ‰	«      }||_        t        j                  j                  |j                  «      sŒ®|c S  y )Nz&Skipping development or system egg: %s)r)  rK   r   rñ   rÍ   r   r:   rT   Údownload_locationra   rE   rð   )
ÚreqÚenvrÎ   ÚtestÚlocÚ
develop_okr’   ÚskippedÚsourcerB  s
        €€€€€r)   r…   z-PackageIndex.fetch_distribution.<locals>.findv  s¼   ø€ Øˆ{Ø�ð ˜CŸG™G™ò $�Ø—?‘?¤lÒ2¹:Ø 7Ñ*ØŸ	™	ØDØ ôð  Ÿ™ DÔ)Øà˜s�{ÒU¨¯©¼;Ñ(FÒ(TÈfÈ*�ÚØŸ-™-¨¯©°vÓ>�CØ-0�DÔ*Ü—w‘w—~‘~ d×&<Ñ&<Õ=Ø#šð$ð" r6   z:No local packages or working download links found for %s%sza source distribution of rÒ   zBest match: %s)rT   rr   )rI  zEnvironment | None)rÜ   r~   r.  r,  rÂ   rñ   ÚclonerG  )
r’   r+  rB  Ú
force_scanrN  rL  Úlocal_indexrÎ   r…   rM  s
   ` ` ``   @r)   rA  zPackageIndex.fetch_distributionX  sõ   ü€ ð4 	�	‰	Ð$ kÔ2Ü“%ˆØˆ÷	ò 	ñ0 Ø�L‰LŒNØ×Ñ˜{Ô+Ù˜Ó$ˆDá˜Ð/Ù˜ [Ó1ˆDàˆ<Ø�|‰|Ð'Ø—‘”Ù˜Ó$ˆDàˆ<¡
Ø×Ñ˜{Ô+Ù˜Ó$ˆDàˆ<Ø�I‰IØLØÒ7Ð7Ò=¸2Øôð
 à�I‰IÐ&¨Ô-Ø—:‘: t×'=Ñ'=�:Ó>Ð>r6   c                óH   — | j                  ||||«      }|�|j                  S y)a3  Obtain a file suitable for fulfilling `requirement`

        DEPRECATED; use the ``fetch_distribution()`` method now instead.  For
        backward compatibility, this routine is identical but returns the
        ``location`` of the downloaded distribution instead of a distribution
        object.
        N)rA  rT   )r’   r+  rB  rP  rN  rÎ   s         r)   ÚfetchzPackageIndex.fetchª  s-   € ð ×&Ñ& {°F¸JÈÓOˆØÐØ—=‘=Ð Ør6   c                ó®  — t         j                  |«      }|xr6 t        ||j                  d«      d «      D �cg c]  }|j                  r|‘Œ c}xs g }t        |«      dk(  �rDt        j                  j                  |«      }t        j                  j                  |«      |k7  rwt        j                  j                  ||«      }t        j                  j                  |«      r t        j                  j                  ||«      st        j                  ||«       |}t        t        j                  j                  |d«      dd¬«      5 }	|	j!                  d|d   j"                  ›d|d   j                  ›d	t        j                  j%                  |«      d   ›d
�«       d d d «       |S |rt'        d|›d|›�«      ‚t'        d«      ‚c c}w # 1 sw Y   |S xY w)Nr   zsetup.pyÚwzutf-8)Úencodingz(from setuptools import setup
setup(name=r   z
, version=z, py_modules=[z])
z9Can't unambiguously interpret project/version identifier zI; any dashes in the name or version should be escaped using underscores. zpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rM   rN   r!   rO   rV   rZ   ra   rE   r[   Údirnamero   rð   ÚsamefileÚshutilÚcopy2ÚopenÚwriterU   Úsplitextr   )
r’   rb   rH   rB  rN   Údrë   r[   Údstrù   s
             r)   r@  zPackageIndex.gen_setup¹  sÍ  € Ü×"Ñ" 8Ó,ˆàò ô /¨x¸¿¹ÀQ»ÈÓNöàØ—9’9ò òòð ð 	ô ˆu‹:˜‹?Ü—w‘w×'Ñ'¨Ó1ˆHô �w‰w�‰˜xÓ(¨FÒ2Ü—g‘g—l‘l 6¨8Ó4�ÜŸ™Ÿ™ sÔ+´·±×0@Ñ0@ÀÈ3Ô0OÜ—L‘L ¨3Ô/Ø"�Hä”b—g‘g—l‘l 6¨:Ó6¸ÀgÔNð ÐRVØ—
‘
ð"Ø"'¨¡(×"7Ñ"7Ð!:¸*ÀUÈ1ÁX×EUÑEUÐDXÐXfÔgi×gnÑgn×gwÑgwð  yAó  hBð  CDñ  hEð  gHð  HLðMô÷ð
 ˆOáÜ ØKÈHÈ<ð X à %˜yð*óð ô !ðGóð ùòA÷$ð
 ˆOús   ¸GÅAG
Ç
Gi    c                ó>  — | j                  d|«       d }	 t        j                  |«      }| j                  |«      }t	        |t
        j                  j                  «      r(t        d|› d|j                  › d|j                  › �«      ‚|j                  «       }d}| j                  }d}d|v r?|j                  d«      }	t        t        t        |	«      «      }| j!                  |||||«       t#        |d	«      5 }
	 |j%                  |«      }|r=|j'                  |«       |
j)                  |«       |d
z  }| j!                  |||||«       nnŒR| j+                  |||
«       d d d «       ||r|j-                  «        S S # 1 sw Y   ŒxY w# |r|j-                  «        w w xY w)NzDownloading %szCan't download ú: ú r   r9   zcontent-lengthzContent-LengthÚwbr   )rÜ   r¡   r­   rÝ   rÞ   r=   rß   rà   r   rÕ   r³   Údl_blocksizeÚget_allÚmaxr   ÚintÚ
reporthookr[  rä   r”   r\  r5  rã   )r’   rA   rb   Úfpr3  rá   ÚblocknumÚbsÚsizeÚsizesr4  r“   s               r)   Ú_download_tozPackageIndex._download_toä  s{  € Ø�	‰	Ð" CÔ(àˆð	Ü!×*Ñ*¨3Ó/ˆGØ—‘˜sÓ#ˆBÜ˜"œfŸl™l×4Ñ4Ô5Ü$ °s°e¸2¸b¿g¹g¸YÀaÈÏÉÀxÐ%PÓQÐQØ—g‘g“iˆGØˆHØ×"Ñ"ˆBØˆDØ 7Ñ*àŸ™Ð(8Ó9�Üœ3œs E›?Ó+�Ø—‘  X¨x¸¸TÔBÜ�h Ó%ð 
8¨ØØŸG™G B›K�EÙØŸ™ UÔ+ØŸ	™	 %Ô(Ø  A™˜ØŸ™¨¨X°xÀÀTÕJàð ð —‘ ¨°3Ô7÷
8ð áØ—‘•
ð ÷
8ð 
8ûñ Ø—‘•
ð ús%   –C!F Ã7A'E;Å	F Å;FÆ F ÆFc                 ó   — y rr   r�   )r’   rA   rb   rj  Úblksizerl  s         r)   rh  zPackageIndex.reporthook  s   € Ør6   c           	     óô  — |j                  d«      rt        |«      S 	 t        || j                  «      S # t        t
        j                  j                  f$ rh}dj                  |j                  D �cg c]  }t        |«      ‘Œ nc c}w c}«      }|r| j                  ||«       nt        |› d|› �«      |‚Y d }~y d }~wt        j                  j                  $ r}|cY d }~S d }~wt        j                  j                   $ rE}|r| j                  ||j"                  «       nt        d|› d|j"                  › �«      |‚Y d }~y d }~wt
        j                  j$                  $ rD}|r| j                  ||j&                  «       nt        |› d|j&                  › �«      |‚Y d }~y d }~wt
        j                  j(                  t*        f$ r1}|r| j                  ||«       nt        d|› d|› �«      |‚Y d }~y d }~ww xY w)Nr7  rb  zDownload error for ra  z7 returned a bad status line. The server might be down, )r1   Ú
local_openÚopen_with_authrÅ   r&   ÚhttpÚclientÚ
InvalidURLro   rs   r€   rñ   r   r=   rß   rà   ÚURLErrorÚreasonÚBadStatusLineÚlineÚHTTPExceptionÚOSError)r’   rA   ÚwarningÚvÚargr³   s         r)   rÝ   zPackageIndex.open_url
  s­  € Ø�>‰>˜'Ô"Ü˜c“?Ð"ð	NÜ! # t§{¡{Ó3Ð3øÜœDŸK™K×2Ñ2Ð3ò 	<Ø—(‘(°·±Ö7¨œC �HÑ7ùÔ7Ó8ˆCÙØ—	‘	˜' 3Õ'ä$¨ u¨A¨c¨U ^Ó4¸!Ð;ô (ûô �|‰|×%Ñ%ò 	Ø�HûÜ�|‰|×$Ñ$ò 	UÙØ—	‘	˜' 1§8¡8Õ,ä$Ð':¸3¸%¸rÀ!Ç(Á(ÀÐ%LÓMÐSTÐTô -ûô �{‰{×(Ñ(ò 	ÙØ—	‘	˜' 1§6¡6Õ*ä$Ø�eð ØŸV™V˜Hð&óð ðô +ûô —‘×)Ñ)¬7Ð3ò 	NÙØ—	‘	˜' 1Õ%ä$Ð':¸3¸%¸rÀ!ÀÐ%EÓFÈAÐMô &ûð	NúsW   ž4 ´#G7ÁB:Á0B
Â3B:Â: G7ÃC!ÃG7Ã! G7Ä;EÅ G7Å!:F Æ &G7Ç'G2Ç2G7c                ó6  — t        |«      \  }}|r,d|v r*|j                  dd«      j                  dd«      }d|v rŒ'nd}|j                  d«      r|d d }t        j                  j                  ||«      }| j                  ||«      xs | j                  ||«      S )Nz..r#   ú\Ú_Ú__downloaded__rR   r.   )rI   Úreplacer0   ra   rE   ro   Ú_download_vcsÚ_download_other)r’   rA   rB  r2   Ú	_fragmentrb   s         r)   r?  zPackageIndex._download_url*  s™   € ô +¨3Ó/‰ˆˆiÙØ˜$‘,Ø—|‘| D¨#Ó.×6Ñ6°t¸SÓA�ð ˜$“,ð $ˆDà�=‰=˜Ô$Ø˜˜�9ˆDä—7‘7—<‘< ¨Ó-ˆà×!Ñ! # xÓ0ÒW°D×4HÑ4HÈÈhÓ4WÐWr6   c                óê   — t         j                  j                  | «      j                  }|j	                  d«      \  }}}t        ddgdgt        |«      z  z   «      }t        t        |h|z  «      d«      S )a  
        >>> rvcs = PackageIndex._resolve_vcs
        >>> rvcs('git+http://foo/bar')
        'git'
        >>> rvcs('hg+https://foo/bar')
        'hg'
        >>> rvcs('git:myhost')
        'git'
        >>> rvcs('hg:myhost')
        >>> rvcs('http://foo/bar')
        ú+ÚsvnÚgitÚhgN)	r=   r%   ÚurlsplitrC  Ú	partitionr~   ÚboolÚnextÚiter)rA   rC  ÚpreÚsepÚ_postÚalloweds         r)   Ú_resolve_vcszPackageIndex._resolve_vcs;  sj   € ô —‘×&Ñ& sÓ+×2Ñ2ˆØ ×*Ñ*¨3Ó/‰ˆˆS�%ä�u˜e�n¨ v´°S³	Ñ'9Ñ9Ó:ˆÜ”D˜#˜ ™Ó)¨4Ó0Ð0r6   c                ó   — | j                  |«      }|sy |dk(  rt        d|› �«      ‚|j                  d«      \  }}}| j                  |«      \  }}| j	                  d|› d|› d|› �«       t        j                  |dd||g«       t        |d	|d
d|g|d|dd	d|dg¬«      }|�,| j	                  d|› �«       t        j                  ||   «       |S )NrŠ  z/Invalid config, SVN download is not supported: r<   zDoing z clone from z to rO  z--quietz-CÚcheckoutz--cwdÚupz-rz-q)r‹  rŒ  zChecking out )r–  r   rŽ  Ú_vcs_split_rev_from_urlrÜ   Ú
subprocessÚ
check_callÚdict)r’   rA   Úspec_filenameÚvcsrb   r‚  ÚrevÚco_commandss           r)   r…  zPackageIndex._download_vcsN  sú   € Ø×Ñ Ó$ˆÙØØ�%Š<Ü ØAÀ#ÀÐGóð ð '×0Ñ0°Ó5‰ˆ�!�QØ×/Ñ/°Ó4‰ˆˆSà�	‰	�F˜3˜%˜|¨C¨5°°X°JÐ?Ô@Ü×Ñ˜s G¨Y¸¸XÐFÔGäØ�d˜H j°)¸SÐAØ�W˜h¨¨d°D¸#¸tÐDô
ˆð ˆ?Ø�I‰I˜ c UÐ+Ô,Ü×!Ñ! +¨cÑ"2Ô3àˆr6   c                ó2  — t         j                  j                  |«      j                  }|dk(  rFt         j                  j                  t         j                  j                  |«      j                  «      S | j                  |d«       | j                  ||«      S )Nrù   T)
r=   r%   r�  rC  rÃ   Úurl2pathnamer>   rE   rÚ   Ú_attempt_download)r’   rA   rb   rC  s       r)   r†  zPackageIndex._download_otherg  so   € Ü—‘×&Ñ& sÓ+×2Ñ2ˆØ�VÒÜ—>‘>×.Ñ.¬v¯|©|×/DÑ/DÀSÓ/I×/NÑ/NÓOÐOà�‰�C˜ÔØ×%Ñ% c¨8Ó4Ð4r6   c                ó(   — | j                  |d«       y )NT)rç   r$  s     r)   r  zPackageIndex.scan_urlo  s   € Ø×Ñ˜˜dÕ#r6   c                ó”   — | j                  ||«      }d|j                  dd«      j                  «       v r| j                  |||«      S |S )NrÐ   rÑ   rÒ   )rn  râ   r/   Ú_invalid_download_html)r’   rA   rb   rá   s       r)   r¤  zPackageIndex._attempt_downloadr  sJ   € Ø×#Ñ# C¨Ó2ˆØ�W—[‘[ °Ó4×:Ñ:Ó<Ñ<Ø×.Ñ.¨s°G¸XÓFÐFàˆOr6   c                óH   — t        j                  |«       t        d|› �«      ‚)NzUnexpected HTML page found at )ra   r2  r   )r’   rA   rá   rb   s       r)   r§  z#PackageIndex._invalid_download_htmly  s!   € Ü
�	‰	�(ÔÜÐ=¸c¸UÐCÓDÐDr6   c                óL  — t         j                  j                  | «      }|j                  j	                  dd«      d   }|j
                  j                  d«      \  }}}|j                  d«      \  }}}|r||fn|df\  }}	|j                  ||d¬«      j                  «       }
|
|	fS )	aò  
        Given a possible VCS URL, return a clean URL and resolved revision if any.

        >>> vsrfu = PackageIndex._vcs_split_rev_from_url
        >>> vsrfu('git+https://github.com/pypa/setuptools@v69.0.0#egg-info=setuptools')
        ('https://github.com/pypa/setuptools', 'v69.0.0')
        >>> vsrfu('git+https://github.com/pypa/setuptools#egg-info=setuptools')
        ('https://github.com/pypa/setuptools', None)
        >>> vsrfu('http://foo/bar')
        ('http://foo/bar', None)
        r‰  r   r9   r<   ú@NrÒ   )rC  rE   rH   )
r=   r%   r�  rC  r@   rE   rŽ  Ú
rpartitionÚ_replaceÚgeturl)rA   rB   Úclean_schemeÚno_fragment_pathr‚  r’  r“  ÚpostÚ
clean_pathr   Úresolveds              r)   rš  z$PackageIndex._vcs_split_rev_from_url}  s°   € ô —‘×%Ñ% cÓ*ˆà—|‘|×)Ñ)¨#¨qÓ1°"Ñ5ˆð "'§¡×!5Ñ!5°cÓ!:ÑÐ˜!˜Qà)×4Ñ4°SÓ9‰ˆˆS�$Ù),˜3 ™+°4¸°,‰ˆ
�Cà—>‘>ØØàð	 "ó 
÷
 ‰&‹(ð 	ð ˜ˆ}Ðr6   c                ó0   — t        j                  |g|¢­Ž  y rr   )r   rÛ   r&  s      r)   rÛ   zPackageIndex.debug�  s   € Ü�	‰	�#Ð˜Ôr6   c                ó0   — t        j                  |g|¢­Ž  y rr   )r   rÜ   r&  s      r)   rÜ   zPackageIndex.info   ó   € Ü�‰�Ð�tÔr6   c                ó0   — t        j                  |g|¢­Ž  y rr   )r   rñ   r&  s      r)   rñ   zPackageIndex.warn£  rµ  r6   )zhttps://pypi.org/simple/)Ú*NT)r½   r€   rÈ   r�  rµ   r¶   )F)rê   r�  rµ   r¶   )rö   r�  rµ   r¶   )rú   r�  rµ   r�  r´   rr   )FFFN)rP  r�  rN  r�  rL  r�  rµ   zDistribution | None)FF)rP  r�  rN  r�  rµ   z
str | None)*rœ   r�   rž   rŸ   r¨   rÍ   rç   rØ   rÚ   r  r  r  ré   r  r#  r,  r/  r5  r:  r.  r*  r:   rA  rS  r@  rd  rn  rh  rÝ   r?  Ústaticmethodr–  r…  r†  r  r¤  r§  rš  rÛ   rÜ   rñ   Ú__classcell__©rÊ   s   @r)   r   r   ,  sh  ø„ ÙEð 4ØØØð-àð-ð
 ð-ð 
õ-ô$!ô31ôj'ô ó ?óò 2ò 
ó:
ô&óõ6óó)òóò PðL !ØØ ØðP?ð ð	P?ð
 ðP?ð ðP?ð 
óP?ðf MRðØ/3ðØEIðà	óò'ðR €Lò óDóNò@Xð" ñ1ó ð1ò$ò25ó$òòEð ñó ðó>ó÷r6   r   z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c                óN   — | j                  d«      }t        j                  |«      S )Nr   )rO   rÐ   Úunescape)rN   Úwhats     r)   Údecode_entityr¾  ¬  s   € Ø�;‰;�q‹>€DÜ�=‰=˜ÓÐr6   c                ó"   — t        t        | «      S )a  
    Decode HTML entities in the given text.

    >>> htmldecode(
    ...     'https://../package_name-0.1.2.tar.gz'
    ...     '?tokena=A&amp;tokenb=B">package_name-0.1.2.tar.gz')
    'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz'
    )Ú
entity_subr¾  )Útexts    r)   r„   r„   ±  s   € ô ”m TÓ*Ð*r6   c                ó   ‡ — ˆ fd„}|S )Nc                ó   •‡ — ˆ ˆfd„}|S )Nc                 óÆ   •— t        j                  «       }t        j                  ‰«       	  ‰| i |¤Žt        j                  |«       S # t        j                  |«       w xY wrr   )ÚsocketÚgetdefaulttimeoutÚsetdefaulttimeout)rs   rt   Úold_timeoutru   Útimeouts      €€r)   Ú_socket_timeoutz@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeout¿  sN   ø€ Ü ×2Ñ2Ó4ˆKÜ×$Ñ$ WÔ-ð6Ù˜TÐ, VÑ,ä×(Ñ(¨Õ5ø”×(Ñ(¨Õ5ús   ¬A	 Á	A r�   )ru   rÊ  rÉ  s   ` €r)   rÊ  z'socket_timeout.<locals>._socket_timeout¾  s   ù€ õ	6ð Ðr6   r�   )rÉ  rÊ  s   ` r)   Úsocket_timeoutrË  ½  s   ø€ ô	ð Ðr6   c                óÎ   — t         j                  j                  | «      }|j                  «       }t	        j
                  |«      }|j                  «       }|j                  dd«      S )a9  
    Encode auth from a URL suitable for an HTTP header.
    >>> str(_encode_auth('username%3Apassword'))
    'dXNlcm5hbWU6cGFzc3dvcmQ='

    Long auth strings should not cause a newline to be inserted.
    >>> long_auth = 'username:' + 'password'*10
    >>> chr(10) in str(_encode_auth(long_auth))
    False
    ú
rÒ   )r=   r%   r?   ÚencodeÚbase64Ú	b64encoderæ   r„  )ÚauthÚauth_sÚ
auth_bytesÚencoded_bytesÚencodeds        r)   Ú_encode_authrÖ  Ì  sR   € ô �\‰\×!Ñ! $Ó'€Fà—‘“€JÜ×$Ñ$ ZÓ0€Mà×"Ñ"Ó$€Gà�?‰?˜4 Ó$Ð$r6   c                  ó.   — e Zd ZU dZded<   ded<   dd„Zy)Ú
CredentialzŒ
    A username/password pair.

    Displayed separated by `:`.
    >>> str(Credential('username', 'password'))
    'username:password'
    r€   ÚusernameÚpasswordc                ó8   — | j                   › d| j                  › �S )Nú:)rÙ  rÚ  r–   s    r)   Ú__str__zCredential.__str__í  s   € Ø—-‘-�  $§-¡- Ð1Ð1r6   N)rµ   r€   )rœ   r�   rž   rŸ   Ú__annotations__rÝ  r�   r6   r)   rØ  rØ  á  s   … ñð ƒMØƒMô2r6   rØ  c                  ó:   ‡ — e Zd Zˆ fd„Zed„ «       Zd„ Zd„ Zˆ xZS )Ú
PyPIConfigc                ó&  •— t         j                  g d¢d«      }t        ‰| �  |«       t        j
                  j                  t        j
                  j                  d«      d«      }t        j
                  j                  |«      rt        | |«       yy)z%
        Load from ~/.pypirc
        )rÙ  rÚ  Ú
repositoryrÒ   ú~z.pypircN)
r�  Úfromkeysr¼   r¨   ra   rE   ro   Ú
expanduserrð   r   )r’   ÚdefaultsÚrcrÊ   s      €r)   r¨   zPyPIConfig.__init__ò  se   ø€ ô —=‘=Ò!GÈÓLˆÜ‰Ñ˜Ô"ä�W‰W�\‰\œ"Ÿ'™'×,Ñ,¨SÓ1°9Ó=ˆÜ�7‰7�>‰>˜"ÔÜ(¨¨rÕ2ð r6   c                óÄ   — | j                  «       D �cg c]$  }| j                  |d«      j                  «       r|‘Œ& }}t        t	        | j
                  |«      «      S c c}w )Nrâ  )Úsectionsrâ   r�   r�  r   Ú_get_repo_cred)r’   ÚsectionÚsections_with_repositoriess      r)   Úcreds_by_repositoryzPyPIConfig.creds_by_repositoryý  s_   € ð  Ÿ=™=›?ö&
àØ�x‰x˜ Ó.×4Ñ4Ô6ò ð&
Ð"ð &
ô ”C˜×+Ñ+Ð-GÓHÓIÐIùò&
s   “)Ac                óÖ   — | j                  |d«      j                  «       }|t        | j                  |d«      j                  «       | j                  |d«      j                  «       «      fS )Nrâ  rÙ  rÚ  )râ   r�   rØ  )r’   rë  Úrepos      r)   rê  zPyPIConfig._get_repo_cred  s]   € Ø�x‰x˜ Ó.×4Ñ4Ó6ˆØ”ZØ�H‰H�W˜jÓ)×/Ñ/Ó1Ø�H‰H�W˜jÓ)×/Ñ/Ó1ó
ð 
ð 	
r6   c                ór   — | j                   j                  «       D ]  \  }}|j                  |«      sŒ|c S  y)zŒ
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N)rí  Úitemsr1   )r’   rA   râ  Úcreds       r)   Úfind_credentialzPyPIConfig.find_credential  s=   € ð
 !%× 8Ñ 8× >Ñ >Ó @ò 	ÑˆJ˜Ø�~‰~˜jÕ)Ø’ð	ð r6   )	rœ   r�   rž   r¨   Úpropertyrí  rê  ró  r¹  rº  s   @r)   rà  rà  ñ  s(   ø„ ô	3ð ñJó ðJò
ör6   rà  c                óš  — t         j                  j                  | «      }|\  }}}}}}|j                  d«      rt        j
                  j                  d«      ‚|dv rt        |«      \  }	}
nd\  }	}
|	sJt        «       j                  | «      }|r/t        |«      }	|j                  | f}t        j                  dg|¢­Ž  |	rgdt        |	«      z   }	||
||||f}t         j                  j                  |«      }t         j                   j#                  |«      }|j%                  d|	«       nt         j                   j#                  | «      }|j%                  dt&        «        ||«      }|	rft         j                  j                  |j(                  «      \  }}}}}}||k(  r1||
k(  r,||||||f}t         j                  j                  |«      |_        |S )	z4Open a urllib2 request, handling HTTP authenticationrÜ  znonnumeric port: '')rt  Úhttpsr  z*Authenticating as %s for %s (from .pypirc)zBasic ÚAuthorizationz
User-Agent)r=   r%   r>   r0   rt  ru  rv  Ú
_splituserrà  ró  r€   rÙ  r   rÜ   rÖ  Ú
urlunparserÃ   ÚRequestÚ
add_headerÚ
user_agentrA   )rA   rÅ   ÚparsedrC  ÚnetlocrE   ÚparamsÚqueryr!  rÑ  Úaddressrò  rÜ   rB   r   rÃ   ri  Ús2Úh2Úpath2Úparam2Úquery2Úfrag2s                          r)   rs  rs    sœ  € ô �\‰\×"Ñ" 3Ó'€FØ06Ñ-€FˆF�D˜& %¨ð ‡��sÔÜ�k‰k×$Ñ$Ð%:Ó;Ð;àÐ"Ñ"Ü" 6Ó*‰ˆ‰gà$‰ˆˆgáÜ‹|×+Ñ+¨CÓ0ˆÙÜ�t“9ˆDØ—=‘= #Ð%ˆDÜ�H‰HÐAÐIÀDÓIáØœ, tÓ,Ñ,ˆØ˜  v¨u°dÐ:ˆÜ—,‘,×)Ñ)¨%Ó0ˆÜ—.‘.×(Ñ(¨Ó1ˆØ×Ñ˜?¨DÕ1ä—.‘.×(Ñ(¨Ó-ˆà×Ñ�|¤ZÔ0Ù	�‹€Báô 06¯|©|×/DÑ/DÀRÇVÁVÓ/LÑ,ˆˆB��v˜v uØ�Š<˜B 'šMØ˜  v¨v°uÐ<ˆEÜ—\‘\×,Ñ,¨UÓ3ˆBŒFà€Ir6   c                ó@   — | j                  d«      \  }}} |r|| fS d| fS )zNsplituser('user[:passwd]@host[:port]')
    --> 'user[:passwd]', 'host[:port]'.rª  N)r«  )ÚhostÚuserÚdelims      r)   rø  rø  I  s0   € ð Ÿ™¨Ó,Ñ€Dˆ%�ÙˆD dÐ*Ð*˜t dÐ*Ð*r6   c                ó   — | S rr   r�   )rA   s    r)   Ú
fix_sf_urlr  T  s   € Ø€Jr6   c                óT  — t         j                  j                  | «      \  }}}}}}t         j                  j	                  |«      }t
        j                  j                  |«      rt         j                  j                  | «      S |j                  d«      rÓt
        j                  j                  |«      r´g }t        j                  |«      D ]p  }	t
        j                  j                  ||	«      }
|	dk(  rt        |
«      } nbt
        j                  j                  |
«      r|	dz  }	|j                  d|	› d|	› d�«       Œr d}|j                  | dj                  |«      ¬«      }d	\  }}nd
\  }}}ddi}t!        j"                  |«      }t         j$                  j'                  | ||||«      S )z7Read a local path, with special support for directoriesr8   z
index.htmlz	<a href="z">z</a>zB<html><head><title>{url}</title></head><body>{files}</body></html>rÍ  )rA   Úfiles)éÈ   ÚOK)rÖ   zPath not foundz	Not foundrÑ   z	text/html)r=   r%   r>   rÃ   r£  ra   rE   ÚisfilerÄ   r0   rò   rô   ro   r   r8  r  ÚioÚStringIOrß   rà   )rA   rC   Ú_serverrE   Ú_paramrG   Ú_fragrb   r  rí   ÚfilepathÚbodyrì   ÚstatusÚmessagerá   Úbody_streams                    r)   rr  rr  X  s`  € ä4:·L±L×4IÑ4IÈ#Ó4NÑ1€GˆW�d˜F F¨EÜ�~‰~×*Ñ*¨4Ó0€HÜ	‡w�w‡~�~�hÔÜ�~‰~×%Ñ% cÓ*Ð*Ø	�‰�sÔ	¤§¡§¡¨hÔ 7ØˆÜ—‘˜HÓ%ò 
	@ˆAÜ—w‘w—|‘| H¨aÓ0ˆHØ�LÒ Ü/°Ó9�ÙÜ—‘—‘˜xÔ(Ø�S‘�Ø�L‰L˜9 Q C r¨!¨¨DÐ1Õ2ð
	@ð XˆDØ—;‘; 3¨d¯i©i¸Ó.>�;Ó?ˆDØ#‰ˆ‘à BÑˆ�˜à˜{Ð+€GÜ—+‘+˜dÓ#€KÜ�<‰<×!Ñ! # v¨w¸ÀÓMÐMr6   rr   )r"   )brŸ   Ú
__future__r   rÏ  Úconfigparserr¤   rÐ   Úhttp.clientrt  r  r  ra   rf   rY  rÅ  r›  ÚsysÚurllib.errorr=   Úurllib.parseÚurllib.requestÚfnmatchr   Ú	functoolsr   Útypingr   Úmore_itertoolsr	   Ú
setuptoolsÚpkg_resourcesr
   r   r   r   r   r   r   r   r   r   r   r   r   r   Úsetuptools.wheelr   Úunicode_utilsr   r   Ú	distutilsr   Údistutils.errorsr   r·   rM   ÚIr‚   r  rN   r×   r@   rY   Ú__all__Ú_SOCKET_TIMEOUTÚ__version__Úversion_infoÚmajorÚminorrü  r*   r    rI   r   rL   rc   r!   rw   r{   rŒ   rŽ   r¡   r   r  rÀ  r¾  r„   rË  rÖ  rØ  ÚRawConfigParserrà  rÃ   rÄ   rs  rø  r  rr  r�   r6   r)   ú<module>r6     s2  ðÙ *å "ã Û Û Û Û Û 	Û Û 	Û 	Û Û Û Û 
Û Û Û Ý Ý Ý å *ã ÷÷ ÷ ÷ õ  #ç Qå Ý +àˆr�z‰zÐ6Ó7€Ø€r‡z�zÐ3°R·T±TÓ:€Øˆ2�:‰:ðJó€ð ˆR�Z‰ZÐ,¨b¯d©dÓ3×9Ñ9€
Ø.×4Ñ4Ó6€
ò€ð €à˜:×1Ñ1Ð2°/À#×BRÑBR×BXÑBXÐAYÐYZÐ[^×[kÑ[k×[qÑ[qÐZrÐs€
òòò0ó	ó óFð .2¸kÐTXóòD
ð €b‡j�jÐKÈRÏTÉTÓR€ðð
 ñLó ðL÷$ñ ô2�.ô ôBx	�;ô x	ðz ˆR�Z‰ZÐ<Ó=×AÑA€
òò
	+óò%ô*2�ô 2ô %�×-Ñ-ô %ðP  &Ÿ~™~×5Ñ5ó +ò`+ð 1‘ Ó0°Ó@€òóNr6   