
    OhO                    X   d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dl	Z
d dlmZ d dlmZ d dlmZmZmZmZ ej*                  d        Zej*                  d        Zej*                  d        Zej*                  d	        Zej*                  d
        Zej*                  d        Zej*                  d        Zej*                  d        Z G d dej<                        Zd Z d Z!d Z"d Z#ejH                  jK                  dddg      d        Z& G d de      Z' G d de'      Z(e(jS                          d Z*ejH                  jK                  de'e(g      d        Z+ejH                  jK                  ddg d g d!fdg d"g d#fg      d$        Z,d% Z-d& Z.d' Z/d( Z0d) Z1d* Z2d+ Z3d, Z4d- Z5d. Z6y)/    )annotationsN)np_version_gt2)base)DecimalArrayDecimalDtype	make_data
to_decimalc                     t               S N)r        s/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/pandas/tests/extension/decimal/test_decimal.pydtyper      s
    >r   c                 (    t        t                     S r   )r   r   r   r   r   datar      s    	$$r   c                 v    t        t        d      D  cg c]  } t        j                  d       c}       S c c} w )Nd      )r   rangedecimalDecimal)_s    r   data_for_twosr       s(    U3Z@+@AA@s   6c                 h    t        t        j                  d      t        j                  d      g      S )NNaN   r   r   r   r   r   r   data_missingr   %   s$    /1CDEEr   c                     t        t        j                  d      t        j                  d      t        j                  d      g      S )N120r   r   r   r   data_for_sortingr#   *   s4    		ws3W__S5IJ r   c                     t        t        j                  d      t        j                  d      t        j                  d      g      S )Nr    r   r"   r   r   r   r   data_missing_for_sortingr%   1   s4    		wu5ws7KL r   c                     d S )Nc                F    | j                         xr |j                         S r   )is_nan)xys     r   <lambda>zna_cmp.<locals>.<lambda>:   s    
1qxxz r   r   r   r   r   na_cmpr,   8   s    11r   c            
         t        j                  d      } t        j                  d      }t        j                  d      }t        j                  d      }t        | | ||||| |g      S )N1.0z0.02.0r   )r   r   r   )bacnas       r   data_for_groupingr4   =   sV    AAA		BAr2q!Q233r   c                      e Zd Z	 	 	 	 d&dZd'dZd( fdZ fdZ fdZd Zd Z	d Z
 fd	Z fd
Zej                  j                  ddg dg dfdg dg dfdg dg dfdg dg dfdg dg dfdg dg dfdg dg dfdg dg dfg       fd       Z fdZ fdZ fdZ fdZ fdZ fdZej                  j                  dddg      d        Zd  Zej                  j3                  d!"      ej                  j                  d#ej6                  ej8                  ej:                  g       fd$              Zd% Z xZ S ))TestDecimalArrayc                     y r   r   )selfop_nameobjothers       r   _get_expected_exceptionz(TestDecimalArray._get_expected_exceptionG   s     r   c                     y)NTr   )r8   serr9   s      r   _supports_reductionz$TestDecimalArray._supports_reductionL   s    r   c                    |dk(  rt         |   |||      S  t        ||      |      } t        t        j                  |      |             }t        j                  ||       y )Ncount)skipna)supercheck_reducegetattrnpasarraytmassert_almost_equal)r8   r>   r9   rB   resultexpected	__class__s         r   rD   zTestDecimalArray.check_reduceO   s[    g7'Wf==*WS'*&9F8wrzz#8:H""684r   c                    |dv r5t         j                  j                  t              }|j	                  |       t
        |   |||       y )N)kurtskewsemmedianraises)pytestmarkxfailNotImplementedErrorapplymarkerrC   test_reduce_series_numeric)r8   r   all_numeric_reductionsrB   requestrU   rL   s         r   rY   z+TestDecimalArray.test_reduce_series_numericW   sD    !%FF;;$$,?$@D%*41GPr   c                    |}|dv r5t         j                  j                  t              }|j	                  |       t
        |   |||      S )N)rO   rQ   rR   )rT   rU   rV   rW   rX   rC   test_reduce_frame)r8   r   rZ   rB   r[   r9   rU   rL   s          r   r]   z"TestDecimalArray.test_reduce_frame]   sL    (((;;$$,?$@D%w(/EvNNr   c                V    t        j                  |      }| j                  |||d       y )N      ?)pdSeries_compare_other)r8   r   comparison_opr>   s       r   test_compare_scalarz$TestDecimalArray.test_compare_scalare   s#    iioC}c:r   c           
     Z   t        j                  |      }t        j                  j	                  d      j                  g dt        |            }t        j                  |      |D cg c]!  }t        j                  t        d|            # c}z  }| j                  ||||       y c c}w )Nr   )r   r   g       @)r`   ra   rF   randomdefault_rngchoicelenr   r   powrb   )r8   r   rc   r>   alterir;   s          r   test_compare_arrayz#TestDecimalArray.test_compare_arrayi   sz    iio		%%a(//
