
    EdI                        d Z ddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZ ddlmZmZ edd
            Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z! G d d          Z"e G d de                      Z#d	S )z@Tools and arithmetics for monomials of distributed polynomials.     )combinations_with_replacementproduct)dedent)MulSTuplesympify)ExactQuotientFailed)PicklableWithSlotsdict_from_expr)public)is_sequenceiterableNc           	   #     K   t          |           }t                    rt                    |k    rt          d          dg|z  nht                    st          d          t                    |k    rt          d          t          d D                       rt          d          d}n5}|dk     rt          d          d}ndk     rt          d	          }d
}|r||k    rdS | r|dk    rt          j        V  dS t          |           t          j        gz   } t          d | D                       rg }t          | |          D ]j}d | D             }	|D ]}
|
dk    r|	|
xx         dz  cc<   t          |	
                                          |k    r|                    t          |            kt          |          E d{V  dS g }t          | |          D ]j}d | D             }	|D ]}
|
dk    r|	|
xx         dz  cc<   t          |	
                                          |k    r|                    t          |            kt          |          E d{V  dS t          fdt          |          D                       rt          d          g }t!          |           D ]8\  }}|                    fdt          ||dz             D                        9t          | D ]}	t          |	 V  dS )a  
    ``max_degrees`` and ``min_degrees`` are either both integers or both lists.
    Unless otherwise specified, ``min_degrees`` is either ``0`` or
    ``[0, ..., 0]``.

    A generator of all monomials ``monom`` is returned, such that
    either
    ``min_degree <= total_degree(monom) <= max_degree``,
    or
    ``min_degrees[i] <= degree_list(monom)[i] <= max_degrees[i]``,
    for all ``i``.

    Case I. ``max_degrees`` and ``min_degrees`` are both integers
    =============================================================

    Given a set of variables $V$ and a min_degree $N$ and a max_degree $M$
    generate a set of monomials of degree less than or equal to $N$ and greater
    than or equal to $M$. The total number of monomials in commutative
    variables is huge and is given by the following formula if $M = 0$:

        .. math::
            \frac{(\#V + N)!}{\#V! N!}

    For example if we would like to generate a dense polynomial of
    a total degree $N = 50$ and $M = 0$, which is the worst case, in 5
    variables, assuming that exponents and all of coefficients are 32-bit long
    and stored in an array we would need almost 80 GiB of memory! Fortunately
    most polynomials, that we will encounter, are sparse.

    Consider monomials in commutative variables $x$ and $y$
    and non-commutative variables $a$ and $b$::

        >>> from sympy import symbols
        >>> from sympy.polys.monomials import itermonomials
        >>> from sympy.polys.orderings import monomial_key
        >>> from sympy.abc import x, y

        >>> sorted(itermonomials([x, y], 2), key=monomial_key('grlex', [y, x]))
        [1, x, y, x**2, x*y, y**2]

        >>> sorted(itermonomials([x, y], 3), key=monomial_key('grlex', [y, x]))
        [1, x, y, x**2, x*y, y**2, x**3, x**2*y, x*y**2, y**3]

        >>> a, b = symbols('a, b', commutative=False)
        >>> set(itermonomials([a, b, x], 2))
        {1, a, a**2, b, b**2, x, x**2, a*b, b*a, x*a, x*b}

        >>> sorted(itermonomials([x, y], 2, 1), key=monomial_key('grlex', [y, x]))
        [x, y, x**2, x*y, y**2]

    Case II. ``max_degrees`` and ``min_degrees`` are both lists
    ===========================================================

    If ``max_degrees = [d_1, ..., d_n]`` and
    ``min_degrees = [e_1, ..., e_n]``, the number of monomials generated
    is:

    .. math::
        (d_1 - e_1 + 1) (d_2 - e_2 + 1) \cdots (d_n - e_n + 1)

    Let us generate all monomials ``monom`` in variables $x$ and $y$
    such that ``[1, 2][i] <= degree_list(monom)[i] <= [2, 4][i]``,
    ``i = 0, 1`` ::

        >>> from sympy import symbols
        >>> from sympy.polys.monomials import itermonomials
        >>> from sympy.polys.orderings import monomial_key
        >>> from sympy.abc import x, y

        >>> sorted(itermonomials([x, y], [2, 4], [1, 2]), reverse=True, key=monomial_key('lex', [x, y]))
        [x**2*y**4, x**2*y**3, x**2*y**2, x*y**4, x*y**3, x*y**2]
    zArgument sizes do not matchNr   zmin_degrees is not a listc              3   "   K   | ]
}|d k     V  dS r   N .0is     5lib/python3.11/site-packages/sympy/polys/monomials.py	<genexpr>z itermonomials.<locals>.<genexpr>b   s&      ..Q1q5......    z+min_degrees cannot contain negative numbersFzmax_degrees cannot be negativezmin_degrees cannot be negativeTc              3   $   K   | ]}|j         V  d S N)is_commutativer   variables     r   r   z itermonomials.<locals>.<genexpr>x   s%      AA8x&AAAAAAr   c                     i | ]}|d S r   r   r   s     r   
<dictcomp>z!itermonomials.<locals>.<dictcomp>{       @@@((A@@@r      )repeatc                     i | ]}|d S r    r   r   s     r   r!   z!itermonomials.<locals>.<dictcomp>   r"   r   c              3   <   K   | ]}|         |         k    V  d S r   r   )r   r   max_degreesmin_degreess     r   r   z itermonomials.<locals>.<genexpr>   s0      AA1{1~A.AAAAAAr   z2min_degrees[i] must be <= max_degrees[i] for all ic                     g | ]}|z  S r   r   )r   r   vars     r   
<listcomp>z!itermonomials.<locals>.<listcomp>   s    HHH1QHHHr   )lenr   
ValueErroranyr   Onelistallr   sumvaluesappendr   setr   rangezip)	variablesr'   r(   ntotal_degree
max_degree
min_degreemonomials_list_commitempowersr   monomials_list_non_commpower_listsmin_dmax_dr*   s    ``            @r   itermonomialsrD      s     T 	IA; {q  	<:;;; 	P#a%KK[)) 	P8999;1$ @ !>???..+..... P !NOOO 
> 	?=>>> 	%JJQ C !ABBB$J #
" 	F 	J!O 	%KKKFOOqug-	AAyAAAAA 	4"$5iLL ; ;@@i@@@ $ . .H1} .x(((A-(((v}}'':5 ;'..sDz:::.///////////&(#	*=== ? ?@@i@@@ $ . .H1} .x(((A-(((v}}'':5 ?+223:>>>233333333333AAAAAaAAAAA 	SQRRR!$Y[!I!I 	J 	JCHHHHeUQY0G0GHHHIIII{+ 	 	Fv,	 	r   c                 Z    ddl m}  || |z              ||           z   ||          z  S )aW  
    Computes the number of monomials.

    The number of monomials is given by the following formula:

    .. math::

        \frac{(\#V + N)!}{\#V! N!}

    where `N` is a total degree and `V` is a set of variables.

    Examples
    ========

    >>> from sympy.polys.monomials import itermonomials, monomial_count
    >>> from sympy.polys.orderings import monomial_key
    >>> from sympy.abc import x, y

    >>> monomial_count(2, 2)
    6

    >>> M = list(itermonomials([x, y], 2))

    >>> sorted(M, key=monomial_key('grlex', [y, x]))
    [1, x, y, x**2, x*y, y**2]
    >>> len(M)
    6

    r   )	factorial)(sympy.functions.combinatorial.factorialsrF   )VNrF   s      r   monomial_countrJ      sE    < CBBBBB9QUiill*YYq\\99r   c                 P    t          d t          | |          D                       S )a%  
    Multiplication of tuples representing monomials.

    Examples
    ========

    Lets multiply `x**3*y**4*z` with `x*y**2`::

        >>> from sympy.polys.monomials import monomial_mul

        >>> monomial_mul((3, 4, 1), (1, 2, 0))
        (4, 6, 1)

    which gives `x**4*y**5*z`.

    c                     g | ]
\  }}||z   S r   r   r   abs      r   r+   z monomial_mul.<locals>.<listcomp>        000TQ1q5000r   tupler7   ABs     r   monomial_mulrV      s)    " 00SAYY000111r   c                 v    t          | |          }t          d |D                       rt          |          S dS )a  
    Division of tuples representing monomials.

    Examples
    ========

    Lets divide `x**3*y**4*z` by `x*y**2`::

        >>> from sympy.polys.monomials import monomial_div

        >>> monomial_div((3, 4, 1), (1, 2, 0))
        (2, 2, 1)

    which gives `x**2*y**2*z`. However::

        >>> monomial_div((3, 4, 1), (1, 2, 2)) is None
        True

    `x*y**2*z**2` does not divide `x**3*y**4*z`.

    c              3   "   K   | ]
}|d k    V  dS r   r   )r   cs     r   r   zmonomial_div.<locals>.<genexpr>   s&      

