???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3

  \T             $   @   sF  d ddddddddd	d
dddddddddddddddddddddd d!d"d#g$Z eZd$Zd%Zd&Zd'd(lZd'd(lZd'd(l	Z	yd'd)l
mZ edd*ZW n ek
r   d+d, ZY nX dZdZdZdZdZdZdZdZd-Ze	jdkrd1Zd1ZdZnd2Zd2ZdZeed0  ZG d3d deZG d4d deZG d5d deZ G d6d de Z!G d7d	 d	ee"Z#G d8d de Z$G d9d de e"Z%G d:d
 d
eZ&G d;d de Z'G d<d deZ(G d=d deZ)G d>d de&e(Z*G d?d de&e(e)Z+G d@d dee,Z-ee#e&e*e(e+e e)e-g	Z.e!e e$e e%e e'e iZ/eeeeeeeefZ0yd'd(l1Z1W n. ek
rd   G dAdB dBe2Z3e3 Z1[3Y nX y
e1j4 W n> e5k
r   e6e1j7 dCre1j7 `8dDd Z9dEd Z:Y n6X e1j4 Z4e6e4dCre4`8e4fdFdZ:e4fdGdZ9[1[4ddHdZ;G dId  d e2Z<ddKdLZ=ej>j?e< G dMdN dNe2Z@G dOd de2ZAG dPdQ dQe2ZBddRdSZCeDjEZFdTdU ZGdVdW ZHdXdY ZIdZd[ ZJdd]d^ZKd_d` ZLdadb ZMG dcdd dde2ZNeN jOZPddedfZQdgdh ZRdidj ZSdkdldmdndodpdqdrdsdt	fdudvZTddwdxZUddydzZVeAd{ee#e*e gg d|dd0d'd}ZWeAd~ee#e*e ee+gg dZXeAd~eg g dZYd'd(lZZZeZj[deZj\eZj]B j^Z_eZj[dj^Z`eZj[dj^ZaeZj[deZj\eZjbB Zc[Zyd'd(ldZeW n ek
r   Y nX dddZfdd Zgdd ZhdddZidd Zjdd Zke<dZle<dZme<dZne<d'Zoe<d0Zpe<dZqelemfZre	jsjtZue	jsjvZwe	jsjxZyezdreud. euZ{[	d(S )DecimalContextDecimalTupleDefaultContextBasicContextExtendedContextDecimalExceptionClampedInvalidOperationDivisionByZeroInexactRounded	SubnormalOverflow	UnderflowFloatOperationDivisionImpossibleInvalidContextConversionSyntaxDivisionUndefined
ROUND_DOWNROUND_HALF_UPROUND_HALF_EVENROUND_CEILINGROUND_FLOORROUND_UPROUND_HALF_DOWN
ROUND_05UP
setcontext
getcontextlocalcontextMAX_PRECMAX_EMAXMIN_EMIN	MIN_ETINYHAVE_THREADSZdecimalz1.70z2.4.2    N)
namedtuplezsign digits exponentc              G   s   | S )N )argsr'   r'   "/usr/lib64/python3.6/_pydecimal.py<lambda>   s    r*   T   ?      l   NZoi@Tc               @   s   e Zd Zdd ZdS )r   c             G   s   d S )Nr'   )selfcontextr(   r'   r'   r)   handle   s    zDecimalException.handleN)__name__
__module____qualname__r0   r'   r'   r'   r)   r      s   c               @   s   e Zd ZdS )r   N)r1   r2   r3   r'   r'   r'   r)   r      s   
c               @   s   e Zd Zdd ZdS )r	   c             G   s,   |r(t |d j|d jdd}|j|S tS )Nr%   nT)_dec_from_triple_sign_int_fix_nan_NaN)r.   r/   r(   ansr'   r'   r)   r0      s    
zInvalidOperation.handleN)r1   r2   r3   r0   r'   r'   r'   r)   r	      s   c               @   s   e Zd Zdd ZdS )r   c             G   s   t S )N)r9   )r.   r/   r(   r'   r'   r)   r0     s    zConversionSyntax.handleN)r1   r2   r3   r0   r'   r'   r'   r)   r      s   c               @   s   e Zd Zdd ZdS )r
   c             G   s   t | S )N)_SignedInfinity)r.   r/   signr(   r'   r'   r)   r0     s    zDivisionByZero.handleN)r1   r2   r3   r0   r'   r'   r'   r)   r
     s   c               @   s   e Zd Zdd ZdS )r   c             G   s   t S )N)r9   )r.   r/   r(   r'   r'   r)   r0     s    zDivisionImpossible.handleN)r1   r2   r3   r0   r'   r'   r'   r)   r     s   c               @   s   e Zd Zdd ZdS )r   c             G   s   t S )N)r9   )r.   r/   r(   r'   r'   r)   r0   )  s    zDivisionUndefined.handleN)r1   r2   r3   r0   r'   r'   r'   r)   r   !  s   c               @   s   e Zd ZdS )r   N)r1   r2   r3   r'   r'   r'   r)   r   ,  s   
c               @   s   e Zd Zdd ZdS )r   c             G   s   t S )N)r9   )r.   r/   r(   r'   r'   r)   r0   C  s    zInvalidContext.handleN)r1   r2   r3   r0   r'   r'   r'   r)   r   8  s   c               @   s   e Zd ZdS )r   N)r1   r2   r3   r'   r'   r'   r)   r   F  s   
c               @   s   e Zd ZdS )r   N)r1   r2   r3   r'   r'   r'   r)   r   R  s   	c               @   s   e Zd Zdd ZdS )r   c             G   s   |j ttttfkrt| S |dkrR|j tkr4t| S t|d|j |j	|j d S |dkr|j t
krlt| S t|d|j |j	|j d S d S )Nr%   9r-   )roundingr   r   r   r   r;   r   r5   precEmaxr   )r.   r/   r<   r(   r'   r'   r)   r0   s  s    


zOverflow.handleN)r1   r2   r3   r0   r'   r'   r'   r)   r   ]  s   c               @   s   e Zd ZdS )r   N)r1   r2   r3   r'   r'   r'   r)   r     s   c               @   s   e Zd ZdS )r   N)r1   r2   r3   r'   r'   r'   r)   r     s   c               @   s   e Zd ZefddZdS )MockThreadingc             C   s
   |j t S )N)modules	__xname__)r.   sysr'   r'   r)   local  s    zMockThreading.localN)r1   r2   r3   rD   rE   r'   r'   r'   r)   rA     s   rA   __decimal_context__c             C   s,   | t ttfkr| j } | j  | tj _d S )N)r   r   r   copyclear_flags	threadingcurrent_threadrF   )r/   r'   r'   r)   r     s    c              C   s4   y
t j jS  tk
r.   t } | t j _| S X d S )N)rI   rJ   rF   AttributeErrorr   )r/   r'   r'   r)   r     s    

c             C   s,   y| j S  tk
r&   t }|| _ |S X d S )N)rF   rK   r   )_localr/   r'   r'   r)   r     s    c             C   s(   | t ttfkr| j } | j  | |_d S )N)r   r   r   rG   rH   rF   )r/   rL   r'   r'   r)   r     s    c             C   s   | d krt  } t| S )N)r   _ContextManager)Zctxr'   r'   r)   r     s    $ c            
   @   s  e Zd ZdZdddZed	d
 Zdd Zdd ZdddZ	dd Z
dd Zdd ZdddZdddZdddZdddZddd Zdd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zdd,d-Zdd.d/Zdd0d1Zd d2d3Zdd5d6Zdd7d8ZeZdd9d:Zdd;d<Zdd=d>Z e Z!dd?d@Z"dAdB Z#ddCdDZ$ddEdFZ%d	dGdHZ&d
dIdJZ'ddKdLZ(ddMdNZ)ddOdPZ*ddQdRZ+dSdT Z,dUdV Z-e-Z.dWdX Z/e0e/Z/dYdZ Z1e0e1Z1d[d\ Z2d]d^ Z3d_d` Z4dadb Z5dcdd Z6dedf Z7dgdh Z8didj Z9dkdl Z:dmdn Z;dodp Z<dqdr Z=e>e6e7e8e9e:e;e<e=dsZ?ddtduZ@dvdw ZAdxdy ZBddzd{ZCdd|d}ZDd~d ZEdddZFdddZGdddZHdddZIdddZJdd ZKdd ZLdddZMdddZNeNZOdddZPdddZQdddZRdd ZSdd ZTdd ZUdd ZVdddZWdddZXdddZYdd ZZdd Z[dddZ\d ddZ]dd Z^dd Z_dd Z`dd Zad!ddZbdd Zcdd Zddd Zed"ddZfdd ZgddÄ Zhd#ddńZiddǄ Zjd$ddɄZkd%dd˄Zldd̈́ Zmddτ Znd&ddфZod'ddӄZpd(ddՄZqd)ddׄZrd*ddلZsd+ddۄZtd,dd݄Zud-dd߄Zvd.ddZwd/ddZxdd Zyd0ddZzd1ddZ{d2ddZ|dd Z}dd Z~dd Zd3ddZdS (4  r   _expr7   r6   _is_special0Nc             C   s  t j| }t|tr$t|j jdd}|d krP|d kr@t }|jt	d| S |j
ddkrfd|_nd|_|j
d}|d k	r|j
d	pd}t|j
d
pd}tt|| |_|t| |_d|_nZ|j
d}|d k	rtt|pdjd|_|j
drd|_nd|_nd|_d|_d|_|S t|trf|dkrBd|_nd|_d|_tt||_d|_|S t|tr|j|_|j|_|j|_|j|_|S t|tr|j|_t|j|_t|j|_d|_|S t|ttfr&t|dkrtdt|d to|d dkstd|d |_|d dkrHd|_|d |_d|_ng }	x^|d D ]R}
t|
trd|
  kozdkn  r|	s|
dkr|	j|
 ntdqVW |d dkrdjtt|	|_|d |_d|_nDt|d trdjtt|	p dg|_|d |_d|_ntd|S t|tr||d krBt }|jtd tj|}|j|_|j|_|j|_|j|_|S t d| d S )N_ zInvalid literal for Decimal: %rr<   -r-   r%   intZfracexprP   FdiagsignalNr4   FT   ztInvalid tuple size in creation of Decimal from list or tuple.  The list or tuple should have exactly three elements.z|Invalid sign.  The first value in the tuple should be an integer; either 0 for a positive number or 1 for a negative number.r+   	   zTThe second value in the tuple must be composed of integers in the range 0 through 9.zUThe third value in the tuple must be an integer, or one of the strings 'F', 'n', 'N'.z;strict semantics for mixing floats and Decimals are enabledzCannot convert %r to Decimal)r%   r-   )r4   rX   )!object__new__
