§
    -@Äj¸²  ã                   óR  — d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZ ddlmZmZ dd	lmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z" dd
l#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z,m-Z-m.Z.m/Z/ ddlm0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 g d¢Z6 e7¦   «         Z8	 ddlm9Z9m:Z: dZ;n# e<$ r dZ;Y nw xY wd„ Z=dcd„Z>d„ Z?ddd„Z@ddd„ZAddd„ZBeCfd„ZDd„ ZEeEZFd„ ZGd„ ZH	 ddl#mIZJ n# e<$ r eHZJY nw xY wd„ ZKddd„ZLd„ Zded!„ZMd"„ ZNd#„ ZOd$„ ZPddd%„ZQddd&„ZRdfd'„ZSddd(„ZTdgd)„ZUd*d+œd,„ZVddd-„ZWd.„ ZXd/„ ZYd0„ ZZd1„ Z[d2„ Z\d3„ Z]d4„ Z^d5„ Z_d6„ Z`d7„ Zad8„ Zbd9„ Zcdhd:„Zdd;„ Zedd<œd=„Zfe5d>k    rdd?lmgZh dd<œd@„Zgefj         eg_         nefZgdA„ ZiejekffdB„ZldC„ ZmdD„ ZndE„ ZodF„ Zp eq eedG¦  «        ¦  «        ZrdH„ ZsdI„ ZtdJ„ ZudK„ ZvdL„ Zwg dM¢ZxedN„ ¦   «         ZydO„ Zz ej{        ¦   «         j0        Z|dP„ Z}dQ„ Z~dR„ ZdS„ Z€dT„ Z�dU„ Z‚ddVœdW„ZƒdX„ Z„ddVœdY„Z…dZ„ Z†ddVœd[„Z‡d\„ ZˆddVœd]„Z‰ e
dd¬^¦  «         G d_„ d`¦  «        ¦   «         ZŠddVœda„Z‹db„ ZŒdS )ia  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)Úbisect_leftÚinsort)Údeque©Úsuppress)Ú	dataclass)Ú	lru_cacheÚreduce)ÚheappushÚheappushpop)Ú
accumulateÚchainÚcombinationsÚcompressÚcountÚcycleÚfilterfalseÚgroupbyÚisliceÚpairwiseÚproductÚrepeatÚstarmapÚ	takewhileÚteeÚzip_longest)ÚprodÚcombÚisqrtÚgcd)ÚmulÚgetitemÚindexÚis_Ú
itemgetterÚtruediv)Ú	randrangeÚsampleÚchoiceÚshuffle)Ú
hexversion)8ÚStatsÚ	all_equalÚbatchedÚbefore_and_afterÚconsumeÚconvolveÚ
dotproductÚ
first_trueÚfactorÚflattenÚgrouperÚis_primeÚiter_exceptÚ
iter_indexÚloopsÚmatmulÚmultinomialÚncyclesÚnthÚnth_combinationÚpadnoneÚpad_noner   Ú	partitionÚpolynomial_evalÚpolynomial_from_rootsÚpolynomial_derivativeÚpowersetÚprependÚquantifyÚreshapeÚ#random_combination_with_replacementÚrandom_combinationÚrandom_derangementÚrandom_permutationÚrandom_productÚ
repeatfuncÚ
roundrobinÚrunning_maxÚrunning_meanÚrunning_medianÚrunning_minÚrunning_statisticsÚsieveÚsliding_windowÚ	subslicesÚsum_of_squaresÚtabulateÚtailÚtakeÚtotientÚ	transposeÚ
triplewiseÚuniqueÚunique_everseenÚunique_justseen)Úheappush_maxÚheappushpop_maxTFc                 ó<   — t          t          || ¦  «        ¦  «        S )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     úGC:\Projects\Historical\venv\Lib\site-packages\more_itertools/recipes.pyr\   r\   q   s   € õ •�x Ñ#Ô#Ñ$Ô$Ð$ó    c                 ó<   — t          | t          |¦  «        ¦  «        S )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     ri   rZ   rZ   �   s   € õ ˆx�˜u™œÑ&Ô&Ð&rj   c                 óÂ   — 	 t          |¦  «        }t          |t          d|| z
  ¦  «        d¦  «        S # t          $ r! t	          t          || ¬¦  «        ¦  «        cY S w xY w)zƒReturn an iterator over the last *n* items of *iterable*.

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

    r   N©Úmaxlen)Úlenr   ÚmaxÚ	TypeErrorÚiterr   )rg   rh   Úsizes      ri   r[   r[   “   sr   € ð8Ý�8‰}Œ}ˆõ �h¥ A t¨a¡xÑ 0Ô 0°$Ñ7Ô7Ð7øõ ð /ð /ð /Ý•E˜(¨1Ð-Ñ-Ô-Ñ.Ô.Ð.Ð.Ð.ð/øøøs   ‚3 ³(AÁAc                 ón   — |€t          | d¬¦  «         dS t          t          | ||¦  «        d¦  «         dS )aX  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

    Nr   rp   )r   Únextr   )Úiteratorrg   s     ri   r0   r0   £   sG   € ð@ 	€yåˆh˜qÐ!Ñ!Ô!Ð!Ð!Ð!õ 	�V�H˜a Ñ#Ô# TÑ*Ô*Ð*Ð*Ð*rj   c                 ó@   — t          t          | |d¦  «        |¦  «        S )z…Returns the nth item or a default value.

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

    N)rx   r   )rh   rg   Údefaults      ri   r>   r>   Ë   s    € õ •�x  DÑ)Ô)¨7Ñ3Ô3Ð3rj   c                 óD   — t          | |¦  «        }|D ]}|D ]}  dS  dS dS )a§  
    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

    FT)r   )rh   Úkeyry   ÚfirstÚseconds        ri   r-   r-   Ø   sF   € õ$ �x Ñ%Ô%€HØð ð ˆØð 	ð 	ˆFØ�5�5�5ØˆtˆtØˆ4rj   c                 ó<   — t          t          || ¦  «        ¦  «        S )zcReturn the how many times the predicate is true.

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

    )Úsumrl   )rh   Úpreds     ri   rH   rH   ò   s   € õ �s�4˜Ñ"Ô"Ñ#Ô#Ð#rj   c                 ó<   — t          | t          d¦  «        ¦  «        S )a   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   ©rh   s    ri   rA   rA   ü   s   € õ ��6 $™<œ<Ñ(Ô(Ð(rj   c                 ó`   — t          j        t          t          | ¦  «        |¦  «        ¦  «        S )zvReturns the sequence elements *n* times

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

    )r   Úfrom_iterabler   Útuple©rh   rg   s     ri   r=   r=     s%   € õ Ô�v¥e¨H¡o¤o°qÑ9Ô9Ñ:Ô:Ð:rj   c                 óH   — t          t          t          | |¦  «        ¦  «        S )zãReturns the dot product of the two iterables.

    >>> dotproduct([10, 15, 12], [0.65, 0.80, 1.25])
    33.5
    >>> 10 * 0.65 + 15 * 0.80 + 12 * 1.25
    33.5

    In Python 3.12 and later, use ``math.sumprod()`` instead.
    )r�   rl   r!   )Úvec1Úvec2s     ri   r2   r2     s   € õ �s•3˜˜dÑ#Ô#Ñ$Ô$Ð$rj   )Úsumprodc                 ó*   — t          j        | ¦  «        S )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   r†   )Úlist_of_listss    ri   r5   r5   +  s   € õ Ô˜}Ñ-Ô-Ð-rj   c                 ó|   — |€t          | t          |¦  «        ¦  «        S t          | t          ||¦  «        ¦  «        S )aK  Call *function* 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   )rm   ÚtimesÚargss      ri   rO   rO   7  s9   € ð, €}Ý�x¥¨¡¤Ñ.Ô.Ð.Ý�8�V D¨%Ñ0Ô0Ñ1Ô1Ð1rj   c                 ó    — t          | ¦  «        S )z²
    Wrapper for :func:`itertools.pairwise`.

    .. warning::

       This function is deprecated as of version 11.0.0. It will be removed in a future
       major release.
    )Úitertools_pairwiser„   s    ri   r   r   R  s   € õ ˜hÑ'Ô'Ð'rj   Úfillc                 ó²   — t          | ¦  «        g|z  }|xdk    r t          |d|iŽS xdk    r t          |ddiŽS dk    r	t          |Ž S 	 t          d¦  «        ‚)a²  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 `ValueError` will be raised.

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

    r”   Ú	fillvalueÚstrictTÚignorez Expected fill, strict, or ignore)ru   r   ÚzipÚ