CIF		$"OA7??3sA;#?"OOC}e< #Ps   (&B(c           	        |}t        j                  |      }t        j                         }|j                  t        j
                     }|j                  t        j                     }d|j                  t        j
                  <   d|j                  t        j                  <   t        j                  |D cg c]  }t        |dz         c}      }	| j                  |||	       d|vr| j                  |||dz         | j                  ||d       | j                  ||d       ||j                  t        j
                  <   ||j                  t        j                  <   y c c}w )Nr   r   modr      )	r`   ra   r   
getcontexttrapsDivisionByZeroInvalidOperationintcheck_opname)
r8   r   all_arithmetic_operatorsr9   r>   contextdivbyzerotrapinvalidoptrapdr;   s
             r   test_arith_series_with_arrayz-TestDecimalArray.test_arith_series_with_arrayq   s   *iio$$&g&<&<=g&>&>?01g,,-23g../ 		6A3q3w<67#w.c7C!G4#w*#w*0=g,,-2?g../ 7s   3Ec                    d}t        j                  t        |d      5  t        |   |       d d d        y # 1 sw Y   y xY wNz,ExtensionArray.fillna added a 'copy' keywordFmatchcheck_stacklevel)rH   assert_produces_warningDeprecationWarningrC   test_fillna_framer8   r   msgrL   s      r   r   z"TestDecimalArray.test_fillna_frame   sA    <''cE
 	4 G%l3	4 	4 	4	   9Ac                   d}t        j                  t        |dd      5  t        |   |       d d d        d}t        j                  t
        |dd      5  t        |   |       d d d        y # 1 sw Y   AxY w# 1 sw Y   y xY w)N4ExtensionArray.fillna 'method' keyword is deprecatedFr   r   raise_on_extra_warnings9The 'method' keyword in DecimalArray.fillna is deprecated)rH   r   r   rC   test_fillna_limit_padFutureWarningr   s      r   r   z&TestDecimalArray.test_fillna_limit_pad   s    D''"$)	
 	8 G),7	8 J''"$)	
 	8 G),7	8 	8	8 	8	8 	8s   A1A=1A:=Bz'limit_area, input_ilocs, expected_ilocsoutside)r   r   r   r   r   )r   r   r   r   r   )r   r   r   r   r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   inside)r   r   r   r   r   c                    d}t        j                  t        |dd      5  d}t        j                  t
        |      5  t        |   ||||       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   Fr   z*DecimalArray does not implement limit_area)r   )rH   r   r   rT   rS   rW   rC   test_ffill_limit_area)r8   r   
limit_areainput_ilocsexpected_ilocsr   rL   s         r   r   z&TestDecimalArray.test_ffill_limit_area   s    " E''"$)	
 
	 ?C2#> - *k>
	 
	 
	 
	s"   A/A#A/#A,	(A//A8c                   d}t        j                  t        |dd      5  t        |   |       d d d        d}t        j                  t
        |dd      5  t        |   |       d d d        d}t        j                  t        |dd      5  t        |   |       d d d        y # 1 sw Y   xxY w# 1 sw Y   MxY w# 1 sw Y   y xY w)Nz)Series.fillna with 'method' is deprecatedFr   r   r   )rH   r   r   rC   test_fillna_limit_backfillr   r   s      r   r   z+TestDecimalArray.test_fillna_limit_backfill   s    9''"$)	
 	= G.|<	= E''"$)	
 	= G.|<	= J''"$)	
 	= G.|<	= 	=%	= 	=	= 	=	= 	=s#   B(B4C (B14B= C	c                    dj                  ddg      }t        j                  t        t        f|d      5  t
        |   |       d d d        y # 1 sw Y   y xY wN|r   r   Fr   )joinrH   r   r   r   rC   test_fillna_no_op_returns_copy)r8   r   r   rL   s      r   r   z/TestDecimalArray.test_fillna_no_op_returns_copy   s]    hhFK
 ''./sU
 	9 G248	9 	9 	9s   AAc                    d}t        j                  t        |d      5  t        |   |       d d d        y # 1 sw Y   y xY wr   )rH   r   r   rC   test_fillna_seriesr   s      r   r   z#TestDecimalArray.test_fillna_series   sA    <''cE
 	5 G&|4	5 	5 	5r   c                    dj                  ddg      }t        j                  t        t        f|d      5  t
        |   ||       d d d        y # 1 sw Y   y xY wr   )r   rH   r   r   r   rC   test_fillna_series_method)r8   r   fillna_methodr   rL   s       r   r   z*TestDecimalArray.test_fillna_series_method   sc    hhFK
 ''./sU
 	K G-lMJ	K 	K 	Ks   AAc                    |st         nd }d}t        j                  ||d      5  t        |   |       d d d        y # 1 sw Y   y xY wr   )r   rH   r   rC   test_fillna_copy_framer8   r   using_copy_on_writewarnr   rL   s        r   r   z'TestDecimalArray.test_fillna_copy_frame   sF    )<!$<''C%P 	9G*<8	9 	9 	9	   ?Ac                    |st         nd }d}t        j                  ||d      5  t        |   |       d d d        y # 1 sw Y   y xY wr   )r   rH   r   rC   test_fillna_copy_seriesr   s        r   r   z(TestDecimalArray.test_fillna_copy_series   sF    )<!$<''C%P 	:G+L9	: 	: 	:r   dropnaTFc                   |d d }|r(t        j                  ||j                                   }n|}t        j                  |      j                  |      }t        j                  |      j                  |      }t        j                         5 }d|j                  t        j                  <   |j                         }|j                         }	d d d        t        j                  	       y # 1 sw Y    xY w)N
   )r   F)rF   arrayisnar`   ra   value_countsr   localcontextrs   ru   
