+
    êh¯o  ã                   óä  € R t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHtH	t	 ^ RI
HtHtHtHtHtHtHtHtHtHtHtHt ^ RIHtHtHt ^ RIHt . RNR	NR
NRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0NR1NR2NR3NR4NR5Nt]! 4       t ] ! R6R77       ]! ] R6R77      t!]#! ]R8R9 4      t$R: t%RsR; lt&R< t'RtR= lt(RtR> lt)RtR? lt*]+3R@ lt,RA t-]-t.RB t/RC t0RD t1RtRE lt2RF t3 ^ RGI
H4t5 RH t4]3P                   ]4n          ! RI RJ]74      t8RK t9RL t:RuRM lt;RN t<RO t=RP t>RtRQ lt?RtRR lt@RvRT ltARtRU ltBRwRV ltCRW^/RX ltDRtRY ltERZ tFR[ tGR\ tHR] tIR^ tJR_ tKR` tLRa tMRb tNRc tORxRd ltPRe tQRfRS/Rg ltR]Rh8¼  d   ^ RiI
HStT RfRS/Rj ltSM]RtS]RP                   ]Sn         Rk tURl tVRm tWRn tXRo tYRp tZRq t[Rr t\R#   ]" d    ] t! ELi ; i  ]6 d    ]3t4 LÎi ; i)ya  Imported from the recipes section of the itertools documentation.

All functions taken from the recipes section of the itertools library docs
[1]_.
Some backward-compatible usability improvements have been made.

.. [1] http://docs.python.org/library/itertools.html#recipes

N)Údeque)ÚSized)ÚpartialÚreduce)ÚchainÚcombinationsÚcompressÚcountÚcycleÚgroupbyÚisliceÚproductÚrepeatÚstarmapÚteeÚzip_longest)Ú	randrangeÚsampleÚchoice)Ú
hexversionÚ	all_equalÚbatchedÚbefore_and_afterÚconsumeÚconvolveÚ
dotproductÚ
first_trueÚfactorÚflattenÚgrouperÚiter_exceptÚ
iter_indexÚmatmulÚncyclesÚnthÚnth_combinationÚpadnoneÚpad_noneÚpairwiseÚ	partitionÚpolynomial_evalÚpolynomial_from_rootsÚpolynomial_derivativeÚpowersetÚprependÚquantifyÚreshapeÚ#random_combination_with_replacementÚrandom_combinationÚrandom_permutationÚrandom_productÚ
repeatfuncÚ
roundrobinÚsieveÚsliding_windowÚ	subslicesÚsum_of_squaresÚtabulateÚtailÚtakeÚtotientÚ	transposeÚ
triplewiseÚuniqueÚunique_everseenÚunique_justseenT©ÚstrictÚsumprodc                 ó   € \        W4      # ©N)r   )ÚxÚys   &&ÚK/usr/lib/python3/dist-packages/setuptools/_vendor/more_itertools/recipes.pyÚ<lambda>rL   _   s	   € ´¸AÔ1Aó    c                ó*   € \        \        W4      4      # )zÕReturn first *n* items of the iterable as a list.

    >>> take(3, range(10))
    [0, 1, 2]

If there are fewer than *n* items in the iterable, all of them are
returned.

    >>> take(10, range(3))
    [0, 1, 2]

)Úlistr   ©ÚnÚiterables   &&rK   r=   r=   b   s   € ô ”�xÓ#Ó$Ð$rM   c                ó,   € \        V \        V4      4      # )a…  Return an iterator over the results of ``func(start)``,
``func(start + 1)``, ``func(start + 2)``...

*func* should be a function that accepts one integer argument.

If *start* is not specified it defaults to 0. It will be incremented each
time the iterator is advanced.

    >>> square = lambda x: x ** 2
    >>> iterator = tabulate(square, -3)
    >>> take(4, iterator)
    [9, 4, 1, 0]

)Úmapr	   )ÚfunctionÚstarts   &&rK   r;   r;   r   s   € ô ˆxœ˜u›Ó&Ð&rM   c           	   #  óÞ   "  € \        V\        4      '       d2   \        V\        ^ \	        V4      V ,
          4      R4       Rj  x€L
  R# \        \        WR7      4       Rj  x€L
  R#  L% L5i)zsReturn an iterator over the last *n* items of *iterable*.

>>> t = tail(3, 'ABCDEFG')
>>> list(t)
['E', 'F', 'G']

N©Úmaxlen)Ú
isinstancer   r   ÚmaxÚlenÚiterr   rP   s   &&rK   r<   r<   „   sR   é € ô �(œE×"Ò"Ü˜(¤C¨¬3¨x«=¸1Õ+<Ó$=¸tÓD×DÒDäœ˜hÔ1Ó2×2Ò2ñ 	Eá2ùs$   ‚AA-ÁA)ÁA-Á"A+Á#A-Á+A-c                óX   € Vf   \        V ^ R7       R# \        \        WV4      R4       R# )aø  Advance *iterable* by *n* steps. If *n* is ``None``, consume it
entirely.

Efficiently exhausts an iterator without returning values. Defaults to
consuming the whole iterator, but an optional second argument may be
provided to limit consumption.

    >>> i = (x for x in range(10))
    >>> next(i)
    0
    >>> consume(i, 3)
    >>> next(i)
    4
    >>> consume(i)
    >>> next(i)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

If the iterator has fewer items remaining than the provided limit, the
whole iterator will be consumed.

    >>> i = (x for x in range(3))
    >>> consume(i, 5)
    >>> next(i)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

NrX   )r   Únextr   )ÚiteratorrQ   s   &&rK   r   r   –   s'   € ð@ 	‚yäˆh˜q×!ô 	ŒV�H Ó# TÖ*rM   c                ó.   € \        \        WR4      V4      # )zmReturns the nth item or a default value.

>>> l = range(10)
>>> nth(l, 3)
3
>>> nth(l, 20, "zebra")
'zebra'

N)r_   r   )rR   rQ   Údefaults   &&&rK   r$   r$   ¾   s   € ô ”�x DÓ)¨7Ó3Ð3rM   c           
     óV   € \        \        \        \        W4      ^4      4      4      ^8*  # )aw  
Returns ``True`` if all the elements are equal to each other.

    >>> all_equal('aaaa')
    True
    >>> all_equal('aaab')
    False

A function that accepts a single argument and returns a transformed version
of each input item can be specified with *key*:

    >>> all_equal('AaaA', key=str.casefold)
    True
    >>> all_equal([1, 2, 3], key=lambda x: x < 10)
    True

)r\   rO   r   r   ©rR   Úkeys   &&rK   r   r   Ë   s%   € ô$ Œt”Fœ7 8Ó1°1Ó5Ó6Ó7¸1Ñ<Ð<rM   c                ó*   € \        \        W4      4      # )zWReturn the how many times the predicate is true.

>>> quantify([True, False, True])
2

)ÚsumrT   )rR   Úpreds   &&rK   r/   r/   à   s   € ô Œs�4Ó"Ó#Ð#rM   c                ó,   € \        V \        R4      4      # )zìReturns the sequence of elements and then returns ``None`` indefinitely.

    >>> take(5, pad_none(range(3)))
    [0, 1, 2, None, None]

Useful for emulating the behavior of the built-in :func:`map` function.

See also :func:`padded`.

N)r   r   ©rR   s   &rK   r'   r'   ê   s   € ô �œ6 $›<Ó(Ð(rM   c                óT   € \         P                  ! \        \        V 4      V4      4      # )zjReturns the sequence elements *n* times

>>> list(ncycles(["a", "b"], 3))
['a', 'b', 'a', 'b', 'a', 'b']

)r   Úfrom_iterabler   Útuple)rR   rQ   s   &&rK   r#   r#   û   s    € ô ×Òœv¤e¨H£o°qÓ9Ó:Ð:rM   c                óH   € \        \        \        P                  W4      4      # )zWReturns the dot product of the two iterables.

>>> dotproduct([10, 10], [20, 20])
400

)rg   rT   ÚoperatorÚmul)Úvec1Úvec2s   &&rK   r   r     s   € ô Œs”8—<‘< Ó,Ó-Ð-rM   c                ó.   € \         P                  ! V 4      # )zÌReturn an iterator flattening one level of nesting in a list of lists.

    >>> list(flatten([[0, 1], [2, 3]]))
    [0, 1, 2, 3]

See also :func:`collapse`, which can flatten multiple levels of nesting.

)r   rl   )ÚlistOfListss   &rK   r   r     s   € ô ×Ò˜{Ó+Ð+rM   c                ó^   € Vf   \        V \        V4      4      # \        V \        W!4      4      # )a  Call *func* with *args* repeatedly, returning an iterable over the
results.

If *times* is specified, the iterable will terminate after that many
repetitions:

    >>> from operator import add
    >>> times = 4
    >>> args = 3, 5
    >>> list(repeatfunc(add, times, *args))
    [8, 8, 8, 8]

If *times* is ``None`` the iterable will not terminate:

    >>> from random import randrange
    >>> times = None
    >>> args = 1, 11
    >>> take(6, repeatfunc(randrange, times, *args))  # doctest:+SKIP
    [2, 4, 8, 1, 8, 4]

)r   r   )ÚfuncÚtimesÚargss   &&*rK   r5   r5     s,   € ð, ‚}Ü�tœV D›\Ó*Ð*Ü�4œ Ó,Ó-Ð-rM   c                óJ   € \        V 4      w  r\        VR4       \        W4      # )zÒReturns an iterator of paired items, overlapping, from the original

>>> take(4, pairwise(count()))
[(0, 1), (1, 2), (2, 3), (3, 4)]

On Python 3.10 and above, this is an alias for :func:`itertools.pairwise`.

N)r   r_   Úzip)rR   ÚaÚbs   &  rK   Ú	_pairwiser}   6  s"   € ô ˆx‹=�D€AÜˆˆD„MÜˆq‹9ÐrM   ©r(   c                 ó   € \        V 4      # rH   )Úitertools_pairwiserj   s   &rK   r(   r(   J  s   € Ü! (Ó+Ð+rM   c                   ó6   a a€ ] tR tRt oRV 3R lltRtVtV ;t# )ÚUnequalIterablesErroriP  c                ó`   <€ R pVe   VRP                   ! V!  ,          p\        SV `	  V4       R# )z Iterables have different lengthsNz/: index 0 has length {}; index {} has length {})ÚformatÚsuperÚ__init__)ÚselfÚdetailsÚmsgÚ	__class__s   && €rK   r†   ÚUnequalIterablesError.__init__Q  s8   ø€ Ø0ˆØÒØÐE×MÒMØñõ ˆCô 	‰Ñ˜ÖrM   © rH   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r†   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)rŠ   Ú__classdict__s   @@rK   r‚   r‚   P  s   ù‡ € ÷÷ rM   r‚   c              #   ó|   "  € \        V R \        /  F$  pV F  pV\        J g   K  \        4       h	  Vx € K&  	  R# 5i)Ú	fillvalueN)r   Ú_markerr‚   )Ú	iterablesÚcomboÚvals   &  rK   Ú_zip_equal_generatorr›   [  s:   é € Ü˜iÐ;´7Ô;ˆÛˆCØ”g�~Ü+Ó-Ð-ñ ð Œó	 <ùs   ‚<¦<c                  óè   €  \        V ^ ,          4      p\        V R,          ^4       F$  w  r#\        V4      pWA8w  g   K  \        WV3R7      h	  \        V !  #   \         d    \        T 4      u # i ; i)é    :é   NN)rˆ   )r\   Ú	enumerater‚   rz   Ú	TypeErrorr›   )r˜   Ú
first_sizeÚiÚitÚsizes   *    rK   Ú
_zip_equalr¥   c  ss   € ð/Ü˜ 1�Ó&ˆ
Ü˜y¨�}¨aÖ0‰EˆAÜ�r“7ˆDØÖ!Ü+°ZÀDÐ4IÔJÐJñ 1ô
 �I‰Ðøô ô /Ü# IÓ.Ò.ð/ús   ‚8A ¿A ÁA1Á0A1c                ó¢   € \        V 4      .V,          pVR8X  d   \        VRV/ # VR8X  d
   \        V!  # VR8X  d
   \        V!  # \	        R4      h)au  Group elements from *iterable* into fixed-length groups of length *n*.

>>> list(grouper('ABCDEF', 3))
[('A', 'B', 'C'), ('D', 'E', 'F')]

The keyword arguments *incomplete* and *fillvalue* control what happens for
iterables whose length is not a multiple of *n*.

When *incomplete* is `'fill'`, the last group will contain instances of
*fillvalue*.

>>> list(grouper('ABCDEFG', 3, incomplete='fill', fillvalue='x'))
[('A', 'B', 'C'), ('D', 'E', 'F'), ('G', 'x', 'x')]

When *incomplete* is `'ignore'`, the last group will not be emitted.

>>> list(grouper('ABCDEFG', 3, incomplete='ignore', fillvalue='x'))
[('A', 'B', 'C'), ('D', 'E', 'F')]

When *incomplete* is `'strict'`, a subclass of `ValueError` will be raised.

>>> it = grouper('ABCDEFG', 3, incomplete='strict')
>>> list(it)  # doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
...
UnequalIterablesError

Úfillr–   rE   Úignorez Expected fill, strict, or ignore)r]   r   r¥   rz   Ú
ValueError)rR   rQ   Ú
incompleter–   rx   s   &&&& rK   r   r   s  s^   € ô: �‹NÐ˜aÕ€DØ�VÔÜ˜DÐ6¨IÑ6Ð6Ø�XÔÜ˜4Ñ Ð Ø�XÔÜ�D‰zÐäÐ;Ó<Ð<rM   c               '  óÄ   "  € \        \        V 4      p\        \        V 4      ^ R4       F/  p\	        \        W4      4      p\        \        V4       Rj  x€L
  K1  	  R#  L
5i)a2  Yields an item from each iterable, alternating between them.

    >>> list(roundrobin('ABC', 'D', 'EF'))
    ['A', 'D', 'E', 'B', 'F', 'C']

This function produces the same output as :func:`interleave_longest`, but
may perform better for some inputs (in particular when the number of
iterables is small).

Néÿÿÿÿ)rT   r]   Úranger\   r
   r   r_   )r˜   Ú	iteratorsÚ
num_actives   *  rK   r6   r6   ›  sL   é € ô ”D˜)Ó$€IÜœC 	›N¨A¨rÖ2ˆ
Üœ& Ó7Ó8ˆ	Ü”t˜YÓ'×'Ò'ó 3á'ùs   ‚AA ÁAÁA c                ó¾   € V f   \         p \        V^4      w  r#p\        \        W4      4      w  rV\        V\        \        P
                  V4      4      \        W64      3# )aw  
Returns a 2-tuple of iterables derived from the input iterable.
The first yields the items that have ``pred(item) == False``.
The second yields the items that have ``pred(item) == True``.

    >>> is_odd = lambda x: x % 2 != 0
    >>> iterable = range(10)
    >>> even_items, odd_items = partition(is_odd, iterable)
    >>> list(even_items), list(odd_items)
    ([0, 2, 4, 6, 8], [1, 3, 5, 7, 9])

If *pred* is None, :func:`bool` is used.

    >>> iterable = [0, 1, False, True, '', ' ']
    >>> false_items, true_items = partition(None, iterable)
    >>> list(false_items), list(true_items)
    ([0, False, ''], [1, True, ' '])

)Úboolr   rT   r   ro   Únot_)rh   rR   Út1Út2ÚpÚp1Úp2s   &&     rK   r)   r)   ­  sP   € ð( ‚|Üˆä�H˜aÓ �I€BˆAÜ”�T“Ó�F€BÜ�RœœXŸ]™]¨BÓ/Ó0´(¸2Ó2BÐCÐCrM   c                óŒ   a€ \        V 4      o\        P                  ! V3R l\        \	        S4      ^,           4       4       4      # )a  Yields all possible subsets of the iterable.

    >>> list(powerset([1, 2, 3]))
    [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

:func:`powerset` will operate on iterables that aren't :class:`set`
instances, so repeated elements in the input will produce repeated elements
in the output.

    >>> seq = [1, 1, 0]
    >>> list(powerset(seq))
    [(), (1,), (1,), (0,), (1, 1), (1, 0), (1, 0), (1, 1, 0)]

For a variant that efficiently yields actual :class:`set` instances, see
:func:`powerset_of_sets`.
c              3   ó<   <"  € T F  p\        SV4      x € K  	  R # 5irH   )r   )Ú.0ÚrÚss   & €rK   Ú	<genexpr>Úpowerset.<locals>.<genexpr>Û  s   øé € ÐMÑ;L°aœ|¨A¨q×1Ð1Ó;Lùs   ƒ)rO   r   rl   r­   r\   )rR   r¼   s   &@rK   r-   r-   É  s2   ø€ ô" 	ˆX‹€AÜ×ÒÔM¼5ÄÀQÃÈ!ÅÔ;LÓMÓMÐMrM   c              #  ó  "  € \        4       pVP                  p. pVP                  pVRJpV  F*  pV'       d	   V! V4      MTp W‚9  d   V! V4       Vx € K*  K,  	  R#   \         d    Y„9  d   T! T4       Tx €  KP   KS  i ; i5i)aJ  
Yield unique elements, preserving order.

    >>> list(unique_everseen('AAAABBBCCDAABBB'))
    ['A', 'B', 'C', 'D']
    >>> list(unique_everseen('ABBCcAD', str.lower))
    ['A', 'B', 'C', 'D']

Sequences with a mix of hashable and unhashable items can be used.
The function will be slower (i.e., `O(n^2)`) for unhashable items.

Remember that ``list`` objects are unhashable - you can use the *key*
parameter to transform the list to a tuple (which is hashable) to
avoid a slowdown.

    >>> iterable = ([1, 2], [2, 3], [1, 2])
    >>> list(unique_everseen(iterable))  # Slow
    [[1, 2], [2, 3]]
    >>> list(unique_everseen(iterable, key=tuple))  # Faster
    [[1, 2], [2, 3]]

Similarly, you may want to convert unhashable ``set`` objects with
``key=frozenset``. For ``dict`` objects,
``key=lambda x: frozenset(x.items())`` can be used.

N)ÚsetÚaddÚappendr    )	rR   re   ÚseensetÚseenset_addÚseenlistÚseenlist_addÚuse_keyÚelementÚks	   &&       rK   rB   rB   Þ  sˆ   é € ô6 ‹e€GØ—+‘+€KØ€HØ—?‘?€LØ˜ˆo€Gãˆß#‰C�ŒL¨ˆð	ØÔÙ˜A”Ø”ñ  ó øô ô 	ØÔ Ù˜Q”Ø•ò !ð	üs*   ‚A BÁAÁBÁBÁ:BÂ BÂBc           
     óÊ   € Vf*   \        \        P                  ! ^ 4      \        V 4      4      # \        \        \        \        P                  ! ^4      \        W4      4      4      # )zÍYields elements in order, ignoring serial duplicates

>>> list(unique_justseen('AAAABBBCCDAABBB'))
['A', 'B', 'C', 'D', 'A', 'B']
>>> list(unique_justseen('ABBCcAD', str.lower))
['A', 'B', 'C', 'A', 'D']

)rT   ro   Ú
itemgetterr   r_   rd   s   &&rK   rC   rC     sJ   € ð ‚{Ü”8×&Ò& qÓ)¬7°8Ó+<Ó=Ð=äŒt”Sœ×,Ò,¨QÓ/´¸Ó1GÓHÓIÐIrM   Fc                ó2   € \        \        WVR7      VR7      # )aˆ  Yields unique elements in sorted order.

>>> list(unique([[1, 2], [3, 4], [1, 2]]))
[[1, 2], [3, 4]]

*key* and *reverse* are passed to :func:`sorted`.

>>> list(unique('ABBcCAD', str.casefold))
['A', 'B', 'c', 'D']
>>> list(unique('ABBcCAD', str.casefold, reverse=True))
['D', 'c', 'B', 'A']

The elements in *iterable* need not be hashable, but they must be
comparable for sorting to work.
)re   Úreverse)re   )rC   Úsorted)rR   re   rÍ   s   &&&rK   rA   rA     s   € ô  œ6 (¸WÔEÈ3ÔOÐOrM   c              #  óZ   "  €  Ve
   V! 4       x €  V ! 4       x € K    T d     R# i ; i5i)a�  Yields results from a function repeatedly until an exception is raised.

Converts a call-until-exception interface to an iterator interface.
Like ``iter(func, sentinel)``, but uses an exception instead of a sentinel
to end the loop.

    >>> l = [0, 1, 2]
    >>> list(iter_except(l.pop, IndexError))
    [2, 1, 0]

Multiple exceptions can be specified as a stopping condition:

    >>> l = [1, 2, 3, '...', 4, 5, 6]
    >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
    [7, 6, 5]
    >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
    [4, 3, 2]
    >>> list(iter_except(lambda: 1 + l.pop(), (IndexError, TypeError)))
    []

NrŒ   )rv   Ú	exceptionÚfirsts   &&&rK   r    r    -  s2   é € ð,ØÒÙ“'ŠMØÙ“&ŒLøØô Úðüs   ‚+„ �(¤+§(¨+c                ó,   € \        \        W 4      V4      # )ad  
Returns the first true value in the iterable.

If no true value is found, returns *default*

If *pred* is not None, returns the first item for which
``pred(item) == True`` .

    >>> first_true(range(10))
    1
    >>> first_true(range(10), pred=lambda x: x > 5)
    6
    >>> first_true(range(10), default='missing', pred=lambda x: x > 9)
    'missing'

)r_   Úfilter)rR   rb   rh   s   &&&rK   r   r   L  s   € ô" ”�tÓ&¨Ó0Ð0rM   r   c                ó¨   € V Uu. uF  p\        V4      NK  	  upV ,          p\         ;QJ d    . R V 4       F  NK  	  5# ! R V 4       4      # u upi )a£  Draw an item at random from each of the input iterables.

    >>> random_product('abc', range(4), 'XYZ')  # doctest:+SKIP
    ('c', 3, 'Z')

If *repeat* is provided as a keyword argument, that many items will be
drawn from each iterable.

    >>> random_product('abcd', range(4), repeat=2)  # doctest:+SKIP
    ('a', 2, 'd', 3)

This equivalent to taking a random selection from
``itertools.product(*args, **kwarg)``.

c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5irH   )r   )rº   Úpools   & rK   r½   Ú!random_product.<locals>.<genexpr>q  s   é € Ð0©% $”˜—�«%ùs   ‚)rm   )r   rx   rÖ   Úpoolss   $*  rK   r4   r4   `  sH   € ñ  &*Ó*¡T˜TŒU�4Ž[¡TÑ*¨VÕ3€EßŒ5Ñ0©%Ó0�5Ð0ˆ5Ñ0©%Ó0Ó0Ð0ùò +s   …Ac                ób   € \        V 4      pVf   \        V4      MTp\        \        W!4      4      # )aF  Return a random *r* length permutation of the elements in *iterable*.

If *r* is not specified or is ``None``, then *r* defaults to the length of
*iterable*.

    >>> random_permutation(range(5))  # doctest:+SKIP
    (3, 4, 0, 1, 2)

This equivalent to taking a random selection from
``itertools.permutations(iterable, r)``.

)rm   r\   r   )rR   r»   rÖ   s   && rK   r3   r3   t  s+   € ô �‹?€DØ’YŒˆDŒ	 A€AÜ”˜“Ó!Ð!rM   c                óÐ   a€ \        V 4      o\        S4      p\        \        \	        V4      V4      4      p\         ;QJ d    . V3R lV 4       F  NK  	  5# ! V3R lV 4       4      # )zëReturn a random *r* length subsequence of the elements in *iterable*.

    >>> random_combination(range(5), 3)  # doctest:+SKIP
    (2, 3, 4)