ValueError)rh   rg   Ú
incompleter–   Ú	iteratorss        ri   r6   r6   ^  sy   € õ: �h‘”Ð  1Ñ$€IØ
ØˆVŠVˆVˆVÝ 	Ð?°YÐ?Ð?Ð?ØˆXŠXˆXˆXÝ˜	Ð/¨$Ð/Ð/Ð/ØŠXˆXÝ˜	�?Ð"ØÝÐ?Ñ@Ô@Ð@rj   c               '   óæ   K  — t          t          | ¦  «        }t          t          | ¦  «        dd¦  «        D ]:}t	          t          ||¦  «        ¦  «        }t          t          |¦  «        E d{V —† Œ;dS )aG  Visit input iterables in a cycle until each is exhausted.

        >>> 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).

    r   éÿÿÿÿN)rl   ru   Úrangerr   r   r   rx   )Ú	iterablesrœ   Ú
num_actives      ri   rP   rP   ‡  s~   è è € õ •D˜)Ñ$Ô$€IÝ�C 	™NœN¨A¨rÑ2Ô2ð (ð (ˆ
Ý�& ¨JÑ7Ô7Ñ8Ô8ˆ	Ý•t˜YÑ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð(ð (rj   c                 ó®   ‡ ‡‡‡— ‰ €t           Š t          |¦  «        Št          ¦   «         Št          ¦   «         Šˆˆˆ ˆfd„} |‰¦  «         |‰¦  «        fS )a¯  
    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, ' '])

    Nc              3   ó”   •K  — 	 | r|                       ¦   «         V — | °‰D ]%} ‰|¦  «        r‰n‰                     |¦  «          nd S ŒE©N)ÚpopleftÚappend)ÚqueueÚvalueÚfalse_queuery   r‚   Ú
true_queues     €€€€ri   Úgenzpartition.<locals>.gen´  su   øè è € ð	Øð &Ø—m’m‘o”oÐ%Ð%Ð%ð ð &à!ð ð �Ø#˜t E™{œ{Ð;��°×CÒCÀEÑJÔJÐJØ�à�ð	rj   )Úboolru   r   )r‚   rh   r«   r©   ry   rª   s   `  @@@ri   rB   rB   ™  sv   øøøø€ ð( €|ÝˆÝ�H‰~Œ~€Hå‘'”'€KÝ‘”€Jðð ð ð ð ð ð ð ð ˆ3ˆ{ÑÔ˜S˜S ™_œ_Ð,Ð,rj   c                 óœ   ‡— t          | ¦  «        Št          j        ˆfd„t          t	          ‰¦  «        dz   ¦  «        D ¦   «         ¦  «        S )a1  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   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S r¤   )r   )Ú.0ÚrÚss     €ri   ú	<genexpr>zpowerset.<locals>.<genexpr>Ó  s-   øè è € ÐMÐM°a�|¨A¨qÑ1Ô1ÐMÐMÐMÐMÐMÐMrj   é   )rf   r   r†   rŸ   rr   )rh   r±   s    @ri   rF   rF   Á  sH   ø€ õ" 	ˆX‰Œ€AÝÔÐMÐMÐMÐM½5ÅÀQÁÄÈ!ÁÑ;LÔ;LÐMÑMÔMÑMÔMÐMrj   c              #   óê   K  — t          ¦   «         }|€3t          |j        | ¦  «        D ]}|                     |¦  «         |V — ŒdS | D ]*} ||¦  «        }||vr|                     |¦  «         |V — Œ+dS )a  Yield unique elements, preserving order. Remember all elements ever seen.

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

    Raises ``TypeError`` for unhashable items.

    Some unhashable objects can be converted to hashable objects
    using the *key* parameter:

    * For ``list`` objects, try ``key=tuple``.
    * For ``set`` objects, try ``key=frozenset``.
    * For ``dict`` objects, try ``key=lambda x: frozenset(x.items())``
      or in Python 3.15 and later, set ``key=frozendict``.

    Alternatively, consider the ``unique()`` itertool recipe.  It sorts
    the data and then uses equality to eliminate duplicates.  Hashability
    is not required.

    N)Úsetr   Ú__contains__Úadd)rh   r}   ÚseenÚelementÚks        ri   ra   ra   Ö  s£   è è € õ. ‰5Œ5€DØ
€{Ý" 4Ô#4°hÑ?Ô?ð 	ð 	ˆGØ�HŠH�WÑÔÐØˆMˆMˆMˆMð	ð 	ð  ð 	ð 	ˆGØ��G‘”ˆAØ˜ˆ}ˆ}Ø—’˜‘”�Ø���øð		ð 	rj   c           
      óÖ   — |€*t          t          d¦  «        t          | ¦  «        ¦  «        S t          t          t          t          d¦  «        t          | |¦  «        ¦  «        ¦  «        S )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']

    Nr   r³   )rl   r%   r   rx   )rh   r}   s     ri   rb   rb   ú  sQ   € ð €{Ý•:˜a‘=”=¥'¨(Ñ"3Ô"3Ñ4Ô4Ð4å�t•S� A™œ­°¸#Ñ(>Ô(>Ñ?Ô?Ñ@Ô@Ð@rj   c                 óH   — t          | ||¬¦  «        }t          ||¬¦  «        S )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.
    )r}   Úreverse)r}   )Úsortedrb   )rh   r}   r½   Ú	sequenceds       ri   r`   r`   	  s+   € õ  �x S°'Ð:Ñ:Ô:€IÝ˜9¨#Ð.Ñ.Ô.Ð.rj   c              #   óx   K  — t          |¦  «        5  |� |¦   «         V — 	  | ¦   «         V — Œ# 1 swxY w Y   dS )aÝ  Yields results from a function repeatedly until an exception is raised.

    Converts a call-until-exception interface to an iterator interface.
    Like ``iter(function, 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   )rm   Ú	exceptionr~   s      ri   r8   r8     sƒ   è è € õ, 
