Your IP : 216.73.216.213


Current Path : /opt/alt/python35/lib/python3.5/site-packages/joblib/test/__pycache__/
Upload File :
Current File : //opt/alt/python35/lib/python3.5/site-packages/joblib/test/__pycache__/test_parallel.cpython-35.pyc



��XQm�"@s�dZddlZddlZddlZddlZddlmZddlmZddl	m
Z
mZddl	mZddl
mZddlmZdd	lmZdd
lmZyddlZeZWnddlZejZYnXerejZyed�Wnek
r/dd
�ZYnXyddlmZWn"ek
rhddlmZYnXyddlZWnek
r�dZYnXddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddl%m&Z&m'Z'ddl%m(Z(m)Z)ddl%m*Z*m+Z+m,Z,m-Z-ddl.m/Z/ddl0Z0ddl1m2Z2m3Z3m4Z4m5Z5dge6e,j7��Z8e9e*d�r�e8j:e*j;d��dd�Z<dd�Z=Gdd �d e>�Z?d!d"d#�Z@d$d%�ZAddd&d'�ZBd(d)�ZCd*d+�ZDd,d-�ZEd.d/�ZFd0d1�ZGd2d3�ZHd4d5�ZId6d7�ZJd8d9�ZKd:d;�ZLd<d=�ZMd>d?�ZNd@dA�ZOdBdC�ZPedDdE��ZQdFdG�ZRGdHdI�dIeS�ZTdJdK�ZUdLdM�ZVdNdO�ZWdPdQ�ZXdRdS�ZYdTdU�ZZdVdW�Z[dXdY�Z\dZd[�Z]d\d]�Z^d^d_�Z_Gd`da�dae �Z`dbdc�Zaddde�Zbdfdg�Zcdhdi�Zdedjdk��ZeGdldm�dme �Zfdndo�Zgdpdq�Zhdrds�Zidtdu�Zjdvdw�Zkdxdy�Zldzd{�Zmed|d}��Zneed~d���Zod�d��Zpd�d��Zqd�d��Zreed�d����Zsed�d���ZtdS)�z
Test the parallel module.
�N)�sqrt)�parallel)�np�
with_numpy)�with_multiprocessing)�check_subprocess_call)�PY3_OR_LATER)�TimeoutError)�sleep�strcCs|S)N�)�srr�J/opt/alt/python35/lib/python3.5/site-packages/joblib/test/test_parallel.py�<lambda>'sr)�Queue)�SequentialBackend)�ThreadingBackend)�MultiprocessingBackend)�SafeFunction)�WorkerInterrupt)�Parallel�delayed)�register_parallel_backend�parallel_backend)�mp�	cpu_count�BACKENDS�effective_n_jobs)�JoblibException)�assert_equal�assert_true�assert_false�
assert_raises�get_context�spawncCs||S)Nr)�x�yrrr�divisionKsr'cCs|dS)N�r)r%rrr�squareOsr)c@s"eZdZdZdd�ZdS)�MyExceptionWithFinickyInitz1An exception class with non trivial __init__
    cCsdS)Nr)�self�a�b�c�drrr�__init__Vsz#MyExceptionWithFinickyInit.__init__N)�__name__�
__module__�__qualname__�__doc__r0rrrrr*Ssr*FcCs1|dkr-|r'tdddd�nt�|S)N�r,r-r.r/)r*�
ValueError)r%�custom_exceptionrrr�exception_raiserZs!r8cCstjd�t�dS)Ng�������?)�timer
�KeyboardInterrupt)r%rrr�interrupt_raiseras
r;cCs|d||S)zO A module-level function so that it can be spawn with
    multiprocessing.
    r(r)r%r&�zrrr�ffsr=cCsttj�d�S)Nr)�typer�get_active_backendrrrr�_active_backend_typemsr@cCst�dkst�dS)Nr)r�AssertionErrorrrrr�test_cpu_countrsrBcCst�dkst�dS)Nr)rrArrrr�test_effective_n_jobsvsrCc	Cstd�}xJdD]B}tdd�|D�td|d|�dd	�|D���qWz�y"tj}tj}tr�tj�t_tj�t_ntj	�t_tj	�t_x�dD]�}tddd|d|�d
