
    uvi]                    h   S r SSKJr  SSKrSSKrSSKrSSKJrJrJ	r	J
r
JrJr  SSKJr  SSKJrJr  \\\4   r\" S\S	9r\\\/\4   rSS
 jrSS jrSS jr " S S\5      r " S S\R8                  S9r " S S\5      r\R>                  " S5      r SS jr!SS jr"SS jr#S S jr$ " S S\5      r%g)!z
.. testsetup::

    from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier
    from packaging.version import Version
    )annotationsN)CallableFinalIterableIteratorTypeVarUnion   )canonicalize_version)InvalidVersionVersionUnparsedVersionVar)boundc                l    [        U [        5      (       d   [        U 5      n U $ U $ ! [         a     g f = fN)
isinstancer   r   versions    B/root/pdf_env/lib/python3.13/site-packages/packaging/specifiers.py_coerce_versionr      s=    gw''	g&G N7N  		s   & 
33c                     U R                  S S9$ )N)local__replace__r   s    r   _public_versionr   #   s    T**    c                &    U R                  S S S S S9$ )N)prepostdevr   r   r   s    r   _base_versionr!   '   s    4dDIIr   c                      \ rS rSrSrSrg)InvalidSpecifier+   z
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                  f   \ rS rSrSrSr\SS j5       r\R                  SS j5       r
\R                  SS j5       r\R                  SS j5       r\\R                  SS j5       5       r\R                  SS	 j5       r\R                  SSS jj5       r\R                   S     SS jj5       rSrg
)BaseSpecifier7   r%   )_strc                    [        U 5      $ )z Internal property for match_argsstrselfs    r   r/   BaseSpecifier._str;   s     4yr   c                    g)zv
Returns the str representation of this Specifier-like object. This
should be representative of the Specifier itself.
Nr%   r3   s    r   __str__BaseSpecifier.__str__@       r   c                    g)z6
Returns a hash value for this Specifier-like object.
Nr%   r3   s    r   __hash__BaseSpecifier.__hash__G   r9   r   c                    g)z
Returns a boolean representing whether or not the two Specifier-like
objects are equal.

:param other: The other object to check against.
Nr%   r4   others     r   __eq__BaseSpecifier.__eq__M   r9   r   c                    g)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%   r3   s    r   prereleasesBaseSpecifier.prereleasesV   r9   r   c                    g)zASetter for :attr:`prereleases`.

:param value: The value to set.
Nr%   r4   values     r   rC   rD   _   r9   r   Nc                    g)zB
Determines if the given item is contained within this specifier.
Nr%   r4   itemrC   s      r   containsBaseSpecifier.containsf   r9   r   c                    g)z}
Takes an iterable of items and filters them so that only items which
are contained within this specifier are allowed in it.
Nr%   )r4   iterablerC   s      r   filterBaseSpecifier.filterl   r9   r   returnr2   rR   intr?   objectrR   boolrR   bool | None)rG   rW   rR   Noner   )rJ   r2   rC   rY   rR   rW   rN   zIterable[UnparsedVersionVar]rC   rY   rR   zIterator[UnparsedVersionVar])r&   r'   r(   r)   	__slots____match_args__propertyr/   abcabstractmethodr7   r;   r@   rC   setterrK   rO   r+   r%   r   r   r-   r-   7   s    IN  	  	 
 	       	 
 	QU4CN	% r   r-   )	metaclassc            	         \ rS rSr% SrSrSrSr\R                  " S\-   \-   S-   \R                  \R                  -  5      rSSS	S