isinstancestr_parserstripreplacer   _raise_errorr   groupr6   rT   r7   lenrN   rO   lstripabsr   _WorkRepr<   rU   listtuple
ValueErrorappendjoinmapfloatr   
from_float	TypeError)clsvaluer/   r.   mintpartfracpartrU   rV   digitsZdigitr'   r'   r)   r]   4  s    







(



zDecimal.__new__c             C   s   t |tr| |S t |ts$tdtj|s8tj|rD| t|S tjd|dkrZd}nd}t	|j
 \}}|j d }t|t|d|  | }| tkr|S | |S d S )Nzargument must be int or float.g      ?r%   r-      )r^   rT   ro   rq   _mathZisinfZisnanreprZcopysignrg   as_integer_ratio
bit_lengthr5   r_   r   )rr   fr<   r4   dkresultr'   r'   r)   rp     s    

zDecimal.from_floatc             C   s(   | j r$| j}|dkrdS |dkr$dS dS )Nr4   r-   rX   r+   r%   )rO   rN   )r.   rU   r'   r'   r)   _isnan  s    zDecimal._isnanc             C   s   | j dkr| jrdS dS dS )NrY   r-   r%   )rN   r6   )r.   r'   r'   r)   _isinfinity  s
    
zDecimal._isinfinityc             C   s|   | j  }|d krd}n|j  }|s&|rx|d kr4t }|dkrJ|jtd| S |dkr`|jtd|S |rn| j|S |j|S dS )NFr+   sNaNr%   )r   r   rc   r	   r8   )r.   otherr/   self_is_nanother_is_nanr'   r'   r)   _check_nans  s"    


zDecimal._check_nansc             C   sv   |d krt  }| js|jrr| j r0|jtd| S |j rF|jtd|S | j r\|jtd| S |j rr|jtd|S dS )Nzcomparison involving sNaNzcomparison involving NaNr%   )r   rO   is_snanrc   r	   is_qnan)r.   r   r/   r'   r'   r)   _compare_check_nans.  s(    zDecimal._compare_check_nansc             C   s   | j p| jdkS )NrP   )rO   r7   )r.   r'   r'   r)   __bool__O  s    zDecimal.__bool__c             C   s  | j s|j r8| j }|j }||kr(dS ||k r4dS dS | sP|sDdS d|j  S |s^d| j S |j| jk rndS | j|jk r~dS | j }|j }||k r| jd| j|j   }|jd|j| j   }||krdS ||k rd| j  S d	| j S n ||krd
| j S d| j  S d S )Nr%   r-   rP   r   r   r   r   r   r   r   r   )rO   r   r6   adjustedr7   rN   )r.   r   Zself_infZ	other_infself_adjustedZother_adjustedself_paddedZother_paddedr'   r'   r)   _cmpV  s>    



zDecimal._cmpc             C   s<   t | |dd\} }|tkr|S | j||r.dS | j|dkS )NT)equality_opFr%   )_convert_for_comparisonNotImplementedr   r   )r.   r   r/   r'   r'   r)   __eq__  s    zDecimal.__eq__c             C   s<   t | |\} }|tkr|S | j||}|r.dS | j|dk S )NFr%   )r   r   r   r   )r.   r   r/   r:   r'   r'   r)   __lt__  s    zDecimal.__lt__c             C   s<   t | |\} }|tkr|S | j||}|r.dS | j|dkS )NFr%   )r   r   r   r   )r.   r   r/   r:   r'   r'   r)   __le__  s    zDecimal.__le__c             C   s<   t | |\} }|tkr|S | j||}|r.dS | j|dkS )NFr%   )r   r   r   r   )r.   r   r/   r:   r'   r'   r)   __gt__  s    zDecimal.__gt__c             C   s<   t | |\} }|tkr|S | j||}|r.dS | j|dkS )NFr%   )r   r   r   r   )r.   r   r/   r:   r'   r'   r)   __ge__  s    zDecimal.__ge__c             C   s>   t |dd}| js|r0|jr0| j||}|r0|S t| j|S )NT)raiseit)_convert_otherrO   r   r   r   )r.   r   r/   r:   r'   r'   r)   compare  s    zDecimal.comparec             C   s   | j r4| j rtdn| j r$tS | jr0t S tS | jdkrNtd| jt	}ntt
| j t	}t| j| t	 }| dkr||n| }|dkrdS |S )Nz"Cannot hash a signaling NaN value.r%   
   r-   r+   r   )rO   r   rq   is_nan_PyHASH_NANr6   _PyHASH_INFrN   pow_PyHASH_MODULUS_PyHASH_10INVrT   r7   )r.   Zexp_hashZhash_r:   r'   r'   r)   __hash__  s    

zDecimal.__hash__c             C   s   t | jttt| j| jS )N)r   r6   rj   rn   rT   r7   rN   )r.   r'   r'   r)   as_tuple  s    zDecimal.as_tuplec             C   s   | j r | j rtdntd| s(dS t| j}| jdkrR|d| j  d }}nr| j }x(|dkr|d dkr|d }|d8 }q\W | j }t|| @ j d |}|r||L }||8 }d| |> }| j	r| }||fS )Nz#cannot convert NaN to integer ratioz(cannot convert Infinity to integer ratior%   r-   r   rx   )r%   r-   )
rO   r   rk   OverflowErrorrT   r7   rN   minr|   r6   )r.   r4   r~   Zd5Zd2Zshift2r'   r'   r)   r{     s,    


zDecimal.as_integer_ratioc             C   s   dt |  S )NzDecimal('%s'))r_   )r.   r'   r'   r)   __repr__'  s    zDecimal.__repr__Fc       	      C   sd  ddg| j  }| jrL| jdkr&|d S | jdkr>|d | j S |d | j S | jt| j }| jdkrt|dkrt|}n6|s~d
}n,| jdkr|d
 d d
 }n|d
 d d
 }|dkrd}dd|   | j }nN|t| jk r| jd|t| j   }d}n | jd | }d| j|d   }||kr*d}n*|d kr:t }ddg|j d||   }|| | | S )NrR   rS   rY   ZInfinityr4   NaNr   r%      r-   rP   rZ   .eEz%+di)r6   rO   rN   r7   re   r   capitals)	r.   engr/   r<   
leftdigitsdotplaceru   rv   rU   r'   r'   r)   __str__,  s:    




zDecimal.__str__c             C   s   | j d|dS )NT)r   r/   )r   )r.   r/   r'   r'   r)   to_eng_string`  s    zDecimal.to_eng_stringc             C   sT   | j r| j|d}|r|S |d kr(t }|  rB|jtkrB| j }n| j }|j|S )N)r/   )rO   r   r   r>   r   copy_abscopy_negate_fix)r.   r/   r:   r'   r'   r)   __neg__i  s    
zDecimal.__neg__c             C   sT   | j r| j|d}|r|S |d kr(t }|  rB|jtkrB| j }nt| }|j|S )N)r/   )rO   r   r   r>   r   r   r   r   )r.   r/   r:   r'   r'   r)   __pos__  s    
zDecimal.__pos__Tc             C   sJ   |s| j  S | jr&| j|d}|r&|S | jr:| j|d}n| j|d}|S )N)r/   )r   rO   r   r6   r   r   )r.   roundr/   r:   r'   r'   r)   __abs__  s    zDecimal.__abs__c       
      C   sl  t |}|tkr|S |d kr"t }| js.|jr| j||}|rB|S | j rr| j|jkrj|j rj|jtdS t	| S |j rt	|S t
| j|j}d}|jtkr| j|jkrd}|  r| rt
| j|j}|rd}t|d|}|j|}|S | s"t||j|j d }|j||j}|j|}|S |sZt|| j|j d }| j||j}|j|}|S t| }t|}t|||j\}}t }	|j|jkr|j|jkrt|d|}|j|}|S |j|jk r|| }}|jdkrd|	_|j|j |_|_nd|	_n&|jdkrd|	_d\|_|_nd|	_|jdkr@|j|j |	_n|j|j |	_|j|	_t	|	}|j|}|S )Nz
-INF + INFr%   r-   rP   )r%   r%   )r   r   r   rO   r   r   r6   rc   r	   r   r   rN   r>   r   r5   r   maxr?   _rescalerh   
_normalizer<   rT   rU   )
r.   r   r/   r:   rU   Znegativezeror<   op1op2r   r'   r'   r)   __add__  s|    





zDecimal.__add__c             C   sH   t |}|tkr|S | js |jr6| j||d}|r6|S | j|j |dS )N)r/   )r   r   rO   r   r   r   )r.   r   r/   r:   r'   r'   r)   __sub__  s    zDecimal.__sub__c             C   s"   t |}|tkr|S |j| |dS )N)r/   )r   r   r   )r.   r   r/   r'   r'   r)   __rsub__  s    zDecimal.__rsub__c             C   sD  t |}|tkr|S |d kr"t }| j|jA }| js:|jr| j||}|rN|S | j rn|sf|jtdS t	| S |j r| s|jtdS t	| S | j
|j
 }|  s| rt|d|}|j|}|S | jdkrt||j|}|j|}|S |jdkrt|| j|}|j|}|S t| }t|}t|t|j|j |}|j|}|S )Nz(+-)INF * 0z0 * (+-)INFrP   1)r   r   r   r6   rO   r   r   rc   r	   r;   rN   r5   r   r7   rh   r_   rT   )r.   r   r/   Z
resultsignr:   Z	resultexpr   r   r'   r'   r)   __mul__  sH    




zDecimal.__mul__c             C   s  t |}|tkrtS |d kr"t }| j|jA }| js:|jr| j||}|rN|S | j rj|j rj|jtdS | j rzt	| S |j r|jt
d t|d|j S |s| s|jtdS |jtd|S | s| j|j }d}nt|jt| j |j d }| j|j | }t| }t|}	|dkr:t|jd|  |	j\}}
nt|j|	jd|   \}}
|
rt|d	 dkr|d7 }n<| j|j }x.||k r|d dkr|d }|d7 }qW t|t||}|j|S )
Nz(+-)INF/(+-)INFzDivision by infinityrP   z0 / 0zx / 0r%   r-   r   rx   )r   r   r   r6   rO   r   r   rc   r	   r;   r   r5   Etinyr   r
   rN   re   r7   r?   rh   divmodrT   r_   r   )r.   r   r/   r<   r:   rU   coeffshiftr   r   	remainder	ideal_expr'   r'   r)   __truediv__Q  sP    

zDecimal.__truediv__c             C   s   | j |j A }|j r| j}nt| j|j}| j |j  }|  sP|j sP|dkrjt|dd| j||jfS ||jkrt	| }t	|}|j
|j
kr| jd|j
|j
  9  _n| jd|j