This equivalent to taking a random selection from
``itertools.combinations(iterable, r)``.

c              3   ó6   <"  € T F  pSV,          x € K  	  R # 5irH   rŒ   ©rº   r¢   rÖ   s   & €rK   r½   Ú%random_combination.<locals>.<genexpr>“  ó   øé € Ð*¡'˜Q��a—’£'ùó   ƒ)rm   r\   rÎ   r   r­   )rR   r»   rQ   ÚindicesrÖ   s   &&  @rK   r2   r2   †  sN   ø€ ô �‹?€DÜˆD‹	€AÜ”VœE !›H aÓ(Ó)€GßŒ5Ô*¡'Ó*�5Ð*ˆ5Ô*¡'Ó*Ó*Ð*rM   c                óÒ   aa€ \        V 4      o\        S4      o\        V3R l\        V4       4       4      p\         ;QJ d    . V3R lV 4       F  NK  	  5# ! V3R lV 4       4      # )a;  Return a random *r* length subsequence of elements in *iterable*,
allowing individual elements to be repeated.

    >>> random_combination_with_replacement(range(3), 5) # doctest:+SKIP
    (0, 0, 1, 2, 2)

This equivalent to taking a random selection from
``itertools.combinations_with_replacement(iterable, r)``.

c              3   ó:   <"  € T F  p\        S4      x € K  	  R # 5irH   )r   )rº   r¢   rQ   s   & €rK   r½   Ú6random_combination_with_replacement.<locals>.<genexpr>£  s   øé € Ð4©8 a”Y˜q—\�\«8ùs   ƒc              3   ó6   <"  € T F  pSV,          x € K  	  R # 5irH   rŒ   rÜ   s   & €rK   r½   rã   ¤  rÞ   rß   )rm   r\   rÎ   r­   )rR   r»   rà   rQ   rÖ   s   && @@rK   r1   r1   –  sM   ù€ ô �‹?€DÜˆD‹	€AÜÔ4¬5°¬8Ó4Ó4€GßŒ5Ô*¡'Ó*�5Ð*ˆ5Ô*¡'Ó*Ó*Ð*rM   c                ó6  € \        V 4      p\        V4      pV^ 8  g   W8”  d   \        h^p\        WV,
          4      p\	        ^V^,           4       F   pWTV,
          V,           ,          V,          pK"  	  V^ 8  d	   W%,          pV^ 8  g   W%8¼  d   \
        h. pV'       dp   WQ,          V,          V^,
          V^,
          rpW%8¼  d)   W%,          pWTV,
          ,          V,          V^,
          rEK.  VP                  VRV,
          ,          4       Kw  \        V4      # )aæ  Equivalent to ``list(combinations(iterable, r))[index]``.