�)Ñ	Ô	ð ð ØÐØ�%‘'”'ˆMˆMˆMð	Ø�(‘*”*ÐÐÐð	ðð ð ð øøøð ð ð ð ð ð s   ’/¯3¶3c                 ó>   — t          t          || ¦  «        |¦  «        S )a�  
    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'

    )rx   Úfilter)rh   r{   r‚   s      ri   r3   r3   :  s   € õ" •�t˜XÑ&Ô&¨Ñ0Ô0Ð0rj   r³   ©r   c                 ó�   — t          t          t           |¦  «        ¦  «        | z  }t          t          t          |¦  «        ¦  «        S )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, repeat=repeat)``.

    )r‡   rl   r)   )r   r    Úpoolss      ri   rN   rN   N  s8   € õ  •#•e˜YÑ'Ô'Ñ(Ô(¨6Ñ1€EÝ••V˜UÑ#Ô#Ñ$Ô$Ð$rj   c                 ó€   — t          | ¦  «        }|€t          |¦  «        n|}t          t          ||¦  «        ¦  «        S )ab  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)``.

    )r‡   rr   r(   )rh   r°   Úpools      ri   rM   rM   b  s8   € õ �‰?Œ?€DØ�Y�ˆD‰	Œ	ˆ	 A€AÝ•˜˜a‘”Ñ!Ô!Ð!rj   c                 óÊ   ‡— t          | ¦  «        Št          ‰¦  «        }t          t          t	          |¦  «        |¦  «        ¦  «        }t          ˆfd„|D ¦   «         ¦  «        S )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                 ó    •— g | ]
}‰|         ‘ŒS © rË   ©r¯   ÚirÈ   s     €ri   ú
<listcomp>z&random_combination.<locals>.<listcomp>�  ó   ø€ Ð+Ð+Ð+˜a�$�q”'Ð+Ð+Ð+rj   )r‡   rr   r¾   r(   rŸ   )rh   r°   rg   ÚindicesrÈ   s       @ri   rK   rK   t  s[   ø€ õ �‰?Œ?€DÝˆD‰	Œ	€AÝ•V�E !™HœH aÑ(Ô(Ñ)Ô)€GÝÐ+Ð+Ð+Ð+ 7Ð+Ñ+Ô+Ñ,Ô,Ð,rj   c                 óÈ   ‡‡— t          | ¦  «        Št          ‰¦  «        Št          ˆfd„t          |¦  «        D ¦   «         ¦  «        }t          ˆfd„|D ¦   «         ¦  «        S )aS  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   ó6   •K  — | ]}t          ‰¦  «        V — Œd S r¤   )r'   ©r¯   rÍ   rg   s     €ri   r²   z6random_combination_with_replacement.<locals>.<genexpr>‘  s)   øè è € Ð4Ð4 a•Y˜q‘\”\Ð4Ð4Ð4Ð4Ð4Ð4rj   c                 ó    •— g | ]
}‰|         ‘ŒS rË   rË   rÌ   s     €ri   rÎ   z7random_combination_with_replacement.<locals>.<listcomp>’  rÏ   rj   )r‡   rr   r¾   rŸ   )rh   r°   rÐ   rg   rÈ   s      @@ri   rJ   rJ   „  sg   øø€ õ �‰?Œ?€DÝˆD‰	Œ	€AÝÐ4Ð4Ð4Ð4­5°©8¬8Ð4Ñ4Ô4Ñ4Ô4€GÝÐ+Ð+Ð+Ð+ 7Ð+Ñ+Ô+Ñ,Ô,Ð,rj   c                 ól  — t          | ¦  «        }t          |¦  «        }t          ||¦  «        }|dk     r||z  }d|cxk    r|k     s	n t          ‚g }|rS||z  |z  |dz
  |dz
  }}}||k    r||z  }|||z
  z  |z  |dz
  }}||k    °|                     |d|z
           ¦  «         |°St          |¦  «        S )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.
    ``IndexError`` will be raised if the given *index* is invalid.
    r   r³   rž   )r‡   rr   r   Ú