SSSSS.rS\S'   S+S,S jjrS-S jrS.S jr\S/S j5       r\R(                  S0S j5       r\S1S j5       r\S1S j5       rS1S jrS1S jr\S2S j5       rS3S jrS4S jrS5S jrS6S  jrS6S! jrS6S" jrS6S# jr S6S$ jr!S7S% jr"S7S& jr#S8S' jr$S9S( jr%S:S;S) jjr& S:     S<S* jjr'Sr(g)=	Specifierv   a+  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).
)_prereleases_spec_spec_versionz8
        (?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*
compatibleequal	not_equalless_than_equalgreater_than_equal	less_thangreater_than	arbitrary)~===!=z<=>=<>===r   
_operatorsNc                   U R                   R                  U5      nU(       d  [        SU< 35      eUR                  S5      R	                  5       UR                  S5      R	                  5       4U l        X l        SU l        g)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	fullmatchr#   groupstriprg   rf   rh   )r4   specrC   matchs       r   __init__Specifier.__init__   su     %%d+"%8#ABB KK
#))+KK	"((*'

 ( :>r   c                    U R                   b"  U R                   S   U:X  a  U R                   S   $ [        U5      nUc  gX4U l         U$ )zDOne element cache, as only one spec Version is needed per Specifier.Nr   r
   )rh   r   )r4   r   version_specifiers      r   _get_spec_versionSpecifier._get_spec_version  sV    )d.@.@.Cw.N%%a((+G4$%9  r   c                2    U R                  U5      nUc   eU$ )zGet spec version, asserting it's valid (not for === operator).

This method should only be called for operators where version
strings are guaranteed to be valid PEP 440 versions (not ===).
)r   )r4   r   spec_versions      r   _require_spec_versionSpecifier._require_spec_version  s&     --g6'''r   c                    U R                   b  U R                   $ U R                  u  pUS:w  aD  US:X  a  UR                  S5      (       a  gU R                  U5      nUc  g UR                  (       a  gg)Nrs   rr   .*FT)rf   rg   endswithr   is_prerelease)r4   rz   version_strr   s       r   rC   Specifier.prereleases%  sz     ($$$ !%

t 4K$8$8$>$> ,,[9G $$r   c                    Xl         g r   rf   rF   s     r   rC   r   B      !r   c                     U R                   S   $ )zHThe operator of this specifier.

>>> Specifier("==1.2.3").operator
'=='
r   rg   r3   s    r   rz   Specifier.operatorF       zz!}r   c                     U R                   S   $ )zIThe version of this specifier.

>>> Specifier("==1.2.3").version
'1.2.3'
r
   r   r3   s    r   r   Specifier.versionO  r   r   c                    U R                   b  SU R                  < 3OSnSU R                  R                   S[	        U 5      < U S3$ )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= ru   ()>)rf   rC   	__class__r&   r2   r4   r   s     r   __repr__Specifier.__repr__X  sU       , T--01 	 4>>**+1SYM#bAAr   c                4    SR                   " U R                  6 $ )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{}{})formatrg   r3   s    r   r7   Specifier.__str__j  s     }}djj))r   c                    U R                   u  pUS:X  d  UR                  S5      (       a  X4$ U R                  U5      n[        X1S:g  S9nX4$ )Nrw   r   rq   strip_trailing_zero)rg   r   r   r   )r4   rz   r   r   canonical_versions        r   _canonical_specSpecifier._canonical_spect  s]     JJu 0 0 6 6$$11':04/?
 **r   c                ,    [        U R                  5      $ r   )hashr   r3   s    r   r;   Specifier.__hash__  s    D(())r   c                   [        U[        5      (       a   U R                  [        U5      5      nO [        XR                  5      (       d  [        $ U R
                  UR
                  :H  $ ! [         a	    [        s $ f = f)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   r2   r   r#   NotImplementedr   r>   s     r   r@   Specifier.__eq__  sm    & eS!!&s5z2 E>>22!!##u'<'<<< $ &%%&s   A+ +A>=A>c                >    [        U SU R                  U    35      nU$ )N	_compare_)getattrrx   )r4   opoperator_callables      r   _get_operatorSpecifier._get_operator  s+    .5Idoob123/
 ! r   c           
         [        [        [        R                  " [        [        U5      5      5      S S 5      nUS-  nU R                  S5      " X5      =(       a    U R                  S5      " X5      $ )Nr   rt   rr   )_version_joinlist	itertools	takewhile_is_not_suffix_version_splitr   )r4   prospectiver   prefixs       r   _compare_compatibleSpecifier._compare_compatible  sn     $$^^D5IJKCRP

 	$!!$': 
t?Q?QRV?W@
 	
r   c                :   UR                  S5      (       aU  [        [        U5      SS9n[        US S SS9n[        U5      n[        U5      n[	        Xe5      u  pxUS [        U5       n	X:H  $ U R                  U5      n
U
R                  (       d  [        U5      nX:H  $ )Nr   Fr   )r   r   r   r   _pad_versionlenr   r   )r4   r   r   normalized_prospectivenormalized_spec
split_specsplit_prospectivepadded_prospective_shortened_prospectiver   s              r   _compare_equalSpecifier._compare_equal  s    ==%9,%&" 349RWXO (8J
 !//E F %11B$O!
 %77HZ$I!(66  55d;L
  %%-k:..r   c                .    U R                  X5      (       + $ r   )r   r4   r   r   s      r   _compare_not_equalSpecifier._compare_not_equal  s    &&{999r   c                <    [        U5      U R                  U5      :*  $ r   r   r   r   s      r   _compare_less_than_equal"Specifier._compare_less_than_equal       {+t/I/I$/OOOr   c                <    [        U5      U R                  U5      :  $ r   r   r   s      r   _compare_greater_than_equal%Specifier._compare_greater_than_equal  r   r   c                    U R                  U5      nX:  d  gUR                  (       d*  UR                  (       a  [        U5      [        U5      :X  a  ggNFT)r   r   r!   r4   r   spec_strr   s       r   _compare_less_thanSpecifier._compare_less_than  sM     ))(3
 ! ""))k*mD.AA
 r   c                    U R                  U5      nX:  d  gUR                  (       d*  UR                  (       a  [        U5      [        U5      :X  a  gUR                  b  [        U5      [        U5      :X  a  ggr   )r   is_postreleaser!   r   r   s       r   _compare_greater_thanSpecifier._compare_greater_than  sw     ))(3
 ! ##**k*mD.AA (].
4 .! 
 r   c                h    [        U5      R                  5       [        U5      R                  5       :H  $ r   )r2   lowerr   s      r   _compare_arbitrarySpecifier._compare_arbitrary0  s&    ;%%'3t9??+<<<r   c                $    U R                  U5      $ )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")
True
>>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True)
True
rK   r4   rJ   s     r   __contains__Specifier.__contains__3      & }}T""r   c           	     H    [        [        U R                  U/US95      5      $ )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 will follow the recommendation from
    :pep:`440` and match prereleases, as there are no other versions.

>>> 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")
True
>>> Specifier(">=1.2.3", prereleases=False).contains("1.3.0a1")
False
>>> Specifier(">=1.2.3").contains("1.3.0a1")
True
rC   )rW   r   rO   rI   s      r   rK   Specifier.containsH  s#    2 DdVEFGGr   c              #    #    / nSnUb  UOU R                   nU R                  U R                  5      nU H  n[        U5      nUc:  U R                  S:X  a(  U R	                  XpR
                  5      (       a  Uv   MG  MI  MK  U" XR
                  5      (       d  Md  UR                  (       a  U(       a  SnUv   M  Ub  M  U R                  SLd  M  UR                  U5        M     U(       d  Uc  U R                  SLa  U Sh  vN   gggg N7f)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 follow the recommendation from :pep:`440`
    and match prereleases if there are no other versions.

>>> 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']
FNrw   T)	rC   r   rz   r   r   r   r   rf   append)	r4   rN   rC   prereleases_versionsfound_non_prereleasesinclude_prereleasesr   r   parsed_versions	            r   rO   Specifier.filterc  s    0  " % '2K8H8H 	
 !..t}}=  G,W5N%==E)d.E.E\\/ / "M/) #><<@@%337J,0)!M (T->->e-K(//8  ( &#!!.+++ / $ & ,s$   BD!D>D3DD	Dr   N)r   r2   rC   rY   rR   rZ   )r   r2   rR   Version | None)r   r2   rR   r   rX   rG   rY   rR   rZ   rQ   )rR   ztuple[str, str]rS   rU   )r   r2   rR   CallableOperator)r   r   r   r2   rR   rW   )r   r   r   r2   rR   rW   )r   zVersion | strr   r2   rR   rW   )rJ   zstr | VersionrR   rW   r   )rJ   UnparsedVersionrC   rY   rR   rW   r[   ))r&   r'   r(   r)   r*   r\   _operator_regex_str_version_regex_strrecompileVERBOSE
IGNORECASEr{   rx   __annotations__r   r   r   r^   rC   ra   rz   r   r   r7   r   r;   r@   r   r   r   r   r   r   r   r   r   r   rK   rO   r+   r%   r   r   rd   rd   v   so    ;I\| ZZ$$'99FB


R]]"F "	J 	>8
!  8 " "    B$* + +*=:!
(&/P:PP6 D=#*H8 RV<,4<,CN<,	%<, <,r   rd   z([0-9]+)((?:a|b|c|rc)[0-9]+)c                2   / nU R                  S5      u  p#nUR                  U=(       d    S5        UR                  S5       HQ  n[        R	                  U5      nU(       a!  UR                  UR                  5       5        M@  UR                  U5        MS     U$ )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   restrJ   r   s          r   r   r     sw     F'',NEd
MM%,3

3''-MM%,,.)MM$   Mr   c                4    U tpU SSR                  U5       3$ )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)
componentsr  r  s      r   r   r     s%     LEWAchhtn%&&r   c                8   ^  [        U 4S jS 5       5      (       + $ )Nc              3  F   >#    U  H  nTR                  U5      v   M     g 7fr   )
startswith).0r   segments     r   	<genexpr>!_is_not_suffix.<locals>.<genexpr>  s#      1Pv6""1Ps   !)r    abrcr   )any)r  s   `r   r   r     s"     1P   r   c                   / / p2UR                  [        [        R                  " S U 5      5      5        UR                  [        [        R                  " S U5      5      5        UR                  U [	        US   5      S  5        UR                  U[	        US   5      S  5        UR                  SS/[        S[	        US   5      [	        US   5      -
  5      -  5        UR                  SS/[        S[	        US   5      [	        US   5      -
  5      -  5        [        [        R                  R                  U5      5      [        [        R                  R                  U5      5      4$ )Nc                "    U R                  5       $ r   isdigitxs    r   <lambda>_pad_version.<locals>.<lambda>  s
    r   c                "    U R                  5       $ r   r$  r&  s    r   r(  r)    s
    !))+r   r   r
   r
  )	r   r   r   r   r   insertmaxchainfrom_iterable)leftright
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                      \ rS rSrSrSr  S     SS jjr\SS j5       r\R                  SS j5       rSS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jr  S       SS jjr S     SS jjrSrg) 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.
)rf   _specsNc                ,   [        U[        5      (       ad  UR                  S5       Vs/ s H)  o3R                  5       (       d  M  UR                  5       PM+     nn[	        [        [        U5      5      U l        O[	        U5      U l        X l        gs  snf )aL  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.
    May also be an iterable of ``Specifier`` instances, which will be used
    as is.
: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   r2   r  r~   	frozensetmaprd   r5  rf   )r4   
specifiersrC   ssplit_specifierss        r   r   SpecifierSet.__init__  su    , j#&& 4>3C3CC3HV3HaGGI		3HV $C	3C$DEDK $J/DK (  Ws   BBc                    U R                   b  U R                   $ U R                  (       d  g [        S U R                   5       5      (       a  gg )Nc              3  8   #    U  H  oR                   v   M     g 7fr   r   r  r;  s     r   r  +SpecifierSet.prereleases.<locals>.<genexpr>  s     2k}}k   T)rf   r5  r!  r3   s    r   rC   SpecifierSet.prereleases  sE     ($$$
 {{ 2dkk222r   c                    Xl         g r   r   rF   s     r   rC   rC  $  r   r   c                d    U R                   b  SU R                  < 3OSnS[        U 5      < U S3$ )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   )rf   rC   r2   r   s     r   r   SpecifierSet.__repr__(  sD       , T--01 	  D	}SE44r   c                X    SR                  [        S U R                   5       5      5      $ )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'
r7  c              3  8   #    U  H  n[        U5      v   M     g 7fr   r1   r@  s     r   r  'SpecifierSet.__str__.<locals>.<genexpr>H  s     ;{!s1vv{rB  )r  sortedr5  r3   s    r   r7   SpecifierSet.__str__=  s"     xx;t{{;;<<r   c                ,    [        U R                  5      $ r   )r   r5  r3   s    r   r;   SpecifierSet.__hash__J  s    DKK  r   c                   [        U[        5      (       a  [        U5      nO[        U[        5      (       d  [        $ [        5       n[	        U R
                  UR
                  -  5      Ul        U R                  c   UR                  b  UR                  Ul        U$ U R                  b  UR                  b  U R                  UR                  :X  a  U R                  Ul        U$ [        S5      e)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   r2   r4  r   r8  r5  rf   
ValueError)r4   r?   	specifiers      r   __and__SpecifierSet.__and__M  s     eS!! 'EE<00!! N	$T[[5<<%?@	$););)G%*%7%7I"  )e.@.@.H%"4"44%)%6%6I" 	 X r   c                    [        U[        [        45      (       a  [        [        U5      5      nO[        U[        5      (       d  [        $ U R
                  UR
                  :H  $ )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   r2   rd   r4  r   r5  r>   s     r   r@   SpecifierSet.__eq__l  sJ    & ec9-.. U,EE<00!!{{ell**r   c                ,    [        U R                  5      $ )z7Returns the number of specifiers in this specifier set.)r   r5  r3   s    r   __len__SpecifierSet.__len__  s    4;;r   c                ,    [        U R                  5      $ )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')>]
)iterr5  r3   s    r   __iter__SpecifierSet.__iter__  s     DKK  r   c                $    U R                  U5      $ )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")
True
>>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)
True
r   r   s     r   r   SpecifierSet.__contains__  r   r   c           	         [        U5      nUb  U(       a  UR                  (       a  SnUc  UOUn[        [        U R	                  U/US95      5      $ )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 will follow the recommendation from :pep:`440`
    and match prereleases, as there are no other versions.
:param installed:
    Whether or not the item is installed. If set to ``True``, it will
    accept prerelease versions even if the specifier does not allow them.

>>> 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")
True
>>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False).contains("1.3.0a1")
False
>>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True)
True
Tr   )r   r   rW   r   rO   )r4   rJ   rC   	installedr   
check_items         r   rK   SpecifierSet.contains  sN    @ "$'91F1FK$_T'
Dj\{KLMMr   c                ,  ^	 Uc  U R                   b  U R                   nU R                  (       a6  U R                   H  nUR                  Xc  SOUS9nM     Ub  [        U5      $ O!USL a  [        U5      $ USL a  U	4S jU 5       $ / n/ nSnU Hl  n[	        U5      nUc$  UR                  U5        UR                  U5        M5  UR                  (       a  UR                  U5        MY  UR                  U5        SnMn     [        U(       a  U5      $ U5      $ )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 follow the recommendation from :pep:`440`
    and match prereleases if there are no other versions.

>>> 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"]))
['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']
Tr   Fc              3  j   >#    U  H(  n[        U5      =mb  TR                  (       a  M$  Uv   M*     g 7fr   )r   r   )r  rJ   r   s     r   r  &SpecifierSet.filter.<locals>.<genexpr>  s3       (#24#88A"00 D (s   #3	3)rC   r5  rO   rY  r   r   r   )
r4   rN   rC   r   filtered_itemsfound_prereleasesfound_final_releaserJ   r   r   s
            @r   rO   SpecifierSet.filter  s.   N 4#3#3#?**K
 ;; ;;2E$; '  $
 & H~% ' d"H~%e# (  4668#D,T2N %%%d+!((.--!((.%%d+&*#  &9NQQ?PQQr   r   )r:  zstr | Iterable[Specifier]rC   rY   rR   rZ   rX   r   rQ   rS   )r?   zSpecifierSet | strrR   r4  rU   )rR   zIterator[Specifier])rJ   r   rR   rW   )NN)rJ   r   rC   rY   r_  rY   rR   rW   r   r[   )r&   r'   r(   r)   r*   r\   r   r^   rC   ra   r   r7   r;   rQ  r@   rV  rZ  r   rK   rO   r+   r%   r   r   r4  r4    s     +I 13#'$(-$( !$( 
	$(L  & " "5*=!>+4 !#0 $(!%	&N&N !&N 	&N
 
&NR RV[R4[RCN[R	%[R [Rr   r4  )r   r   rR   r   )r   r   rR   r   )r   r2   rR   	list[str])r  ri  rR   r2   )r  r2   rR   rW   )r/  ri  r0  ri  rR   ztuple[list[str], list[str]])&r*   
__future__r   r_   r   r  typingr   r   r   r   r   r	   utilsr   r   r   r   r2   r   r   rW   r   r   r   r!   rO  r#   ABCMetar-   rd   r  r  r   r   r   r   r4  r%   r   r   <module>rn     s    # 
  	 F F ' ,%1I WcND01 +J	z 	<ckk <~i, i,X 

:;,'*KR= KRr   