|j
  9  _t|j|j\}}	|d|j k rt|t|dt| j t|	|fS |jtd}
|
|
fS )Nr+   rP   r%   r   z%quotient too large in //, % or divmodr   )r6   r   rN   r   r   r5   r   r>   r?   rh   rU   rT   r   r_   rc   r   )r.   r   r/   r<   r   expdiffr   r   qrr:   r'   r'   r)   _divide  s*    
zDecimal._dividec             C   s"   t |}|tkr|S |j| |dS )N)r/   )r   r   r   )r.   r   r/   r'   r'   r)   __rtruediv__  s    zDecimal.__rtruediv__c             C   s   t |}|tkr|S |d kr"t }| j||}|r:||fS | j|jA }| j r~|j rj|jtd}||fS t| |jtdfS |s| s|jt	d}||fS |jt
d||jtdfS | j||\}}|j|}||fS )Nzdivmod(INF, INF)zINF % xzdivmod(0, 0)zx // 0zx % 0)r   r   r   r   r6   r   rc   r	   r;   r   r
   r   r   )r.   r   r/   r:   r<   Zquotientr   r'   r'   r)   
__divmod__  s0    
zDecimal.__divmod__c             C   s"   t |}|tkr|S |j| |dS )N)r/   )r   r   r   )r.   r   r/   r'   r'   r)   __rdivmod__  s    zDecimal.__rdivmod__c             C   s   t |}|tkr|S |d kr"t }| j||}|r6|S | j rJ|jtdS |sj| r^|jtdS |jtdS | j||d }|j	|}|S )NzINF % xzx % 0z0 % 0r-   )
r   r   r   r   r   rc   r	   r   r   r   )r.   r   r/   r:   r   r'   r'   r)   __mod__  s"    
zDecimal.__mod__c             C   s"   t |}|tkr|S |j| |dS )N)r/   )r   r   r   )r.   r   r/   r'   r'   r)   __rmod__  s    zDecimal.__rmod__c             C   s  |d krt  }t|dd}| j||}|r.|S | j rB|jtdS |sb| rV|jtdS |jtdS |j r|t| }|j|S t	| j
|j
}| st| jd|}|j|S | j |j  }||jd kr|jtS |dkr| j||j}|j|S t| }t|}|j|jkr(| jd	|j|j  9  _n| jd	|j|j  9  _t|j|j\}}	d|	 |d@  |jkr~|	|j8 }	|d7 }|d	|j kr|jtS | j}
|	d
k rd|
 }
|	 }	t|
t|	|}|j|S )NT)r   zremainder_near(infinity, x)zremainder_near(x, 0)zremainder_near(0, 0)rP   r-   r+   r   r%   r   )r   r   r   r   rc   r	   r   r   r   r   rN   r5   r6   r   r?   r   r   r>   rh   rU   rT   r   r_   )r.   r   r/   r:   ideal_exponentr   r   r   r   r   r<   r'   r'   r)   remainder_near  sZ    






zDecimal.remainder_nearc             C   s   t |}|tkr|S |d kr"t }| j||}|r6|S | j rb|j rR|jtdS t| j|jA  S |s| r|jt	d| j|jA S |jt
dS | j||d S )Nz
INF // INFzx // 0z0 // 0r%   )r   r   r   r   r   rc   r	   r;   r6   r
   r   r   )r.   r   r/   r:   r'   r'   r)   __floordiv__L  s$    zDecimal.__floordiv__c             C   s"   t |}|tkr|S |j| |dS )N)r/   )r   r   r   )r.   r   r/   r'   r'   r)   __rfloordiv__h  s    zDecimal.__rfloordiv__c             C   s8   | j  r(| j rtd| jr"dnd}nt| }t|S )Nz%Cannot convert signaling NaN to floatz-nannan)r   r   rk   r6   r_   ro   )r.   sr'   r'   r)   	__float__o  s    zDecimal.__float__c             C   st   | j r(| j rtdn| j r(tdd| j }| jdkrT|t| j d| j  S |t| jd | j pjd S d S )NzCannot convert NaN to integerz"Cannot convert infinity to integerr-   r%   r   rP   r   )	rO   r   rk   r   r   r6   rN   rT   r7   )r.   r   r'   r'   r)   __int__y  s    


zDecimal.__int__c             C   s   | S )Nr'   )r.   r'   r'   r)   real  s    zDecimal.realc             C   s   t dS )Nr%   )r   )r.   r'   r'   r)   imag  s    zDecimal.imagc             C   s   | S )Nr'   )r.   r'   r'   r)   	conjugate  s    zDecimal.conjugatec             C   s   t t| S )N)complexro   )r.   r'   r'   r)   __complex__  s    zDecimal.__complex__c             C   sR   | j }|j|j }t||krJ|t|| d  jd}t| j|| jdS t| S )NrP   T)	r7   r?   clampre   rf   r5   r6   rN   r   )r.   r/   ZpayloadZmax_payload_lenr'   r'   r)   r8     s    zDecimal._fix_nanc             C   sX  | j r | j r| j|S t| S |j }|j }| s|j|g|j }tt	| j
||}|| j
krx|jt t| jd|S t| S t| j| j
 |j }||kr|jtd| j}|jt |jt |S ||k }|r|}| j
|k rt| j| j
 | }	|	dk rt| jd|d } d}	| j|j }
|
| |	}| jd |	 p>d}|dkr~tt|d }t||jkr~|d d }|d7 }||kr|jtd| j}nt| j||}|r|r|jt |r|jt |r|jt |jt |s|jt |S |r|jt |jdkrP| j
|krP|jt | jd| j
|   }t| j||S t| S )NrP   z
above Emaxr%   r   r-   r   )rO   r   r8   r   r   Etopr@   r   r   r   rN   rc   r   r5   r6   re   r7   r?   r   r   r   _pick_rounding_functionr>   r_   rT   r   r   )r.   r/   r   r   exp_maxZnew_expZexp_minr:   Zself_is_subnormalrw   Zrounding_methodchangedr   r   r'   r'   r)   r     sn    
















zDecimal._fixc             C   s   t | j|rdS dS d S )Nr%   r-   r   )
_all_zerosr7   )r.   r?   r'   r'   r)   _round_down  s    zDecimal._round_downc             C   s   | j | S )N)r   )r.   r?   r'   r'   r)   	_round_up  s    zDecimal._round_upc             C   s*   | j | dkrdS t| j |r"dS dS d S )NZ56789r-   r%   r   )r7   r   )r.   r?   r'   r'   r)   _round_half_up  s
    zDecimal._round_half_upc             C   s   t | j|rdS | j|S d S )Nr-   r   )_exact_halfr7   r   )r.   r?   r'   r'   r)   _round_half_down  s    zDecimal._round_half_downc             C   s8   t | j|r*|dks&| j|d  dkr*dS | j|S d S )Nr%   r-   02468r   )r   r7   r   )r.   r?   r'   r'   r)   _round_half_even#  s    zDecimal._round_half_evenc             C   s    | j r| j|S | j| S d S )N)r6   r   )r.   r?   r'   r'   r)   _round_ceiling+  s    
zDecimal._round_ceilingc             C   s    | j s| j|S | j| S d S )N)r6   r   )r.   r?   r'   r'   r)   _round_floor2  s    
zDecimal._round_floorc             C   s0   |r | j |d  dkr | j|S | j| S d S )Nr-   Z05)r7   r   )r.   r?   r'   r'   r)   _round_05up9  s    
zDecimal._round_05up)r   r   r   r   r   r   r   r   c             C   sb   |d k	r2t |tstdtdd| }| j|S | jrR| j rJtdntdt| j	dt
S )Nz+Second argument to round should be integralr%   r   zcannot round a NaNzcannot round an infinity)r^   rT   rq   r5   quantizerO   r   rk   r   r   r   )r.   r4   rU   r'   r'   r)   	__round__K  s    /


zDecimal.__round__c             C   s0   | j r | j rtdntdt| jdtS )Nzcannot round a NaNzcannot round an infinityr%   )rO   r   rk   r   rT   r   r   )r.   r'   r'   r)   	__floor__  s
    
zDecimal.__floor__c             C   s0   | j r | j rtdntdt| jdtS )Nzcannot round a NaNzcannot round an infinityr%   )rO   r   rk   r   rT   r   r   )r.   r'   r'   r)   __ceil__  s
    
zDecimal.__ceil__c             C   s  t |dd}t |dd}| js$|jr|d kr2t }| jdkrJ|jtd| S |jdkrb|jtd|S | jdkrr| }nf|jdkr|}nV| jdkr|s|jtdS t| j|jA  }n*|jdkr| s|jtdS t| j|jA  }n0t| j|jA t	t
| jt
|j | j|j }|j||S )	NT)r   rX   r   r4   rY   zINF * 0 in fmaz0 * INF in fma)r   rO   r   rN   rc   r	   r;   r6   r5   r_   rT   r7   r   )r.   r   Zthirdr/   productr'   r'   r)   fma  s6    





zDecimal.fmac             C   s  t |}|tkr|S t |}|tkr(|S |d kr6t }| j }|j }|j }|sZ|sZ|r|dkrp|jtd| S |dkr|jtd|S |dkr|jtd|S |r| j|S |r|j|S |j|S | j o|j o|j s|jtdS |dk r|jtdS |s|jtdS |j |j	kr(|jtdS | rD|  rD|jtdS |j
 rTd}n| j}tt|}t| j }t|j }	|j| td	|j| | }x t|	jD ]}
t|d	|}qW t||	j|}t|t|dS )
Nr+   r   z@pow() 3rd argument not allowed unless all arguments are integersr%   zApow() 2nd argument cannot be negative when 3rd argument specifiedzpow() 3rd argument cannot be 0zSinsufficient precision: pow() 3rd argument must not have more than precision digitszXat least one of pow() 1st argument and 2nd argument must be nonzero; 0**0 is not definedr   )r   r   r   r   rc   r	   r8   
_isintegerr   r?   _isevenr6   rg   rT   rh   to_integral_valuer   rU   ranger5   r_   )r.   r   modulor/   r   r   Zmodulo_is_nanr<   baseexponentir'   r'   r)   _power_modulo  sl    



zDecimal._power_moduloc             C   s  t | }|j|j }}x |d dkr6|d }|d7 }qW t |}|j|j }}x |d dkrn|d }|d7 }qPW |dkr||9 }x |d dkr|d }|d7 }qW |dk rd S |d|  }	|jdkr|	 }	|j o|jdkr| jt| }
t|	|
 |d }nd}tddd|  |	| S |jdkr|d }|dkr|| @ |krPd S t	|d }|d
 d }|t