IndexErrorr¦   )rh   r°   r#   rÈ   rg   ÚcÚresults          ri   r?   r?   •  së   € õ �‰?Œ?€DÝˆD‰	Œ	€AÝˆQ�‰
Œ
€Aàˆq‚y€yØ�‰
ˆØ�ˆ>ˆ>Š>ˆ>˜Š>ˆ>ˆ>ˆ>ÝÐà€FØ
ð $Ø�a‘%˜1‘*˜a !™e Q¨¡Uˆaˆ1ˆØ�qŠjˆjØ�Q‰JˆEØ˜˜A™‘; !Ñ# Q¨¡UˆqˆAð �qŠjˆjð 	�Š�d˜2 ™6”lÑ#Ô#Ð#ð ð $õ �‰=Œ=Ðrj   c                 ó$   — t          | g|¦  «        S )a  Yield *value*, followed by the elements in *iterable*.

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

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

    )r   )r¨   rh   s     ri   rG   rG   ·  s   € õ �%�˜(Ñ#Ô#Ð#rj   c              #   ó  K  — t          |¦  «        ddd…         }t          |¦  «        }t          dg|¬¦  «        |z  }t          | t	          d|dz
  ¦  «        ¦  «        D ])}|                     |¦  «         t          ||¦  «        V — Œ*dS )u}  Discrete linear convolution of two iterables.
    Equivalent to polynomial multiplication.

    For example, multiplying ``(xÂ² -x - 20)`` by ``(x - 3)``
    gives ``(xÂ³ -4xÂ² -17x + 60)``.

        >>> list(convolve([1, -1, -20], [1, -3]))
        [1, -4, -17, 60]

    Examples of popular kinds of kernels:

    * The kernel ``[0.25, 0.25, 0.25, 0.25]`` computes a moving average.
      For image data, this blurs the image and reduces noise.
    * The kernel ``[1/2, 0, -1/2]`` estimates the first derivative of
      a function evaluated at evenly spaced inputs.
    * The kernel ``[1, -2, 1]`` estimates the second derivative of a
      function evaluated at evenly spaced inputs.

    Convolutions are mathematically commutative; however, the inputs are
    evaluated differently.  The signal is consumed lazily and can be
    infinite. The kernel is fully consumed before the calculations begin.

    Supports all numeric types: int, float, complex, Decimal, Fraction.

    References:

    * Article:  https://betterexplained.com/articles/intuitive-convolution/
    * Video by 3Blue1Brown:  https://www.youtube.com/watch?v=KuXjwB4LzSA

    Nrž   r   rp   r³   )r‡   rr   r   r   r   r¦   Ú_sumprod)ÚsignalÚkernelrg   ÚwindowÚxs        ri   r1   r1   Æ  sŸ   è è € õF �6‰]Œ]˜4˜4˜R˜4Ô €FÝˆF‰Œ€AÝ�A�3˜qÐ!Ñ!Ô! AÑ%€FÝ�6�6 ! Q¨¡UÑ+Ô+Ñ,Ô,ð 'ð 'ˆØ�Š�aÑÔÐÝ�v˜vÑ&Ô&Ð&Ð&Ð&Ð&ð'ð 'rj   c                 ó„   — t          |¦  «        \  }}t          t          | |¦  «        t          |¦  «        ¦  «        }||fS )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.
    )r   r   r   r™   )Ú	predicateÚitÚtruesÚafters       ri   r/   r/   ñ  s<   € õ �r‘7”7�L€Eˆ5Ý•Y˜y¨%Ñ0Ô0µ#°e±*´*Ñ=Ô=€EØ�%ˆ<Ðrj   c                 ó¬   — t          | d¦  «        \  }}}t          |d¦  «         t          |d¦  «         t          |d¦  «         t          |||¦  «        S )z�Return overlapping triplets from *iterable*.

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

    é   N)r   rx   r™   )rh   Út1Út2Út3s       ri   r_   r_     sP   € õ �X˜qÑ!Ô!�J€BˆˆBÝˆˆT�N„N€NÝˆˆT�N„N€NÝˆˆT�N„N€NÝˆr�2�r‰?Œ?Ðrj   c                 óœ   — t          | |¦  «        }t          |¦  «        D ]$\  }}t          t          |||¦  «        d ¦  «         Œ%t	          |Ž S r¤   )r   Ú	enumeraterx   r   r™   )rh   rg   rœ   rÍ   ry   s        ri   Ú_sliding_window_islicerì     sU   € å�H˜aÑ Ô €IÝ  Ñ+Ô+ð +ð +‰ˆˆ8Ý�V�H˜a Ñ#Ô# TÑ*Ô*Ð*Ð*Ý�	ˆ?Ðrj   c              #   óÂ   K  — t          | ¦  «        }t          t          ||dz
  ¦  «        |¬¦  «        }|D ](}|                     |¦  «         t	          |¦  «        V — Œ)d S )Nr³   rp   )ru   r   r   r¦   r‡   )rh   rg   ry   rÞ   rß   s        ri   Ú_sliding_window_dequerî     sq   è è € å�H‰~Œ~€HÝ•6˜( A¨¡EÑ*Ô*°1Ð5Ñ5Ô5€FØð ð ˆØ�Š�aÑÔÐÝ�F‰mŒmÐÐÐÐðð rj   c                 óÒ   — |dk    rt          | |¦  «        S |dk    rt          | |¦  «        S |dk    rt          | ¦  «        S |dk    rt          | ¦  «        S t	          d|› �¦  «        ‚)aY  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`.
    é   é   r³   zn should be at least one, not )rî   rì   r   r™   rš   rˆ   s     ri   rW   rW   %  sy   € ð 	ˆ2‚v€vÝ$ X¨qÑ1Ô1Ð1Ø	
ˆQŠˆÝ% h°Ñ2Ô2Ð2Ø	
ˆaŠˆÝ˜Ñ!Ô!Ð!Ø	
ˆaŠˆÝ�8‰}Œ}ÐåÐ=¸!Ð=Ð=Ñ>Ô>Ð>rj   c           
      óæ   — t          | ¦  «        }t          t          t          t	          t          |¦  «        dz   ¦  «        d¦  «        ¦  «        }t          t          t          |¦  «        |¦  «        S )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.
    r³   rñ   )	rf   r   Úslicer   rŸ   rr   rl   r"   r   )rh   ÚseqÚslicess      ri   rX   rX   >  sR   € õ ˆx‰.Œ.€CÝ•U�L­­s°3©x¬x¸!©|Ñ)<Ô)<¸aÑ@Ô@ÑAÔA€FÝ�w�˜s™œ VÑ,Ô,Ð,rj   c                 óV   — dg}| D ]"}t          t          |d| f¦  «        ¦  «        }Œ#|S )uk  Compute a polynomial's coefficients from its roots.

    >>> roots = [5, -4, 3]            # (x - 5) * (x + 4) * (x - 3)
    >>> polynomial_from_roots(roots)  # xÂ³ - 4 xÂ² - 17 x + 60
    [1, -4, -17, 60]

    Note that polynomial coefficients are specified in descending power order.

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    r³   )rf   r1   )ÚrootsÚpolyÚroots      ri   rD   rD   L  s>   € ð  ˆ3€DØð 0ð 0ˆÝ•H˜T A¨ u :Ñ.Ô.Ñ/Ô/ˆˆØ€Krj   c              #   ó:  K  — t          | dd¦  «        }|€7t          | ||¦  «        }t          ||¦  «        D ]\  }}||u s||k    r|V — ŒdS |€t          | ¦  «        n|}|dz
  }t	          t
          ¦  «        5  	  |||dz   |¦  «        x}V — Œ# 1 swxY w Y   dS )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#   Nr³   )Úgetattrr   rë   rr   r   rš   )rh   r¨   rn   ÚstopÚ	seq_indexry   rÍ   r¹   s           ri   r9   r9   b  s  è è € õ2 ˜ '¨4Ñ0Ô0€IØÐå˜( E¨4Ñ0Ô0ˆÝ# H¨eÑ4Ô4ð 	ð 	‰JˆAˆwØ˜%ÐÐ 7¨eÒ#3Ð#3Ø���øð	ð 	ð
 !% �s�8‰}Œ}ˆ}°$ˆØ�A‰IˆÝ•jÑ!Ô!ð 	;ð 	;ð;Ø%˜I e¨Q°©U°DÑ9Ô9Ð9�qÐ:Ð:Ð:ð;ð	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð 	;ð 	;s   Á9BÂBÂBc              #   ó€  K  — | dk    rdV — d}t          d¦  «        | dz  z  }t          |d|t          | ¦  «        dz   ¬¦  «        D ]_}t          |d|||z  ¦  «        E d{V —† t          t	          t          ||z  | ||z   ¦  «        ¦  «        ¦  «        |||z  | ||z   …<   ||z  }Œ`t          |d|¦  «        E d{V —† dS )zeYield the primes less than n.

    >>> list(sieve(30))
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

    rñ   ræ   )r   r³   r³   )rü   N)Ú	bytearrayr9   r   Úbytesrr   rŸ   )rg   rn   ÚdataÚps       ri   rV   rV   ‹  sû   è è € ð 	ˆ1‚u€uØˆˆˆØ€EÝ�VÑÔ  Q¡Ñ'€DÝ˜˜a ­U°1©X¬X¸©\Ð:Ñ:Ô:ð ð ˆÝ˜d A u¨a°!©eÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ý"'­­E°!°a±%¸¸AÀ¹EÑ,BÔ,BÑ(CÔ(CÑ"DÔ"DˆˆQ�‰U�Q˜˜Q™ÐÑØ�A‘ˆˆÝ˜$  5Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)rj   ©r—   c             #   ó"  K  — |dk     rt          d¦  «        ‚t          | ¦  «        }t          t          ||¦  «        ¦  «        x}rI|r"t	          |¦  «        |k    rt          d¦  «        ‚|V — t          t          ||¦  «        ¦  «        x}°GdS dS )aŽ  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`.
    r³   zn must be at least onezbatched(): incomplete batchN)rš   ru   r‡   r   rr   )rh   rg   r—   ry   Úbatchs        ri   Ú_batchedr     s­   è è € ð 	ˆ1‚u€uÝÐ1Ñ2Ô2Ð2Ý�H‰~Œ~€HÝ� ¨!Ñ,Ô,Ñ-Ô-Ð
-ˆ%ð Øð 	<•c˜%‘j”j A’o�oÝÐ:Ñ;Ô;Ð;Øˆˆˆõ � ¨!Ñ,Ô,Ñ-Ô-Ð
-ˆ%ð ð ð ð ð rj   i¢ )r.   c                ó&   — t          | ||¬¦  «        S )Nr  )Úitertools_batched)rh   rg   r—   s      ri   r.   r.   ·  s   € Ý  ¨1°VÐ<Ñ<Ô<Ð<rj   c                 ó   — t          | ddiŽS )a  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.
    r—   T)r™   )Úmatrixs    ri   r^   r^   ¿  s   € õ �Ð$˜tÐ$Ð$Ð$rj   c                 óf   — 	 t          | ¦  «         n# t          $ r Y dS w xY wt          | |¦  «        S )z.Scalars are bytes, strings, and non-iterables.T)ru   rt   Ú
