
    hMhE                        d Z ddlmZ ddlZddlmZ ddlmZ ddlZddl	Z
ddlmZmZ ddl	mZmZmZmZmZmZ d Z G d	 d
e          ZdedededededdfdZg a ej                    d             Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d  Z+d! Z,d" Z-d# Z.d$ Z/d% Z0d& Z1d' Z2d( Z3d) Z4d* Z5d+ Z6d, Z7d- Z8d. Z9d/ Z:d0 Z;d1 Z<d2 Z=d3 Z>d4 Z?d5 Z@d6 ZAd7 ZBd8 ZCd9 ZDd: ZEdS );zTest interact and interactive.    )patchN)EnumOrderedDict)
TraitErrorFloat)interactinteract_manualinteractiveinteractionOutputWidgetc                      d S N )kwargss    i/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/ipywidgets/widgets/tests/test_interaction.pyfr          D    c                       e Zd ZdZdZdZdS )Colorr         N)__name__
__module____qualname__redgreenbluer   r   r   r   r      s        
CEDDDr   r   abcdereturnc                     d S r   r   r!   r"   r#   r$   r%   s        r   gr)   !   r   r   c                  
    g a d S r   )	displayedr   r   r   clear_displayr,   &   s     IIIr   c                  :    t                               |            d S r   )r+   extend)argss    r   record_displayr0   +   s    Tr   c                    |                                 D ]\  }}|dk    r| j        |u sJ t          | |          }||k    s*J d                    | j        j        |||                      t          |t          t          f          rLt          |          }t          |          }||u s*J d                    | j        j        |||                      dS )z$Check a single widget against a dictclsz{}.{} = {!r} != {!r}ztype({}.{}) = {!r} != {!r}N)	items	__class__getattrformatr   