sort_indexrH   assert_series_equal)
r8   all_datar   r[   r;   vcsvcs_exctxrJ   rK   s
             r   test_value_countsz"TestDecimalArray.test_value_counts  s    CR=HHXx}}&678EEii!..f.=5!..f.=!!# 	+s27CIIg../^^%F((*H	+ 	vx0	+ 	+s   >C--C6c                    t        j                  |      }|j                  j                  t	        |      v sJ dt	        |      v sJ y )Nz	Decimal: )r`   ra   r   namerepr)r8   r   r>   s      r   test_series_reprz!TestDecimalArray.test_series_repr  s=     iiozz$s)+++d3i'''r   z%Inconsistent array-vs-scalar behavior)reasonufuncc                &    t         |   ||       y r   )rC   #test_unary_ufunc_dunder_equivalence)r8   r   r   rL   s      r   r   z4TestDecimalArray.test_unary_ufunc_dunder_equivalence!  s     	3D%@r   c                J   t        j                  |d      }t        j                  |d      }t        j                  ||      rJ t        sy 	 t        j                  |d      }t        j                  |d      }t        j                  ||      sJ y # t        $ r Y y w xY w)NT)copyF)rF   r   may_share_memoryr   
ValueError)r8   r   result_copy1result_copy2result_nocopy1result_nocopy2s         r   test_array_interface_copyz*TestDecimalArray.test_array_interface_copy&  s    xx40xx40&&|\BBB	XXd7N
 $U3"">>BBB  		s   B 	B"!B")r9   strreturnz4type[Exception] | tuple[type[Exception], ...] | None)r>   	pd.Seriesr9   r   r   bool)r>   r   r9   r   rB   r   )!__name__