d	�|D��tddd|d|�dd	�|D��tddd|ddd|�dd	�|D��tddd|d|�dd	�|D��q�WWn{t
k
r�}z[tj}tj}|t_|t_tt|j
���tt|j
���|�WYdd}~XnXWd|t_|t_XdS)N��r(cSsg|]}t|��qSr)r))�.0r%rrr�
<listcomp>�s	z)check_simple_parallel.<locals>.<listcomp>�n_jobs�backendcss!|]}tt�|�VqdS)N)rr))rFr%rrr�	<genexpr>�sz(check_simple_parallel.<locals>.<genexpr>��d�verbosecss!|]}tt�|�VqdS)N)rr))rFr%rrrrJ�scss!|]}tt�|�VqdS)N)rr))rFr%rrrrJ�s�pre_dispatchcss!|]}tt�|�VqdS)N)rr))rFr%rrrrJ�scss!|]}tt�|�VqdS)N)rr))rFr%rrrrJ�s������)rEr(rOrP)r(rKrLrO)�rangerr�sys�stdoutr�io�StringIO�stderr�BytesIO�	Exception�print�unicode�getvalue)	rI�XrHZorig_stdoutZorig_stderrrM�eZ	my_stdoutZ	my_stderrrrr�check_simple_parallel|sD
		
					r^ccs xtD]}t|fVqWdS)N)�ALL_VALID_BACKENDSr^)rIrrr�test_simple_parallel�s