a16





r   N)monomial_ldivr1   rR   )rT   rU   Cs      r   monomial_divr\      sB    , 	aA


1


 Qxxtr   c                 P    t          d t          | |          D                       S )a  
    Division of tuples representing monomials.

    Examples
    ========

    Lets divide `x**3*y**4*z` by `x*y**2`::

        >>> from sympy.polys.monomials import monomial_ldiv

        >>> monomial_ldiv((3, 4, 1), (1, 2, 0))
        (2, 2, 1)

    which gives `x**2*y**2*z`.

        >>> monomial_ldiv((3, 4, 1), (1, 2, 2))
        (2, 2, -1)

    which gives `x**2*y**2*z**-1`.

    c                     g | ]
\  }}||z
  S r   r   rM   s      r   r+   z!monomial_ldiv.<locals>.<listcomp>   rP   r   rQ   rS   s     r   rZ   rZ      s)    , 00SAYY000111r   c                 :    t          fd| D                       S )z%Return the n-th pow of the monomial. c                     g | ]}|z  S r   r   )r   rN   r9   s     r   r+   z monomial_pow.<locals>.<listcomp>   s    ###11Q3###r   )rR   )rT   r9   s    `r   monomial_powra      s&    #######$$$r   c                 P    t          d t          | |          D                       S )a.  
    Greatest common divisor of tuples representing monomials.

    Examples
    ========

    Lets compute GCD of `x*y**4*z` and `x**3*y**2`::

        >>> from sympy.polys.monomials import monomial_gcd

        >>> monomial_gcd((1, 4, 1), (3, 2, 0))
        (1, 2, 0)

    which gives `x*y**2`.

    c                 4    g | ]\  }}t          ||          S r   )minrM   s      r   r+   z monomial_gcd.<locals>.<listcomp>  $    444A3q!99444r   rQ   rS   s     r   monomial_gcdrf     )    " 44Q444555r   c                 P    t          d t          | |          D                       S )a1  
    Least common multiple of tuples representing monomials.

    Examples
    ========

    Lets compute LCM of `x*y**4*z` and `x**3*y**2`::

        >>> from sympy.polys.monomials import monomial_lcm

        >>> monomial_lcm((1, 4, 1), (3, 2, 0))
        (3, 4, 1)

    which gives `x**3*y**4*z`.

    c                 4    g | ]\  }}t          ||          S r   )maxrM   s      r   r+   z monomial_lcm.<locals>.<listcomp>&  re   r   rQ   rS   s     r   monomial_lcmrk     rg   r   c                 P    t          d t          | |          D                       S )z
    Does there exist a monomial X such that XA == B?

    Examples
    ========

    >>> from sympy.polys.monomials import monomial_divides
    >>> monomial_divides((1, 2), (3, 4))
    True
    >>> monomial_divides((1, 2), (0, 2))
    False
    c              3   (   K   | ]\  }}||k    V  d S r   r   rM   s      r   r   z#monomial_divides.<locals>.<genexpr>5  s*      ,,$!QqAv,,,,,,r   )r1   r7   rS   s     r   monomial_dividesrn   (  s)     ,,#a)),,,,,,r   c                      t          | d                   }| dd         D ]0}t          |          D ]\  }}t          ||         |          ||<   1t          |          S )a  
    Returns maximal degree for each variable in a set of monomials.

    Examples
    ========

    Consider monomials `x**3*y**4*z**5`, `y**5*z` and `x**6*y**3*z**9`.
    We wish to find out what is the maximal degree for each of `x`, `y`
    and `z` variables::

        >>> from sympy.polys.monomials import monomial_max

        >>> monomial_max((3,4,5), (0,5,1), (6,3,9))
        (6, 5, 9)

    r   r#   N)r0   	enumeraterj   rR   monomsMrI   r   r9   s        r   monomial_maxrt   7  l    " 	VAYAABBZ    aLL 	  	 DAqqtQ<<AaDD	  88Or   c                      t          | d                   }| dd         D ]0}t          |          D ]\  }}t          ||         |          ||<   1t          |          S )a  
    Returns minimal degree for each variable in a set of monomials.

    Examples
    ========

    Consider monomials `x**3*y**4*z**5`, `y**5*z` and `x**6*y**3*z**9`.
    We wish to find out what is the minimal degree for each of `x`, `y`
    and `z` variables::

        >>> from sympy.polys.monomials import monomial_min

        >>> monomial_min((3,4,5), (0,5,1), (6,3,9))
        (0, 3, 1)

    r   r#   N)r0   rp   rd   rR   rq   s        r   monomial_minrw   P  ru   r   c                      t          |           S )z
    Returns the total degree of a monomial.

    Examples
    ========

    The total degree of `xy^2` is 3:

    >>> from sympy.polys.monomials import monomial_deg
    >>> monomial_deg((1, 2))
    3
    )r2   )rs   s    r   monomial_degry   i  s     q66Mr   c                     | \  }}|\  }}t          ||          }|j        r|||                    ||          fS dS |||z  s||                    ||          fS dS )z,Division of two terms in over a ring/field. N)r\   is_Fieldquo)rN   rO   domaina_lma_lcb_lmb_lcmonoms           r   term_divr   x  s    JD$JD$t$$E 	 	&**T400004 	 	&**T400004r   c                   N    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZdS )MonomialOpsz6Code generator of fast monomial arithmetic functions. c                     || _         d S r   )ngens)selfr   s     r   __init__zMonomialOps.__init__  s    