isinstance)r¨   Ú
stringlikes     ri   Ú
_is_scalarr  Ë  sF   € ðÝˆU‰ŒˆˆøÝð ð ð Øˆtˆtðøøøå�e˜ZÑ(Ô(Ð(s   ‚ ’
 Ÿ c                 óÖ   — t          | ¦  «        }	 	 t          |¦  «        }n# t          $ r |cY S w xY wt          |f|¦  «        }t	          |¦  «        r|S t          j        |¦  «        }ŒZ)z.Depth-first iterator over scalars in a tensor.)ru   rx   ÚStopIterationr   r  r†   )Útensorry   r¨   s      ri   Ú_flatten_tensorr  Ô  sƒ   € å�F‰|Œ|€Hð1ð	Ý˜‘N”NˆEˆEøÝð 	ð 	ð 	ØˆOˆOˆOð	øøøå˜%˜ 8Ñ,Ô,ˆÝ�eÑÔð 	ØˆOÝÔ& xÑ0Ô0ˆð1s   ’" ¢1°1c                 óü   — t          |t          ¦  «        r"t          t          j        | ¦  «        |¦  «        S |^}}t          | ¦  «        }t          t          t          |¦  «        |¦  «        }t          ||¦  «        S )aó  Change the shape of a *matrix*.

    If *shape* is an integer, the matrix must be two dimensional
    and the shape is interpreted as the desired number of columns:

        >>> matrix = [(0, 1), (2, 3), (4, 5)]
        >>> cols = 3
        >>> list(reshape(matrix, cols))
        [(0, 1, 2), (3, 4, 5)]

    If *shape* is a tuple (or other iterable), the input matrix can have
    any number of dimensions. It will first be flattened and then rebuilt
    to the desired shape which can also be multidimensional:

        >>> matrix = [(0, 1), (2, 3), (4, 5)]    # Start with a 3 x 2 matrix

        >>> list(reshape(matrix, (2, 3)))        # Make a 2 x 3 matrix
        [(0, 1, 2), (3, 4, 5)]

        >>> list(reshape(matrix, (6,)))          # Make a vector of length six
        [0, 1, 2, 3, 4, 5]

        >>> list(reshape(matrix, (2, 1, 3, 1)))  # Make 2 x 1 x 3 x 1 tensor
        [(((0,), (1,), (2,)),), (((3,), (4,), (5,)),)]

    Each dimension is assumed to be uniform, either all arrays or all scalars.
    Flattening stops when the first value in a dimension is a scalar.
    Scalars are bytes, strings, and non-iterables.
    The reshape iterator stops when the requested shape is complete
    or when the input is exhausted, whichever comes first.

    )	r  Úintr.   r   r†   r  r
   Úreversedr   )r
  ÚshapeÚ	first_dimÚdimsÚscalar_streamÚreshapeds         ri   rI   rI   â  sp   € õB �%�ÑÔð ;Ý•uÔ*¨6Ñ2Ô2°EÑ:Ô:Ð:ØÐ€I�Ý# FÑ+Ô+€MÝ•g�x¨™~œ~¨}Ñ=Ô=€HÝ�(˜IÑ&Ô&Ð&rj   c                 ó¨   — t          |d         ¦  «        }t          t          t          t	          | t          |¦  «        ¦  «        ¦  «        |¦  «        S )a#  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.

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    r   )rr   r.   r   rÛ   r   r^   )Úm1Úm2rg   s      ri   r;   r;     s=   € õ 	ˆBˆqŒE‰
Œ
€AÝ•7�8¥W¨Rµ¸2±´Ñ%?Ô%?Ñ@Ô@À!ÑDÔDÐDrj   c                 óæ   — t          d| ¦  «        D ]R}dx}}d}|dk    r:||z  |z   | z  }||z  |z   | z  }||z  |z   | z  }t          ||z
  | ¦  «        }|dk    °:|| k    r|c S ŒSt          d¦  «        ‚)Nr³   rñ   zprime or under 5)rŸ   r    rš   )rg   Úbrß   ÚyÚds        ri   Ú_factor_pollardr"    s©   € õ �1�a‰[Œ[ð 	ð 	ˆØˆ	ˆˆAØˆØ�1ŠfˆfØ�Q‘˜‘˜a‘ˆAØ�Q‘˜‘˜a‘ˆAØ�Q‘˜‘˜a‘ˆAÝ�A˜‘E˜1‘”ˆAð	 �1Šfˆfð
 �Š6ˆ6ØˆHˆHˆHð å
Ð'Ñ
(Ô
(Ð(rj   éÓ   c              #   ó*  K  — | dk     rdS t           D ]}| |z  s|V — | |z  } | |z  ¯Œg }| dk    r| gng }|D ]F} | dk     st          | ¦  «        r|                     | ¦  «         Œ-t          | ¦  «        }||| |z  fz  }ŒGt	          |¦  «        E d{V —† dS )a  Yield the prime factors of n.

    >>> list(factor(360))
    [2, 2, 2, 3, 3, 5]

    Finds small factors with trial division.  Larger factors are
    either verified as prime with ``is_prime`` or split into
    smaller factors with Pollard's rho algorithm.
    rñ   Nr³   ié­  )Ú_primes_below_211r7   r¦   r"  r¾   )rg   ÚprimeÚprimesÚtodoÚfacts        ri   r4   r4   -  së   è è € ð 	ˆ1‚u€uØˆõ #ð ð ˆØ�e‘)ð 	ØˆKˆKˆKØ�%‰KˆAð �e‘)ð 	øð
 €FØ�a’%�%ˆAˆ3ˆ3˜R€DØð &ð &ˆØˆvŠ:ˆ:� !™œˆ:Ø�MŠM˜!ÑÔÐÐå" 1Ñ%Ô%ˆDØ�T˜1 ™9Ð%Ñ%ˆDˆDÝ�f‰~Œ~ÐÐÐÐÐÐÐÐÐrj   c           	      óö   — t          | ¦  «        }|dk    r t          |¦  «        d¦  «        S t          t          t	          |¦  «        t          t          |¦  «        ¦  «        ¦  «        }t          | |¦  «        S )a´  Evaluate a polynomial at a specific value.

    Computes with better numeric stability than Horner's method.

    Evaluate ``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

    Note that polynomial coefficients are specified in descending power order.

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    r   )rr   Útyperl   Úpowr   r  rŸ   rÛ   )Úcoefficientsrß   rg   Úpowerss       ri   rC   rC   N  sc   € õ  	ˆLÑÔ€AØˆA‚v€vØ�t�A‰wŒw�q‰zŒzÐÝ••f˜Q‘i”i¥­%°©(¬(Ñ!3Ô!3Ñ4Ô4€FÝ�L &Ñ)Ô)Ð)rj   c                 ó.   — t          t          | ¦  «        Ž S )z¯Return the sum of the squares of the input values.

    >>> sum_of_squares([10, 20, 30])
    1400

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    )rÛ   r   r„   s    ri   rY   rY   e  s   € õ •S˜‘]”]Ð#Ð#rj   c                 ó    — t          | ¦  «        }t          t          d|¦  «        ¦  «        }t          t	          t
          | |¦  «        ¦  «        S )u¨  Compute the first derivative of a polynomial.

    Evaluate the derivative of ``xÂ³ - 4 xÂ² - 17 x + 60``:

    >>> coefficients = [1, -4, -17, 60]
    >>> derivative_coefficients = polynomial_derivative(coefficients)
    >>> derivative_coefficients
    [3, -8, -17]

    Note that polynomial coefficients are specified in descending power order.

    Supports all numeric types: int, float, complex, Decimal, Fraction.
    r³   )rr   r  rŸ   rf   rl   r!   )r-  rg   r.  s      ri   rE   rE   p  s@   € õ 	ˆLÑÔ€AÝ•e˜A˜q‘k”kÑ"Ô"€FÝ••C˜ vÑ.Ô.Ñ/Ô/Ð/rj   c                 óT   — t          t          | ¦  «        ¦  «        D ]
}| | |z  z  } Œ| S )uÙ  Return the count of natural numbers up to *n* that are coprime with *n*.

    Euler's totient function Ï†(n) gives the number of totatives.
    Totative are integers k in the range 1 â‰¤ k â‰¤ n such that gcd(n, k) = 1.

    >>> n = 9
    >>> totient(n)
    6

    >>> totatives = [x for x in range(1, n) if gcd(n, x) == 1]
    >>> totatives
    [1, 2, 4, 5, 7, 8]
    >>> len(totatives)
    6

    Reference:  https://en.wikipedia.org/wiki/Euler%27s_totient_function

    )rµ   r4   )rg   r&  s     ri   r]   r]   ƒ  s3   € õ& •V˜A‘Y”Y‘”ð ð ˆØ	ˆQ�%‰Z‰ˆˆØ€Hrj   ))iÿ  )rñ   )i�Š )é   éI   )l   ÅtT7 )rñ   é   é=   )l   Áay)rñ   é   é   iS_ )l   ;n>Ô)rñ   ræ   é   r4  é   )l   ßp¤)rñ   ræ   r8  r4  r9  r6  )l            )rñ   iE  iŸ$  in  i×à i=• iþ‘k)l   ý%!HÈn•fW )rñ   ræ   r8  r4  r9  r6  é   é   r7  é   r2  é%   é)   c                 ó€   — | dz
  | z                        ¦   «         dz
  }| |z	  }d|z  |z  | k    r|dz  r|dk    sJ ‚||fS )z#Return s, d such that 2**s * d == nr³   r   )Ú