The subsequences of *iterable* that are of length *r* can be ordered
lexicographically. :func:`nth_combination` computes the subsequence at
sort position *index* directly, without computing the previous
subsequences.

    >>> nth_combination(range(5), 3, 5)
    (0, 3, 4)

``ValueError`` will be raised If *r* is negative or greater than the length
of *iterable*.
``IndexError`` will be raised if the given *index* is invalid.
r¬   )rm   r\   r©   Úminr­   Ú
IndexErrorrÂ   )	rR   r»   ÚindexrÖ   rQ   ÚcrÉ   r¢   Úresults	   &&&      rK   r%   r%   §  sã   € ô �‹?€DÜˆD‹	€AØ	ˆAŒ�1”5ÜÐà	€AÜˆA�1�u‹€AÜ�1�a˜!•eŽ_ˆØ�Q•˜•�O˜qÕ Šñ ð ˆq„yØ�
ˆà�Œ	�u”zÜÐà€Fß
Ø•%˜1•*˜a !�e Q¨¥UˆaˆØŒjØ�JˆEØ˜A�•; !Õ# Q¨¥UŠqØ�‰�d˜2 �6•lÖ#ä�‹=ÐrM   c                ó   € \        V .V4      # )a  Yield *value*, followed by the elements in *iterator*.

    >>> value = '0'
    >>> iterator = ['1', '2', '3']
    >>> list(prepend(value, iterator))
    ['0', '1', '2', '3']