r   c                 6    i }t          ||           ||         S r   )exec)r   codenamenss       r   _buildzMonomialOps._build  s    T2$xr   c                 D    fdt          | j                  D             S )Nc                     g | ]}|	S r   r   )r   r   r   s     r   r+   z%MonomialOps._vars.<locals>.<listcomp>  s"    @@@44#@@@r   )r6   r   )r   r   s    `r   _varszMonomialOps._vars  s'    @@@@U4:->->@@@@r   c           	      v   d}t          d          }|                     d          }|                     d          }d t          ||          D             }|t          |d                    |          d                    |          d                    |                    z  }|                     ||          S )NrV   s        def %(name)s(A, B):
            (%(A)s,) = A
            (%(B)s,) = B
            return (%(AB)s,)
        rN   rO   c                 "    g | ]\  }}|d |S ) + r   rM   s      r   r+   z#MonomialOps.mul.<locals>.<listcomp>  '    999daAAAqq!999r   , r   rT   rU   ABr   r   r7   dictjoinr   r   r   templaterT   rU   r   r   s          r   mulzMonomialOps.mul  s        JJsOOJJsOO99c!Qii999$DDIIaLLDIIaLLTYYWY]][[[[{{4&&&r   c                    d}t          d          }|                     d          }d |D             }|t          |d                    |          d                    |                    z  }|                     ||          S )Nra   zZ        def %(name)s(A, k):
            (%(A)s,) = A
            return (%(Ak)s,)
        rN   c                     g | ]}d |z  S )z%s*kr   )r   rN   s     r   r+   z#MonomialOps.pow.<locals>.<listcomp>  s    &&&avz&&&r   r   )r   rT   Ak)r   r   r   r   r   )r   r   r   rT   r   r   s         r   powzMonomialOps.pow  s       
 JJsOO&&1&&&$DDIIaLLTYYr]]KKKK{{4&&&r   c           	      v   d}t          d          }|                     d          }|                     d          }d t          ||          D             }|t          |d                    |          d                    |          d                    |                    z  }|                     ||          S )Nmonomial_mulpowzw        def %(name)s(A, B, k):
            (%(A)s,) = A
            (%(B)s,) = B
            return (%(ABk)s,)
        rN   rO   c                 $    g | ]\  }}|d |dS )r   z*kr   rM   s      r   r+   z&MonomialOps.mulpow.<locals>.<listcomp>  s)    <<<Aqqq!!!$<<<r   r   )r   rT   rU   ABkr   )r   r   r   rT   rU   r   r   s          r   mulpowzMonomialOps.mulpow  s         JJsOOJJsOO<<Q<<<$DDIIaLLDIIaLLdiiX[nn]]]]{{4&&&r   c           	      v   d}t          d          }|                     d          }|                     d          }d t          ||          D             }|t          |d                    |          d                    |          d                    |                    z  }|                     ||          S )NrZ   r   rN   rO   c                 "    g | ]\  }}|d |S )z - r   rM   s      r   r+   z$MonomialOps.ldiv.<locals>.<listcomp>  r   r   r   r   r   r   s          r   ldivzMonomialOps.ldiv  s        JJsOOJJsOO99c!Qii999$DDIIaLLDIIaLLTYYWY]][[[[{{4&&&r   c           
         d}t          d          }|                     d          }|                     d          }d t          | j                  D             }|                     d          }|t	          |d                    |          d                    |          d                    |          d                    |          	          z  }|                     ||          S )