r`cCs0tddd|�dd�td�D��dS)NrHr(rIcss!|]}tt�d�VqdS)g{�G�z�?N)rr))rF�_rrrrJ�sznested_loop.<locals>.<genexpr>)rrQ)rIrrr�nested_loop�srbcs6tddd|��fdd�td�D��dS)NrHr(rIc3s!|]}tt���VqdS)N)rrb)rFra)�
child_backendrrrJ�sz$check_nested_loop.<locals>.<genexpr>)rrQ)�parent_backendrcr)rcr�check_nested_loop�sreccs4x-tD]%}xtD]}t||fVqWqWdS)N)rre)rdrcrrr�test_nested_loop�s

rfcsUtdd��tdddd��fdd�td�D��t�j��d	S)
z1Input is mutable when using the threading backend�maxsizerDrHr(rI�	threadingc3s*|] }t�jdd�d�VqdS)�check_pickleFrEN)r�put)rFra)�qrrrJ�sz1test_mutate_input_with_threads.<locals>.<genexpr>N)rrrQr �fullrr)rkr�test_mutate_input_with_threads�s rmccsXtd�}xEd
D]=}tdd�|D�td|�dd�|D��fVqWd	S)z.Check the keyword argument processing of pmap.�
rE�cSs"g|]}t|dd��qS)r&rE)r=)rFr%rrrrG�s	z(test_parallel_kwargs.<locals>.<listcomp>rHcss'|]}tt�|dd�VqdS)r&rEN)rr=)rFr%rrrrJ�sz'test_parallel_kwargs.<locals>.<genexpr>N)rEro)rQrr)�lstrHrrr�test_parallel_kwargs�s

rqcCsCtd�}dd�|D�}tddd|���}|j}tdk	rot|dk	�t|jdk	�t||dd�|D���t||d	d�|D���tdk	r�t|j|jjk�WdQRXtdk	r�t|jjdk�t||d
d�|D���tdk	r?t|jjdk�dS)NrncSs"g|]}t|dd��qS)r&rE)r=)rFr%rrrrG�s	z5check_parallel_as_context_manager.<locals>.<listcomp>rHrorIcss'|]}tt�|dd�VqdS)r&rEN)rr=)rFr%rrrrJ�sz4check_parallel_as_context_manager.<locals>.<genexpr>css'|]}tt�|dd�VqdS)r&rEN)rr=)rFr%rrrrJ�scss'|]}tt�|dd�VqdS)r&rEN)rr=)rFr%rrrrJ�s)rQr�_backendrr �_poolr)rIrp�expected�pZmanaged_backendrrr�!check_parallel_as_context_manager�s 	    rvccs&xddgD]}t|fVq
WdS)N�multiprocessingrh)rv)rIrrr�test_parallel_context_manager�srxcs~dd��ytj��Wn.tk
rM}z|j}WYdd}~XnXt|t��fdd�td�D��dS)ze Check that pmap captures the errors when it is passed an object
        that cannot be pickled.
    cSs|dS)Nr(r)r%rrr�g�sz!test_parallel_pickling.<locals>.gNc3s!|]}t��|�VqdS)N)r)rFr%)ryrrrJ�sz)test_parallel_pickling.<locals>.<genexpr>rn)�pickle�dumpsrX�	__class__r"rrQ)�exc�exception_classr)ryr�test_parallel_pickling�srcCsbx[ddgD]M}tjjdttddd|dd�dd	�td�D����q
WdS)
NrwrhrnrHr(rI�timeoutcss!|]}tt�d�VqdS)g����MbP?N)rr
)rFr%rrrrJsz0test_parallel_timeout_success.<locals>.<genexpr>)�nose�toolsr�lenrrQ)rIrrr�test_parallel_timeout_successs
	r�c
CsYxRddgD]D}tjjttddd|dd�dd	�td
�D��q
WdS)NrwrhrHr(rIr�g{�G�z�?css!|]}tt�d�VqdS)rnN)rr
)rFr%rrrrJsz-test_parallel_timeout_fail.<locals>.<genexpr>rn)r�r�r"r	rrQ)rIrrr�test_parallel_timeout_fail
s
	r�cCs�tdk	r�tttdd�dd�tdd�D��tttdd�dd�dD��tdd��B}t|jjdk	�|jj}tt|dd�tdd�D��t|jjdk	�t|jj|k	�t	d	d�t
d
�D�|dd�t
d
�D���|jj}tt|d
d�dD��t|jjdk	�t|jj|k	�t	dd�t
d
�D�|dd�t
d
�D���WdQRXt|jjdk�n&tttdd�dd�dD��tttdd�dd�tdd�D��tt
tdddd�dd�t
d�D��y6t�}tdd�dd�tdd �D��Wn8tk
r�}ztt|t��WYdd}~XnXdS)!NrHr(cSs+g|]!\}}tt�||��qSr)rr')rFr%r&rrrrGs	z&test_error_capture.<locals>.<listcomp>rrEcSs"g|]}tt�|��qSr)rr;)rFr%rrrrGs	cSs+g|]!\}}tt�||��qSr)rr')rFr%r&rrrrG's	cSs"g|]}t|dd��qS)r&rE)r=)rFr%rrrrG1s	rncss'|]}tt�|dd�VqdS)r&rEN)rr=)rFr%rrrrJ2sz%test_error_capture.<locals>.<genexpr>cSs"g|]}tt�|��qSr)rr;)rFr%rrrrG6s	cSs"g|]}t|dd��qS)r&rE)r=)rFr%rrrrG>s	css'|]}tt�|dd�VqdS)r&rEN)rr=)rFr%rrrrJ?scSs"g|]}tt�|��qSr)rr;)rFr%rrrrGFs	cSs+g|]!\}}tt�||��qSr)rr')rFr%r&rrrrGKs	rMcss'|]}tt�|dd�VqdS)r7TN)rr8)rF�irrrrJPs�css*|] \}}tt�||�VqdS)N)rr')rFr%r&rrrrJWs)rrE)rEr)rEr)rrE)rEr)rEr)rEr)rrE)rEr)rrE)rEr)rr"rr�ziprr rrrsrrQr:�ZeroDivisionErrorr*rXr!�
isinstance)rZ
original_pool�exrrr�test_error_capturesN			 	'		!r�c@s(eZdZdd�Zdd�ZdS)�CountercCs||_||_dS)N)�list1�list2)r+r�r�rrrr0]s	zCounter.__init__cCs3|jj|�tt|j�t|j��dS)N)r��appendrr�r�)r+r�rrr�__call__aszCounter.__call__N)r1r2r3r0r�rrrrr�\sr�cCs|jd|�dS)NzConsumed %s)r�)�queue�itemrrr�consumerfsr�cs!t���fdd�}tddddd|��fdd�|�D��t�d	d
ddd
dddddddg�tt��d�g�dd�<tddddd|��fdd�|�D��t�d	dd
dd
dddddddg�tt��d�dS)zC Test that with only one job, Parallel does act as a iterator.
    c3s1x*td�D]}�jd|�|Vq
WdS)N�zProduced %i)rQr�)r�)r�rr�producerosz(check_dispatch_one_job.<locals>.producerrHrE�
batch_sizerIc3s$|]}tt��|�VqdS)N)rr�)rFr%)r�rrrJvsz)check_dispatch_one_job.<locals>.<genexpr>z
Produced 0z
Consumed 0z
Produced 1z
Consumed 1z
Produced 2z
Consumed 2z
Produced 3z
Consumed 3z
Produced 4z
Consumed 4z
Produced 5z
Consumed 5�Nroc3s$|]}tt��|�VqdS)N)rr�)rFr%)r�rrrJ�s)�listrrr�)rIr�r)r�r�check_dispatch_one_jobjs(	
r�ccs xtD]}t|fVqWdS)N)rr�)rIrrr�test_dispatch_one_job�s
r�c	s�tdkrtj��tj�}|j���fdd�}tdddddd	d
|��fdd�|�D��t��dd
�}|jd�t|dddg�tt��d�dS)zW Check that using pre_dispatch Parallel does indeed dispatch items
        lazily.
    Nc3s1x*td�D]}�jd|�|Vq
WdS)Nr�zProduced %i)rQr�)r�)r�rrr��sz0check_dispatch_multiprocessing.<locals>.producerrHr(r�rErN�rIc3s$|]}tt��d�VqdS)�anyN)rr�)rFra)r�rrrJ�sz1check_dispatch_multiprocessing.<locals>.<genexpr>rozConsumed anyz
Produced 0z
Produced 1z
Produced 2r�)	rr��SkipTest�Managerr�r�removerr�)rI�managerr�Z
first_fourr)r�r�check_dispatch_multiprocessing�s
r�ccs,x%tD]}|dkrt|fVqWdS)N�
sequential)rr�)rIrrr�test_dispatch_multiprocessing�s
r�cCs\tdddddd��:}|dd�td	�D��t|jj�d
�WdQRXdS)NrHr(r��autorIrhcss!|]}tt�|�VqdS)N)r�id)rFr�rrrrJ�sz/test_batching_auto_threading.<locals>.<genexpr>i�rE)rrQrrr�compute_batch_size)rurrr�test_batching_auto_threading�sr�cCs_tdddddd��=}|dd�td	�D��t|jj�d
k�WdQRXdS)NrHr(r�r�rIrwcss!|]}tt�|�VqdS)N)rr�)rFr�rrrrJ�sz5test_batching_auto_multiprocessing.<locals>.<genexpr>i�r)rrQr rrr�)rurrr�"test_batching_auto_multiprocessing�sr�c	Cs<tttdddddd�dd�td	�D��d
S)zCMake sure that exception raised during dispatch are indeed capturedrHr(rN�rMrcss!|]}tt�|�VqdS)N)rr8)rFr�rrrrJ�sz*test_exception_dispatch.<locals>.<genexpr>r�N)r"r6rrQrrrr�test_exception_dispatch�sr�c	Cs<tttdddddd�dd�td	�D��dS)
NrHr(rNr�rMrcss'|]}ttt��|�VqdS)N)rrr8)rFr�rrrrJ�sz1test_nested_exception_dispatch.<locals>.<genexpr>r�)r"rrrQrrrr�test_nested_exception_dispatch�sr�cCs[tjjtj�}|dd�}|jd�dj|�}t|�}t|�dS)NrEzparallel.py�/)	rr2�split�os�sepr��join�
__import__�reload)Zjoblib_path�modulerrr�_reload_joblib�s
r�cCs]ttjjdd��s'tj��tttdddd�dd�t	d	�D��dS)
NZJOBLIB_MULTIPROCESSINGrErHr(rN�allcSsg|]}tt���qSr)rr�)rFr�rrrrG�s	z*test_multiple_spawning.<locals>.<listcomp>rn)
�intr��environ�getr�r�r"�ImportErrorrrQrrrr�test_multiple_spawning�sr�c@s7eZdZdZdddd�Zddd�ZdS)�FakeParallelBackendz8Pretends to run concurrently while running sequentially.rENcKs|j|�|_||_|S)N)rrHr)r+rHr�backend_argsrrr�	configure�s	zFakeParallelBackend.configurecCs-|dkr)ttj�d|d�}|S)NrrE)�maxrr)r+rHrrrr�sz$FakeParallelBackend.effective_n_jobs)r1r2r3r4r�rrrrrr��sr�cCstttdd�dS)NrIzunit-testing)r"r6rrrrr�test_invalid_backendsr�cCsAz2tdt�tdtk�ttdt�Wdtd=XdS)N�test_backend)rr�r rrrrrr�test_register_parallel_backends

r�cCs\tt�t�z+tdtddd�tt�t�Wddt_Xtt�t�dS)Nrh�make_defaultTrw)rr@rrrrr�DEFAULT_BACKENDrrrr�test_overwrite_default_backends
r�c
Cst|dd���tj�\}}t|d�ttd�d�t�}t|jd�|dkr�tt|�t�tt|j	�t�np|dkr�tt|�t
�tt|j	�t
�n8|jd�rtt|�t�tt|j	�t�WdQRXdS)NrHr�rwrh�test_)
rrr?rrrrHr>rrrr�
startswithr�)�backend_name�active_backend�
active_n_jobsrurrr�check_backend_context_managers
	r�ccs�dd�td�D�}x|D]}t|t�q Wddg|}zvtt�t�x|D]}t|fVqaWtt�t�tdddd�d	d
�|D��tt�t�Wdx0tt	j
��D]}|jd�r�t	|=q�WXdS)NcSsg|]}d|�qS)ztest_backend_%dr)rFr�rrrrG.s	z0test_backend_context_manager.<locals>.<listcomp>r�rwrhrHr(rIcss'|]}|stt�|�VqdS)N)rr�)rFr-rrrrJ>sz/test_backend_context_manager.<locals>.<genexpr>r�)rQrr�rr@rr�rr�r�keysr�)Zall_test_backendsr�Zall_backendsr�rrr�test_backend_context_manager,s 

	r�c@s%eZdZdZddd�ZdS)�ParameterizedParallelBackendz9Pretends to run conncurrently while running sequentially.NcCs%|dkrtd��||_dS)Nzparam should not be None)r6�param)r+r�rrrr0Lsz%ParameterizedParallelBackend.__init__)r1r2r3r4r0rrrrr�Isr�cCs
tdt�z�tt�t�tddddd���tj�\}}tt|�t�t|j	d�t|d�t
�}t|jd�t|j
|k�|dd�td�D��}WdQRXt|d	d
�td�D��tt�t�Wdtd=XdS)NZ
param_backendr��*rHr�css!|]}tt�|�VqdS)N)rr)rFr�rrrrJ_sz=test_parameterized_backend_context_manager.<locals>.<genexpr>rDcSsg|]}t|��qSr)r)rFr�rrrrG`s	z>test_parameterized_backend_context_manager.<locals>.<listcomp>)rr�rr@rrrr?r>r�rrHr rrrQr)r�r�ru�resultsrrr�*test_parameterized_backend_context_managerRs

	& r�cCs�tt�t�ttdd�dd���tj�\}}tt|�t�t|jd�t|d�t	�}t|j
