
    Of8                        d Z ddlZ G d dej                  Z G d dej                  Z G d dej                  Z G d	 d
          Z G d de          Z G d dej                  Z G d dej                  Z	dS )z!Resolution ordering utility tests    Nc                   ,    e Zd Zd Zd Zd Zd Zd ZdS )Test__mergeOrderingsc                 $    ddl m}  ||          S )Nr   )_legacy_mergeOrderings)zope.interface.ror   )self	orderingsr   s      N/var/www/html/env/lib/python3.11/site-packages/zope/interface/tests/test_ro.py_callFUTzTest__mergeOrderings._callFUT   s%    <<<<<<%%i000    c                 X    |                      |                     g           g            d S NassertEqualr   r   s    r
   
test_emptyzTest__mergeOrderings.test_empty   s*    r**B/////r   c                 `    |                      |                     g d          g d           d S )N)abcr   r   s    r
   test_singlez Test__mergeOrderings.test_single   s2    77IIIIIr   c                 f    |                      |                     dgddgg          ddg           d S )Nr   r   r   r   s    r
   test_w_duplicatesz&Test__mergeOrderings.test_w_duplicates"   s9    Sz':;;c3ZHHHHHr   c                     g d}ddg}g d}dg}|                      |                     ||||g          g d           d S )N)xyzqr   )         )r   r   r   r   r    r!   r   r   )r   O1O2O3O4s        r
   &test_suffix_across_multiple_duplicatesz;Test__mergeOrderings.test_suffix_across_multiple_duplicates%   sf    __3ZYYUBB'788666	8 	8 	8 	8 	8r   N)__name__