Nr\   z        def %(name)s(A, B):
            (%(A)s,) = A
            (%(B)s,) = B
            %(RAB)s
            return (%(R)s,)
        rN   rO   c                 4    g | ]}d t          |          z  S )z7r%(i)s = a%(i)s - b%(i)s
    if r%(i)s < 0: return None)r   )r   r   s     r   r+   z#MonomialOps.div.<locals>.<listcomp>  s(    sss[\JTTUYYYVsssr   rr   z
    )r   rT   rU   RABR)r   r   r6   r   r   r   r   )r   r   r   rT   rU   r   r   r   s           r   divzMonomialOps.div  s        JJsOOJJsOOss`efjfp`q`qsssJJsOO$DDIIaLLDIIaLLhmm\_N`N`dhdmdmnodpdpqqqq{{4&&&r   c           	      v   d}t          d          }|                     d          }|                     d          }d t          ||          D             }|t          |d                    |          d                    |          d                    |                    z  }|                     ||          S )Nrk   r   rN   rO   c           	      .    g | ]\  }}|d |d|d|S ) if z >=  else r   rM   s      r   r+   z#MonomialOps.lcm.<locals>.<listcomp>  3    NNN41a111aaaAA6NNNr   r   r   r   r   s          r   lcmzMonomialOps.lcm          JJsOOJJsOONN3q!99NNN$DDIIaLLDIIaLLTYYWY]][[[[{{4&&&r   c           	      v   d}t          d          }|                     d          }|                     d          }d t          ||          D             }|t          |d                    |          d                    |          d                    |                    z  }|                     ||          S )Nrf   r   rN   rO   c           	      .    g | ]\  }}|d |d|d|S )r   z <= r   r   rM   s      r   r+   z#MonomialOps.gcd.<locals>.<listcomp>  r   r   r   r   r   r   s          r   gcdzMonomialOps.gcd  r   r   N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s        @@    
A A A' ' '
' 
' 
'' ' '' ' '' ' ' ' ' '' ' ' ' 'r   r   c                   x    e Zd ZdZdZddZddZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd ZeZd Zd Zd ZdS )Monomialz9Class representing a monomial, i.e. a product of powers. )	exponentsgensNc                    t          |          st          t          |          |          \  }}t          |          dk    rSt	          |                                          d         dk    r(t	          |                                          d         }n"t          d                    |                    t          t          t          |                    | _        || _        d S )N)r   r#   r   zExpected a monomial got {})r   r   r	   r,   r0   r3   keysr-   formatrR   mapintr   r   )r   r   r   reps       r   r   zMonomial.__init__   s     	M&wu~~DAAAIC3xx1} Mcjjll!3!3A!6!!; MSXXZZ((+ !=!D!DU!K!KLLLs3//			r   c                 <    |                      ||p| j                  S r   )	__class__r   )r   r   r   s      r   rebuildzMonomial.rebuild  s    ~~i):;;;r   c                 *    t          | j                  S r   )r,   r   r   s    r   __len__zMonomial.__len__  s    4>"""r   c                 *    t          | j                  S r   )iterr   r   s    r   __iter__zMonomial.__iter__  s    DN###r   c                     | j         |         S r   )r   )r   r>   s     r   __getitem__zMonomial.__getitem__  s    ~d##r   c                 N    t          | j        j        | j        | j        f          S r   )hashr   r   r   r   r   s    r   __hash__zMonomial.__hash__  s     T^,dndiHIIIr   c                     | j         r7d                    d t          | j         | j                  D                       S | j        j        d| j        dS )N*c                 "    g | ]\  }}|d |S )z**r   r   genexps      r   r+   z$Monomial.__str__.<locals>.<listcomp>  s'    dddS###ss3dddr   ())r   r   r7   r   r   r   r   s    r   __str__zMonomial.__str__  sZ    9 	H88ddC	SWSaDbDbdddeee#~666GGr   c                     |p| j         }|st          d| z            t          d t          || j                  D              S )z3Convert a monomial instance to a SymPy expression. z5Cannot convert %s to an expression without generatorsc                     g | ]
\  }}||z  S r   r   r   s      r   r+   z$Monomial.as_expr.<locals>.<listcomp>(  s     JJJ83c3hJJJr   )r   r-   r   r7   r   )r   r   s     r   as_exprzMonomial.as_expr   s\     ty 	PG$NP P P JJs4/H/HJJJKKr   c                     t          |t                    r|j        }n!t          |t          t          f          r|}ndS | j        |k    S )NF)
isinstancer   r   rR   r   r   otherr   s      r   __eq__zMonomial.__eq__*  sL    eX&& 	IIu~.. 	II5~**r   c                     | |k     S r   r   )r   r   s     r   __ne__zMonomial.__ne__4  s    5=  r   c                     t          |t                    r|j        }n&t          |t          t          f          r|}nt
          |                     t          | j        |                    S r   )r   r   r   rR   r   NotImplementedErrorr   rV   r   s      r   __mul__zMonomial.__mul__7  s^    eX&& 	&IIu~.. 	&II%%||LCCDDDr   c                    t          |t                    r|j        }n&t          |t          t          f          r|}nt
          t          | j        |          }||                     |          S t          | t          |                    r   )	r   r   r   rR   r   r   r\   r   r
   )r   r   r   results       r   __truediv__zMonomial.__truediv__A  s    eX&& 	&IIu~.. 	&II%%dni88 	=<<'''%dHUOO<<<r   c                 (   t          |          }|s&|                     dgt          |           z            S |dk    rD| j        }t	          d|          D ]}t          || j                  }|                     |          S t          d|z            )Nr   r#   z'a non-negative integer expected, got %s)r   r   r,   r   r6   rV   r-   )r   r   r9   r   r   s        r   __pow__zMonomial.__pow__R  s    JJ 
	P<<CII...U 	PI1a[[ D D(DNCC		<<	***FNOOOr   c                     t          |t                    r|j        }n1t          |t          t          f          r|}nt          d|z            |                     t          | j        |                    S )z&Greatest common divisor of monomials. .an instance of Monomial class expected, got %s)r   r   r   rR   r   	TypeErrorr   rf   r   s      r   r   zMonomial.gcda  y    eX&& 	JIIu~.. 	JII@5HJ J J ||LCCDDDr   c                     t          |t                    r|j        }n1t          |t          t          f          r|}nt          d|z            |                     t          | j        |                    S )z$Least common multiple of monomials. r   )r   r   r   rR   r   r   r   rk   r   s      r   r   zMonomial.lcmm  r   r   r   )r   r   r   r   	__slots__r   r   r   r   r   r   r   r   r   r   r   r   __floordiv__r   r   r   r   r   r   r   r     s(       CC%I	 	 	 	< < < <# # #$ $ $$ $ $J J JH H HL L L+ + +! ! !E E E= = = LP P P
E 
E 
E
E 
E 
E 
E 
Er   r   r   )$r   	itertoolsr   r   textwrapr   
sympy.corer   r   r   r	   sympy.polys.polyerrorsr
   sympy.polys.polyutilsr   r   sympy.utilitiesr   sympy.utilities.iterablesr   r   rD   rJ   rV   r\   rZ   ra   rf   rk   rn   rt   rw   ry   r   r   r   r   r   r   <module>r     s   F F = < < < < < < <       - - - - - - - - - - - - 6 6 6 6 6 6 D D D D D D D D " " " " " " ; ; ; ; ; ; ; ;E E E EN: : :B2 2 2&  :2 2 20% % %6 6 6&6 6 6&- - -  2  2    $n' n' n' n' n' n' n' n'` |E |E |E |E |E! |E |E |E |E |Er   