To prepend multiple values, see :func:`itertools.chain`
or :func:`value_chain`.

)r   )Úvaluer`   s   &&rK   r.   r.   Ñ  s   € ô �%�˜(Ó#Ð#rM   c              #  óü   "  € \        V4      RRR1,          p\        V4      p\        ^ .VR7      V,          p\        V \	        ^ V^,
          4      4       F!  pVP                  V4       \        W4      x € K#  	  R# 5i)a&  Convolve the iterable *signal* with the iterable *kernel*.

    >>> signal = (1, 2, 3, 4, 5)
    >>> kernel = [3, 2, 1]
    >>> list(convolve(signal, kernel))
    [3, 8, 14, 20, 26, 14, 5]

Note: the input arguments are not interchangeable, as the *kernel*
is immediately consumed and stored.

NrX   r¬   )rm   r\   r   r   r   rÂ   Ú_sumprod)ÚsignalÚkernelrQ   ÚwindowrI   s   &&   rK   r   r   à  sh   é € ô �6‹]™4˜R˜4Õ €FÜˆF‹€AÜ�A�3˜qÔ! AÕ%€FÜ�6œ6 ! Q¨¥UÓ+Ö,ˆØ�‰�aÔÜ�vÓ&Ô&ó -ùs   ‚A:A<c                ó\   a aa€ \        S4      o. oVV V3R lp\        SS4      pV! 4       V3# )až  A variant of :func:`takewhile` that allows complete access to the
remainder of the iterator.

     >>> it = iter('ABCdEfGhI')
     >>> all_upper, remainder = before_and_after(str.isupper, it)
     >>> ''.join(all_upper)
     'ABC'
     >>> ''.join(remainder) # takewhile() would lose the 'd'
     'dEfGhI'

Note that the first iterator must be fully consumed before the second
iterator can generate valid results.
c               3   ón   <"  € S F)  p S! V 4      '       d   V x € K  SP                  V 4        R # 	  R # 5irH   )rÂ   )Úelemr£   Ú	predicateÚ
transitions    €€€rK   Útrue_iteratorÚ'before_and_after.<locals>.true_iterator  s/   øé € ÛˆDÙ˜�ŠØ”
à×!Ñ! $Ô'Úó ùs   ƒ25)r]   r   )rõ   r£   r÷   Úremainder_iteratorrö   s   ff  @rK   r   r   ö  s5   ú€ ô 
ˆb‹€BØ€J÷ô ˜z¨2Ó.Ðá‹?Ð.Ð.Ð.rM   c              #  ó^   "  € \        \        V 4      4       F  w  w  rw  r4WV3x € K  	  R# 5i)z�Return overlapping triplets from *iterable*.

>>> list(triplewise('ABCDE'))
[('A', 'B', 'C'), ('B', 'C', 'D'), ('C', 'D', 'E')]

Nr~   )rR   r{   Ú_r|   ré   s   &    rK   r@   r@     s,   é € ô #¤8¨HÓ#5Ö6‰‰ˆ‘�Ø�AˆgŒó 7ùs   ‚+-c              #  ó¬   "  € \        V 4      p\        \        W!^,
          4      VR7      pV F!  pVP                  V4       \	        V4      x € K#  	  R# 5i)a=  Return a sliding window of width *n* over *iterable*.

    >>> list(sliding_window(range(6), 4))
    [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, 5)]

If *iterable* has fewer than *n* items, then nothing is yielded:

    >>> list(sliding_window(range(3), 4))
    []

For a variant with more features, see :func:`windowed`.
rX   N)r]   r   r   rÂ   rm   )rR   rQ   r£   rñ   rI   s   &&   rK   r8   r8   "  sE   é € ô 
ˆh‹€BÜ”6˜" !�eÓ$¨QÔ/€FÛˆØ�‰�aÔÜ�F‹mÔó ùs   ‚AAc           
     óÆ   € \        V 4      p\        \        \        \	        \        V4      ^,           4      ^4      4      p\        \        P                  \        V4      V4      # )zêReturn all contiguous non-empty subslices of *iterable*.

    >>> list(subslices('ABC'))
    [['A'], ['A', 'B'], ['A', 'B', 'C'], ['B'], ['B', 'C'], ['C']]

This is similar to :func:`substrings`, but emits items in a different
order.
)
rO   r   Úslicer   r­   r\   rT   ro   Úgetitemr   )rR   ÚseqÚslicess   &  rK   r9   r9   6  sF   € ô ˆx‹.€CÜ”UœL¬¬s°3«x¸!­|Ó)<¸aÓ@ÓA€FÜŒx×Ñ¤¨£¨fÓ5Ð5rM   c                ó’   € \        \        ^4      \        \        P                  V 4      4      p\        \        \        V^.4      4      # )z¼Compute a polynomial's coefficients from its roots.

>>> roots = [5, -4, 3]  # (x - 5) * (x + 4) * (x - 3)
>>> polynomial_from_roots(roots)  # x^3 - 4 * x^2 - 17 * x + 60
[1, -4, -17, 60]
)rz   r   rT   ro   ÚnegrO   r   r   )ÚrootsÚfactorss   & rK   r+   r+   D  s5   € ô ”&˜“)œS¤§¡¨uÓ5Ó6€GÜ””x ¨1¨#Ó.Ó/Ð/rM   c              #  ó  "  € \        V RR4      pVf4   \        WV4      p\        WR4       F  w  rgWqJ g	   Wq8X  g   K  Vx € K  	  R# Vf   \        V 4      MTpV^,
          p  V! W^,           V4      ;px € K    \         d     R# i ; i5i)a·  Yield the index of each place in *iterable* that *value* occurs,
beginning with index *start* and ending before index *stop*.


>>> list(iter_index('AABCADEAF', 'A'))
[0, 1, 4, 7]
>>> list(iter_index('AABCADEAF', 'A', 1))  # start index is inclusive
[1, 4, 7]
>>> list(iter_index('AABCADEAF', 'A', 1, 7))  # stop index is not inclusive
[1, 4]

The behavior for non-scalar *values* matches the built-in Python types.

>>> list(iter_index('ABCDABCD', 'AB'))
[0, 4]
>>> list(iter_index([0, 1, 2, 3, 0, 1, 2, 3], [0, 1]))
[]
>>> list(iter_index([[0, 1], [2, 3], [0, 1], [2, 3]], [0, 1]))
[0, 2]

See :func:`locate` for a more general means of finding the indexes
associated with particular values.

rè   N)Úgetattrr   rŸ   r\   r©   )rR   rì   rV   ÚstopÚ	seq_indexr£   r¢   rÈ   s   &&&&    rK   r!   r!   O  s‘   é € ô2 ˜ '¨4Ó0€IØÒä�H TÓ*ˆÜ# BÖ.‰JˆAØÓ 7Ö#3Ø”ó /ð
 !%¢Œs�8Œ}°$ˆØ�A�Iˆð	ØÙ% e°­U°DÓ9Ð9�qÔ:øÜô 	Úð	üs(   ‚6B½$BÁ"A9 Á9BÂBÂBÂBc              #  ó°  "  € V ^8”  d   ^x € ^p\        R4      V ^,          ,          p\        P                  ! V 4      ^,           p\        V^W4       Fd  p\        V^WV,          4       Rj  x€L
  \	        \        \        WD,          WV,           4      4      4      W$V,          WV,           1&   WD,          pKf  	  \        V^V4       Rj  x€L
  R#  Ld L5i)zXYield the primes less than n.

>>> list(sieve(30))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
N)r�   rž   )Ú	bytearrayÚmathÚisqrtr!   Úbytesr\   r­   )rQ   rV   ÚdataÚlimitrµ   s   &    rK   r7   r7   z  s·   é € ð 	ˆ1„uØŠØ€EÜ�VÓ  Q¥Õ'€DÜ�JŠJ�q‹M˜AÕ€EÜ˜˜a Ö.ˆÜ˜d A u°!­eÓ4×4Ð4Ü"'¬¬E°!µ%¸À½EÓ,BÓ(CÓ"Dˆ��U�Q˜Q�ÐÑØ•Šñ /ô ˜$  5Ó)×)Ò)ñ 	5ñ *ùs%   ‚A+CÁ-CÁ.ACÃCÃCÃCrE   c             #  óÒ   "  € V^8  d   \        R4      h\        V 4      p\        \        W14      4      ;p'       d*   V'       d   \	        V4      V8w  d   \        R4      hVx € KE  R# 5i)ar  Batch data into tuples of length *n*. If the number of items in
*iterable* is not divisible by *n*:
* The last batch will be shorter if *strict* is ``False``.
* :exc:`ValueError` will be raised if *strict* is ``True``.

>>> list(batched('ABCDEFG', 3))
[('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)]

On Python 3.13 and above, this is an alias for :func:`itertools.batched`.
zn must be at least onezbatched(): incomplete batchN)r©   r]   rm   r   r\   )rR   rQ   rE   r£   Úbatchs   &&$  rK   Ú_batchedr  Œ  sZ   é € ð 	ˆ1„uÜÐ1Ó2Ð2Ü	ˆh‹€BÜœ ›Ó'Ð
'ˆ%Ö
'ß”c˜%“j A”oÜÐ:Ó;Ð;ØŒñ (ùs   ‚AA'Á#A'i¢ )r   c                ó   € \        WVR 7      # )rD   )Úitertools_batched)rR   rQ   rE   s   &&$rK   r   r   £  s   € Ü  °VÔ<Ð<rM   c                ó   € \        V !  # )zùSwap the rows and columns of the input matrix.

>>> list(transpose([(1, 2, 3), (11, 22, 33)]))
[(1, 11), (2, 22), (3, 33)]

The caller should ensure that the dimensions of the input are compatible.
If the input is empty, no output will be produced.
)Ú_zip_strict©r£   s   &rK   r?   r?   ¬  s   € ô ˜ÑÐrM   c                óB   € \        \        P                  ! V 4      V4      # )z²Reshape the 2-D input *matrix* to have a column count given by *cols*.

>>> matrix = [(0, 1), (2, 3), (4, 5)]
>>> cols = 3
>>> list(reshape(matrix, cols))
[(0, 1, 2), (3, 4, 5)]
)r   r   rl   )ÚmatrixÚcolss   &&rK   r0   r0   ¸  s   € ô ”5×&Ò& vÓ.°Ó5Ð5rM   c                ó€   € \        V^ ,          4      p\        \        \        \	        V \        V4      4      4      V4      # )zÆMultiply two matrices.

>>> list(matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]))
[(49, 80), (41, 60)]

The caller should ensure that the dimensions of the input matrices are
compatible with each other.
)r\   r   r   rî   r   r?   )Úm1Úm2rQ   s   && rK   r"   r"   Ã  s0   € ô 	ˆBˆq�E‹
€AÜ”7œ8¤W¨R´¸2³Ó%?Ó@À!ÓDÐDrM   c              #  óÎ   "  € \        \        P                  ! V 4      ^,           4       F)  pW,          '       d   K  Vx € W,          p V ^8X  g   K%   R# 	  V ^8”  d   V x € R# R# 5i)zHYield the prime factors of n.

>>> list(factor(360))
[2, 2, 2, 3, 3, 5]
N)r7   r  r  )rQ   Úprimes   & rK   r   r   Ð  sS   é € ô ”t—z’z !“} qÕ(Ö)ˆØ—)–)ØŠKØ�KˆAØ�AŽvÚñ *ð 	ˆ1„uØŒñ ùs   ‚5A%¼A%ÁA%c           	     ó¦   € \        V 4      pV^ 8X  d
   V^ ,          # \        \        \        V4      \	        \        V4      4      4      p\        W4      # )zÄEvaluate a polynomial at a specific value.

Example: evaluating x^3 - 4 * x^2 - 17 * x + 60 at x = 2.5:

>>> coefficients = [1, -4, -17, 60]
>>> x = 2.5
>>> polynomial_eval(coefficients, x)
8.125
)r\   rT   Úpowr   Úreversedr­   rî   )ÚcoefficientsrI   rQ   Úpowerss   &&  rK   r*   r*   à  sD   € ô 	ˆLÓ€AØˆA„vØ�1�uˆÜ””f˜Q“i¤¬%°«(Ó!3Ó4€FÜ�LÓ)Ð)rM   c                ó&   € \        \        V 4      !  # )zZReturn the sum of the squares of the input values.

>>> sum_of_squares([10, 20, 30])
1400
)rî   r   r  s   &rK   r:   r:   ñ  s   € ô ”S˜“WÑÐrM   c                óˆ   € \        V 4      p\        \        ^V4      4      p\        \	        \
        P                  W4      4      # )a  Compute the first derivative of a polynomial.

Example: evaluating the derivative of x^3 - 4 * x^2 - 17 * x + 60

>>> coefficients = [1, -4, -17, 60]
>>> derivative_coefficients = polynomial_derivative(coefficients)
>>> derivative_coefficients
[3, -8, -17]
)r\   r#  r­   rO   rT   ro   rp   )r$  rQ   r%  s   &  rK   r,   r,   ú  s4   € ô 	ˆLÓ€AÜ”e˜A˜q“kÓ"€FÜ””H—L‘L ,Ó7Ó8Ð8rM   c                óh   € \        \        V 4      4       F  pW,          V^,
          ,          p K  	  V # )zmReturn the count of natural numbers up to *n* that are coprime with *n*.

>>> totient(9)
6
>>> totient(12)
4
)rÀ   r   )rQ   rµ   s   & rK   r>   r>   	  s-   € ô ”˜“Ž^ˆØ�F�a˜!•eÕŠñ ð €HrM   )r�   rH   )r§   N)NF)NN)r�   N)]Ú__doc__r  ro   Úcollectionsr   Úcollections.abcr   Ú	functoolsr   r   Ú	itertoolsr   r   r   r	   r
   r   r   r   r   r   r   r   Úrandomr   r   r   Úsysr   Ú__all__Úobjectr—   rz   r  r    r  rî   r=   r;   r<   r   r$   r   r±   r/   r'   r&   r#   r   r   r5   r}   r(   r€   ÚImportErrorr©   r‚   r›   r¥   r   r6   r)   r-   rB   rC   rA   r    r   r4   r3   r2   r1   r%   r.   r   r   r@   r8   r9   r+   r!   r7   r  r   r  r?   r0   r"   r   r*   r:   r,   r>   rŒ   rM   rK   Ú<module>r3     sð  ðñó Û å Ý !ß %÷÷ ÷ ó ÷ -Ñ ,Ý ð/Øð/àð/ð ð/ð ð	/ð
 ð/ð ð/ð ð/ð ð/ð ð/ð ð/ð ð/ð ð/ð ð/ð ð/ð 
ð/ð  ð!/ð" ð#/ð$ ð%/ð& ð'/ð( ð)/ð* ð+/ð, ð-/ð. ð//ð0 ð1/ð2 ð3/ð4 ð5/ð6 ð7/ð8 *ð9/ð: ð;/ð< ð=/ð> ð?/ð@ ðA/ðB ðC/ðD ðE/ðF ðG/ðH ðI/ðJ ðK/ðL ðM/ðN ðO/ðP ðQ/ðR ðS/ðT ðU/ðV ðW/ðX ðY/ðZ ð[/ð\ ð]/€ñb ‹(€ð,ÙˆtÕñ ˜# dÔ+€Kñ �4˜Ñ$AÓB€ò%ô 'ò$3ô$%+ôP
4ô=ð* !ô $ò)ð €ò;ò.ò	,ô.ò6ð	)Ý8ò
,ð !×(Ñ(€HÔô˜Jô òò/ô %=òP(ò$Dò8Nô**ôZJôPô&ô>1ð(1 ô 1ô("ò$+ò +ò"'òT$ò'ò,/òBòò(6ò0ô(òV*ð$ Eô ð( �ÔÝ6ð= uõ =ð €Gà×&Ñ&€G„Oò	ò6ò
Eòò *ò"ò9ôøða ô ØƒKðûðZ ô Ø‚Hðús$   Â1	G ÄG# Ç	G ÇG Ç#	G/Ç.G/