__module____qualname__r   r   r   r   r&    r   r
   r   r      se        1 1 10 0 0J J JI I I8 8 8 8 8r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )Test__flattenc                 $    ddl m}  ||          S )Nr   )_legacy_flatten)r   r.   )r   obr.   s      r
   r   zTest__flatten._callFUT0   s$    555555r"""r   c                      G d d          } |            }d|_         |                     |                     |          |g           d S )Nc                       e Zd ZdS )-Test__flatten.test_w_empty_bases.<locals>.FooNr'   r(   r)   r*   r   r
   Foor2   6           Dr   r4   r*   	__bases__r   r   r   r4   foos      r
   test_w_empty_basesz Test__flatten.test_w_empty_bases4   h    	 	 	 	 	 	 	 	 cees++cU33333r   c                      G d d          }|                      |                     |          |t          g           d S )Nc                       e Zd ZdS )-Test__flatten.test_w_single_base.<locals>.FooNr3   r*   r   r
   r4   r>   ?   r5   r   r4   r   r   objectr   r4   s     r
   test_w_single_basez Test__flatten.test_w_single_base=   X    	 	 	 	 	 	 	 	 	s++c6];;;;;r   c                      G d d          } G d d|          }|                      |                     |          ||t          g           d S )Nc                       e Zd ZdS )'Test__flatten.test_w_bases.<locals>.FooNr3   r*   r   r
   r4   rF   F   r5   r   r4   c                       e Zd ZdS )'Test__flatten.test_w_bases.<locals>.BarNr3   r*   r   r
   BarrH   I   r5   r   rI   r?   r   r4   rI   s      r
   test_w_baseszTest__flatten.test_w_basesD       	 	 	 	 	 	 	 		 	 	 	 	# 	 	 	 	s++c3-?@@@@@r   c           
           G d d          } G d d|          } G d d|          } G d d||          }|                      |                     |          |||t          ||t          g           d S )	Nc                       e Zd ZdS ))Test__flatten.test_w_diamond.<locals>.FooNr3   r*   r   r
   r4   rO   P   r5   r   r4   c                       e Zd ZdS ))Test__flatten.test_w_diamond.<locals>.BarNr3   r*   r   r
   rI   rQ   S   r5   r   rI   c                       e Zd ZdS ))Test__flatten.test_w_diamond.<locals>.BazNr3   r*   r   r
   BazrS   V   r5   r   rT   c                       e Zd ZdS ))Test__flatten.test_w_diamond.<locals>.QuxNr3   r*   r   r
   QuxrV   Y   r5   r   rW   r?   r   r4   rI   rT   rW   s        r
   test_w_diamondzTest__flatten.test_w_diamondN   s    	 	 	 	 	 	 	 		 	 	 	 	# 	 	 		 	 	 	 	# 	 	 		 	 	 	 	#s 	 	 	 	s++sCc6B	D 	D 	D 	D 	Dr   N)r'   r(   r)   r   r:   rB   rK   rY   r*   r   r
   r,   r,   .   sg        # # #4 4 4< < <A A AD D D D Dr   r,   c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 ZdS )
Test_roNc                      ddl m}  ||fi |S )Nr   )
_legacy_ro)r   r]   )r   r/   kwargsr]   s       r
   r   zTest_ro._callFUTc   s,    000000z"'''''r   c                      G d d          } |            }d|_         |                     |                     |          |g           d S )Nc                       e Zd ZdS )'Test_ro.test_w_empty_bases.<locals>.FooNr3   r*   r   r
   r4   ra   i   r5   r   r4   r*   r6   r8   s      r
   r:   zTest_ro.test_w_empty_basesg   r;   r   c                      G d d          }|                      |                     |          |t          g           d S )Nc                       e Zd ZdS )'Test_ro.test_w_single_base.<locals>.FooNr3   r*   r   r
   r4   rd   r   r5   r   r4   r?   rA   s     r
   rB   zTest_ro.test_w_single_basep   rC   r   c                      G d d          } G d d|          }|                      |                     |          ||t          g           d S )Nc                       e Zd ZdS )!Test_ro.test_w_bases.<locals>.FooNr3   r*   r   r
   r4   rg   y   r5   r   r4   c                       e Zd ZdS )!Test_ro.test_w_bases.<locals>.BarNr3   r*   r   r
   rI   ri   |   r5   r   rI   r?   rJ   s      r
   rK   zTest_ro.test_w_basesw   rL   r   c                      G d d          } G d d|          } G d d|          } G d d||          }|                      |                     |          ||||t          g           d S )	Nc                       e Zd ZdS )#Test_ro.test_w_diamond.<locals>.FooNr3   r*   r   r
   r4   rl      r5   r   r4   c                       e Zd ZdS )#Test_ro.test_w_diamond.<locals>.BarNr3   r*   r   r
   rI   rn      r5   r   rI   c                       e Zd ZdS )#Test_ro.test_w_diamond.<locals>.BazNr3   r*   r   r
   rT   rp      r5   r   rT   c                       e Zd ZdS )#Test_ro.test_w_diamond.<locals>.QuxNr3   r*   r   r
   rW   rr      r5   r   rW   r?   rX   s        r
   rY   zTest_ro.test_w_diamond   s    	 	 	 	 	 	 	 		 	 	 	 	# 	 	 		 	 	 	 	# 	 	 		 	 	 	 	#s 	 	 	 	s++sCf5	7 	7 	7 	7 	7r   c                      G d d          } |d          } |d|          } |d|          } |d|          } |d|          } |d|||          }|||||||gfS )	Nc                       e Zd Zd Zd ZdS ) Test_ro._make_IOErr.<locals>.Fooc                 "    || _         || _        d S r   r'   r7   )r   namebasess      r
   __init__z)Test_ro._make_IOErr.<locals>.Foo.__init__        $!&r   c                     | j         S r   r'   r   s    r
   __repr__z)Test_ro._make_IOErr.<locals>.Foo.__repr__   
    }$r   N)r'   r(   r)   rz   r~   r*   r   r
   r4   ru      s2        ' ' '% % % % %r   r4   IExIStdErrIEnvErrIIOErrIOSErrIOErrr*   )r   r4   r   r   r   r   r   r   s           r
   _make_IOErrzTest_ro._make_IOErr   s    	% 	% 	% 	% 	% 	% 	% 	% c%jj#i%%#i))Xw''Xw''GWff55uffgwDDDr   c                     |                                  \  }}|                     |                     |          |           d S r   )r   r   r   )r   r   ry   s      r
   test_non_orderablezTest_ro.test_non_orderable   s?    ''))uu--u55555r   c                    ddl m} ddl m} ddl m} ddl m}  G d d|          } ||           G d d	                      } G d
 d|          } G d d          } G d d||          }	|                     |                      | |	                                 ||	           ||           ||          || ||           |t                    g           d S )Nr   	Interface)implementedBy)implementer
providedByc                       e Zd ZdS )?Test_ro.test_mixed_inheritance_and_implementation.<locals>.IFooNr3   r*   r   r
   IFoor      r5   r   r   c                       e Zd ZdS )HTest_ro.test_mixed_inheritance_and_implementation.<locals>.ImplementsFooNr3   r*   r   r
   ImplementsFoor      s        Dr   r   c                       e Zd ZdS )ETest_ro.test_mixed_inheritance_and_implementation.<locals>.ExtendsFooNr3   r*   r   r
   
ExtendsFoor      r5   r   r   c                       e Zd ZdS )LTest_ro.test_mixed_inheritance_and_implementation.<locals>.ImplementsNothingNr3   r*   r   r
   ImplementsNothingr      r5   r   r   c                       e Zd ZdS )VTest_ro.test_mixed_inheritance_and_implementation.<locals>.ExtendsFooImplementsNothingNr3   r*   r   r
   ExtendsFooImplementsNothingr      r5   r   r   )zope.interfacer   r   r   r   r   r   r@   )
r   r   r   r   r   r   r   r   r   r   s
             r
   )test_mixed_inheritance_and_implementationz1Test_ro.test_mixed_inheritance_and_implementation   s    	-,,,,,000000......------	 	 	 	 	9 	 	 	 
T			 	 	 	 	 	 	 
			 	 	 	 	 	 	 		 	 	 	 	 	 	 		 	 	 	 	*6G 	 	 	 	MM**%@%@%B%BCCDD]677]:&&]=))],--]6""$	% 	% 	% 	% 	%r   )r'   r(   r)   maxDiffr   r:   rB   rK   rY   r   r   r   r*   r   r
   r[   r[   `   s        G( ( (4 4 4< < <A A A7 7 7"E E E,6 6 6
!% !% !% !% !%r   r[   c                        e Zd Zd Zd Zd ZdS )	C3Settingc                 "    || _         || _        d S r   )_setting_value)r   settingvalues      r
   rz   zC3Setting.__init__   s    r   c                 \    ddl m} t          |j        | j        j        | j                   d S Nr   ro)r   r   setattrC3r   r'   r   )r   r   s     r
   	__enter__zC3Setting.__enter__   s5    %%%%%%t}-t{;;;;;r   c                 \    ddl m} t          |j        | j        j        | j                   d S r   )r   r   r   r   r   r'   )r   tvtbr   s        r
   __exit__zC3Setting.__exit__   s5    %%%%%%t}-t}=====r   N)r'   r(   r)   rz   r   r   r*   r   r
   r   r      sA          < < <> > > > >r   r   c                   Z     e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z fdZ xZS )
Test_c3_roc                     t                               |            ddlm}  |d          x| _        }|                     |j                   d S )Nr   )InstalledHandlerzzope.interface.ro)r[   setUpzope.testing.loggingsupportr   log_handler
addCleanup	uninstall)r   r   handlers      r
   r   zTest_c3_ro.setUp   sZ    d@@@@@@%5%56I%J%JJ7)*****r   c                      ddl m}  ||fi |S r   )r   r   )r   r/   r^   r   s       r
   r   zTest_c3_ro._callFUT   s,    ((((((r"r   c                 J    G d d|          } G d d|          } G d d|          } G d d||          } G d	 d
||          } G d d||          }t          |d          r;|                     |                                |                     |                     |S )Nc                       e Zd ZdS )+Test_c3_ro._make_complex_diamond.<locals>.FNr3   r*   r   r
   Fr      r5   r   r   c                       e Zd ZdS )+Test_c3_ro._make_complex_diamond.<locals>.ENr3   r*   r   r
   Er      r5   r   r   c                       e Zd ZdS )+Test_c3_ro._make_complex_diamond.<locals>.DNr3   r*   r   r
   Dr      r5   r   r   c                       e Zd ZdS )+Test_c3_ro._make_complex_diamond.<locals>.CNr3   r*   r   r
   Cr      r5   r   r   c                       e Zd ZdS )+Test_c3_ro._make_complex_diamond.<locals>.BNr3   r*   r   r
   Br      r5   r   r   c                       e Zd ZdS )+Test_c3_ro._make_complex_diamond.<locals>.ANr3   r*   r   r
   Ar      r5   r   r   mro)hasattrr   r   r   )r   baser   r   r   r   r   r   s           r
   _make_complex_diamondz Test_c3_ro._make_complex_diamond   sG   	 	 	 	 	 	 	 		 	 	 	 	 	 	 		 	 	 	 	 	 	 		 	 	 	 	1 	 	 		 	 	 	 	1 	 	 		 	 	 	 	1 	 	 	 1e 	8QUUWWdmmA&6&6777r   c                 :    |                      t                     d S r   )r   r@   r   s    r
   test_complex_diamond_objectz&Test_c3_ro.test_complex_diamond_object  s    ""6*****r   c                     ddl m} |                     |          }|                     d |j        D             g d           d S )Nr   r   c                     g | ]	}|j         
S r*   r}   ).0r   s     r
   
<listcomp>z=Test_c3_ro.test_complex_diamond_interface.<locals>.<listcomp>  s    ,,,AQZ,,,r   )r   r   r   r   r   r   r   )r   r   r   r   __iro__)r   r   IAs      r
   test_complex_diamond_interfacez)Test_c3_ro.test_complex_diamond_interface	  se    ,,,,,,''	22,,,,,777	
 	
 	
 	
 	
r   c                     ddl m} |                     |          }|                     |d          }|                     |j        |           |                                  d S )Nr   r   T)use_legacy_ro)r   r   r   r   assertNotEqualr   _check_handler_complex_diamond)r   r   r   legacy_A_iros       r
   (test_complex_diamond_use_legacy_argumentz3Test_c3_ro.test_complex_diamond_use_legacy_argument  sn    ,,,,,,&&y11}}Qd};;AI|444 	++-----r   c                     ddl m} |                     |          }|                     |d          }|                     t          |          |j                   |                                  d S )Nr   r   T)log_changed_ro)r   r   r   r   r   tupler   r   )r   r   r   computed_A_iros       r
   ,test_complex_diamond_compare_legacy_argumentz7Test_c3_ro.test_complex_diamond_compare_legacy_argument  st    ,,,,,,&&y11q>>~..	:::++-----r   c                 X   | j         }|                     dt          |j                             |j        d         }d                    d          }|                     d                    d |                                                                D                       |           d S )Nr   r   a  Object <InterfaceClass {name}> has different legacy and C3 MROs:
  Legacy RO (len=7)                 C3 RO (len=7; inconsistent=no)
  ==================================================================
    zope.interface.tests.test_ro.A    zope.interface.tests.test_ro.A
    zope.interface.tests.test_ro.B    zope.interface.tests.test_ro.B
  - zope.interface.tests.test_ro.E
    zope.interface.tests.test_ro.C    zope.interface.tests.test_ro.C
    zope.interface.tests.test_ro.D    zope.interface.tests.test_ro.D
                                    + zope.interface.tests.test_ro.E
    zope.interface.tests.test_ro.F    zope.interface.tests.test_ro.F
    zope.interface.Interface          zope.interface.Interfacezzope.interface.tests.test_ro.A)rx   
c              3   >   K   | ]}|                                 V  d S r   )rstrip)r   lns     r
   	<genexpr>z<Test_c3_ro._check_handler_complex_diamond.<locals>.<genexpr>;  s*      MMbbiikkMMMMMMr   )r   r   lenrecordsformatjoin
getMessage
splitlines)r   r   recordexpecteds       r
   r   z)Test_c3_ro._check_handler_complex_diamond&  s    "C00111#B CI&1 CI C
 C
 	 	IIMMF,=,=,?,?,J,J,L,LMMMMM	
 	
 	
 	
 	
r   c                 t   ddl m}  G d d          } |ddi           } G d d|          } G d	 d
|          } G d d|          } G d d|          } |d          } |d|||f          }	 |d|||	f          }
|                     |
dd          }|                     ||
||	|||||g           | j        j        \  }|                     d|                                           |                     |j	                  5  |                     |
d           d d d            d S # 1 swxY w Y   d S )Nr   r   c                        e Zd ZdZddZd ZdS )UTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Basedr*   Nc                 "    || _         || _        d S r   rw   )r   rx   ry   attrss       r
   rz   z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Based.__init__H  r{   r   c                     | j         S r   r}   r   s    r
   r~   z^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>._Based.__repr__L  r   r   )r*   N)r'   r(   r)   r7   rz   r~   r*   r   r
   _Basedr   E  s<        I' ' ' '% % % % %r   r   r   r*   c                       e Zd ZdS )^Test_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.IPluggableIndexNr3   r*   r   r
   IPluggableIndexr  Q  r5   r   r  c                       e Zd ZdS )bTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.ILimitedResultIndexNr3   r*   r   r
   ILimitedResultIndexr  T  r5   r   r  c                       e Zd ZdS )ZTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.IQueryIndexNr3   r*   r   r
   IQueryIndexr  W  r5   r   r  c                       e Zd ZdS )YTest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super.<locals>.IPathIndexNr3   r*   r   r
   
IPathIndexr
  Z  r5   r   r  r@   	PathIndexExtendedPathIndexTF)r   strictzused the legacyr  )
r   r   r   r   r   r   assertInr   assertRaises InconsistentResolutionOrderError)r   r   r   r   r  r  r  r  objr  r  resultr   s                r
   :test_ExtendedPathIndex_implement_thing_implementedby_superzETest_c3_ro.test_ExtendedPathIndex_implement_thing_implementedby_super?  sa    	&%%%%%	% 	% 	% 	% 	% 	% 	% 	% F;B//		 	 	 	 	i 	 	 		 	 	 	 	/ 	 	 		 	 	 	 	/ 	 	 		 	 	 	 	 	 	 	 fXF;[#(FGG	 #F +y9
 
 d5  
 
 	" 	 	 	 "*'):):)<)<===rBCC 	: 	:MM+DM999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:s   D--D14D1c           	          ddl m} ddlm} |                     t           |t                                                                          |j        |j	        |j
        |j        |j        |j        g           d S )Nr   r   )
interfaces)r   r   zope.interface.commonr  r   listOSError	flattenedIOSErrorIIOErrorIEnvironmentErrorIStandardError
IExceptionr   )r   r   r  s      r
   test_OSError_IOErrorzTest_c3_ro.test_OSError_IOError  s    ------444444GII&&002233##,)%$		 		 		 		 		r   c           	      0   dd l }ddlm} 	 |`n# t          $ r Y nw xY w|                                5  |                    d           t          |j        j	        d          5  t          |j        j
        d          5  |                     |j                  5  t                                                       d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                                 \  }}|                     |j                  5  |                     |d           d d d            n# 1 swxY w Y   t          |j        j        d          5  t          |j        j
        d          5  |                                5  |                    d           |                     |           d d d            n# 1 swxY w Y   |                     ||j        j                   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   |                     |d          }|                     |dd          }|                     ||           d S )	Nr   r   errorTFr  ignore)r   r  )warningsr   r   __warningregistry__AttributeErrorcatch_warningssimplefilterr   r   WARN_BAD_IRO
STRICT_IROr  "InconsistentResolutionOrderWarningsuperr   r   r  r   TRACK_BAD_IROr  BAD_IROSr   )r   r%  r   r   _iro
legacy_iro	__class__s          r
   r   zTest_c3_ro.test_non_orderable  s   %%%%%%	&& 	 	 	D	 $$&& 	1 	1!!'***"D  1 1 % 1 1
 &&r'LMM 1 1GG..0001 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 ##%%qrBCC 	. 	.MM%M---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. E
 
 	1 	1Ee
 
	1 	1
 ((** % %%%h///e$$$% % % % % % % % % % % % % % % MM%000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 mmE%m00]]5U]KK
j)))))s    
0D$C5?C!C	;CCCCCC5C""C5%C"&C5)D5C9	9D<C9	=DDDE,,E03E0I,H/+G8,H/8G<<H/?G< #H/#I/H3	3I6H3	7II
I
)r'   r(   r)   r   r   r   r   r   r   r   r   r  r!  r   __classcell__)r3  s   @r
   r   r      s        + + +       4+ + +
 
 
. . .. . .
 
 
2C: C: C:J  $* $* $* $* $* $* $* $* $*r   r   c                   "    e Zd ZddZd Zd ZdS )TestC3FNc                 <    ddl m} |                    |||          S )Nr   )r   )r   r   resolver)r   r   r  	base_mrosr   s        r
   _makeOnezTestC3._makeOne  s*    (((((({{1fi000r   c                 &   |                      t          |           t          j        t          j        j        i          }|j        }|                     t          j        |           |                     |t          j                 j                   d S )N)r9  )	r:  typeunittestTestCase__mro__memor  assertIsNonehad_inconsistency)r   c3r@  s      r
   test_base_mros_givenzTestC3.test_base_mros_given  sy    ]]JJ((*;*CD  
 
 wh'...$x01CDDDDDr   c                    |                      t          |                     }|                     |j                   d |_        |                     |                                t          t          |           j                             d S r   )	r:  r<  assertIsNotNone_C3__mro_merger   r   r  r?  )r   rC  s     r
   test_one_base_optimizationz!TestC3.test_one_base_optimization  sm    ]]4::&& 	R[)))	4T

(:#;#;<<<<<r   )FN)r'   r(   r)   r:  rD  rI  r*   r   r
   r6  r6    sI        1 1 1 1E E E= = = = =r   r6  c                   6    e Zd Z G d d          ZddZd ZdS )Test_ROComparisonc                       e Zd ZdZdZdS )Test_ROComparison.MockC3FN)r'   r(   r)   direct_inconsistencybases_had_inconsistencyr*   r   r
   MockC3rM    s        $"'r   rP  Nr*   c                 P    ddl m}  ||p|                                 ||          S )Nr   )_ROComparison)r   rR  rP  )r   rC  c3_ro	legacy_rorR  s        r
   r:  zTest_ROComparison._makeOne  s5    333333}R04;;==%CCCr   c                 N   |                                  }|                     d|j                   d|j        _        |                     d|j                   d|j        _        |                     d|j                   d|j        _        |                     d|j                   d S )NnoTdirectzdirect+basesFry   )r:  r   _inconsistent_labelrC  rN  rO  )r   comps     r
   test_inconsistent_labelz)Test_ROComparison.test_inconsistent_label  s    }}t7888'+$4#;<<<*.')ABBB',$$":;;;;;r   )Nr*   r*   )r'   r(   r)   rP  r:  rZ  r*   r   r
   rK  rK    sc        ( ( ( ( ( ( ( (D D D D< < < < <r   rK  )
__doc__r=  r>  r   r,   r[   r   r   r6  rK  r*   r   r
   <module>r\     sn   ( ' 8 8 8 8 88, 8 8 80/D /D /D /D /DH% /D /D /Ddn% n% n% n% n%h n% n% n%b> > > > > > > >W* W* W* W* W* W* W* W*t= = = = =X = = =0< < < < <) < < < < <r   