+
    SBib                     t   R t ^ RIt^ RIt^ RIt^ RIHtHtHtHtH	t	H
t
HtHt ^RIHt ^RIHt ]]]3,          t]! R]R7      t]]].]3,          tR R lt ! R	 R
]4      t ! R R]P2                  R7      t ! R R]4      t]P8                  ! R4      tR R ltR R ltR R lt R R lt! ! R R]4      t"R# )z
.. testsetup::

    from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier
    from packaging.version import Version
N)CallableIterableIteratorListOptionalTupleTypeVarUnion)canonicalize_version)VersionUnparsedVersionVar)boundc                0    V ^8  d   QhR\         R\        /#    versionreturn)UnparsedVersionr   )formats   "H/usr/lib/python3.14/site-packages/wheel/vendored/packaging/specifiers.py__annotate__r      s      _      c                 H    \        V \        4      '       g   \        V 4      p V # N)
isinstancer   )r   s   &r   _coerce_versionr      s    gw'''"Nr   c                       ] tR t^tRtRtR# )InvalidSpecifierz
Raised when attempting to create a :class:`Specifier` with a specifier
string that is invalid.

>>> Specifier("lolwat")
Traceback (most recent call last):
    ...
packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat'
 N)__name__
__module____qualname____firstlineno____doc____static_attributes__r   r   r   r   r      s    r   r   c                     a  ] tR t^*t o ]P
                  V 3R lR l4       t]P
                  V 3R lR l4       t]P
                  V 3R lR l4       t]	]P
                  V 3R lR l4       4       t
]
P                  V 3R	 lR
 l4       t
]P
                  RV 3R lR ll4       t]P
                  RV 3R lR ll4       tRtV tR# )BaseSpecifierc                    < V ^8  d   QhRS[ /# r   r   str)r   __classdict__s   "r   r   BaseSpecifier.__annotate__,   s       r   c                    R# )zv
Returns the str representation of this Specifier-like object. This
should be representative of the Specifier itself.
Nr   selfs   &r   __str__BaseSpecifier.__str__+       r   c                    < V ^8  d   QhRS[ /# r(   int)r   r+   s   "r   r   r,   3   s      # r   c                    R# )z6
Returns a hash value for this Specifier-like object.
Nr   r.   s   &r   __hash__BaseSpecifier.__hash__2   r2   r   c                &   < V ^8  d   QhRS[ RS[/# r   otherr   objectbool)r   r+   s   "r   r   r,   9   s      F t r   c                    R# )z
Returns a boolean representing whether or not the two Specifier-like
objects are equal.

:param other: The other object to check against.
Nr   r/   r;   s   &&r   __eq__BaseSpecifier.__eq__8   r2   r   c                0   < V ^8  d   QhRS[ S[,          /# r(   r   r>   )r   r+   s   "r   r   r,   C   s      Xd^ r   c                    R# )zWhether or not pre-releases as a whole are allowed.

This can be set to either ``True`` or ``False`` to explicitly enable or disable
prereleases or it can be set to ``None`` (the default) to use default semantics.
Nr   r.   s   &r   prereleasesBaseSpecifier.prereleasesA   r2   r   c                $   < V ^8  d   QhRS[ RR/# r   valuer   Nr>   )r   r+   s   "r   r   r,   K   s       $ r   c                    R# )zASetter for :attr:`prereleases`.

:param value: The value to set.
Nr   r/   rJ   s   &&r   rF   rG   J   r2   r   Nc                <   < V ^8  d   QhRS[ RS[S[,          RS[/# r   itemrF   r   r*   r   r>   )r   r+   s   "r   r   r,   R   s&      S x~  r   c                    R# )zB
Determines if the given item is contained within this specifier.
Nr   )r/   rP   rF   s   &&&r   containsBaseSpecifier.containsQ   r2   r   c                \   < V ^8  d   QhRS[ S[,          RS[S[,          RS[S[,          /# r   iterablerF   r   r   r   r   r>   r   )r   r+   s   "r   r   r,   X   s5       !34CKD>	$	%r   c                    R# )z}
Takes an iterable of items and filters them so that only items which
are contained within this specifier are allowed in it.
Nr   )r/   rW   rF   s   &&&r   filterBaseSpecifier.filterW   r2   r   r   r   )r   r    r!   r"   abcabstractmethodr0   r7   rA   propertyrF   setterrS   rZ   r$   __classdictcell__r+   s   @r   r&   r&   *   s       	 
 	       	  
 	  r   r&   )	metaclassc                     a  ] tR t^at o RtRtRt]P                  ! R],           ],           R,           ]P                  ]P                  ,          4      tRRRR	R
RRRRRRRRRRR/tRDV 3R lR llt]V 3R lR l4       t]P                   V 3R lR l4       t]V 3R lR l4       t]V 3R lR  l4       tV 3R! lR" ltV 3R# lR$ lt]V 3R% lR& l4       tV 3R' lR( ltV 3R) lR* ltV 3R+ lR, ltV 3R- lR. ltV 3R/ lR0 ltV 3R1 lR2 ltV 3R3 lR4 ltV 3R5 lR6 ltV 3R7 lR8 ltV 3R9 lR: ltV 3R; lR< lt V 3R= lR> lt!REV 3R? lR@ llt"REV 3RA lRB llt#RCt$V t%R# )F	Specifiera+  This class abstracts handling of version specifiers.

.. tip::

    It is generally not required to instantiate this manually. You should instead
    prefer to work with :class:`SpecifierSet` instead, which can parse
    comma-separated version specifiers (which is what package metadata contains).
z8
        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
        a  
        (?P<version>
            (?:
                # The identity operators allow for an escape hatch that will
                # do an exact string match of the version you wish to install.
                # This will not be parsed by PEP 440 and we cannot determine
                # any semantic meaning from it. This operator is discouraged
                # but included entirely as an escape hatch.
                (?<====)  # Only match for the identity operator
                \s*
                [^\s;)]*  # The arbitrary version can be just about anything,
                          # we match everything except for whitespace, a
                          # semi-colon for marker support, and a closing paren
                          # since versions can be enclosed in them.
            )
            |
            (?:
                # The (non)equality operators allow for wild card and local
                # versions to be specified so we have to define these two
                # operators separately to enable that.
                (?<===|!=)            # Only match for equals and not equals

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release

                # You cannot use a wild card and a pre-release, post-release, a dev or
                # local version together so group them with a | and make them optional.
                (?:
                    \.\*  # Wild card syntax of .*
                    |
                    (?:                                  # pre release
                        [-_\.]?
                        (alpha|beta|preview|pre|a|b|c|rc)
                        [-_\.]?
                        [0-9]*
                    )?
                    (?:                                  # post release
                        (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                    )?
                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
                )?
            )
            |
            (?:
                # The compatible operator requires at least two digits in the
                # release segment.
                (?<=~=)               # Only match for the compatible operator

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
                (?:                   # pre release
                    [-_\.]?
                    (alpha|beta|preview|pre|a|b|c|rc)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
            |
            (?:
                # All other operators only allow a sub set of what the
                # (non)equality operators do. Specifically they do not allow
                # local versions to be specified nor do they allow the prefix
                # matching wild cards.
                (?<!==|!=|~=)         # We have special cases for these
                                      # operators so we want to make sure they
                                      # don't match here.

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (alpha|beta|preview|pre|a|b|c|rc)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
        )
        z^\s*z\s*$~=
compatible==equalz!=	not_equal<=less_than_equal>=greater_than_equal<	less_than>greater_than===	arbitraryNc                :   < V ^8  d   QhRS[ RS[S[,          RR/# )r   specrF   r   NrQ   )r   r+   s   "r   r   Specifier.__annotate__   s&     ( (S (HTN (d (r   c                    V P                   P                  V4      pV'       g   \        RV R24      hVP                  R4      P	                  4       VP                  R4      P	                  4       3V n        W n        R# )a  Initialize a Specifier instance.

:param spec:
    The string representation of a specifier which will be parsed and
    normalized before use.
:param prereleases:
    This tells the specifier if it should accept prerelease versions if
    applicable or not. The default of ``None`` will autodetect it from the
    given specifiers.
:raises InvalidSpecifier:
    If the given specifier is invalid (i.e. bad syntax).
zInvalid specifier: ''operatorr   N)_regexsearchr   groupstrip_spec_prereleases)r/   ru   rF   matchs   &&& r   __init__Specifier.__init__   sm     ""4("%9$q#ABB KK
#))+KK	"((*'

 (r   c                    < V ^8  d   QhRS[ /# r(   rK   )r   r+   s   "r   r   rv      s      T r   c                    V P                   e   V P                   # V P                  w  rVR9   dA   VR8X  d   VP                  R4      '       d   VR R p\        V4      P                  '       d   R# R# )Nrg   .*TF)rg   rl   rj   re   rr   )r   r~   endswithr   is_prerelease)r/   ry   r   s   &  r   rF   Specifier.prereleases   sq     ($$$
 !JJ66 4G$4$4T$:$:!#2, w---r   c                $   < V ^8  d   QhRS[ RR/# rI   rK   )r   r+   s   "r   r   rv          " " "$ "r   c                    Wn         R # r   r   rM   s   &&r   rF   r         !r   c                    < V ^8  d   QhRS[ /# r(   r)   )r   r+   s   "r   r   rv     s      # r   c                (    V P                   ^ ,          # )zHThe operator of this specifier.

>>> Specifier("==1.2.3").operator
'=='
r~   r.   s   &r   ry   Specifier.operator       zz!}r   c                    < V ^8  d   QhRS[ /# r(   r)   )r   r+   s   "r   r   rv     s       r   c                (    V P                   ^,          # )zIThe version of this specifier.

>>> Specifier("==1.2.3").version
'1.2.3'
r   r.   s   &r   r   Specifier.version  r   r   c                    < V ^8  d   QhRS[ /# r(   r)   )r   r+   s   "r   r   rv   $  s     B B# Br   c                    V P                   e   RV P                  : 2MRpRV P                  P                   R\	        V 4      : V R2# )a  A representation of the Specifier that shows all internal state.

>>> Specifier('>=1.0.0')
<Specifier('>=1.0.0')>
>>> Specifier('>=1.0.0', prereleases=False)
<Specifier('>=1.0.0', prereleases=False)>
>>> Specifier('>=1.0.0', prereleases=True)
<Specifier('>=1.0.0', prereleases=True)>
, prereleases= rn   ()>)r   rF   	__class__r   r*   r/   pres   & r   __repr__Specifier.__repr__$  sU       , T--01 	 4>>**+1SYM#bAAr   c                    < V ^8  d   QhRS[ /# r(   r)   )r   r+   s   "r   r   rv   6  s     * * *r   c                6    RP                   ! V P                  !  # )zA string representation of the Specifier that can be round-tripped.

>>> str(Specifier('>=1.0.0'))
'>=1.0.0'
>>> str(Specifier('>=1.0.0', prereleases=False))
'>=1.0.0'
z{}{})r   r~   r.   s   &r   r0   Specifier.__str__6  s     }}djj))r   c                6   < V ^8  d   QhRS[ S[S[3,          /# r(   )r   r*   )r   r+   s   "r   r   rv   A  s     0 0sCx 0r   c                    \        V P                  ^,          V P                  ^ ,          R8g  R7      pV P                  ^ ,          V3# )   re   strip_trailing_zero)r
   r~   )r/   canonical_versions   & r   _canonical_specSpecifier._canonical_spec@  s>    0JJqM!%A$!6
 zz!}///r   c                    < V ^8  d   QhRS[ /# r(   r4   )r   r+   s   "r   r   rv   H  s     * *# *r   c                ,    \        V P                  4      # r   )hashr   r.   s   &r   r7   Specifier.__hash__H  s    D(())r   c                &   < V ^8  d   QhRS[ RS[/# r:   r<   )r   r+   s   "r   r   rv   K  s     = =F =t =r   c                   \        V\        4      '       d    V P                  \        V4      4      pM!\        WP                  4      '       g   \        # V P
                  VP
                  8H  #   \         d
    \        u # i ; i)a  Whether or not the two Specifier-like objects are equal.

:param other: The other object to check against.

The value of :attr:`prereleases` is ignored.

>>> Specifier("==1.2.3") == Specifier("== 1.2.3.0")
True
>>> (Specifier("==1.2.3", prereleases=False) ==
...  Specifier("==1.2.3", prereleases=True))
True
>>> Specifier("==1.2.3") == "==1.2.3"
True
>>> Specifier("==1.2.3") == Specifier("==1.2.4")
False
>>> Specifier("==1.2.3") == Specifier("~=1.2.3")
False
)r   r*   r   r   NotImplementedr   r@   s   &&r   rA   Specifier.__eq__K  sm    & eS!!&s5z2 E>>22!!##u'<'<<< $ &%%&s   A- -B Bc                &   < V ^8  d   QhRS[ RS[/# )r   opr   )r*   CallableOperator)r   r+   s   "r   r   rv   h  s     ! ! !(8 !r   c                F    \        V R V P                  V,           24      pV# )	_compare_)getattr
_operators)r/   r   operator_callables   && r   _get_operatorSpecifier._get_operatorh  s+    .5Idoob123/
 ! r   c                ,   < V ^8  d   QhRS[ RS[RS[/# r   prospectiveru   r   r   r*   r>   )r   r+   s   "r   r   rv   n  s"     
 
w 
c 
d 
r   c           
         \        \        \        P                  ! \        \        V4      4      4      R R 4      pVR,          pV P                  R4      ! W4      ;'       d    V P                  R4      ! W4      # )Nr   rl   rg   )_version_joinlist	itertools	takewhile_is_not_suffix_version_splitr   )r/   r   ru   prefixs   &&& r   _compare_compatibleSpecifier._compare_compatiblen  ss     $$^^D5IJKCRP

 	$!!$': 
 
t?Q?QRV?W@
 	
r   c                ,   < V ^8  d   QhRS[ RS[RS[/# r   r   )r   r+   s   "r   r   rv     s"     &/ &/' &/ &/ &/r   c                T   VP                  R 4      '       d]   \        VP                  RR7      p\        VRR RR7      p\        V4      p\        V4      p\	        We4      w  rxVR\        V4       p	W8H  # \        V4      p
V
P                  '       g   \        VP                  4      pW8H  # )r   Fr   Nr   )r   r
   publicr   _pad_versionlenr   local)r/   r   ru   normalized_prospectivenormalized_spec
split_specsplit_prospectivepadded_prospective_shortened_prospectivespec_versions   &&&        r   _compare_equalSpecifier._compare_equal  s    ==%9""&" 349RWXO (8J
 !//E F %11B$O!
 %77HZ$I!(66 #4=L
  %%%%k&8&89..r   c                ,   < V ^8  d   QhRS[ RS[RS[/# r   r   )r   r+   s   "r   r   rv     s"     : :g :S :T :r   c                .    V P                  W4      '       * # r   )r   r/   r   ru   s   &&&r   _compare_not_equalSpecifier._compare_not_equal  s    &&{999r   c                ,   < V ^8  d   QhRS[ RS[RS[/# r   r   )r   r+   s   "r   r   rv     s"     < <G <3 <4 <r   c                D    \        VP                  4      \        V4      8*  # r   r   r   r   s   &&&r   _compare_less_than_equal"Specifier._compare_less_than_equal       {))*gdm;;r   c                ,   < V ^8  d   QhRS[ RS[RS[/# r   r   )r   r+   s   "r   r   rv     s"     < <w <c <d <r   c                D    \        VP                  4      \        V4      8  # r   r   r   s   &&&r   _compare_greater_than_equal%Specifier._compare_greater_than_equal  r   r   c                ,   < V ^8  d   QhRS[ RS[RS[/# r   r   spec_strr   r   )r   r+   s   "r   r   rv     s"      g   r   c                    \        V4      pW8  g   R # VP                  '       gB   VP                  '       d0   \        VP                  4      \        VP                  4      8X  d   R # R# FT)r   r   base_versionr/   r   r   ru   s   &&& r   _compare_less_thanSpecifier._compare_less_than  sX     x 
 ! !!!k&?&?&?{//0GD<M<M4NN
 r   c                ,   < V ^8  d   QhRS[ RS[RS[/# r   r   )r   r+   s   "r   r   rv     s"       C D r   c                L   \        V4      pW8  g   R # VP                  '       gB   VP                  '       d0   \        VP                  4      \        VP                  4      8X  d   R # VP                  e0   \        VP                  4      \        VP                  4      8X  d   R # R# r   )r   is_postreleaser   r   r   s   &&& r   _compare_greater_thanSpecifier._compare_greater_than  s     x 
 ! """{'A'A'A{//0GD<M<M4NN ({//0GD<M<M4NN
 r   c                ,   < V ^8  d   QhRS[ RS[RS[/# r   r   )r   r+   s   "r   r   rv     s"     = =g =S =T =r   c                h    \        V4      P                  4       \        V4      P                  4       8H  # r   )r*   lowerr   s   &&&r   _compare_arbitrarySpecifier._compare_arbitrary  s&    ;%%'3t9??+<<<r   c                <   < V ^8  d   QhRS[ S[S[3,          RS[/# r   rP   r   )r	   r*   r   r>   )r   r+   s   "r   r   rv     s$     # #sG|!4 # #r   c                $    V P                  V4      # )a  Return whether or not the item is contained in this specifier.

:param item: The item to check for.

This is used for the ``in`` operator and behaves the same as
:meth:`contains` with no ``prereleases`` argument passed.

>>> "1.2.3" in Specifier(">=1.2.3")
True
>>> Version("1.2.3") in Specifier(">=1.2.3")
True
>>> "1.0.0" in Specifier(">=1.2.3")
False
>>> "1.3.0a1" in Specifier(">=1.2.3")
False
>>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True)
True
rS   r/   rP   s   &&r   __contains__Specifier.__contains__      & }}T""r   c                <   < V ^8  d   QhRS[ RS[S[,          RS[/# rO   r   r   r>   )r   r+   s   "r   r   rv     s.     ,@ ,@#,@2:4.,@	,@r   c                    Vf   V P                   p\        V4      pVP                  '       d   V'       g   R# V P                  V P                  4      pV! W0P
                  4      # )a  Return whether or not the item is contained in this specifier.

:param item:
    The item to check for, which can be a version string or a
    :class:`Version` instance.
:param prereleases:
    Whether or not to match prereleases with this Specifier. If set to
    ``None`` (the default), it uses :attr:`prereleases` to determine
    whether or not prereleases are allowed.

>>> Specifier(">=1.2.3").contains("1.2.3")
True
>>> Specifier(">=1.2.3").contains(Version("1.2.3"))
True
>>> Specifier(">=1.2.3").contains("1.0.0")
False
>>> Specifier(">=1.2.3").contains("1.3.0a1")
False
>>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1")
True
>>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True)
True
F)rF   r   r   r   ry   r   )r/   rP   rF   normalized_itemr   s   &&&  r   rS   Specifier.contains  sZ    8 **K *$/
 ((( /3.@.@.O ,,??r   c                \   < V ^8  d   QhRS[ S[,          RS[S[,          RS[S[,          /# rV   rX   )r   r+   s   "r   r   rv   5  s5     ; ; !34;CKD>;	$	%;r   c              #  T  "   Rp. pRVe   TMR/pV Fn  p\        V4      pV P                  ! V3/ VB '       g   K)  VP                  '       d.   V'       g&   V P                  '       g   VP	                  V4       Kh  RpVx  Kp  	  V'       g   V'       d   V F  pVx  K	  	  R# R# R# 5i)a  Filter items in the given iterable, that match the specifier.

:param iterable:
    An iterable that can contain version strings and :class:`Version` instances.
    The items in the iterable will be filtered according to the specifier.
:param prereleases:
    Whether or not to allow prereleases in the returned iterator. If set to
    ``None`` (the default), it will be intelligently decide whether to allow
    prereleases or not (based on the :attr:`prereleases` attribute, and
    whether the only versions matching are prereleases).

This method is smarter than just ``filter(Specifier().contains, [...])``
because it implements the rule from :pep:`440` that a prerelease item
SHOULD be accepted if no other versions match the given specifier.

>>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
['1.3']
>>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")]))
['1.2.3', '1.3', <Version('1.4')>]
>>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"]))
['1.5a1']
>>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
['1.3', '1.5a1']
>>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
['1.3', '1.5a1']
FrF   NT)r   rS   r   rF   append)r/   rW   rF   yieldedfound_prereleaseskwr   parsed_versions   &&&     r   rZ   Specifier.filter5  s     < K,C[N  G,W5N}}^2r22 "///4#3#3#3%,,W5 #G!M  ( ,, - -ws(   5B(B(B(B(($B(B(B()r   r~   r   Nr   )&r   r    r!   r"   r#   _operator_regex_str_version_regex_strrecompileVERBOSE
IGNORECASErz   r   r   r^   rF   r_   ry   r   r   r0   r   r7   rA   r   r   r   r   r   r   r   r   r   r  rS   rZ   r$   r`   ra   s   @r   rd   rd   a   s    \| ZZ%%(::WD


R]]"F 	lgk"[^{	J( (4  . " "    B B$* * 0 0* *= =:! !
 
(&/ &/P: :< << < 0 <= =# #*,@ ,@\; ; ;r   rd   z^([0-9]+)((?:a|b|c|rc)[0-9]+)$c                F    V ^8  d   QhR\         R\        \         ,          /# r   )r*   r   )r   s   "r   r   r   v  s      C DI r   c                6   . pV P                  R4      w  r#pTP                  T;'       g    R4       VP                  R4       FR  p\        P	                  V4      pV'       d"   VP                  VP                  4       4       KA  VP                  V4       KT  	  V# )a  Split version into components.

The split components are intended for version comparison. The logic does
not attempt to retain the original version string, so joining the
components back with :func:`_version_join` may not produce the original
version string.
!0.)
rpartitionr  split_prefix_regexr{   extendgroups)r   resultepochr   restrP   r   s   &      r   r   r   v  sy     F'',NEd
MM%,,3

3$$T*MM%,,.)MM$   Mr   c                F    V ^8  d   QhR\         \        ,          R\        /# )r   
componentsr   )r   r*   )r   s   "r   r   r     s     ' 'd3i 'C 'r   c                4    V vrV RRP                  V4       2# )zJoin split version components into a version string.

This function assumes the input came from :func:`_version_split`, where the
first component must be the epoch (either empty or numeric), and all other
components numeric.
r  r   )join)r*  r'  r(  s   &  r   r   r     s%     LEWAchhtn%&&r   c                0    V ^8  d   QhR\         R\        /# )r   segmentr   )r*   r>   )r   s   "r   r   r     s      C D r   c                    a  \         ;QJ d)    V 3R  lR 4       F  '       g   K   R'       * # 	  R'       * # ! V 3R  lR 4       4      '       * # )c              3   F   <"   T F  pSP                  V4      x  K  	  R # 5ir   )
startswith).0r   r.  s   & r   	<genexpr>!_is_not_suffix.<locals>.<genexpr>  s#      1Pv6""1Ps   !TF)devabrcpost)any)r.  s   fr   r   r     sM    s 1Pss  s  s 1P   r   c          	          V ^8  d   QhR\         \        ,          R\         \        ,          R\        \         \        ,          \         \        ,          3,          /# )r   leftrightr   )r   r*   r   )r   s   "r   r   r     s;      tCy c uT#YS	=Q7R r   c                 $   . . r2VP                  \        \        P                  ! R  V 4      4      4       VP                  \        \        P                  ! R V4      4      4       VP                  V \	        V^ ,          4      R 4       VP                  V\	        V^ ,          4      R 4       VP                  ^R.\        ^ \	        V^ ,          4      \	        V^ ,          4      ,
          4      ,          4       VP                  ^R.\        ^ \	        V^ ,          4      \	        V^ ,          4      ,
          4      ,          4       \        \        P                  P                  V4      4      \        \        P                  P                  V4      4      3# )c                 "    V P                  4       # r   isdigitxs   &r   <lambda>_pad_version.<locals>.<lambda>  s
    r   c                 "    V P                  4       # r   r@  rB  s   &r   rD  rE    s
    !))+r   Nr  )	r  r   r   r   r   insertmaxchainfrom_iterable)r<  r=  
left_splitright_splits   &&  r   r   r     s3    " d9../DdKLMtI//0EuMNO d3z!}-/01uSQ0234 a#QKN(;c*Q->P(P!QQRq3%#aZ]);c+a.>Q)Q"RRS 	Y__**:67Y__**;78 r   c                   B  a  ] tR tRt o RtRV 3R lR llt]V 3R lR l4       t]P                  V 3R lR	 l4       tV 3R
 lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltR V 3R lR lltR!V 3R lR lltRtV tR# )"SpecifierSeti  zThis class abstracts handling of a set of version specifiers.

It can be passed a single specifier (``>=3.0``), a comma-separated list of
specifiers (``>=3.0,!=3.1``), or no specifier at all.
Nc                :   < V ^8  d   QhRS[ RS[S[,          RR/# )r   
specifiersrF   r   NrQ   )r   r+   s   "r   r   SpecifierSet.__annotate__  s)     ( ((19$(	(r   c                    VP                  R4       Uu. uF*  q3P                  4       '       g   K  VP                  4       NK,  	  pp\        \        \        V4      4      V n        W n        R# u upi )a  Initialize a SpecifierSet instance.

:param specifiers:
    The string representation of a specifier or a comma-separated list of
    specifiers which will be parsed and normalized before use.
:param prereleases:
    This tells the SpecifierSet if it should accept prerelease versions if
    applicable or not. The default of ``None`` will autodetect it from the
    given specifiers.

:raises InvalidSpecifier:
    If the given ``specifiers`` are not parseable than this exception will be
    raised.
,N)r"  r}   	frozensetmaprd   _specsr   )r/   rP  rF   ssplit_specifierss   &&&  r   r   SpecifierSet.__init__  sX    ( 0:/?/?/DR/D!	IAGGI/DR  I/? @A ( Ss
   A,A,c                0   < V ^8  d   QhRS[ S[,          /# r(   rD   )r   r+   s   "r   r   rQ    s     7 7Xd^ 7r   c                    V P                   e   V P                   # V P                  '       g   R # \        ;QJ d&    R V P                   4       F  '       g   K   R# 	  R# ! R V P                   4       4      # )Nc              3   8   "   T F  qP                   x  K  	  R # 5ir   rF   r2  rW  s   & r   r3  +SpecifierSet.prereleases.<locals>.<genexpr>  s     6+Q==+   TF)r   rV  r:  r.   s   &r   rF   SpecifierSet.prereleases  s]     ($$$
 {{{ s6$++6ss6s6s6$++666r   c                $   < V ^8  d   QhRS[ RR/# rI   rK   )r   r+   s   "r   r   rQ    r   r   c                    Wn         R # r   r   rM   s   &&r   rF   ra    r   r   c                    < V ^8  d   QhRS[ /# r(   r)   )r   r+   s   "r   r   rQ    s     5 5# 5r   c                f    V P                   e   RV P                  : 2MRpR\        V 4      : V R2# )a  A representation of the specifier set that shows all internal state.

Note that the ordering of the individual specifiers within the set may not
match the input string.

>>> SpecifierSet('>=1.0.0,!=2.0.0')
<SpecifierSet('!=2.0.0,>=1.0.0')>
>>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False)
<SpecifierSet('!=2.0.0,>=1.0.0', prereleases=False)>
>>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True)
<SpecifierSet('!=2.0.0,>=1.0.0', prereleases=True)>
r   r   z<SpecifierSet(r   )r   rF   r*   r   s   & r   r   SpecifierSet.__repr__  sD       , T--01 	  D	}SE44r   c                    < V ^8  d   QhRS[ /# r(   r)   )r   r+   s   "r   r   rQ     s     = = =r   c                X    RP                  \        R V P                   4       4      4      # )a6  A string representation of the specifier set that can be round-tripped.

Note that the ordering of the individual specifiers within the set may not
match the input string.

>>> str(SpecifierSet(">=1.0.0,!=1.0.1"))
'!=1.0.1,>=1.0.0'
>>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False))
'!=1.0.1,>=1.0.0'
rS  c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r)   r^  s   & r   r3  'SpecifierSet.__str__.<locals>.<genexpr>  s     ;{!s1vv{r`  )r,  sortedrV  r.   s   &r   r0   SpecifierSet.__str__   s"     xx;t{{;;<<r   c                    < V ^8  d   QhRS[ /# r(   r4   )r   r+   s   "r   r   rQ    s     ! !# !r   c                ,    \        V P                  4      # r   )r   rV  r.   s   &r   r7   SpecifierSet.__hash__  s    DKK  r   c                8   < V ^8  d   QhRS[ RS[3,          RR/# )r   r;   rN  r   )r	   r*   )r   r+   s   "r   r   rQ    s%      U>3#67 N r   c                   \        V\        4      '       d   \        V4      pM\        V\        4      '       g   \        # \        4       p\	        V P
                  VP
                  ,          4      Vn        V P                  f"   VP                  e   VP                  Vn        V# V P                  e"   VP                  f   V P                  Vn        V# V P                  VP                  8X  d   V P                  Vn        V# \        R4      h)aR  Return a SpecifierSet which is a combination of the two sets.

:param other: The other object to combine with.

>>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1'
<SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
>>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1')
<SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
zFCannot combine SpecifierSets with True and False prerelease overrides.)r   r*   rN  r   rT  rV  r   
ValueError)r/   r;   	specifiers   && r   __and__SpecifierSet.__and__  s     eS!! 'EE<00!! N	$T[[5<<%?@	$););)G%*%7%7I"  *u/A/A/I%)%6%6I"  %"4"44%)%6%6I"   r   c                &   < V ^8  d   QhRS[ RS[/# r:   r<   )r   r+   s   "r   r   rQ  0  s     + +F +t +r   c                    \        V\        \        34      '       d   \        \        V4      4      pM\        V\        4      '       g   \        # V P
                  VP
                  8H  # )a1  Whether or not the two SpecifierSet-like objects are equal.

:param other: The other object to check against.

The value of :attr:`prereleases` is ignored.

>>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1")
True
>>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) ==
...  SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True))
True
>>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1"
True
>>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0")
False
>>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2")
False
)r   r*   rd   rN  r   rV  r@   s   &&r   rA   SpecifierSet.__eq__0  sJ    & ec9-.. U,EE<00!!{{ell**r   c                    < V ^8  d   QhRS[ /# r(   r4   )r   r+   s   "r   r   rQ  J  s          r   c                ,    \        V P                  4      # )z7Returns the number of specifiers in this specifier set.)r   rV  r.   s   &r   __len__SpecifierSet.__len__J  s    4;;r   c                0   < V ^8  d   QhRS[ S[,          /# r(   )r   rd   )r   r+   s   "r   r   rQ  N  s     ! !(9- !r   c                ,    \        V P                  4      # )z
Returns an iterator over all the underlying :class:`Specifier` instances
in this specifier set.

>>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str)
[<Specifier('!=1.0.1')>, <Specifier('>=1.0.0')>]
)iterrV  r.   s   &r   __iter__SpecifierSet.__iter__N  s     DKK  r   c                &   < V ^8  d   QhRS[ RS[/# r  )r   r>   )r   r+   s   "r   r   rQ  X  s     # # #T #r   c                $    V P                  V4      # )a  Return whether or not the item is contained in this specifier.

:param item: The item to check for.

This is used for the ``in`` operator and behaves the same as
:meth:`contains` with no ``prereleases`` argument passed.

>>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1")
True
>>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1")
True
>>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1")
False
>>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1")
False
>>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)
True
r  r  s   &&r   r  SpecifierSet.__contains__X  r  r   c                R   < V ^8  d   QhRS[ RS[S[,          RS[S[,          RS[/# )r   rP   rF   	installedr   r	  )r   r+   s   "r   r   rQ  m  sA     7S 7S7S d^7S D>	7S
 
7Sr   c                  aa \        S\        4      '       g   \        S4      oSf   V P                  oS'       g   SP                  '       d   R# V'       d(   SP                  '       d   \        SP                  4      o\
        ;QJ d*    VV3R lV P                   4       F  '       d   K   R# 	  R# ! VV3R lV P                   4       4      # )a  Return whether or not the item is contained in this SpecifierSet.

:param item:
    The item to check for, which can be a version string or a
    :class:`Version` instance.
:param prereleases:
    Whether or not to match prereleases with this SpecifierSet. If set to
    ``None`` (the default), it uses :attr:`prereleases` to determine
    whether or not prereleases are allowed.

>>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3")
True
>>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3"))
True
>>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1")
False
>>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1")
False
>>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1")
True
>>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True)
True
Fc              3   H   <"   T F  qP                  SSR 7      x  K  	  R# 5i)r]  Nr  )r2  rW  rP   rF   s   & r   r3  (SpecifierSet.contains.<locals>.<genexpr>  s     Rk::d:<<ks   "T)r   r   rF   r   r   allrV  )r/   rP   rF   r  s   &ff&r   rS   SpecifierSet.containsm  s    < $((4=D
 **K t111+++4,,-D sRdkkRssRsRsRdkkRRRr   c                \   < V ^8  d   QhRS[ S[,          RS[S[,          RS[S[,          /# rV   rX   )r   r+   s   "r   r   rQ    s:     M" M" !34M"CKD>M"	$	%M"r   c                   Vf   V P                   pV P                  '       d;   V P                   F  pVP                  V\        V4      R7      pK!  	  \	        V4      # . p. pV FV  p\        V4      pVP                  '       d&   V'       g   V'       g   VP                  V4       KC  KE  VP                  V4       KX  	  V'       g   V'       d   Vf   \	        V4      # \	        V4      # )a.  Filter items in the given iterable, that match the specifiers in this set.

:param iterable:
    An iterable that can contain version strings and :class:`Version` instances.
    The items in the iterable will be filtered according to the specifier.
:param prereleases:
    Whether or not to allow prereleases in the returned iterator. If set to
    ``None`` (the default), it will be intelligently decide whether to allow
    prereleases or not (based on the :attr:`prereleases` attribute, and
    whether the only versions matching are prereleases).

This method is smarter than just ``filter(SpecifierSet(...).contains, [...])``
because it implements the rule from :pep:`440` that a prerelease item
SHOULD be accepted if no other versions match the given specifier.

>>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
['1.3']
>>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")]))
['1.3', <Version('1.4')>]
>>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"]))
[]
>>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
['1.3', '1.5a1']
>>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
['1.3', '1.5a1']

An "empty" SpecifierSet will filter items based on the presence of prerelease
versions in the set.

>>> list(SpecifierSet("").filter(["1.3", "1.5a1"]))
['1.3']
>>> list(SpecifierSet("").filter(["1.5a1"]))
['1.5a1']
>>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"]))
['1.3', '1.5a1']
>>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True))
['1.3', '1.5a1']
r]  )rF   rV  rZ   r>   r  r   r   r  )r/   rW   rF   ru   filteredr  rP   r  s   &&&     r   rZ   SpecifierSet.filter  s    X **K
 ;;;;;xT+=N;O $>!
 24H:< !0!6 "///#)006 $ OOD) !  1k6I-..>!r   )r   rV  r  )NNr   )r   r    r!   r"   r#   r   r^   rF   r_   r   r0   r7   rt  rA   r{  r  r  rS   rZ   r$   r`   ra   s   @r   rN  rN    s     ( (: 7 7  " "5 5*= =! ! @+ +4   ! !# #*7S 7SrM" M" M"r   rN  )#r#   r\   r   r  typingr   r   r   r   r   r   r   r	   utilsr
   r   r   r*   r   r   r>   r   r   rr  r   ABCMetar&   rd   r  r#  r   r   r   r   rN  r   r   r   <module>r     s      	 V V V ' %1I WcND01 	z 	4ckk 4nO Od 

<=,'*A"= A"r   