t|kr~d S t|| |}t|| |}|d ks|d krd S ||krd S d| }n|dkrt	|d d }td| |\}}|r d S x$|d dkr$|d }|d8 }qW |d d }|t
t|krHd S t|| |}t|| |}|d ksx|d kr|d S ||krd S d| }nd S |d| krd S | | }tdt||S |dkr|d|  d }}n|dkrt
tt|| | krd S t	|}|dkr>t
tt|| | kr>d S |d|   }}x:|d |d   koldkn  r|d }|d }qPW x:|d |d   kodkn  r|d }|d }qW |dkrt|dkr||krd S t||\}}|dkrd S dt	| |  > }x>t|||d  \}}||kr>P n||d  | | }qW ||koh|dkspd S |}|dkr||d t| krd S || }||9 }|d| krd S t|}|j r|jdkr| jt| }
t||
 |t
| }nd}td|d|  || S )Nr   r%   r-   r   rP   r+      r      ]   A   rx      rZ   d   )r+   r  r   r  )rh   rT   rU   r<   r   r6   rN   r   r5   _nbitsre   r_   _decimal_lshift_exactr   rg   	_log10_lb)r.   r   pxxcxeyycyer   r   ZzerosZ
last_digitr   Zemaxr   rt   r4   Zxc_bitsremar   r   Zstr_xcr'   r'   r)   _power_exact(  s    :









&&&&


 zDecimal._power_exactc             C   s@  |d k	r| j |||S t|}|tkr*|S |d kr8t }| j||}|rL|S |sd| s`|jtdS tS d}| jdkr|j	 r|j
 sd}n| r|jtdS | j } | s|jdkrt|ddS t| S | j r|jdkrt| S t|ddS | tkr|j	 rZ|jdkrd}n||jkr"|j}nt|}| j| }|d|j k rxd|j }|jt n|jt |jt d|j }t|dd|   |S | j }|j r|jdk|dk krt|ddS t| S d }d}	| j |j  }
|dk|jdkkr|
tt|jkrHt|d|jd }n,|j }|
tt| krHt|d|d }|d kr| j||jd }|d k	r|dkrtd|j|j}d}	|d kr:|j}t| }|j|j }}t|}|j|j }}|jdkr| }d	}xJt|||||| \}}|d
dtt|| d    rP |d	7 }qW t|t||}|	r2|j	  r2t|j|jkr|jd t|j }t|j|jd|  |j| }|j  }|j!  xt"D ]}d|j#|< qW |j$|}|jt |j%t& r|jt' |j%t( r |jt(d|j x:t't&ttt)fD ]}|j%| r|j| qW n
|j$|}|S )Nz0 ** 0r%   r-   z+x ** y with x negative and y not an integerrP   r   FTrZ   rx   r   z
above Emax)*r   r   r   r   r   rc   r	   _Oner6   r   r   r   r5   r;   r   r?   rT   rN   r   r   r   _log10_exp_boundre   r_   r@   r   r  r7   rh   rU   r<   _dpowerrG   rH   _signalstrapsr   flagsr   r   r   r   )r.   r   r   r/   r:   Zresult_signZ
multiplierrU   Zself_adjexactZboundr   r
  r  r  r  r  r  r  extrar   r   Z
newcontextZ	exceptionr'   r'   r)   __pow__	  s    














"




zDecimal.__pow__c             C   s"   t |}|tkr|S |j| |dS )N)r/   )r   r   r  )r.   r   r/   r'   r'   r)   __rpow__	  s    zDecimal.__rpow__c             C   s   |d krt  }| jr(| j|d}|r(|S | j|}|j r>|S |sPt|jddS |j|j g|j	 }t
|j}|j}x.|j|d  dkr||k r|d7 }|d8 }qvW t|j|jd | |S )N)r/   rP   r%   r-   )r   rO   r   r   r   r5   r6   r@   r   r   re   r7   rN   )r.   r/   r:   dupr   endrU   r'   r'   r)   	normalize	  s$    

zDecimal.normalizec             C   s  t |dd}|d krt }|d kr(|j}| js4|jr|| j||}|rH|S |j sX| j r||j rp| j rpt| S |jtdS |j	 |j
  ko|jkn  s|jtdS | st| jd|j
}|j|S | j }||jkr|jtdS ||j
 d |jkr|jtdS | j|j
|}|j |jkr0|jtdS t|j|jkrN|jtdS |rn|j |jk rn|jt |j
| j
kr|| kr|jt |jt |j|}|S )	NT)r   zquantize with one INFz)target exponent out of bounds in quantizerP   z9exponent of quantize result too large for current contextr-   z7quantize result has too many digits for current context)r   r   r>   rO   r   r   r   rc   r	   r   rN   r@   r5   r6   r   r   r?   r   re   r7   Eminr   r   r   )r.   rU   r>   r/   r:   r   r'   r'   r)   r   
  sT     






zDecimal.quantizec             C   sD   t |dd}| js|jr8| j r(|j p6| j o6|j S | j|jkS )NT)r   )r   rO   r   is_infiniterN   )r.   r   r/   r'   r'   r)   same_quantumJ
  s
    	zDecimal.same_quantumc             C   s   | j rt| S | s t| jd|S | j|krHt| j| jd| j|   |S t| j| j | }|dk rzt| jd|d } d}| j| }|| |}| jd | pd}|dkrtt	|d }t| j||S )NrP   r%   r   r-   )
rO   r   r5   r6   rN   r7   re   r   r_   rT   )r.   rU   r>   rw   Zthis_functionr   r   r'   r'   r)   r   Y
  s"    


zDecimal._rescalec             C   sh   |dkrt d| js|  r$t| S | j| j d | |}|j | j krd|j|j d | |}|S )Nr%   z'argument should be at least 1 in _roundr-   )rk   rO   r   r   r   )r.   placesr>   r:   r'   r'   r)   _round{
  s    
zDecimal._roundc             C   s   | j r"| j|d}|r|S t| S | jdkr4t| S | sFt| jddS |d krTt }|d krb|j}| jd|}|| kr|j	t
 |j	t |S )N)r/   r%   rP   )rO   r   r   rN   r5   r6   r   r>   r   rc   r   r   )r.   r>   r/   r:   r'   r'   r)   to_integral_exact
  s$    



zDecimal.to_integral_exactc             C   s`   |d krt  }|d kr|j}| jr>| j|d}|r6|S t| S | jdkrPt| S | jd|S d S )N)r/   r%   )r   r>   rO   r   r   rN   r   )r.   r>   r/   r:   r'   r'   r)   r   
  s    
zDecimal.to_integral_valuec             C   s  |d krt  }| jrB| j|d}|r(|S | j rB| jdkrBt| S | sdt| jd| jd }|j|S | jdkrz|j	t
dS |jd }t| }|jd? }|jd@ r|jd }t| jd? d }n|j}t| jd d? }|| }|dkr|d| 9 }d	}	nt|d|  \}}
|
 }	||8 }d| }x(|| }||kr:P n|| d? }q$W |	o\|| |k}	|	r|dkr||d|  }n|d|  9 }||7 }n|d
 dkr|d7 }tdt||}|j }|jt}|j|}||_|S )N)r/   r%   rP   r+   r-   zsqrt(-x), x > 0r   r  Trx   )r   rO   r   r   r6   r   r5   rN   r   rc   r	   r?   rh   rU   rT   re   r7   r   r_   _shallow_copy_set_roundingr   r>   )r.   r/   r:   r?   opr   clr   r  r   r4   r   r>   r'   r'   r)   sqrt
  s`    










zDecimal.sqrtc             C   s   t |dd}|d krt }| js&|jr~| j }|j }|s>|r~|dkrX|dkrX| j|S |dkrr|dkrr|j|S | j||S | j|}|dkr| j|}|dkr|}n| }|j|S )NT)r   r-   r%   r   )r   r   rO   r   r   r   r   compare_total)r.   r   r/   snonr*  r:   r'   r'   r)   r   %  s&    


	
zDecimal.maxc             C   s   t |dd}|d krt }| js&|jr~| j }|j }|s>|r~|dkrX|dkrX| j|S |dkrr|dkrr|j|S | j||S | j|}|dkr| j|}|dkr| }n|}|j|S )NT)r   r-   r%   r   )r   r   rO   r   r   r   r   r-  )r.   r   r/   r.  r/  r*  r:   r'   r'   r)   r   O  s&    



zDecimal.minc             C   s8   | j r
dS | jdkrdS | j| jd  }|dt| kS )NFr%   TrP   )rO   rN   r7   re   )r.   restr'   r'   r)   r   q  s    
zDecimal._isintegerc             C   s(   |  s| j dkrdS | jd| j   dkS )Nr%   Tr-   r   r   )rN   r7   )r.   r'   r'   r)   r   z  s    zDecimal._isevenc             C   s.   y| j t| j d S  tk
r(   dS X d S )Nr-   r%   )rN   re   r7   rq   )r.   r'   r'   r)   r     s    zDecimal.adjustedc             C   s   | S )Nr'   )r.   r'   r'   r)   	canonical  s    zDecimal.canonicalc             C   s.   t |dd}| j||}|r |S | j||dS )NT)r   )r/   )r   r   r   )r.   r   r/   r:   r'   r'   r)   compare_signal  s
    zDecimal.compare_signalc             C   sf  t |dd}| jr|j rtS | j r0|jr0tS | j}| j }|j }|sP|r||krt| j| jf}t|j|jf}||k r|rtS tS ||kr|rtS tS tS |r|dkrtS |dkrtS |dkrtS |dkrtS n4|dkrtS |dkrtS |dkr tS |dkrtS | |k rtS | |kr*tS | j|jk rF|rBtS tS | j|jkrb|r^tS tS tS )NT)r   r-   r+   )	r   r6   _NegativeOner  r   re   r7   _ZerorN   )r.   r   r/   r<   Zself_nanZ	other_nanZself_keyZ	other_keyr'   r'   r)   r-    sf    




zDecimal.compare_totalc             C   s&   t |dd}| j }|j }|j|S )NT)r   )r   r   r-  )r.   r   r/   r   or'   r'   r)   compare_total_mag  s    zDecimal.compare_total_magc             C   s   t d| j| j| jS )Nr%   )r5   r7   rN   rO   )r.   r'   r'   r)   r     s    zDecimal.copy_absc             C   s2   | j rtd| j| j| jS td| j| j| jS d S )Nr%   r-   )r6   r5   r7   rN   rO   )r.   r'   r'   r)   r     s    zDecimal.copy_negatec             C   s"   t |dd}t|j| j| j| jS )NT)r   )r   r5   r6   r7   rN   rO   )r.   r   r/   r'   r'   r)   	copy_sign  s    
zDecimal.copy_signc             C   s  |d krt  }| j|d}|r"|S | j d
kr2tS | s:tS | j dkrNt| S |j}| j }| jdkr|t	t
|jd d krtdd|jd }n0| jdkr|t	t
|j  d d krtdd|j d }n| jdko|| k r
tddd|d   d | }n| jdkrB|| d k rBtdd|d  | d }nt| }|j|j }}|jdkrj| }d}xFt|||| \}	}
|	dd	t	t
|	| d    rP |d7 }qpW tdt
|	|
}|j }|jt}|j|}||_|S )N)r/   r-   r%   rZ   r   rP   r=   rx   r   r   )r   r   r   r4  r  r   r?   r   r6   re   r_   r@   r5   r   rh   rT   rU   r<   _dexpr'  r(  r   r   r>   )r.   r/   r:   r
  adjr)  r*  r   r  r   rU   r>   r'   r'   r)   rU     sJ    $( "

zDecimal.expc             C   s   dS )NTr'   )r.   r'   r'   r)   is_canonicalL  s    zDecimal.is_canonicalc             C   s   | j  S )N)rO   )r.   r'   r'   r)   	is_finiteT  s    zDecimal.is_finitec             C   s
   | j dkS )NrY   )rN   )r.   r'   r'   r)   r"  \  s    zDecimal.is_infinitec             C   s
   | j dkS )Nr4   rX   )r4   rX   )rN   )r.   r'   r'   r)   r   `  s    zDecimal.is_nanc             C   s,   | j s|  rdS |d krt }|j| j kS )NF)rO   r   r!  r   )r.   r/   r'   r'   r)   	is_normald  s
    zDecimal.is_normalc             C   s
   | j dkS )Nr4   )rN   )r.   r'   r'   r)   r   l  s    zDecimal.is_qnanc             C   s
   | j dkS )Nr-   )r6   )r.   r'   r'   r)   	is_signedp  s    zDecimal.is_signedc             C   s
   | j dkS )NrX   )rN   )r.   r'   r'   r)   r   t  s    zDecimal.is_snanc             C   s,   | j s|  rdS |d krt }| j |jk S )NF)rO   r   r   r!  )r.   r/   r'   r'   r)   is_subnormalx  s
    zDecimal.is_subnormalc             C   s   | j  o| jdkS )NrP   )rO   r7   )r.   r'   r'   r)   is_zero  s    zDecimal.is_zeroc             C   s   | j t| j d }|dkr4tt|d d d S |dkrXttd| d d d S t| }|j|j }}|dkrt|d|   }t|}t|t| ||k  S |ttd|  |  d S )Nr-      r   r+   r%   r   r   )rN   re   r7   r_   rh   rT   rU   )r.   r9  r)  r*  r   numdenr'   r'   r)   _ln_exp_bound  s    zDecimal._ln_exp_boundc       
      C   s  |d krt  }| j|d}|r"|S | s*tS | j dkr:tS | tkrFtS | jdkr\|jt	dS t