__module____qualname__r<   r?   rD   rY   r]   rd   rn   r}   r   r   rT   rU   parametrizer   r   r   r   r   r   r   r   r   rV   rF   positivenegativeabsr   r   __classcell__)rL   s   @r   r6   r6   F   sm   	=
5QO;=@,48& [[199998888		
"=8
95
K9: [[Xe}51 61&( [[EF[[Wr{{BKK&HIA J GACr   r6   c                 N   t        t        j                  d      t        j                  d      g      } | j                  ddgdt        j                  d            }t        t        j                  d      t        j                  d      g      }t	        j
                  ||       y )Nr.   r/   r   rf   Tz-1.0)
allow_fill
fill_value)r   r   r   takerH   assert_extension_array_equalarrrJ   rK   s      r    test_take_na_value_other_decimalr   9  su    
.0FG
HCXXq"g$7??6;RXSFW__U3W__V5LMNH##FH5r   c                 2   t               } t        j                  g d|       }t        t	        j
                  d      t	        j
                  d      t	        j
                  d      g|       }t        j                  |      }t        j                  ||       y )N)r   r   r   r   r   r   r   )r   r`   ra   r   r   r   rH   r   )r   r>   r   exps       r   6test_series_constructor_coerce_data_to_extension_dtyper   @  sj    NE
))IU
+C
		W__Q/1CDC ))C.C3$r   c                 \   t        t        j                  d      g      } t        j                  | t                     }t        j                  |       }t        j                  ||       t        j                  | d      }t        j                  dg      }t        j                  ||       y )N10.0r   int64r   )r   r   r   r`   ra   r   rH   r   r   s      r   "test_series_constructor_with_dtyper   L  sv    
/0
1CYYs,.1Fyy~H68,YYs'*Fyy"H68,r   c                    t        t        j                  d      g      } t        j                  d| it                     }t        j                  d| i      }t        j                  ||       t        t        j                  d      g      } t        j                  d| id      }t        j                  ddgi      }t        j                  ||       y )Nr   Ar   r   r   )r   r   r   r`   	DataFramer   rH   assert_frame_equalr   s      r   %test_dataframe_constructor_with_dtyper   W  s    
/0
1C\\3*LN;F||S#J'H&(+
/0
1C\\3*G4F||S2$K(H&(+r   frameTFc                f   t        j                  t        t        j                  d      g      d      }t        j
                         }d|_        | r|j                         }|j                  t        |            }| r|d   }|j                  j                  j                  |j                  k(  sJ y )Nr   r1   )r   rq   )r`   ra   r   r   r   Contextprecto_frameastyper   r   ry   )r   r   r   rJ   s       r   test_astype_dispatchesr   d  s     99\7??1#5"67cBD
//
CCH}}[[c*+F<<$$000r   c                  (    e Zd ZdZedddd       Zy)DecimalArrayWithoutFromSequencez:Helper class for testing error handling in _from_sequence.NF)r   r   c                   t        d      )NzFor the test)KeyError)clsscalarsr   r   s       r   _from_sequencez.DecimalArrayWithoutFromSequence._from_sequence|  s    ~&&r   )r   r   r   __doc__classmethodr   r   r   r   r   r   y  s    D.2 ' 'r   r   c                      e Zd Zed        Zy)DecimalArrayWithoutCoercionc                (    | j                  |d      S )NF)coerce_to_dtype)_create_method)r   ops     r   _create_arithmetic_methodz5DecimalArrayWithoutCoercion._create_arithmetic_method  s    !!"e!<<r   N)r   r   r   r   r  r   r   r   r   r     s    = =r   r   c                   t         }t        d        }| j                  t        d|        |t	        j
                  d      t	        j
                  d      g      }t        j                  |      }|j                  |t        j                        }t        j                  t	        j
                  d      t	        j
                  d      gd      }t        j                  ||       y )Nc                    t         S r   )r   )r   s    r   construct_array_typez?test_combine_from_sequence_raises.<locals>.construct_array_type  s    ..r   r  r.   r/   4.0objectr   )r   r   setattrr   r   r   r`   ra   combineoperatoraddrH   r   )monkeypatchr   r  r   r>   rJ   rK   s          r   !test_combine_from_sequence_raisesr    s    
)C/ / &<>RS
wu%wu'=>
?C
))C.C[[hll+F yy		!78H 68,r   class_c                    | t        j                  d      t        j                  d      g      }||z   }t        j                  t        j                  d      t        j                  d      gd      }t	        j
                  ||       y )Nr.   r/   r  r  r   )r   r   rF   r   rH   assert_numpy_array_equal)r  r   rJ   rK   s       r   $test_scalar_ops_from_sequence_raisesr    sj     '//%('//%*@A