bit_length)rg   r±   r!  s      ri   Ú_shift_to_oddrA  «  s]   € ð ˆa‰%�1‰× Ò Ñ"Ô" QÑ&€AØ	ˆQ‰€AØ�‰F�a‰<˜1ÒÐ  Q¡Ð¨1°ª6¨6¨6Ð1Øˆaˆ4€Krj   c                 óþ   — | dk    r| dz  rd|cxk    r| k     sn J ‚t          | dz
  ¦  «        \  }}t          ||| ¦  «        }|dk    s	|| dz
  k    rdS t          |dz
  ¦  «        D ]}||z  | z  }|| dz
  k    r dS ŒdS )Nrñ   r³   TF)rA  r,  rŸ   )rg   Úbaser±   r!  rß   Ú_s         ri   Ú_strong_probable_primerE  ´  s²   € Ø�ŠEˆE˜˜A™ˆE A¨ M M¢M M°¢M M M M MÐ2å˜˜Q™ÑÔ�D€A€qåˆD�!�Q‰Œ€AØˆA‚v€v��a˜!‘e’�Øˆtå�1�q‘5‰\Œ\ð ð ˆØ�‰E�A‰IˆØ��A‘Š:ˆ:Ø�4�4ð ð ˆ5rj   c                 óî   ‡ — ‰ dk     r‰ dv S ‰ dz  r‰ dz  r‰ dz  r‰ dz  r
‰ dz  r‰ dz  sd	S t           D ]\  }}‰ |k     r nŒˆ fd
„t          d¦  «        D ¦   «         }t          ˆ fd„|D ¦   «         ¦  «        S )aÁ  Return ``True`` if *n* is prime and ``False`` otherwise.

    Basic examples:

        >>> is_prime(37)
        True
        >>> is_prime(3 * 13)
        False
        >>> is_prime(18_446_744_073_709_551_557)
        True

    Find the next prime over one billion:

        >>> next(filter(is_prime, count(10**9)))
        1000000007

    Generate random primes up to 200 bits and up to 60 decimal digits:

        >>> from random import seed, randrange, getrandbits
        >>> seed(18675309)

        >>> next(filter(is_prime, map(getrandbits, repeat(200))))
        893303929355758292373272075469392561129886005037663238028407

        >>> next(filter(is_prime, map(randrange, repeat(10**60))))
        269638077304026462407872868003560484232362454342414618963649

    This function is exact for values of *n* below 10**24.  For larger inputs,
    the probabilistic Miller-Rabin primality test has a less than 1 in 2**128
    chance of a false positive.
    r:  >   rñ   ræ   r8  r4  r9  r6  r³   ræ   r8  r4  r9  r6  Fc              3   ó>   •K  — | ]}t          d ‰dz
  ¦  «        V — ŒdS )rñ   r³   N)Ú_private_randrangerÓ   s     €ri   r²   zis_prime.<locals>.<genexpr>õ  s2   øè è € ÐAÐA°!Õ# A q¨1¡uÑ-Ô-ÐAÐAÐAÐAÐAÐArj   é@   c              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S r¤   )rE  )r¯   rC  rg   s     €ri   r²   zis_prime.<locals>.<genexpr>÷  s.   øè è € ÐAÐA°4Õ% a¨Ñ.Ô.ÐAÐAÐAÐAÐAÐArj   )Ú_perfect_testsrŸ   Úall)rg   ÚlimitÚbasess   `  ri   r7   r7   Ê  sÐ   ø€ ðB 	ˆ2‚v€vØÐ(Ð(Ð(à�‰Eð �a˜!‘eð   A¡ð ¨!¨a©%ð °A¸±Fð ¸qÀ2¹vð Øˆuå&ð Bð B‰ˆˆuØˆuŠ9ˆ9ØˆEð ð BÐAÐAÐAµu¸R±y´yÐAÑAÔAˆåÐAÐAÐAÐA¸5ÐAÑAÔAÑAÔAÐArj   c                 ó"   — t          d| ¦  «        S )zÂReturns an iterable with *n* elements for efficient looping.
    Like ``range(n)`` but doesn't create integers.

    >>> i = 0
    >>> for _ in loops(5):
    ...     i += 1
    >>> i
    5

    NrÄ   )rg   s    ri   r:   r:   ú  s   € õ �$˜‰?Œ?Ðrj   c                  ób   — t          t          t          t          | ¦  «        | ¦  «        ¦  «        S )uÕ  Number of distinct arrangements of a multiset.

    The expression ``multinomial(3, 4, 2)`` has several equivalent
    interpretations:

    * In the expansion of ``(a + b + c)â�¹``, the coefficient of the
      ``aÂ³bâ�´cÂ²`` term is 1260.

    * There are 1260 distinct ways to arrange 9 balls consisting of 3 reds, 4
      greens, and 2 blues.

    * There are 1260 unique ways to place 9 distinct objects into three bins
      with sizes 3, 4, and 2.

    The :func:`multinomial` function computes the length of
    :func:`distinct_permutations`.  For example, there are 83,160 distinct
    anagrams of the word "abracadabra":

        >>> from more_itertools import distinct_permutations, ilen
        >>> ilen(distinct_permutations('abracadabra'))
        83160

    This can be computed directly from the letter counts, 5a 2b 2r 1c 1d:

        >>> from collections import Counter
        >>> list(Counter('abracadabra').values())
        [5, 2, 2, 1, 1]
        >>> multinomial(5, 2, 2, 1, 1)
        83160

    A binomial coefficient is a special case of multinomial where there are
    only two categories.  For example, the number of ways to arrange 12 balls
    with 5 reds and 7 blues is ``multinomial(5, 7)`` or ``math.comb(12, 5)``.

    Likewise, factorial is a special case of multinomial where
    the multiplicities are all just 1 so that
    ``multinomial(1, 1, 1, 1, 1, 1, 1) == math.factorial(7)``.

    Reference:  https://en.wikipedia.org/wiki/Multinomial_theorem

    )r   rl   r   r   )Úcountss    ri   r<   r<     s'   € õT ••D�* VÑ,Ô,¨fÑ5Ô5Ñ6Ô6Ð6rj   c           	   #   ó<  K  — | j         }g }g }t          t          ¦  «        5  	 t          |t	          | |¦   «         ¦  «        ¦  «         |d         V — t          |t          | |¦   «         ¦  «        ¦  «         |d         |d         z   dz  V — Œm# 1 swxY w Y   dS )z.Non-windowed running_median() for Python 3.14+Tr   rñ   N)Ú__next__r   r  rc   r   r   rd   ©ry   ÚreadÚloÚhis       ri   Ú#_running_median_minheap_and_maxheaprX  5  sØ   è è € ð Ô€DØ	€BØ	€Bå	•-Ñ	 Ô	 ð &ð &ð	&Ý˜�[¨¨T¨T©V¬VÑ4Ô4Ñ5Ô5Ð5Ø�Q”%ˆKˆKˆKå�R�¨¨T¨T©V¬VÑ4Ô4Ñ5Ô5Ð5Ø�a”5˜2˜aœ5‘= AÑ%Ð%Ð%Ð%ð	&ð&ð &ð &ð &øøøð &ð &ð &ð &ð &ð &s   ¢A/BÂBÂBc           	   #   óD  K  — | j         }g }g }t          t          ¦  «        5  	 t          |t	          | |¦   «         ¦  «         ¦  «         |d          V — t          |t	          | |¦   «          ¦  «         ¦  «         |d         |d         z
  dz  V — Œq# 1 swxY w Y   dS )zDBackport of non-windowed running_median() for Python 3.13 and prior.Tr   rñ   N)rS  r   r  r   r   rT  s       ri   Ú_running_median_minheap_onlyrZ  E  sâ   è è € ð Ô€DØ	€BØ	€Bå	•-Ñ	 Ô	 ð &ð &ð	&Ý�R�+ b¨$¨$©&¬&Ñ1Ô1Ð1Ñ2Ô2Ð2Ø�a”5�&ˆLˆLˆLå�R�+ b¨4¨4©6¬6¨'Ñ2Ô2Ð2Ñ3Ô3Ð3Ø�a”5˜2˜aœ5‘= AÑ%Ð%Ð%Ð%ð	&ð&ð &ð &ð &øøøð &ð &ð &ð &ð &ð &s   ¢A3BÂBÂBc              #   ób  K  — t          ¦   «         }g }| D ]™}|                     |¦  «         t          ||¦  «         t          |¦  «        |k    r%t	          ||                     ¦   «         ¦  «        }||= t          |¦  «        }|dz  }|dz  r||         n||dz
           ||         z   dz  V — ŒšdS )z+Yield median of values in a sliding window.rñ   r³   N)r   r¦   r   rr   r   r¥   )ry   rq   rÞ   Úorderedrß   rÍ   rg   Úms           ri   Ú_running_median_windowedr^  U  sÐ   è è € õ ‰WŒW€FØ€Gàð 