d�t|j|k�|dd�t
d�D��}WdQRXt|dd�t
d�D��tt�t�dS)	Nr��+rHrDcss!|]}tt�|�VqdS)N)rr)rFr�rrrrJuszDtest_direct_parameterized_backend_context_manager.<locals>.<genexpr>cSsg|]}t|��qSr)r)rFr�rrrrGvs	zEtest_direct_parameterized_backend_context_manager.<locals>.<listcomp>)rr@rrr�rr?r>r�rrHr rrrQ)r�r�rur�rrr�1test_direct_parameterized_backend_context_managerhs
	& r�cCs'td�}t|�tj|�dS)NZfoobar)r�reprrzr{)r]rrr�test_joblib_exception~s
r�cCs#tt�}tt|dd�dS)NrEr)rr'r"r)Z
safe_divisionrrr�test_safe_function�sr�cCs=tttdd�tttdd�tttdd�dS)Nr�rrEg���Q��?rO)r"r6rrrrr�test_invalid_batch_size�sr�cCs^|jd�}dd�t|�D�}t|�dd�t|�D��}t||�dS)N�n_taskscSsg|]}t|��qSr)r))rFr�rrrrG�s	z&check_same_results.<locals>.<listcomp>css!|]}tt�|�VqdS)N)rr))rFr�rrrrJ�sz%check_same_results.<locals>.<genexpr>)�poprQrr)�paramsr�rtr�rrr�check_same_results�s%r�c
csJttdddddd�fVttdddddd�fVttdddddd�fVttdddddd�fVttdddddd�fVttdddddd�fVttdd	ddd
d�fVttdd	ddd
ddd�fVttdd	ddd
d�fVttdddddd
�fVdS)Nr�r(rHrNr�rniro�r�rEr5z2*n_jobs)r��dictrrrr�test_dispatch_race_condition�s       r�cCs�tdddd�}|jjd�}tjd
kr�|j�}tjjdd	�j�p`d}|dkr�tj	d
kr�t
|d�q�t
|d�q�t
||�n
t
|d�dS)NrHr(rIrw�contextr�roZJOBLIB_START_METHOD��win32r$�fork)r�ro)r�
_backend_argsr�rR�version_info�get_start_methodr�r��strip�platformr)rur�Zstart_methodZ
env_methodrrr�test_default_mp_context�s!r�cs�tjdkrtjd��tjd�}tjjd�}|j	dd��tj
��j�tddd	|��fd
d�t
d�D��dS)
Nr�roz3multiprocessing can cause BLAS freeze on old Pythonr$r�i�rHr(rIc3s*|] }ttj���j�VqdS)N)rr�dot�T)rFr�)r,rrrJ�szDtest_no_blas_crash_or_freeze_with_multiprocessing.<locals>.<genexpr>)r�ro)rRr�r�r�rr#r�random�RandomState�randnr�r�rrQ)Z
spawn_backend�rngr)r,r�1test_no_blas_crash_or_freeze_with_multiprocessing�sr�cCsStdkrtjd��djdddg�}ttjd|gdd�dS)	NzNot a POSIX platformz

z$from joblib import Parallel, delayedzdef sqrt(x): return x**2z=print(Parallel(n_jobs=2)(delayed(sqrt)(i) for i in range(5)))z-cZstdout_regexz\[0, 1, 4, 9, 16\])�posixr�r�r�rrR�
executable)�coderrr�2test_parallel_with_interactively_defined_functions�sr�cCs,tg�}ttdd�|�g�dS)NrHr()�iterrr)Zexhausted_iteratorrrr�%test_parallel_with_exhausted_iterator�sr�cCs1t|tj�s'tdt|���|j�S)Nz#Expected np.memmap instance, got %r)r�r�memmap�	TypeErrorr>�copy)r,rrr�check_memmap�sr�cCs}dd�}tdddd�dd�|d	�D��}x<t||t|���D]\}}tjj||�qVWdS)
Ncss6x/t|�D]!}tjddtj�|Vq
WdS)Nrn�dtype)rQr�ones�float32)�nr�rrr�generate_arrays�szBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysrHr(�
max_nbytesrEcss!|]}tt�|�VqdS)N)rr�)rFr,rrrrJsz<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>rL)rr�r�r�testing�assert_array_equal)r�r��resultrtrrr�)test_auto_memmap_on_arrays_from_generator�s
(rcCs�tdkrtjd��d}|jdddd�}ttjd|gdd	�d
}|jdddd�}ttjd|gd|�dS)NzNot a POSIX platforma
import sys

from joblib import Parallel, delayed


def func():
    return 42


def parallel_func():
    res =  Parallel(n_jobs={inner_n_jobs})(delayed(func)() for _ in range(3))
    return res

Parallel(n_jobs={outer_n_jobs})(delayed(parallel_func)() for _ in range(5))
    Zinner_n_jobsrEZouter_n_jobsr(z-cZstderr_regexz^$z6Multiprocessing-backed parallel loops cannot be nested)r�r�r��formatrrRr�)Z
template_coder��regexrrr�test_nested_parallel_warnings
sr)ur4r9rRrTr��mathr�joblibrZjoblib.test.commonrrrZjoblib.testingrZjoblib._compatrrwr	r
�cPicklerzr��PickleError�
PicklingErrorrZ�	NameErrorr�rr�r�Zjoblib._parallel_backendsrrrrrZjoblib.parallelrrrrrrrrZjoblib.my_exceptionsrr��
nose.toolsrr r!r"�sortedr�r_�hasattrr�r#r'r)rXr*r8r;r=r@rBrCr^r`rbrerfrmrqrvrxrr�r�r��objectr�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�rrrrrr�<module>s�
	


""(		G
(