BC3YFxx		!78H 1r   z#reverse, expected_div, expected_mod)r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   c                    t        g d      }| rt        d|      \  }}nt        |d      \  }}t        |      }t        |      }t        j                  ||       t        j                  ||       y )N)r   r         r   )r	   divmodrH   r   )reverseexpected_divexpected_modr   divrp   s         r   test_divmod_arrayr    sc     \
"C!S>S#q>Sl+Ll+L##C6##C6r   c                   | d d }t        j                  |t        dd            }t        j                  |      }t        j                  t        j                  |      t        dd            }t        j                  ||       y )Nrq   r     index)r`   ra   r   rF   r   rH   r   )r   r1   srJ   rK   s        r   test_ufunc_fallbackr     s^    RaA
		!5A;'AVVAYFyy%1+6H68,r   c                     t        g d      } t        j                  |       }t        t        j                  | j                              }t	        j
                  ||       y Nr   r   r  )r	   rF   r   _datarH   r   )r1   rJ   rK   s      r   test_array_ufuncr%    s?    9AVVAYF"&&/*H##FH5r   c                    t        g d      } t        j                  |       }t        j                  |      }t        j                  t        t        j                  | j
                                    }t        j                  ||       y r"  )r	   r`   ra   rF   r   r$  rH   r   r1   r  rJ   rK   s       r   test_array_ufunc_seriesr(    sU    9A
		!AVVAYFyyBFF177O45H68,r   c                 >   t        g d      } t        j                  |       }t        j                  |t        j                  d            }t        j                  t        j                  | t        j                  d                  }t        j                  ||       y )Nr#  r   )	r	   r`   ra   rF   r  r   r   rH   r   r'  s       r   $test_array_ufunc_series_scalar_otherr*    sd    9A
		!AVVAwq)*Fyy7??1#567H68,r   c                 8   t        g d      } t        j                  |       }t        j                  t        g d            }t        j                  ||       }t        j                  | |      }t        j                  ||       t        j                  ||       y )Nr#  )r   r     )r	   r`   ra   rF   r  rH   r   )r1   r  rK   r1r2s        r   test_array_ufunc_series_deferr/    sj    9A
		!AyyI./H	1B	1B2x(2x(r   c                    t               d d } t        j                  g dg dt        |       d      }t        j                  t        | d   | d   g            }|j                  d      d   j                  d	       }t        j                  ||d
       |d   j                  |d         j                  d       }t        j                  ||d
       t        j                  t        | d   | d   | d   g      t        j                  j                  g d            }|j                  ddg      d   j                  d       }t        j                  ||d
       |d   j                  |d   |d   g      j                  d       }t        j                  ||d
       t        j                  ddgt        | d   | d   g      d      }|j                  d      j                  d       }t        j                  ||d
       y )Nrq   r   r   r   r   r   r   )id1id2decimalsr   r  r2  r4  c                     | j                   d   S Nr   ilocr)   s    r   r+   z"test_groupby_agg.<locals>.<lambda>  s     r   Fcheck_namesc                     | j                   d   S r6  r7  r9  s    r   r+   z"test_groupby_agg.<locals>.<lambda>  s    QVVAY r   r   )r   r   )r   r   )r   r   r  r3  c                     | j                   d   S r6  r7  r9  s    r   r+   z"test_groupby_agg.<locals>.<lambda>   s    !&&) r   c                     | j                   d   S r6  r7  r9  s    r   r+   z"test_groupby_agg.<locals>.<lambda>  s    !&&QR) r   )r3  r4  c                     | j                   d   S r6  r7  r9  s    r   r+   z"test_groupby_agg.<locals>.<lambda>  s    QVVAY r   )r   r`   r   r   ra   r	   groupbyaggrH   r   
MultiIndexfrom_tuplesr   )r   dfrK   rJ   s       r   test_groupby_aggrF    s    ;r?D	\RVEWX
B
 yyT!Wd1g$678HZZz*../BCF68?