Ið 
IˆØ�Š�aÑÔÐÝˆw˜ÑÔÐåˆw‰<Œ<˜&Ò Ð Ý˜G V§^¢^Ñ%5Ô%5Ñ6Ô6ˆAØ˜�
å�‰LŒLˆØ�‰FˆØ ™EÐHˆg�aŒjˆj¨°°A±¬¸À¼Ñ(CÀqÑ'HÐHÐHÐHÐHð
Ið 
Irj   rp   c                óÖ   — t          | ¦  «        }|�4t          |¦  «        }|dk    rt          d¦  «        ‚t          ||¦  «        S t          st          |¦  «        S t          |¦  «        S )aD  Cumulative median of values seen so far or values in a sliding window.

    Set *maxlen* to a positive integer to specify the maximum size
    of the sliding window.  The default of *None* is equivalent to
    an unbounded window.

    For example:

        >>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0]))
        [5.0, 7.0, 5.0, 7.0, 8.0, 8.5]
        >>> list(running_median([5.0, 9.0, 4.0, 12.0, 8.0, 9.0], maxlen=3))
        [5.0, 7.0, 5.0, 9.0, 8.0, 9.0]

    Supports numeric types such as int, float, Decimal, and Fraction,
    but not complex numbers which are unorderable.

    On version Python 3.13 and prior, max-heaps are simulated with
    negative values. The negation causes Decimal inputs to apply context
    rounding, making the results slightly different than that obtained
    by statistics.median().
    Nr   úWindow size should be positive)ru   Ú_indexrš   r^  Ú_max_heap_availablerZ  rX  ©rh   rq   ry   s      ri   rS   rS   h  sl   € õ. �H‰~Œ~€HàÐÝ˜‘”ˆØ�QŠ;ˆ;ÝÐ=Ñ>Ô>Ð>Ý'¨°&Ñ9Ô9Ð9åð 6Ý+¨HÑ5Ô5Ð5å.¨xÑ8Ô8Ð8rj   c              #   óä   K  — t          ¦   «         }d}| D ]Z}|                     |¦  «         ||z  }t          |¦  «        |k    r||                     ¦   «         z  }|t          |¦  «        z  V — Œ[d S )Nr   )r   r¦   rr   r¥   )ry   rg   rÞ   Úrunning_sumr¨   s        ri   Ú_windowed_running_meanrf  �  s†   è è € Ý‰WŒW€FØ€KØð (ð (ˆØ�Š�eÑÔÐØ�uÑˆÝˆv‰;Œ;˜Š?ˆ?Ø˜6Ÿ>š>Ñ+Ô+Ñ+ˆKØ�C ™KœKÑ'Ð'Ð'Ð'Ð'ð(ð (rj   c                óÎ   — t          | ¦  «        }|€0t          t          t          |¦  «        t	          d¦  «        ¦  «        S |dk    rt          d¦  «        ‚t          ||¦  «        S )a³  Cumulative mean of values seen so far or values in a sliding window.

    Set *maxlen* to a positive integer to specify the maximum size
    of the sliding window.  The default of *None* is equivalent to
    an unbounded window.

    For example:

        >>> list(running_mean([40, 30, 50, 46, 39, 44]))
        [40.0, 35.0, 40.0, 41.5, 41.0, 41.5]

        >>> list(running_mean([40, 30, 50, 46, 39, 44], maxlen=3))
        [40.0, 35.0, 40.0, 42.0, 45.0, 43.0]

    Supports numeric types such as int, float, complex, Decimal, and Fraction.

    No extra effort is made to reduce round-off errors for float inputs.
    So the results may be slightly different from `statistics.mean`.

    Nr³   r   r`  )ru   rl   r&   r   r   rš   rf  rc  s      ri   rR   rR   ˜  s\   € õ, �H‰~Œ~€Hà€~Ý•7�J xÑ0Ô0µ%¸±(´(Ñ;Ô;Ð;à�‚{€{ÝÐ9Ñ:Ô:Ð:å! (¨FÑ3Ô3Ð3rj   c              #   ól  K  — t          ¦   «         }t          | ¦  «        D ]“\  }}|r)|d         d         ||z
  k    r|                     ¦   «          |r:|d         d         |k     s(|                     ¦   «          |r|d         d         |k     ¯(|                     ||f¦  «         |d         d         V — Œ”d S ©Nr   rž   r³   ©r   rë   r¥   Úpopr¦   )ry   rq   Úsisr#   r¨   s        ri   Ú_windowed_running_minrm  ¹  óË   è è € Ý
‰'Œ'€CÝ! (Ñ+Ô+ð ð ‰ˆˆuØð 	�3�q”6˜!”9 ¨¡Ò.Ð.Ø�KŠK‰MŒMˆMØð 	˜#˜bœ' !œ* uÒ,Ð,Ø�GŠG‰IŒIˆIð ð 	˜#˜bœ' !œ* uÒ,Ð,à�
Š
�E˜5�>Ñ"Ô"Ð"Ø�!Œf�QŒiˆˆˆˆðð rj   c                óš   — t          | ¦  «        }|€t          |t          ¬¦  «        S |dk    rt          d¦  «        ‚t	          ||¦  «        S )aD  Smallest of values seen so far or values in a sliding window.

    Set *maxlen* to a positive integer to specify the maximum size
    of the sliding window.  The default of *None* is equivalent to
    an unbounded window.

    For example:

        >>> list(running_min([4, 3, 7, 0, 8, 1, 6, 2, 9, 5]))
        [4, 3, 3, 0, 0, 0, 0, 0, 0, 0]

        >>> list(running_min([4, 3, 7, 0, 8, 1, 6, 2, 9, 5], maxlen=3))
        [4, 3, 3, 0, 0, 0, 1, 1, 2, 2]

    Supports numeric types such as int, float, Decimal, and Fraction,
    but not complex numbers which are unorderable.
    N©Úfuncr   r`  )ru   r   Úminrš   rm  rc  s      ri   rT   rT   Ä  óO   € õ& �H‰~Œ~€Hà€~Ý˜(­Ð-Ñ-Ô-Ð-à�‚{€{ÝÐ9Ñ:Ô:Ð:å  ¨6Ñ2Ô2Ð2rj   c              #   ól  K  — t          ¦   «         }t          | ¦  «        D ]“\  }}|r)|d         d         ||z
  k    r|                     ¦   «          |r:|d         d         |k    s(|                     ¦   «          |r|d         d         |k    ¯(|                     ||f¦  «         |d         d         V — Œ”d S ri  rj  )ry   rq   Úsdsr#   r¨   s        ri   Ú_windowed_running_maxrv  â  rn  rj   c                óš   — t          | ¦  «        }|€t          |t          ¬¦  «        S |dk    rt          d¦  «        ‚t	          ||¦  «        S )aC  Largest of values seen so far or values in a sliding window.

    Set *maxlen* to a positive integer to specify the maximum size
    of the sliding window.  The default of *None* is equivalent to
    an unbounded window.

    For example:

        >>> list(running_max([4, 3, 7, 0, 8, 1, 6, 2, 9, 5]))
        [4, 4, 7, 7, 8, 8, 8, 8, 9, 9]

        >>> list(running_max([4, 3, 7, 0, 8, 1, 6, 2, 9, 5], maxlen=3))
        [4, 4, 7, 7, 8, 8, 8, 6, 9, 9]

    Supports numeric types such as int, float, Decimal, and Fraction,
    but not complex numbers which are unorderable.
    Nrp  r   r`  )ru   r   rs   rš   rv  rc  s      ri   rQ   rQ   í  rs  rj   )ÚfrozenÚslotsc                   óB   — e Zd ZU eed<   eed<   eed<   eed<   eed<   dS )r,   rv   ÚminimumÚmedianÚmaximumÚmeanN)Ú__name__Ú
__module__Ú__qualname__r  Ú__annotations__ÚfloatrË   rj   ri   r,   r,     s=   € € € € € € à
€I€I�IØ€N€N�NØ€M€M�MØ€N€N�NØ
€K€K�K€K€Krj   r,   c                óJ  — t          | d¦  «        \  }}}}t          t          |€t          d¦  «        n*t	          t          d|¦  «        t          |¦  «        ¦  «        t          ||¬¦  «        t          ||¬¦  «        t          ||¬¦  «        t          ||¬¦  «        ¦  «        S )a  Statistics for values seen so far or values in a sliding window.

    Set *maxlen* to a positive integer to specify the maximum size
    of the sliding window.  The default of *None* is equivalent to
    an unbounded window.

    Yields instances of a ``Stats`` dataclass with fields for the dataset *size*,
    *minimum* value, *median* value, *maximum* value, and the arithmetic *mean*.

    Supports numeric types such as int, float, Decimal, and Fraction,
    but not complex numbers which are unorderable.
    é   Nr³   rp   )r   rl   r,   r   r   rŸ   r   rT   rS   rQ   rR   )rh   rq   Út0rç   rè   ré   s         ri   rU   rU     s›   € õ ˜ 1Ñ%Ô%�N€BˆˆB�ÝÝØ�N�ˆa‰Œˆ­­e°A°vÑ.>Ô.>ÅÀvÁÄÑ(OÔ(OÝ�B˜vÐ&Ñ&Ô&Ý�r &Ð)Ñ)Ô)Ý�B˜vÐ&Ñ&Ô&Ý�R Ð'Ñ'Ô'ñô ð rj   c                 óŠ  — t          | ¦  «        }t          |¦  «        dk     r$t          |¦  «        dk    rdS t          d¦  «        ‚t          t	          t          |¦  «        ¦  «        ¦  «        }t          |¦  «        }	 t          |¦  «         t          t          t          ||¦  «        ¦  «        s t          |Ž |¦  «        S ŒE)z�Return a random derangement of elements in the iterable.

    Equivalent to but much faster than ``choice(list(derangements(iterable)))``.

    rñ   r   rË   zNo derangments to choose from)
r‡   rr   rÖ   rf   rŸ   r*   Úanyrl   r$   r%   )rh   rô   Úpermrn   s       ri   rL   rL   /  s«   € õ �‰/Œ/€CÝ
ˆ3�x„x�!‚|€|Ýˆs‰8Œ8�qŠ=ˆ=Ø�2ÝÐ8Ñ9Ô9Ð9Ý••c˜#‘h”h‘”Ñ Ô €DÝ�$‰KŒK€Eð*Ý�‰ŒˆÝ•3•s˜E 4Ñ(Ô(Ñ)Ô)ð 	*Ø$•:˜tÐ$ SÑ)Ô)Ð)ð*rj   )r   r¤   )r”   N)NF)NN)r   N)�Ú__doc__ÚrandomÚbisectr   r   Úcollectionsr   Ú
contextlibr   Údataclassesr   Ú	functoolsr	   r
   Úheapqr   r   Ú	itertoolsr   r   r   r   r   r   r   r   r   r   r“   r   r   r   r   r   r   Úmathr   r   r   r    Úoperatorr!   r"   r#   ra  r$   r%   r&   r'   r(   r)   r*   Úsysr+   Ú__all__ÚobjectÚ_markerrc   rd   rb  ÚImportErrorr\   rZ   r[   r0   r>   r-   r¬   rH   rA   r@   r=   r2   rŒ   rÛ   r5   rO   r6   rP   rB   rF   ra   rb   r`   r8   r3   rN   rM   rK   rJ   r?   rG   r1   r/   r_   rì   rî   rW   rX   rD   r9   rV   r  r.   r  r^   Ústrr   r  r  rI   r;   r"  r‡   r%  r4   rC   rY   rE   r]   rK  rA  rE  ÚRandomrH  r7   r:   r<   rX  rZ  r^  rS   rf  rR   rm  rT   rv  rQ   r,   rU   rL   rË   rj   ri   ú<module>rœ     sC  ððð ð €€€à &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð$ (Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LØ 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø Ð Ð Ð Ð Ð ð9ð 9ð 9€ðv ˆ&‰(Œ(€ðØ3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ð ÐÐøð ð  ð  ð  ØÐÐÐð øøøð%ð %ð %ð 'ð 'ð 'ð 'ð$8ð 8ð 8ð %+ð %+ð %+ð %+ðP
4ð 
4ð 
4ð 
4ðð ð ð ð4 !ð $ð $ð $ð $ð)ð )ð )ð €ð;ð ;ð ;ð
%ð 
%ð 
%ðØ(Ð(Ð(Ð(Ð(Ð(Ð(øØð ð ð Ø€H€H€Hðøøøð	.ð 	.ð 	.ð2ð 2ð 2ð 2ð6	(ð 	(ð 	(ð&Að &Að &Að &AðR(ð (ð (ð$%-ð %-ð %-ðPNð Nð Nð*!ð !ð !ð !ðHAð Að Að Að/ð /ð /ð /ð(ð ð ð ð:1ð 1ð 1ð 1ð( '(ð %ð %ð %ð %ð %ð("ð "ð "ð "ð$-ð -ð -ð -ð -ð -ð"ð ð ðD$ð $ð $ð('ð ('ð ('ðVð ð ð&ð ð ð ð ð ðð ð ð?ð ?ð ?ð2-ð -ð -ðð ð ð,&;ð &;ð &;ð &;ðR*ð *ð *ð* %*ð ð ð ð ð ð( �ÒÐØ6Ð6Ð6Ð6Ð6Ð6à',ð =ð =ð =ð =ð =ð Ô&€G„O€Oà€Gð	%ð 	%ð 	%ð #& u ð )ð )ð )ð )ð1ð 1ð 1ð&'ð &'ð &'ðREð Eð Eð)ð )ð )ð  �E˜%˜% ™*œ*Ñ%Ô%Ð ðð ð ðB*ð *ð *ð.$ð $ð $ð0ð 0ð 0ð&ð ð ð2ð ð €ð ðð ñ „ððð ð ð& #�V”]‘_”_Ô.Ð ð-Bð -Bð -Bð`ð ð ð*7ð *7ð *7ðZ&ð &ð &ð &ð &ð &ð Ið Ið Ið& (,ð "9ð "9ð "9ð "9ð "9ðJ(ð (ð (ð &*ð 4ð 4ð 4ð 4ð 4ðBð ð ð %)ð 3ð 3ð 3ð 3ð 3ð<ð ð ð %)ð 3ð 3ð 3ð 3ð 3ð< €�$˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð ,0ð ð ð ð ð ð6*ð *ð *ð *ð *s$   ÂB ÂB'Â&B'ÃC ÃC"Ã!C"