| }|j|j }}|j}|| j  d }x>t|||}|ddttt|| d    rP |d7 }qW tt|dk tt|| }|j }|jt}	|j|}|	|_|S )	N)r/   r-   zln of a negative valuer+   rx   r   rZ   r%   )r   r   _NegativeInfinityr   	_Infinityr  r4  r6   rc   r	   rh   rT   rU   r?   rC  _dlogre   r_   rg   r5   r'  r(  r   r   r>   )
r.   r/   r:   r)  r*  r   r
  r$  r   r>   r'   r'   r)   ln  s:    
$

z
Decimal.lnc             C   s   | j t| j d }|dkr,tt|d S |dkrHttd| d S t| }|j|j }}|dkrt|d|   }td| }t|t| ||k  d S td|  | }t|| |dk  d S )	Nr-   r+   r%   r      Z231r   r   )rN   re   r7   r_   rh   rT   rU   )r.   r9  r)  r*  r   rA  rB  r'   r'   r)   r    s    zDecimal._log10_exp_boundc       
      C   sH  |d krt  }| j|d}|r"|S | s*tS | j dkr:tS | jdkrP|jtdS | jd dkr| jdd  dt	| jd  krt
| jt	| j d }nt| }|j|j }}|j}|| j  d }x>t|||}|dd	t	tt|| d    rP |d
7 }qW tt|dk tt|| }|j }|jt}	|j|}|	|_|S )N)r/   r-   zlog10 of a negative valuer%   r   rP   r+   rx   r   rZ   )r   r   rD  r   rE  r6   rc   r	   r7   re   r   rN   rh   rT   rU   r?   r  _dlog10r_   rg   r5   r'  r(  r   r   r>   )
r.   r/   r:   r)  r*  r   r
  r$  r   r>   r'   r'   r)   log10  s:    
.$

zDecimal.log10c             C   sV   | j |d}|r|S |d kr"t }| j r.tS | s@|jtddS t| j }|j|S )N)r/   zlogb(0)r-   )	r   r   r   rE  rc   r
   r   r   r   )r.   r/   r:   r'   r'   r)   logb   s    	zDecimal.logbc             C   s8   | j dks| jdkrdS x| jD ]}|dkr dS q W dS )Nr%   FZ01T)r6   rN   r7   )r.   digr'   r'   r)   
_islogical>  s    zDecimal._islogicalc             C   s   |j t| }|dkr$d| | }n|dk r<||j  d  }|j t| }|dkr`d| | }n|dk rx||j  d  }||fS )Nr%   rP   )r?   re   )r.   r/   opaopbZdifr'   r'   r)   _fill_logicalL  s    zDecimal._fill_logicalc             C   s~   |d krt  }t|dd}| j  s.|j  r8|jtS | j|| j|j\}}djdd t||D }t	d|j
dpxddS )NT)r   rR   c             S   s$   g | ]\}}t t|t|@ qS r'   )r_   rT   ).0r  br'   r'   r)   
<listcomp>g  s    z'Decimal.logical_and.<locals>.<listcomp>r%   rP   )r   r   rM  rc   r	   rP  r7   rm   zipr5   rf   )r.   r   r/   rN  rO  r   r'   r'   r)   logical_andY  s    
zDecimal.logical_andc             C   s(   |d krt  }| jtdd|j d|S )Nr%   r   )r   logical_xorr5   r?   )r.   r/   r'   r'   r)   logical_invertj  s    zDecimal.logical_invertc             C   s~   |d krt  }t|dd}| j  s.|j  r8|jtS | j|| j|j\}}djdd t||D }t	d|j
dpxddS )NT)r   rR   c             S   s$   g | ]\}}t t|t|B qS r'   )r_   rT   )rQ  r  rR  r'   r'   r)   rS    s    z&Decimal.logical_or.<locals>.<listcomp>r%   rP   )r   r   rM  rc   r	   rP  r7   rm   rT  r5   rf   )r.   r   r/   rN  rO  r   r'   r'   r)   
logical_orq  s    
zDecimal.logical_orc             C   s~   |d krt  }t|dd}| j  s.|j  r8|jtS | j|| j|j\}}djdd t||D }t	d|j
dpxddS )NT)r   rR   c             S   s$   g | ]\}}t t|t|A qS r'   )r_   rT   )rQ  r  rR  r'   r'   r)   rS    s    z'Decimal.logical_xor.<locals>.<listcomp>r%   rP   )r   r   rM  rc   r	   rP  r7   rm   rT  r5   rf   )r.   r   r/   rN  rO  r   r'   r'   r)   rV    s    
zDecimal.logical_xorc             C   s   t |dd}|d krt }| js&|jr~| j }|j }|s>|r~|dkrX|dkrX| j|S |dkrr|dkrr|j|S | j||S | j j|j }|dkr| j|}|dkr|}n| }|j|S )NT)r   r-   r%   r   )	r   r   rO   r   r   r   r   r   r-  )r.   r   r/   r.  r/  r*  r:   r'   r'   r)   max_mag  s&    


zDecimal.max_magc             C   s   t |dd}|d krt }| js&|jr~| j }|j }|s>|r~|dkrX|dkrX| j|S |dkrr|dkrr|j|S | j||S | j j|j }|dkr| j|}|dkr| }n|}|j|S )NT)r   r-   r%   r   )	r   r   rO   r   r   r   r   r   r-  )r.   r   r/   r.  r/  r*  r:   r'   r'   r)   min_mag  s&    


zDecimal.min_magc             C   s   |d krt  }| j|d}|r"|S | j dkr2tS | j dkrTtdd|j |j S |j }|jt	 |j
  | j|}|| kr|S | jtdd|j d |S )N)r/   r-   r%   r=   r   r   )r   r   r   rD  r5   r?   r   rG   r(  r   _ignore_all_flagsr   r   r   )r.   r/   r:   new_selfr'   r'   r)   
next_minus  s"    

zDecimal.next_minusc             C   s   |d krt  }| j|d}|r"|S | j dkr2tS | j dkrTtdd|j |j S |j }|jt	 |j
  | j|}|| kr|S | jtdd|j d |S )N)r/   r-   r=   r%   r   r   )r   r   r   rE  r5   r?   r   rG   r(  r   r[  r   r   r   )r.   r/   r:   r\  r'   r'   r)   	next_plus  s"    

zDecimal.next_plusc             C   s   t |dd}|d krt }| j||}|r.|S | j|}|dkrJ| j|S |dkr^| j|}n
| j|}|j r|jt	d|j
 |jt |jt nD|j |jk r|jt |jt |jt |jt |s|jt |S )NT)r   r%   r-   z Infinite result from next_towardr   )r   r   r   r   r7  r^  r]  r   rc   r   r6   r   r   r   r!  r   r   r   )r.   r   r/   r:   Z
comparisonr'   r'   r)   next_toward  s4    	








zDecimal.next_towardc             C   s   | j  rdS | j rdS | j }|dkr,dS |dkr8dS | j rN| jrJdS dS |d kr\t }| j|drv| jrrd	S d
S | jrdS dS d S )Nr   r   r-   z	+Infinityz	-Infinityz-Zeroz+Zero)r/   z
-Subnormalz
+Subnormalz-Normalz+Normalr   )r   r   r   r?  r6   r   r>  )r.   r/   infr'   r'   r)   number_class+  s,    zDecimal.number_classc             C   s   t dS )Nr   )r   )r.   r'   r'   r)   radixU  s    zDecimal.radixc             C   s   |d krt  }t|dd}| j||}|r.|S |jdkrB|jtS |j t|  ko^|jkn  sn|jtS | j r~t	| S t|}| j
}|jt| }|dkrd| | }n|dk r|| d  }||d  |d |  }t| j|jdpd| jS )NT)r   r%   rP   )r   r   r   rN   rc   r	   r?   rT   r   r   r7   re   r5   r6   rf   )r.   r   r/   r:   torotrotdigtopadZrotatedr'   r'   r)   rotateY  s,    

"
zDecimal.rotatec             C   s   |d krt  }t|dd}| j||}|r.|S |jdkrB|jtS d|j|j  }d|j|j  }|t|  kox|kn  s|jtS | j	 rt
| S t| j| j| jt| }|j|}|S )NT)r   r%   r+   r   )r   r   r   rN   rc   r	   r@   r?   rT   r   r   r5   r6   r7   r   )r.   r   r/   r:   ZliminfZlimsupr~   r'   r'   r)   scalebz  s"    



zDecimal.scalebc             C   s  |d krt  }t|dd}| j||}|r.|S |jdkrB|jtS |j t|  ko^|jkn  sn|jtS | j r~t	| S t|}| j
}|jt| }|dkrd| | }n|dk r|| d  }|dk r|d | }n|d|  }||j d  }t| j|jdpd| jS )NT)r   r%   rP   )r   r   r   rN   rc   r	   r?   rT   r   r   r7   re   r5   r6   rf   )r.   r   r/   r:   rc  rd  re  Zshiftedr'   r'   r)   r     s2    

"
zDecimal.shiftc             C   s   | j t| ffS )N)	__class__r_   )r.   r'   r'   r)   
__reduce__  s    zDecimal.__reduce__c             C   s   t | tkr| S | jt| S )N)typer   rh  r_   )r.   r'   r'   r)   __copy__  s    zDecimal.__copy__c             C   s   t | tkr| S | jt| S )N)rj  r   rh  r_   )r.   memor'   r'   r)   __deepcopy__  s    zDecimal.__deepcopy__c             C   sN  |d krt  }t||d}| jrXt| j|}t| j }|d dkrL|d7 }t|||S |d d krvddg|j |d< |d dkrt	| j| j
| jd } |j}|d }|d k	r|d dkr| j|d	 |} nF|d d
kr| j| |} n*|d dkrt| j
|kr| j||} |  rB| jdkrB|d d
krB| jd|} | jt| j
 }	|d dkr|  r||d k	r|d	| }
nd	}
nB|d d
kr|	}
n.|d dkr| jdkr|	dkr|	}
nd	}
|
dk rd}d|
  | j
 }nP|
t| j
kr| j
d|
t| j
   }d}n"| j
d |
 p$d}| j
|
d  }|	|
 }t| j||||S )N)_localeconvrj  %gGr+   	precisioneEr-   zfF%ZgGr%   r   rP   rR   i)r   _parse_format_specifierrO   _format_signr6   r_   r   _format_alignr   r5   r7   rN   r>   r%  r   re   _format_number)r.   Z	specifierr/   rn  specr<   bodyr>   rr  r   r   ru   rv   rU   r'   r'   r)   
__format__  sZ    
"

zDecimal.__format__)rN   r7   r6   rO   )rP   N)NN)N)N)N)N)N)N)FN)N)N)N)TN)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)NN)N)N)NN)N)NN)NN)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)NN)r1   r2   r3   	__slots__r]   classmethodrp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   r   r   r   r   r   r   r   __radd__r   r   r   __rmul__r   r   r   r   r   r   r   r   r   r   r   r   	__trunc__r   propertyr   r   r   r8   r   r   r   r   r   r   r   r   r   dictr   r   r   r   r   r   r  r  r  r   r   r#  r   r%  r&  r   to_integralr,  r   r   r   r   r   r1  r2  r-  r6  r   r   r7  rU   r:  r;  r"  r   r<  r   r=  r   r>  r?  rC  rG  r  rJ  rK  rM  rP  rU  rW  rX  rV  rY  rZ  r]  r^  r_  ra  rb  rf  rg  r   ri  rk  rm  rz  r'   r'   r'   r)   r   +  s  
 (
 !@

	
	
	
	
2
4
	
V7;!$K
f	>,U n Y="c*"	IK23.*!'Fc             C   s&   t jt}| |_||_||_||_|S )N)r\   r]   r   r6   r7   rN   rO   )r<   Zcoefficientr   Zspecialr.   r'   r'   r)   r5     s    
r5   c               @   s$   e Zd Zdd Zdd Zdd ZdS )rM   c             C   s   |j  | _d S )N)rG   new_context)r.   r  r'   r'   r)   __init__9  s    z_ContextManager.__init__c             C   s   t  | _t| j | jS )N)r   saved_contextr   r  )r.   r'   r'   r)   	__enter__;  s    
z_ContextManager.__enter__c             C   s   t | j d S )N)r   r  )r.   tvtbr'   r'   r)   __exit__?  s    z_ContextManager.__exit__N)r1   r2   r3   r  r  r  r'   r'   r'   r)   rM   3  s   rM   c            	   @   s  e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd ZeZdddZdd Zdd Zdd ZdZd d! Zd"d# Zd$d% Zdd'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dSdT Z-dUdV Z.dWdX Z/dYdZ Z0d[d\ Z1d]d^ Z2d_d` Z3dadb Z4dcdd Z5dedf Z6dgdh Z7didj Z8dkdl Z9dmdn Z:dodp Z;dqdr Z<dsdt Z=dudv Z>dwdx Z?dydz Z@d{d| ZAd}d~ ZBdd ZCdd ZDdd ZEdd ZFdddZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUeUZVdS )r   Nc
                s>  yt }