isinstanceintfloattype)wr$   attrexpectedvaluetvtes          r   check_widgetrA   2   s    '')) i ih5==;(*****At$$EH$$$&<&C&CAKDXZ^`ego&p&p$$$ %#u.. i%[[(^^Rxxx!=!D!DQ[EY[_aceg!h!hxxxi ir   c                     i }| j         D ]!}t          |t                    s
|||j        <   "|                                D ]\  }}||v sJ t          ||         fi | dS )z*Check that widgets are created as expectedN)childrenr7   r   descriptionr3   rA   )	containerto_checkwidgetsr;   keyr$   s         r   check_widget_childrenrI   A   s     G ' '!V$$ 	'%&GAM".."" ( (Qg~~~~WS\''Q''''( (r   c                      d} t          t          |           }|j        d         }t          |t          j        d|            d S Nhellor!   r   r!   r2   rD   r>   r   r   rC   rA   rG   Textr!   r#   r;   s      r   test_single_value_stringrR   N   sR    AAA	
1AL     r   c                      dD ]B} t          t          |           }|j        d         }t          |t          j        d|            Cd S )N)TFrM   r   r!   rN   )r   r   rC   rA   rG   CheckboxrQ   s      r   test_single_value_boolrU   X   sb     
 
QJqMQ 	
 	
 	
 	
 	

 
r   c                      dD ]d} | sd}d}n| dk    r	|  }d| z  }nd| z  }|  }t          t          |           }|j        d         }t          |t          j        d| ||dd	
           ed S )N)g      @      ?g              rX   rW   r      rM   r!   皙?Tr2   rD   r>   minmaxstepreadout)r   r   rC   rA   rG   FloatSliderr!   expected_minexpected_maxr#   r;   s        r   test_single_value_floatrd   b   s    # 
 
 	LLLUU2LQ3LLQ3L2LQJqMQ#	
 	
 	
 	
 	

 
r   c                     dD ]~} | sd}d}n| dk    r	|  }d| z  }nd| z  }|  }t          t          |           }t          |j                  dk    sJ |j        d         }t	          |t
          j        d| ||dd	           d S )
N)r      r   r   r   rY   rM   r   r!   Tr[   )r   r   lenrC   rA   rG   	IntSliderra   s        r   test_single_value_intrj   y   s     
 
 	LLLUU2LQ3LLQ3L2LQ1:!####JqMQ!	
 	
 	
 	
 	

 
r   c            	      *   g d} | d         }t          t          |           }t          |j                  dk    sJ t	          t
          j        |t          |           t          |           t          |                     }t          ||           d S )N)rL   thereguyr   lisr   r2   r>   options_options_labels_options_values	r   r   rh   rC   dictrG   DropdowntuplerI   valuesfirstr#   r$   s       r   test_list_strr{      s    &&&F1IEA6"""Aqz??afff	 	 	A !######r   c            	      >   g d} | d         }t          t          |           }t          |j                  dk    sJ t	          t
          j        |t          |           t          d | D                       t          |                     }t          ||           d S )NrY   r   r   r   rn   r   c              3   4   K   | ]}t          |          V  d S r   )str).0vs     r   	<genexpr>z test_list_int.<locals>.<genexpr>   s(      55c!ff555555r   rp   rt   rx   s       r   test_list_intr      s    YYF1IEA6"""Aqz??af55f55555f	 	 	A !######r   c                     g d} | d         d         }t          t          |           }t          |j                  dk    sJ t	          t
          j        |t          |           dd          }t          ||           d S 	N)rY   ,  )r   d   )r      r   r   rn   r   312r   r   r   rp   rt   rx   s       r   test_list_tupler      s    +++F1IaLEA6"""Aqz??af''	 	 	A !######r   c                      dD ]X} t          j        t                    5  t          |            t	          t
          |           }d d d            n# 1 swxY w Y   Yd S )N)r   )tup)pytestraises
ValueErrorprintr   r   )badr#   s     r   test_list_tuple_invalidr      s     ( ( ]:&& 	( 	(#JJJA3'''A	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(( (s   &AA	A	c                     t          d          t          ddt                     fD ]} t          t          |           }|j        d         }t          t          j        dt          t          |                                                     | t          | 
                                          t          |                                                     }t          |fi | d S )	Nrf   rM   r"   )r!   r"   r#   )r$   r   r$   )r2   rD   r>   rq   rr   rs   )ru   r   r   rC   rG   rv   nextiterry   rw   keysrA   )r$   r#   r;   checks       r   	test_dictr      s    q			qC4    ! ! QJqM tAHHJJ''((!!&&((OO!!((**--
 
 
 	Q  %    ! !r   c                  
   ddl m}  g d}|d         d         } | |          }t          t          |          }t	          |j                  dk    sJ t          t          j        ||dd	          }t          ||           d S )
Nr   r   r   r   rn   r   r   r   rp   )
collectionsr   r   r   rh   rC   ru   rG   rv   rI   )r   r3   rz   ry   r#   r$   s         r   test_ordereddictr      s    ''''''***E!HQKE[FA6"""Aqz??a''	 	 	A !######r   c                     d } t           |                       }t          t           |                       }t          |j                  dk    sJ t          t          j        |ddd          }t          ||           d S )Nc               3   "   K   dV  dV  dV  d S )NrY   r   r   r   r   r   r   yield_valuesz#test_iterable.<locals>.yield_values   s%      r   rn   r   r}   r   rp   )	r   r   r   rh   rC   ru   rG   rv   rI   )r   rz   r#   r$   s       r   test_iterabler      s         EA<<>>***Aqz??a'!	 	 	A !######r   c                     g d} | d         d         }t          t          t          |                     }t          |j                  dk    sJ t          t          j        |t          |           dd          }t          ||           d S r   )
r   r   r   rh   rC   ru   rG   rv   rw   rI   rx   s       r   test_iterable_tupler      s    +++F1IaLEA4<<(((Aqz??af''	 	 	A !######r   c                  L   ddl m}  ddlm}  G d d|           }g d}|d         d         } ||          }t	          t
          |          }t          |j                  d	k    sJ t          t          j
        |t          |          d
d          }t          ||           d S )Nr   )Mappingr   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )!test_mapping.<locals>.TestMappingc                     || _         d S r   ry   )selfry   s     r   __init__z*test_mapping.<locals>.TestMapping.__init__  s     DKKKr   c                     t           r   NotImplementedErrorr   s    r   __getitem__z-test_mapping.<locals>.TestMapping.__getitem__	      %%r   c                     t           r   r   r   s    r   __len__z)test_mapping.<locals>.TestMapping.__len__  r   r   c                     t           r   r   r   s    r   __iter__z*test_mapping.<locals>.TestMapping.__iter__  r   r   c                     | j         S r   r   r   s    r   r3   z'test_mapping.<locals>.TestMapping.items  s
    ;r   N)r   r   r   r   r   r   r   r3   r   r   r   TestMappingr     s_        	! 	! 	!	& 	& 	&	& 	& 	&	& 	& 	&	 	 	 	 	r   r   r   r   rn   r   r   r   rp   )collections.abcr   r   r   r   r   rh   rC   ru   rG   rv   rw   rI   )r   r   r   r3   rz   ry   r#   r$   s           r   test_mappingr     s    ''''''''''''
 
 
 
 
g 
 
 
 +**E!HQKE[FA6"""Aqz??ae''	 	 	A !######r   c                 D   t          j        t          dt                    5  t	          d          d             }d d d            n# 1 swxY w Y   t          t                    dk    sJ t          d         j        d         }t          |t          j
        d           d S )Ndisplayrf   rM   c                     d S r   r   rM   s    r   fooz!test_decorator_kwarg.<locals>.foo"      Dr   r   r   r2   r>   r   objectr   r0   r	   rh   r+   rC   rA   rG   ri   r,   r   r;   s      r   test_decorator_kwargr      s    	k9n	=	=  	A	 	 
	               y>>Q!a A     s   AAAc                 l    G d d          } |            }t          j        t          dt                    5  t	          |j        d          }d d d            n# 1 swxY w Y   t          t                    dk    sJ t          d         j        d         }t          |t          j        d	           d S )
Nc                       e Zd Zd ZdS ))test_interact_instancemethod.<locals>.Fooc                 $    t          |           d S r   )r   )r   xs     r   showz.test_interact_instancemethod.<locals>.Foo.show.  s    !HHHHHr   N)r   r   r   r   r   r   r   Foor   -  s#        	 	 	 	 	r   r   r   )r   
   r   r   r   rf   r   )r   r   r   r0   r	   r   rh   r+   rC   rA   rG   ri   )r,   r   r   r)   r;   s        r   test_interact_instancemethodr   ,  s           	A	k9n	=	= ' 'QVv&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' 'y>>Q!a A     s   AA"Ac                 4   t          j        t          dt                    5  t          dd            }d d d            n# 1 swxY w Y   t          t                    dk    sJ t          d         j        d         }t          |t          j
        d           d S )Nr   defaultc                     d S r   r   rM   s    r   r   z#test_decorator_no_call.<locals>.foo>  r   r   r   r   r   r   r   r   r   r0   r	   rh   r+   rC   rA   rG   rP   r   s      r   test_decorator_no_callr   <  s    	k9n	=	=  		 	 	 
	               y>>Q!a AL     s   ?AAc                 8   dd}t          j        t          dt                    5  t	          |          }d d d            n# 1 swxY w Y   t          t                    dk    sJ t          d         j        d         }t          |t          j
        d           d S )Nr   c                     d S r   r   rM   s    r   r   ztest_call_interact.<locals>.fooI      r   r   r   r   r   r   r   r,   r   ifoor;   s       r   test_call_interactr   H  s       	k9n	=	=  }}              y>>Q!a AL     s   AAAc                    dd}t          j        t          dt                    5  t	          |          }d d d            n# 1 swxY w Y   t          t                    dk    sJ t          d         j        d         }t          |t          j
        d           t          j        t          dt                    5  d|_        d d d            n# 1 swxY w Y   t          t                    dk    sJ d S )	Nr   c                     d S r   r   rM   s    r   r   z<test_call_interact_on_trait_changed_none_return.<locals>.fooU  r   r   r   r   r   r   calledr   r   r   r   r0   r	   rh   r+   rC   rA   rG   rP   r>   r   s       r   /test_call_interact_on_trait_changed_none_returnr   T  sb      	k9n	=	=  }}              y>>Q!a AL    
k9n	=	=                y>>Qs#   AAA:CCCc                 <   d	d}t          j        t          dt                    5  t	          |d          }d d d            n# 1 swxY w Y   t          t                    dk    sJ t          d         j        d         }t          |t          j
        d           d S )
Nr   c                     d S r   r   rM   s    r   r   z&test_call_interact_kwargs.<locals>.food  r   r   r   r   rM   r   r   r   r   r   r   s       r   test_call_interact_kwargsr   c  s       	k9n	=	= # #r"""# # # # # # # # # # # # # # #y>>Q!a A     s   AA
Ac                 ~   i t          j        t          dt                    5  t          dfd	            }ddd           n# 1 swxY w Y   t          t                    dk    sJ t          d         j        d         }t          |t          j
        d            |d	          }|d	k    sJ d
         d	k    sJ t          j        t          dt                    5  d|_        ddd           n# 1 swxY w Y   d
         dk    sJ t          t                    dk    sJ |j        t          d         k    sJ dS )z*test calling @interact decorated functionsr   r   c                     | d<   | S Nr!   r   r!   r$   s    r   r   z0test_call_decorated_on_trait_change.<locals>.foos      AcFHr   Nr   r   r   r   rL   r!   r   rY   r   r   r,   r   r;   r!   r$   s       @r   #test_call_decorated_on_trait_changer   o  s   
A	k9n	=	=  		 	 	 	 	 
	              
 y>>Q!a AL   
 	GA<<<<S6W 
k9n	=	=                S6Xy>>Q7im######s#   AAAC22C69C6c                    i t          j        t          dt                    5  t	          d          dfd	            }ddd           n# 1 swxY w Y   t          t                    dk    sJ t          d         j        d	         }t          |t          j
        d
            |d          }|dk    sJ d         dk    sJ t          j        t          dt                    5  d|_        ddd           n# 1 swxY w Y   d         dk    sJ t          t                    dk    sJ |j        t          d         k    sJ dS )z3test calling @interact(foo=bar) decorated functionsr   kwargrM   r   c                     | d<   | S r   r   r   s    r   r   z7test_call_decorated_kwargs_on_trait_change.<locals>.foo  r   r   Nr   r   r   r   rL   r!   r   rY   r   r   r   r   s       @r   *test_call_decorated_kwargs_on_trait_changer     s   
A	k9n	=	=  	G				 	 	 	 	 
		              
 y>>Q!a AL   
 	GA<<<<S6W 
k9n	=	=                S6Xy>>Q7im######s#   AAA'C;;C?C?c                      t          t          t          j        d          d          } t	          | j                  dk    sJ | j        d         }t          |t          j        dd           d S )Nrf   text)r!   r"   r   r   r"   r2   r>   rD   )r   r   rG   fixedrh   rC   rA   rP   r#   r;   s     r   
test_fixedr     sr    Aq))V444Aqz??a	
1AL     r   c                      t          t          d          } | j        d         }t          |t          j        dd           d S )Nr   r"   r   r"   r   rO   r   s     r   test_default_descriptionr     sM    A   A	
1AL     r   c                      i fd} t          | t          j        dd                    }|j        d         }t	          |t          j        dd           d|_        d	dik    sJ d S )
Nc                  Z                                                          |            d S r   )clearupdate)r   r$   s    r   record_kwargsz.test_custom_description.<locals>.record_kwargs  s(    					r   r   r   )r>   rD   r   r   r   zdifferent textr"   )r   rG   rP   rC   rA   r>   )r   r#   r;   r$   s      @r   test_custom_descriptionr     s    
A     	MW\E%R%R%RSSSA	
1AL   
 AG&'''''''r   c                       G d dt                     } t          j        t          d          5  t	          t
           |                        ddd           dS # 1 swxY w Y   dS )z9 Test that passing in a non-value widget raises an error c                   &    e Zd ZdZ e            ZdS )2test_raises_on_non_value_widget.<locals>.BadWidgetz+ A widget that contains a `value` traitlet N)r   r   r   __doc__r   r>   r   r   r   	BadWidgetr    s        99r   r  z.* not a ValueWidget.*)matchr   N)r   r   r   	TypeErrorr   r   )r  s    r   test_raises_on_non_value_widgetr    s        F    
y(@	A	A	A & &A%%%%& & & & & & & & & & & & & & & & & &s   AA"Ac                      t          j        d                              t                    } | j        d         }t          |t          j                   d S )NTmanualr   )r2   )r	   rq   widgetr   rC   rA   rG   Buttonr   s     r   test_interact_manual_buttonr    sI    %%%,,Q//A	
1A''''''r   c                      d} d } t          j        d          |d          j        }d|j        d         _        | dk    sJ d S )Nr   c                     |dz  }d S )Nr   r   )testarg	callcounts     r   calltestz-test_interact_manual_nocall.<locals>.calltest  s    Q			r   Tr	  rf   )r  r   )r	   rq   r  rC   r>   )r  r  r#   s      r   test_interact_manual_nocallr    sZ    I  %%%%h:::AAAJqM>>>>>>r   c                      t          j        t                    } |                                  t	          j        t                    } |                                  d S r   )r	   r  r   r   r
   )r;   s    r   test_interact_callr    s?    AHHJJJq!!AHHJJJJJr   c                     d }  t          j        d                              d          | d          j        }|j        dk    sJ  t	          j        d                                          d                              |           }|j        dk    sJ   t          d                                          d          |           j        }|j        dk    sJ d S )Nc                     | S r   r   r   s    r   r   z test_interact_options.<locals>.f  s    r   Fr	  T   r   )r	   rq   r  r
  r
   )r   r;   s     r   test_interact_optionsr    s      ;&&&..d.;;ADDDKA8t7u---5577"===DDQGGA8u-2   --a007A8tr   c                      t          j        t                    5  t          j        d           d d d            d S # 1 swxY w Y   d S )Nr   )r   )r   r   r   r	   rq   r   r   r   test_interact_options_badr    s    	z	"	" $ $U####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   =AAc                     t           j        }  | ddd          }t          || ddd           d|_        d|_        t          || ddd           d|_        d|_        d|_        d	|_        t          || ddd           d
|_        t          || d
dd           d|_        t          || ddd           d|_        t          || ddd           t          j	        t                    5  d|_        d d d            n# 1 swxY w Y   t          j	        t                    5  d|_        d d d            n# 1 swxY w Y    | ddd          }t          |ddd            | ddd          }t          |d           t          j	        t                    5   | dd           d d d            d S # 1 swxY w Y   d S )N)r      r      r>   r\   r]   r2   r>   r\   r]   rY   )r   rY   r   r  )r   r   )rf   r  )r   r     r   r\   r]   r>   r   r   )}      r>   r   r\   r]   )rG   IntRangeSliderrA   upperr]   r\   lowerr>   r   r   r   )irswr;   s     r   test_int_range_logicr+    s   !D6qa(((AFq9999AGAEFq9999AEAEAGAGFq9999AGFq9999AGFq9999AGFq9999	z	"	"                	z	"	"                 	(((Aq////#Z000A*%%%%	z	"	"                   s6   +C??DD#D77D;>D;F66F:=F:c                     t           j        }  | ddd          }t          || ddd           d|_        d|_        d|_        d|_        t          || ddd           d|_        t          || ddd           d	|_        t          || d	dd           d|_        t          || d
dd           t          j	        t                    5  d|_        d d d            n# 1 swxY w Y   t          j	        t                    5  d|_        d d d            n# 1 swxY w Y    | ddd          }t          |dd           t          j	        t                    5   | dd           d d d            d S # 1 swxY w Y   d S )N)皙?皙?rX   333333?r  r   r-  r.  )rX   rZ   )g      ?r/  )r-  r/  gffffff?gr   rY   )g@g      @r"  g       @g      @r&  rZ   )rG   FloatRangeSliderrA   r\   r]   r)  r(  r>   r   r   r   )frswr;   s     r   test_float_range_logicr2    s\   #D8,,,AH""====AEAEAGAGH""====AGH""====AGH""====AGH""====	z	"	"                	z	"	"                 	,,,A####	z	"	"                   s6   	CC!$C!DDDE44E8;E8c                  F   t           j        }  |             }t          |t                                 t	          j        t                    5  d|_        d d d            n# 1 swxY w Y   t          |t                                  | dgdg          }t          || dd           t	          j        t                    5  |j        dz   |_        d d d            n# 1 swxY w Y   t          |d           |j        d	z   |_        t          |d
d           d|_        t          |d           ddi|_        t          |ddi           d|_        t	          j        t                    5  d|_        d d d            n# 1 swxY w Y   t          |d           d S )Nr%  )r   r   r   r   )rq   r>   )r   )r4  )r2   r>   rq   )r   r   )r4  r5  r   )r   r   )rq   )	rG   SelectMultiplerA   rw   r   r   r   r>   rq   )smwr;   s     r   test_multiple_selectionr8  5  s^   

 C 	A%''"""" 
z	"	"                %''"""" 	VHQC(((A4;;;; 
z	"	" ! !'D.! ! ! ! ! ! ! ! ! ! ! ! ! ! !$ 	I%AIO26666 AG&!!!! AAIQqE"""" AI	z	"	"                D""""""s6   A!!A%(A%C  C$'C$1FF	F	c                      d} t          t          |           }|j        d         }t          |t          j        d|            d S rK   )r   ru   rC   rA   rG   rP   rQ   s      r   test_interact_noinspectr:  \  sR    ADAA	
1AL     r   c                      ddl m}  ddlm  G fdd|           } |            }t	          d |          }|                                 |j        dk    sJ d S )	Nr   )ValueWidgetUnicodec                   @    e Zd Z  d          Z              Zd ZdS )*test_get_interact_value.<locals>.TheAnswer	TheAnswerc                     dS )N*   r   r   s    r   get_interact_valuez=test_get_interact_value.<locals>.TheAnswer.get_interact_valuem  s    2r   N)r   r   r   _model_namerD   rD  r=  s   r   rA  r@  j  s>        gk**gii	 	 	 	 	r   rA  c                     | S r   r   r   s    r   <lambda>z)test_get_interact_value.<locals>.<lambda>p  s    a r   rG  rC  )ipywidgets.widgetsr<  	traitletsr>  r   r   result)r<  rA  r;   r#   r>  s       @r   test_get_interact_valuerL  g  s    ......!!!!!!      K   
 		AKK1%%%AHHJJJ8r>>>>>>r   c            	         ddl m} m} dd l}dd l} |             } |j        d          }t          t          j        	                    t          j        
                    t          j                            t                              dd                    5 }|                    |          }d d d            n# 1 swxY w Y   |                    ||           d S )Nr   )ri   r   T)drop_defaultsz../../zstate.schema.json)rI  ri   r   json
jsonschemaget_manager_stateopenospathjoindirnamerealpath__file__loadvalidate)ri   r   rO  rP  sstater   schemas           r   test_state_schemar^  t  s   44444444KKK	A$F$4888E	bgll27??27+;+;H+E+EFFReff	g	g kl1              v&&&&&s   B;;B?B?c                     t          t                    } t          | j                  dk    sJ t	          | dt
          j        idt
          j        idt
          j        idt
          j	        it
          j
        t          j        t          j        t          j        ddt          j        t          j        t          j        fd           d S )Nr  r2   )r   r   r    )r2   rq   rr   rs   r(   )r   r)   rh   rC   rI   rG   rP   rT   IntText	FloatTextrv   r   r   r   r    )r#   s    r   test_type_hintsrb  ~  s    AAqz??a	',
'"
#'/
"'#
$#y
 
  8 %	5;
C	
 	
     r   )Fr  unittest.mockr   rS  enumr   r   r   r   
ipywidgetsrG   rJ  r   r   r	   r
   r   r   r   r   r   r   r   boolr8   r9   r)   r+   fixturer,   r0   rA   rI   rR   rU   rd   rj   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+  r2  r8  r:  rL  r^  rb  r   r   r   <module>rh     s   % $       				       # # # # # #      ' ' ' ' ' ' ' '5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5	 	 	    D   	 	 	# 	% 	E 	d 	 	 	 	 	    i i i
( 
( 
(  
 
 

 
 
.
 
 
0$ $ $$ $ $$ $ $( ( (! ! !"$ $ $ $ $ $"$ $ $$ $ $:
 
 
   
 
 

 
 
  
 
 
$ $ $4$ $ $8    ( ( ( & & &( ( (
    
 
 
$ $ $  D  :%# %# %#N    ' ' '    r   