^##BuI.223FGF68? yyDGT!Wd1g./mm''(@AH ZZ'
3778KLF68?
^##RY5	$:;??@STF68? ||QF
DGTRSWCU8VWXHZZ""#67F&(>r   c                   d }| j                  t        d|d       t               d d }t        j                  g dt        |      d      }t        j
                  t        |d   |d	   z   |d
   z   |d   |d   z   g            }|j                  d      d   j                  d       }t        j                  ||d       t        j
                  t        |            }t        j                  g dt        j                        }|j                  |      j                  d       }t        j                  ||d       y )Nc                R    t        j                  t        j                  |             S r   )rF   sumr   )r8   s    r   DecimalArray__my_sumz8test_groupby_agg_ea_method.<locals>.DecimalArray__my_sum  s    vvbhhtn%%r   my_sumFraisingrq   r1  )idr4  r   r   r   r  r  rN  r4  c                6    | j                   j                         S r   valuesrK  r9  s    r   r+   z,test_groupby_agg_ea_method.<locals>.<lambda>  s    8I r   r:  r   c                6    | j                   j                         S r   rP  r9  s    r   r+   z,test_groupby_agg_ea_method.<locals>.<lambda>  s    ahhoo.? r   )r  r   r   r`   r   ra   r	   rA  rB  rH   r   rF   r   r   )r  rJ  r   rE  rK   rJ   r  groupers           r   test_groupby_agg_ea_methodrT    s   & h0DeT;r?D	_,t:LM	NByyT!WtAw%6a%@$q'DQRGBS$TUVHZZj)--.IJF68?
		,t$%Ahhbhh7GYYw##$?@F68?r   c                >   d	d}| j                  t        d|d       t               }t        j                  t        |            }t        j
                  |t        t        |            d      }||dkD      ||dkD      |j                  d    |j                  d    y )
Nc                    t        d      )Nz0tried to convert a DecimalArray to a numpy array)	Exception)r8   r   s     r   DecimalArray__array__z;test_indexing_no_materialize.<locals>.DecimalArray__array__%  s    JKKr   	__array__FrL  )r1   r0   r_   r   )r   r1   r   )	r  r   r   r`   ra   r   r   rj   at)r  rX  r   r  rE  s        r   test_indexing_no_materializer[     s    
L k3HRWX;D
		,t$%A	AE#a&M2	3B a#gJq3wKDDGEE&Mr   c                    t        j                  d      t        j                  d      g} t        j                  t        j                  d      t        j                  d      gd      }t	        j                  | d      }|j                  d	      }t        j                  ||       t	        j                  |      j                  d	      }t        j                  ||       y )
Nz1.1111z2.2222z1.11z2.22r  r   r   r   )r4  )	r   r   rF   r   r`   to_numpyrH   r  ra   )rQ  rK   r1   rJ   s       r   test_to_numpy_keywordr^  5  s    ooh')BCFxx		 '//&"9:(H 	y)AZZZ#F1YYq\""A".F1r   c                   t        j                  dt        j                  d      t        j                  d      gid      }|j	                  t                     }d|j                  d<   | rtt        j                  dt        j                  d      t        j                  d      git                     }t        j                  |j                  |j                         y y )Nr1   r   r  r  r   r   r=  )
r`   r   r   r   r   r   r8  rH   assert_equalrQ  )r   rE  df2rK   s       r   test_array_copy_on_writerb  C  s    	sW__Q/1CDEX	VB
))LN
#CBGGDM<<7??1%wq'9:;<>
 	

HOO4	 r   )7
__future__r   r   r
  numpyrF   rT   pandas.compat.numpyr   pandasr`   pandas._testing_testingrH   pandas.tests.extensionr   $pandas.tests.extension.decimal.arrayr   r   r   r	   fixturer   r   r   r   r#   r%   r,   r4   ExtensionTestsr6   r   r   r   r   rU   r   r   r   r   _add_arithmetic_opsr  r  r  r   r%  r(  r*  r/  rF  rT  r[  r^  rb  r   r   r   <module>rn     s   "     .   '    % % B B F F     2 2 4 4pCt** pCf6	%-
, 4-01 11('l '="A =  / / 1-* .0KL22 )\<(4|*LM7	7-6--	)?@@**25r   