W n tk
r   Y nX |d k	r*|n|
j| _|d k	r>|n|
j| _|d k	rR|n|
j| _|d k	rf|n|
j| _|d k	rz|n|
j| _|d k	r|n|
j| _|	d krg | _n|	| _d kr|
j	j
 | _	n.ttstfddt D | _	n| _	 d kr
tjtd| _n0t ts4t fddt  D | _n | _d S )Nc             3   s   | ]}|t | kfV  qd S )N)rT   )rQ  r   )r  r'   r)   	<genexpr>n  s    z#Context.__init__.<locals>.<genexpr>r%   c             3   s   | ]}|t | kfV  qd S )N)rT   )rQ  r   )r  r'   r)   r  u  s    )r   	NameErrorr?   r>   r!  r@   r   r   _ignored_flagsr  rG   r^   r  r  fromkeysr  )r.   r?   r>   r!  r@   r   r   r  r  r  Zdcr'   )r  r  r)   r  U  s.    

zContext.__init__c             C   s   t |tstd| |dkr<||krtd||||f nJ|dkrb||k rtd||||f n$||k sr||krtd||||f tj| ||S )Nz%s must be an integerz-infz%s must be in [%s, %d]. got: %sr`  z%s must be in [%d, %s]. got: %sz%s must be in [%d, %d]. got %s)r^   rT   rq   rk   r\   __setattr__)r.   namers   ZvminZvmaxr'   r'   r)   _set_integer_checky  s    
zContext._set_integer_checkc             C   sh   t |tstd| x |D ]}|tkrtd| qW x tD ]}||kr>td| q>W tj| ||S )Nz%s must be a signal dictz%s is not a valid signal dict)r^   r  rq   r  KeyErrorr\   r  )r.   r  r~   keyr'   r'   r)   _set_signal_dict  s    


zContext._set_signal_dictc             C   s   |dkr| j ||ddS |dkr0| j ||ddS |dkrH| j ||ddS |dkr`| j ||ddS |d	krx| j ||ddS |d
kr|tkrtd| tj| ||S |dks|dkr| j||S |dkrtj| ||S td| d S )Nr?   r-   r`  r!  z-infr%   r@   r   r   r>   z%s: invalid rounding moder  r  r  z.'decimal.Context' object has no attribute '%s')r  _rounding_modesrq   r\   r  r  rK   )r.   r  rs   r'   r'   r)   r    s(    zContext.__setattr__c             C   s   t d| d S )Nz%s cannot be deleted)rK   )r.   r  r'   r'   r)   __delattr__  s    zContext.__delattr__c          	   C   sN   dd | j j D }dd | jj D }| j| j| j| j| j| j| j	||ffS )Nc             S   s   g | ]\}}|r|qS r'   r'   )rQ  sigr  r'   r'   r)   rS    s    z&Context.__reduce__.<locals>.<listcomp>c             S   s   g | ]\}}|r|qS r'   r'   )rQ  r  r  r'   r'   r)   rS    s    )
r  itemsr  rh  r?   r>   r!  r@   r   r   )r.   r  r  r'   r'   r)   ri    s
    zContext.__reduce__c             C   s|   g }|j dt|   dd | jj D }|j ddj| d  dd | jj D }|j ddj| d  dj|d	 S )
NzrContext(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d, clamp=%(clamp)dc             S   s   g | ]\}}|r|j qS r'   )r1   )rQ  r}   r  r'   r'   r)   rS    s    z$Context.__repr__.<locals>.<listcomp>zflags=[z, ]c             S   s   g | ]\}}|r|j qS r'   )r1   )rQ  r  r  r'   r'   r)   rS    s    ztraps=[))rl   varsr  r  rm   r  )r.   r   namesr'   r'   r)   r     s    zContext.__repr__c             C   s   x| j D ]}d| j |< qW d S )Nr%   )r  )r.   flagr'   r'   r)   rH     s    zContext.clear_flagsc             C   s   x| j D ]}d| j |< qW d S )Nr%   )r  )r.   r  r'   r'   r)   clear_traps  s    zContext.clear_trapsc          
   C   s.   t | j| j| j| j| j| j| j| j| j		}|S )N)
r   r?   r>   r!  r@   r   r   r  r  r  )r.   ncr'   r'   r)   r'    s    zContext._shallow_copyc          
   C   s6   t | j| j| j| j| j| j| jj | j	j | j
	}|S )N)r   r?   r>   r!  r@   r   r   r  rG   r  r  )r.   r  r'   r'   r)   rG     s
    zContext.copyc             G   sZ   t j||}|| jkr(| j| f| S d| j|< | j| sN| j| f| S ||d S )Nr-   )_condition_mapgetr  r0   r  r  )r.   Z	conditionZexplanationr(   errorr'   r'   r)   rc     s    


zContext._raise_errorc             C   s
   | j t S )N)_ignore_flagsr  )r.   r'   r'   r)   r[    s    zContext._ignore_all_flagsc             G   s   | j t| | _ t|S )N)r  ri   )r.   r  r'   r'   r)   r    s    zContext._ignore_flagsc             G   s<   |rt |d ttfr|d }x|D ]}| jj| q$W d S )Nr%   )r^   rj   ri   r  remove)r.   r  r  r'   r'   r)   _regard_flags  s    
zContext._regard_flagsc             C   s   t | j| j d S )Nr-   )rT   r!  r?   )r.   r'   r'   r)   r     s    zContext.Etinyc             C   s   t | j| j d S )Nr-   )rT   r@   r?   )r.   r'   r'   r)   r     s    zContext.Etopc             C   s   | j }|| _ |S )N)r>   )r.   rj  r>   r'   r'   r)   r(    s    zContext._set_roundingrP   c             C   sj   t |tr*||j ksd|kr*| jtdS t|| d}|j r`t|j| j	| j
 kr`| jtdS |j| S )NrQ   zAtrailing or leading whitespace and underscores are not permitted.)r/   zdiagnostic info too long in NaN)r^   r_   ra   rc   r   r   r   re   r7   r?   r   r   )r.   rA  r~   r'   r'   r)   create_decimal#  s    zContext.create_decimalc             C   s   t j|}|j| S )N)r   rp   r   )r.   r}   r~   r'   r'   r)   create_decimal_from_float4  s    
z!Context.create_decimal_from_floatc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r   )r.   r  r'   r'   r)   rg   F  s    zContext.absc             C   s8   t |dd}|j|| d}|tkr0td| n|S d S )NT)r   )r/   zUnable to convert %s to Decimal)r   r   r   rq   )r.   r  rR  r   r'   r'   r)   add[  s
    zContext.addc             C   s   t |j| S )N)r_   r   )r.   r  r'   r'   r)   _applyp  s    zContext._applyc             C   s   t |tstd|j S )Nz,canonical requires a Decimal as an argument.)r^   r   rq   r1  )r.   r  r'   r'   r)   r1  s  s    	
zContext.canonicalc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   r   )r.   r  rR  r'   r'   r)   r     s    !zContext.comparec             C   s   t |dd}|j|| dS )NT)r   )r/   )r   r2  )r.   r  rR  r'   r'   r)   r2    s     zContext.compare_signalc             C   s   t |dd}|j|S )NT)r   )r   r-  )r.   r  rR  r'   r'   r)   r-    s    zContext.compare_totalc             C   s   t |dd}|j|S )NT)r   )r   r6  )r.   r  rR  r'   r'   r)   r6    s    zContext.compare_total_magc             C   s   t |dd}|j S )NT)r   )r   r   )r.   r  r'   r'   r)   r     s    
zContext.copy_absc             C   s   t |dd}t|S )NT)r   )r   r   )r.   r  r'   r'   r)   copy_decimal  s    
zContext.copy_decimalc             C   s   t |dd}|j S )NT)r   )r   r   )r.   r  r'   r'   r)   r     s    
zContext.copy_negatec             C   s   t |dd}|j|S )NT)r   )r   r7  )r.   r  rR  r'   r'   r)   r7    s    zContext.copy_signc             C   s8   t |dd}|j|| d}|tkr0td| n|S d S )NT)r   )r/   zUnable to convert %s to Decimal)r   r   r   rq   )r.   r  rR  r   r'   r'   r)   divide+  s
    zContext.dividec             C   s8   t |dd}|j|| d}|tkr0td| n|S d S )NT)r   )r/   zUnable to convert %s to Decimal)r   r   r   rq   )r.   r  rR  r   r'   r'   r)   
divide_intP  s
    zContext.divide_intc             C   s8   t |dd}|j|| d}|tkr0td| n|S d S )NT)r   )r/   zUnable to convert %s to Decimal)r   r   r   rq   )r.   r  rR  r   r'   r'   r)   r   g  s
    zContext.divmodc             C   s   t |dd}|j| dS )NT)r   )r/   )r   rU   )r.   r  r'   r'   r)   rU   |  s    zContext.expc             C   s   t |dd}|j||| dS )NT)r   )r/   )r   r   )r.   r  rR  r*  r'   r'   r)   r     s    zContext.fmac             C   s   t |tstd|j S )Nz/is_canonical requires a Decimal as an argument.)r^   r   rq   r:  )r.   r  r'   r'   r)   r:    s    	
zContext.is_canonicalc             C   s   t |dd}|j S )NT)r   )r   r;  )r.   r  r'   r'   r)   r;    s    zContext.is_finitec             C   s   t |dd}|j S )NT)r   )r   r"  )r.   r  r'   r'   r)   r"    s    zContext.is_infinitec             C   s   t |dd}|j S )NT)r   )r   r   )r.   r  r'   r'   r)   r     s    zContext.is_nanc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r<  )r.   r  r'   r'   r)   r<    s    zContext.is_normalc             C   s   t |dd}|j S )NT)r   )r   r   )r.   r  r'   r'   r)   r     s    zContext.is_qnanc             C   s   t |dd}|j S )NT)r   )r   r=  )r.   r  r'   r'   r)   r=    s    zContext.is_signedc             C   s   t |dd}|j S )NT)r   )r   r   )r.   r  r'   r'   r)   r   $  s    zContext.is_snanc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r>  )r.   r  r'   r'   r)   r>  4  s    zContext.is_subnormalc             C   s   t |dd}|j S )NT)r   )r   r?  )r.   r  r'   r'   r)   r?  J  s    zContext.is_zeroc             C   s   t |dd}|j| dS )NT)r   )r/   )r   rG  )r.   r  r'   r'   r)   rG  [  s    z
Context.lnc             C   s   t |dd}|j| dS )NT)r   )r/   )r   rJ  )r.   r  r'   r'   r)   rJ  q  s    zContext.log10c             C   s   t |dd}|j| dS )NT)r   )r/   )r   rK  )r.   r  r'   r'   r)   rK    s    zContext.logbc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   rU  )r.   r  rR  r'   r'   r)   rU    s    zContext.logical_andc             C   s   t |dd}|j| dS )NT)r   )r/   )r   rW  )r.   r  r'   r'   r)   rW    s    zContext.logical_invertc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   rX  )r.   r  rR  r'   r'   r)   rX    s    zContext.logical_orc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   rV  )r.   r  rR  r'   r'   r)   rV    s    zContext.logical_xorc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   r   )r.   r  rR  r'   r'   r)   r     s    zContext.maxc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   rY  )r.   r  rR  r'   r'   r)   rY  &  s    zContext.max_magc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   r   )r.   r  rR  r'   r'   r)   r   7  s    zContext.minc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   rZ  )r.   r  rR  r'   r'   r)   rZ  R  s    zContext.min_magc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r   )r.   r  r'   r'   r)   minusc  s    zContext.minusc             C   s8   t |dd}|j|| d}|tkr0td| n|S d S )NT)r   )r/   zUnable to convert %s to Decimal)r   r   r   rq   )r.   r  rR  r   r'   r'   r)   multiplyt  s
    zContext.multiplyc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r]  )r.   r  r'   r'   r)   r]    s    zContext.next_minusc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r^  )r.   r  r'   r'   r)   r^    s    zContext.next_plusc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   r_  )r.   r  rR  r'   r'   r)   r_    s     zContext.next_towardc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r   )r.   r  r'   r'   r)   r     s    zContext.normalizec             C   s   t |dd}|j| dS )NT)r   )r/   )r   ra  )r.   r  r'   r'   r)   ra    s    /zContext.number_classc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r   )r.   r  r'   r'   r)   plus)  s    zContext.plusc             C   s:   t |dd}|j||| d}|tkr2td| n|S d S )NT)r   )r/   zUnable to convert %s to Decimal)r   r  r   rq   )r.   r  rR  r   r   r'   r'   r)   power:  s
    IzContext.powerc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   r   )r.   r  rR  r'   r'   r)   r     s    7zContext.quantizec             C   s   t dS )Nr   )r   )r.   r'   r'   r)   rb    s    zContext.radixc             C   s8   t |dd}|j|| d}|tkr0td| n|S d S )NT)r   )r/   zUnable to convert %s to Decimal)r   r   r   rq   )r.   r  rR  r   r'   r'   r)   r     s
    zContext.remainderc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   r   )r.   r  rR  r'   r'   r)   r     s    zContext.remainder_nearc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   rf  )r.   r  rR  r'   r'   r)   rf    s    zContext.rotatec             C   s   t |dd}|j|S )NT)r   )r   r#  )r.   r  rR  r'   r'   r)   r#  1  s    zContext.same_quantumc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   rg  )r.   r  rR  r'   r'   r)   rg  I  s    zContext.scalebc             C   s   t |dd}|j|| dS )NT)r   )r/   )r   r   )r.   r  rR  r'   r'   r)   r   \  s    zContext.shiftc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r,  )r.   r  r'   r'   r)   r,  z  s    zContext.sqrtc             C   s8   t |dd}|j|| d}|tkr0td| n|S d S )NT)r   )r/   zUnable to convert %s to Decimal)r   r   r   rq   )r.   r  rR  r   r'   r'   r)   subtract  s
    zContext.subtractc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r   )r.   r  r'   r'   r)   r     s    zContext.to_eng_stringc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r   )r.   r  r'   r'   r)   to_sci_string  s    zContext.to_sci_stringc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r&  )r.   r  r'   r'   r)   r&    s    zContext.to_integral_exactc             C   s   t |dd}|j| dS )NT)r   )r/   )r   r   )r.   r  r'   r'   r)   r     s    zContext.to_integral_value)	NNNNNNNNN)N)rP   )N)Wr1   r2   r3   r  r  r  r  r  ri  r   rH   r  r'  rG   rk  rc   r[  r  r  r   r   r   r(  r  r  rg   r  r  r1  r   r2  r-  r6  r   r  r   r7  r  r  r   rU   r   r:  r;  r"  r   r<  r   r=  r   r>  r?  rG  rJ  rK  rU  rW  rX  rV  r   rY  r   rZ  r  r  r]  r^  r_  r   ra  r  r  r   rb  r   r   rf  r#  rg  r   r,  r  r   r  r&  r   r  r'   r'   r'   r)   r   B  s     
"

$#% #2
P:&" c               @   s&   e Zd Zd	Zd
ddZdd ZeZdS )rh   r<   rT   rU   Nc             C   sf   |d krd | _ d| _d | _nFt|trD|j| _ t|j| _|j| _n|d | _ |d | _|d | _d S )Nr%   r-   r+   )r<   rT   rU   r^   r   r6   r7   rN   )r.   rs   r'   r'   r)   r    s    



z_WorkRep.__init__c             C   s   d| j | j| jf S )Nz(%r, %r, %r))r<   rT   rU   )r.   r'   r'   r)   r   (  s    z_WorkRep.__repr__)r<   rT   rU   )N)r1   r2   r3   r{  r  r   r   r'   r'   r'   r)   rh     s   
rh   c             C   s   | j |j k r|}| }n| }|}tt|j}tt|j}|j td|| d  }||j  d |k rpd|_||_ | jd|j |j   9  _|j |_ | |fS )Nr-   r+   r   r   )rU   re   r_   rT   r   )r   r   r?   Ztmpr   Ztmp_lenZ	other_lenrU   r'   r'   r)   r   /  s    r   c             C   sb   | dkrdS |dkr | d|  S t t| }t|t|jd }|| k rPd S | d|   S d S )Nr%   r   rP   )r_   rg   re   rstrip)r4   r   Zstr_nZval_nr'   r'   r)   r  O  s    r  c             C   sF   | dks|dkrt dd}x$||kr@|||  |  d?  }}qW |S )Nr%   z3Both arguments to _sqrt_nearest should be positive.r-   )rk   )r4   r  rR  r'   r'   r)   _sqrt_nearestd  s    
r  c             C   s2   d|> | |?  }}|d| |d @  |d@  |k S )Nr-   r+   r'   )r  r   rR  r   r'   r'   r)   _rshift_nearests  s    r  c             C   s&   t | |\}}|d| |d@  |k S )Nr+   r-   )r   )r  rR  r   r   r'   r'   r)   _div_nearest{  s    r  r  c       	   	   C   s   | | }d}xn||kr*t ||| > |ksF||krzt ||| ? |krzt|| d> |t||t||  | }|d7 }qW tdtt| d|   }t||}t||}x0t|d ddD ]}t||t|| | }qW t|| |S )Nr%   r-   r   rZ   ir   )rg   r  r  r  rT   re   r_   r   )	r  MLr  RTZyshiftwr   r'   r'   r)   _ilog  s    

r  c       
      C   s   |d7 }t t| }|| || dk }|dkrd| }|| | }|dkrZ| d| 9 } nt| d|  } t| |}t|}t|| |}|| }	nd}t|d|  }	t|	| dS )Nr+   r-   r%   r   r  )re   r_   r  r  _log10_digits)
r*  r   r
  r+  r}   r  r   log_dZlog_10Zlog_tenpowerr'   r'   r)   rI    s     

rI  c       	      C   s   |d7 }t t| }|| || dk }|dkrr|| | }|dkrR| d| 9 } nt| d|  } t| d| }nd}|rt tt|d }|| dkrt|t||  d| }qd}nd}t|| dS )Nr+   r-   r%   r   r  )re   r_   r  r  rg   r  )	r*  r   r
  r+  r}   r   r  r  Z	f_log_tenr'   r'   r)   rF    s"    rF  c               @   s   e Zd Zdd Zdd ZdS )_Log10Memoizec             C   s
   d| _ d S )NZ/23025850929940456840179914546843642076011014886)rw   )r.   r'   r'   r)   r    s    z_Log10Memoize.__init__c             C   s   |dk rt d|t| jkrd}xLd|| d  }tttd| |d}|| d  d| krdP |d7 }q$W |jdd d	 | _t| jd |d  S )
Nr%   zp should be nonnegativerZ   r   r+   r  rP   r-   r   )rk   re   rw   r_   r  r  r  rT   )r.   r
  r  r  rw   r'   r'   r)   	getdigits  s    	z_Log10Memoize.getdigitsN)r1   r2   r3   r  r  r'   r'   r'   r)   r    s   r  c       	      C   s   t | |> | }tdtt| d|   }t| |}||> }x.t|d ddD ]}t| ||  || }qRW x6t|d dd	D ]"}||d > }t|||  |}qW || S )
Nr   rZ   r-   r%   r+   ir   r   r   )r  rT   re   r_   r  r   )	r  r  r  r  r  r  ZMshiftr   r   r'   r'   r)   _iexp&  s    
r  c       	      C   s   |d7 }t d|tt|  d }|| }|| }|dkrH| d|  }n| d|   }t|t|\}}t|d| }tt|d| d|| d fS )Nr+   r%   r-   r   i  rZ   )r   re   r_   r   r  r  r  )	r*  r   r
  r  r   r   ZcshiftZquotr  r'   r'   r)   r8  K  s    r8  c             C   s   t tt|| }t| ||| d }|| }|dkrJ|| d|  }nt|| d|  }|dkrt t| | dk|dkkrd|d  d d|  }	}
qd| d |  }	}
n,t||d  |d \}	}
t|	d}	|
d7 }
|	|
fS )Nr-   r%   r   )re   r_   rg   rF  r  r8  )r  r  r  r  r
  rR  Zlxcr   Zpcr   rU   r'   r'   r)   r  o  s    
r  r  F   5   (      r@     r   rx   )	r   2345678r=   c             C   s0   | dkrt dt| }dt| ||d   S )Nr%   z0The argument to _log10_lb should be nonnegative.r  )rk   r_   re   )r*  Z
correctionZstr_cr'   r'   r)   r	    s    r	  c             C   sL   t | tr| S t | tr t| S |r8t | tr8tj| S |rHtd|  tS )NzUnable to convert %s to Decimal)r^   r   rT   ro   rp   rq   r   )r   r   Zallow_floatr'   r'   r)   r     s    


r   c             C   s   t |tr| |fS t |tjrR| jsDt| jtt| j	|j
 | j} | t|jfS |rrt |tjrr|jdkrr|j}t |trt }|rd|jt< n|jtd | tj|fS ttfS )Nr%   r-   z;strict semantics for mixing floats and Decimals are enabled)r^   r   _numbersZRationalrO   r5   r6   r_   rT   r7   denominatorrN   	numeratorZComplexr   r   ro   r   r  r   rc   rp   r   )r.   r   r   r/   r'   r'   r)   r     s$    

r   r  i?B )r?   r>   r  r  r@   r!  r   r   r[   )r?   r>   r  r  a          # A numeric string consists of:
#    \s*
    (?P<sign>[-+])?              # an optional sign, followed by either...
    (
        (?=\d|\.\d)              # ...a number (with at least one digit)
        (?P<int>\d*)             # having a (possibly empty) integer part
        (\.(?P<frac>\d*))?       # followed by an optional fractional part
        (E(?P<exp>[-+]?\d+))?    # followed by an optional exponent, or...
    |
        Inf(inity)?              # ...an infinity, or...
    |
        (?P<signal>s)?           # ...an (optionally signaling)
        NaN                      # NaN
        (?P<diag>\d*)            # with (possibly empty) diagnostic info.
    )
#    \s*
    \Z
z0*$z50*$z\A
(?:
   (?P<fill>.)?
   (?P<align>[<>=^])
)?
(?P<sign>[-+ ])?
(?P<alt>\#)?
(?P<zeropad>0)?
(?P<minimumwidth>(?!0)\d+)?
(?P<thousands_sep>,)?
(?:\.(?P<precision>0|(?!0)\d+))?
(?P<type>[eEfFgGn%])?
\Z
c             C   s  t j| }|d krtd|  |j }|d }|d }|d d k	|d< |d rv|d k	rbtd|  |d k	rvtd|  |p|d|d< |pd|d< |d	 d krd
|d	< t|d pd|d< |d d k	rt|d |d< |d dkr|d d ks|d dkrd|d< |d dkrfd|d< |d kr&tj }|d d k	r@td|  |d |d< |d |d< |d |d< n*|d d kr|d|d< ddg|d< d|d< |S )NzInvalid format specifier: fillalignzeropadz7Fill character conflicts with '0' in format specifier: z2Alignment conflicts with '0' in format specifier:  >r<   rS   minimumwidthrP   rr  r%   rj  ZgGnr-   r4   rp  thousands_sepzJExplicit thousands separator conflicts with 'n' type in format specifier: groupingdecimal_pointrR   rZ   r   )_parse_format_specifier_regexmatchrk   	groupdictrT   _locale
localeconv)format_specrn  rt   Zformat_dictr  r  r'   r'   r)   rt  D  sN    

rt  c       	      C   s   |d }|d }||t |  t |  }|d }|dkrF| | | }nj|dkr\||  | }nT|dkrr| | | }n>|dkrt |d }|d | |  | ||d   }ntd	|S )
Nr  r  r  <r  =^r+   zUnrecognised alignment field)re   rk   )	r<   ry  rx  r  r  Zpaddingr  r   Zhalfr'   r'   r)   rv    s    "rv  c             C   sp   ddl m}m} | sg S | d dkrJt| dkrJ|| d d || d S | d	 tjkrd| d d
 S tdd S )Nr%   )chainrepeatr-   r+   z unrecognised format for groupingr   r   r   r   r   )	itertoolsr  r  re   r  CHAR_MAXrk   )r  r  r  r'   r'   r)   _group_lengths  s    r  c             C   s   |d }|d }g }xt |D ]}|dkr2tdttt| |d|}|jd|t|   | | d    | d |  } ||8 }|  r|dkrP |t|8 }qW tt| |d}|jd|t|   | | d    |jt|S )Nr  r  r%   zgroup length should be positiver-   rP   )r  rk   r   r   re   rl   rm   reversed)rw   rx  	min_widthsepr  groupsr+  r'   r'   r)   _insert_thousands_sep  s     $$r  c             C   s$   | rdS |d dkr|d S dS d S )NrS   r<   z +rR   r'   )is_negativerx  r'   r'   r)   ru    s
    ru  c             C   s   t | |}|s|d r"|d | }|dks6|d dkr\ddddd|d  }|d	j||7 }|d d
krp|d
7 }|d r|d t| t| }nd}t|||}t||| |S )NZaltr  r%   rj  rs  r   r   )r   r   rq  rp  z{0}{1:+}ro  r  r  )ru  formatre   r  rv  )r  ru   rv   rU   rx  r<   Zecharr  r'   r'   r)   rw    s    
rw  ZInfz-Infr   l            l    lNZoi)N)F)r%   )r  )r  )FF)Fi)N)r-   r   )|__all__r1   rC   __version__Z__libmpdec_version__Zmathry   Znumbersr  rD   collectionsr&   Z_namedtupler   ImportErrorr   r   r   r   r   r   r   r   r$   maxsizer    r!   r"   r#   ArithmeticErrorr   r   r	   r   ZeroDivisionErrorr
   r   r   r   r   r   r   r   r   rq   r   r  r  r  rI   r\   rA   rE   rK   hasattrrJ   rF   r   r   r   r   r5   NumberregisterrM   r   rh   r   rT   r|   r  r  r  r  r  r  rI  rF  r  r  r  r  r8  r  r	  r   r   r   r   r   recompileVERBOSE
IGNORECASEr  r`   r   r   DOTALLr  Zlocaler  rt  rv  r  r  ru  rw  rE  rD  r9   r4  r  r3  r;   	hash_infomodulusr   r`  r   r   r   r   r   r'   r'   r'   r)   <module>u   s~  


&



.                          

             ^

0",#
%$+
	

*
P
%
)