U
    ÷¾|eˆp  ã                   @   sb  d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d d
l+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;m<Z<m=Z= d dl>m?Z?m@Z@mAZA G dd„ de?ƒZBeBƒ ZCdeC_DdddddddddddddddgZEG dd „ d ed!eEƒƒZFed"ddd#d$gƒZGd%d&„ ZHd'd(„ ZIdeCi fd)d*„ZJdCd,d-„ZKG d.d/„ d/eLƒZMG d0d1„ d1eNƒZOG d2d3„ d3ePƒZQd4d5„ ZRG d6d7„ d7eLƒZSG d8d9„ d9eSƒZTG d:d;„ d;eLƒZUdeTfd<d=„ZVd>dd+deTfd?d@„ZWdAdB„ ZXdS )Dé    )Ú
namedtupleN)Úevent)	ÚutilsÚerrorsÚtypingÚinterpreterÚbytecodeÚpostprocÚconfigÚcallconvÚcpu)ÚParforDiagnostics)ÚCompilerError)Úlookup_environment)ÚPassManager)ÚExtractByteCodeÚTranslateByteCodeÚ	FixupArgsÚIRProcessingÚDeadBranchPruneÚRewriteSemanticConstantsÚInlineClosureLikesÚGenericRewritesÚWithLiftingÚInlineInlinablesÚFindLiterallyCallsÚMakeFunctionToJitFunctionÚCanonicalizeLoopExitÚCanonicalizeLoopEntryÚLiteralUnrollÚReconstructSSAÚRewriteDynamicRaisesÚ!LiteralPropagationSubPipelinePass)ÚNopythonTypeInferenceÚAnnotateTypesÚNopythonRewritesÚPreParforPassÚ
ParforPassÚDumpParforDiagnosticsÚIRLegalizationÚNoPythonBackendÚInlineOverloadsÚPreLowerStripPhisÚNativeLoweringÚNativeParforLoweringÚ"NoPythonSupportedFeatureValidationÚParforFusionPassÚParforPreLoweringPass)ÚObjectModeFrontEndÚObjectModeBackEnd)ÚTargetConfigÚOptionÚConfigStackc                   @   sf  e Zd Zeeddd�Zeeddd�Zeeddd�Zeeddd�Zeeddd�Z	eedd	d�Z
eedd
d�Zeedd
d�Zeedd
d�Zeeddd�Zeedd
d�Zeedd
d�Zeeje d¡dd�Zeedd
d�Zeedd
d�Zeedd
d�Zeeje d¡d
d�Zeedd
d�Zeeje d¡d
d�Zeeddd�Zeeddd�Zeeddd�Zeeddd�Z dS )ÚFlagsFzEnable loop-lifting)ÚtypeÚdefaultÚdocz!Enable pyobject mode (in general)z(Enable pyobject mode inside lifted loopsTz
Enable SSAz-Force pyobject mode inside the whole functionz&Release GIL inside the native functionZTODOz7Force inlining of the function. Overrides _dbg_optnone.zŽEnable automatic parallel optimization, can be fine-tuned by
taking a dictionary of sub-options instead of a boolean, see parfor.py for
detailÚpythonÚneverr   ÚbackendzTExtend variable lifetime for debugging. This automatically turns on with debug=True.z\Disable optimization for debug. Equivalent to adding optnone attribute in the LLVM Function.zDMake debug emissions directives-only. Used when generating lineinfo.N)!Ú__name__Ú
__module__Ú__qualname__r5   ÚboolÚenable_loopliftÚenable_pyobjectZenable_pyobject_loopliftÚ
enable_ssaÚforce_pyobjectÚrelease_gilZ
no_compileÚ	debuginfoÚboundscheckZforceinlineÚno_cpython_wrapperZno_cfunc_wrapperr   ÚParallelOptionsÚauto_parallelÚnrtÚno_rewritesÚstrÚerror_modelÚFastMathOptionsÚfastmathÚnoaliasÚInlineOptionsÚinlineÚtarget_backendÚdbg_extend_lifetimesÚdbg_optnoneÚdbg_directives_only© rY   rY   úP/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/core/compiler.pyr7   *   sæ   ýýýýýýýýýýýýýýýýýýýýýýýr7   TÚtyping_contextÚtarget_contextÚentry_pointÚtyping_errorÚtype_annotationÚ	signatureÚ
objectmodeÚliftedÚfndescÚlibraryÚcall_helperÚenvironmentÚmetadataÚreload_initÚreferenced_envsc                   @   sF   e Zd ZdZdZdd„ Zdd„ Zedd„ ƒZe	d	d
„ ƒZ
ddd„ZdS )ÚCompileResultzI
    A structure holding results from the compilation of a function.
    rY   c              
   C   sT   | j  ¡ }t| jƒ}| j}d |_|_|  ¡ }|| j| j| j	| j
| j|| jt|ƒf	S )zA
        Reduce a CompileResult to picklable components.
        N)rd   Zserialize_using_object_coderN   r_   rc   ÚtypemapÚ	calltypesÚ_find_referenced_environmentsrf   r`   ra   rb   rh   Útuple)ÚselfÚlibdataÚtypeannrc   ri   rY   rY   rZ   Ú_reduceÉ   s    

   þzCompileResult._reducec                 C   sN   | j j}g }|jD ]6}|j}| d¡rt|ƒ}|dk	r| ¡ r| |¡ q|S )z2Returns a list of referenced environments
        Z_ZN08NumbaEnvN)rd   Z_final_moduleÚglobal_variablesÚnameÚ
startswithr   Ú	can_cacheÚappend)ro   Úmodri   ÚgvZgvnÚenvrY   rY   rZ   rm   Ù   s    

z+CompileResult._find_referenced_environmentsc                 C   sv   |	r|	D ]
}|ƒ  q|  ¡  |¡}| |||¡}| ||j||||||||d d d |	|
d�}|
D ]}|j  |j|¡ q\|S )N)r\   r[   rd   rf   r]   rc   r_   r`   ra   rb   r^   re   rg   rh   ri   )ÚcodegenZunserialize_libraryÚget_executabler[   Zset_envÚenv_name)Úclsr\   rp   rc   rz   r`   ra   rb   rq   rh   ri   Úfnrd   ÚcfuncÚcrrY   rY   rZ   Ú_rebuildè   s0    òzCompileResult._rebuildc                 C   s
   | j  ¡ S ©N)r\   r{   ©ro   rY   rY   rZ   r{   
  s    zCompileResult.codegenÚ c                 C   sD   t |› dt| ƒj› d| j› �ƒ | jj|d d� t |› d�ƒ d S )NzDUMP ú z  )ÚtabzEND DUMP)Úprintr8   r>   r]   r`   Údump)ro   r‡   rY   rY   rZ   r‰     s     zCompileResult.dumpN)r…   )r>   r?   r@   Ú__doc__Ú	__slots__rr   rm   Úclassmethodr‚   Úpropertyr{   r‰   rY   rY   rY   rZ   rj   Â   s   
!
rj   Z_CompileResultÚ_LowerResultr€   rz   c                 C   sd   t |  ¡ ƒ}t tƒ}|| }|r(t|Ž ‚|| }|D ]}d | |< q4| d }|d k	r`| d ¡| d< | S )Nr^   )ÚsetÚkeysÚ	CR_FIELDSÚ	NameErrorÚwith_traceback)Úentriesr�   ÚfieldsetZbadnamesÚmissingÚkÚerrrY   rY   rZ   Úsanitize_compile_result_entries  s    
r™   c                  K   s   t | ƒ} tf | ŽS rƒ   )r™   rj   )r”   rY   rY   rZ   Úcompile_result,  s    rš   c              
   C   sZ   ddl m} t ¡ }tj|dd�}| ||¡�" t||| ||||ƒW  5 Q R £ S Q R X dS )zp
    Compile the function in an isolated environment (typing and target
    context).
    Good for testing.
    r   )Ú
cpu_targetr   )ÚtargetN)Únumba.core.registryr›   r   ÚContextr   Ú
CPUContextÚnested_contextÚcompile_extra)ÚfuncÚargsÚreturn_typeÚflagsÚlocalsr›   Ú	typingctxÚ	targetctxrY   rY   rZ   Úcompile_isolated1  s     ÿr©   Fc           
      C   sp   t j | ¡}t |¡}t j|d�}| |¡}|rXddlm} ||t	 
d¡i dƒ}| ¡  t |¡}	|	 |¡ |S )a  
    Run the compiler frontend over the given Python function, and return
    the function's canonical Numba IR.

    If inline_closures is Truthy then closure inlining will be run
    If emit_dels is Truthy the ir.Del nodes will be emitted appropriately
    )Úfunc_idr   )ÚInlineClosureCallPassF)r   ÚFunctionIdentityÚfrom_functionr   ZInterpreterZByteCodeZ	interpretÚnumba.core.inline_closurecallr«   r   rJ   Úrunr	   ÚPostProcessor)
r¢   Zinline_closuresÚ	emit_delsrª   ÚinterpÚbcÚfunc_irr«   Úinline_passÚ	post_procrY   rY   rZ   Úrun_frontendA  s    	

 ÿ

r·   c                   @   s(   e Zd ZdZddgZdd„ Zdd„ ZdS )	Ú_CompileStatuszC
    Describes the state of compilation. Used like a C record.
    Úfail_reasonÚcan_fallbackc                 C   s   d | _ || _d S rƒ   )r¹   rº   )ro   rº   rY   rY   rZ   Ú__init__^  s    z_CompileStatus.__init__c                 C   s4   g }| j D ]}| dj|t| |ƒd�¡ q
d |¡S )Nz{k}={v})r—   Úvz, )r‹   rw   ÚformatÚgetattrÚjoin)ro   Úvalsr—   rY   rY   rZ   Ú__repr__b  s    
z_CompileStatus.__repr__N)r>   r?   r@   rŠ   r‹   r»   rÁ   rY   rY   rY   rZ   r¸   X  s   r¸   c                   @   s   e Zd ZdZdd„ ZdS )Ú_EarlyPipelineCompletionz@
    Raised to indicate that a pipeline has completed early
    c                 C   s
   || _ d S rƒ   )Úresult)ro   rÃ   rY   rY   rZ   r»   n  s    z!_EarlyPipelineCompletion.__init__N)r>   r?   r@   rŠ   r»   rY   rY   rY   rZ   rÂ   i  s   rÂ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	StateDictz�
    A dictionary that has an overloaded getattr and setattr to permit getting
    and setting key/values through the use of attributes.
    c                 C   s,   z
| | W S  t k
r&   t|ƒ‚Y nX d S rƒ   )ÚKeyErrorÚAttributeError)ro   ÚattrrY   rY   rZ   Ú__getattr__x  s    
zStateDict.__getattr__c                 C   s   || |< d S rƒ   rY   )ro   rÇ   ÚvaluerY   rY   rZ   Ú__setattr__~  s    zStateDict.__setattr__N)r>   r?   r@   rŠ   rÈ   rÊ   rY   rY   rY   rZ   rÄ   r  s   rÄ   c                 C   sp   i }|j rd|d< |jr d|d< |jr.d|d< |jr>|j|d< |jrN|j|d< t |j| ¡}||d< | jf |ŽS )zL
    Make a new target context from the given target context and flags.
    TÚenable_debuginfoZenable_boundscheckÚ
enable_nrtrK   rQ   rO   )	rG   rH   rL   rK   rQ   r   Úcreate_error_modelrO   Ú	subtarget)r¨   r¥   ZsubtargetoptionsrO   rY   rY   rZ   Ú_make_subtarget‚  s    

rÏ   c                   @   sJ   e Zd ZdZdd„ Zdd„ Zddd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚCompilerBasez4
    Stores and manages states for the compiler
    c                 C   sô   t  ¡  | ¡  | ¡  tƒ | _|| j_t||ƒ| j_|| j_|| j_	|| j_
|| j_|| j_d | j_d | j_d | j_d | j_d | j_d | j_d | j_d | j_i | j_g | j_| | j_tƒ | j_| jj| jjd< i | jjd< t| jjjd�| j_d S )NÚparfor_diagnosticsZparfors)rº   )r
   Úreload_configÚrefreshrÄ   Ústater§   rÏ   r¨   rd   r£   r¤   r¥   r¦   r³   rª   r´   rb   Úlifted_fromrk   rl   r_   rg   rh   Úpipeliner   rÑ   r¸   rC   Ústatus)ro   r§   r¨   rd   r£   r¤   r¥   r¦   rY   rY   rZ   r»   œ  s:    
ÿ
ÿzCompilerBase.__init__c                 C   s6   t j |¡| j_tƒ  | j¡ d| j_d | j_|  	¡ S )NrY   )
r   r¬   r­   rÔ   rª   r   Úrun_passrb   rÕ   Ú_compile_bytecode)ro   r¢   rY   rY   rZ   r¡   Æ  s
    zCompilerBase.compile_extrarY   Nc                 C   sF   |j | j_ || j_|| j_|| j_| jjj| j_tƒ  | j¡ |  	¡ S rƒ   )
rª   rÔ   rb   rÕ   r´   Ú	arg_countÚnargsr   rØ   Ú_compile_ir)ro   r´   rb   rÕ   rY   rY   rZ   Ú
compile_irÎ  s    
zCompilerBase.compile_irc                 C   s
   t ƒ ‚dS )zGChild classes override this to customize the pipelines in use.
        N)ÚNotImplementedErrorr„   rY   rY   rZ   Údefine_pipelinesØ  s    zCompilerBase.define_pipelinesc                 C   s€  t ƒ  | jj ¡ ¡��` |  ¡ }|D ]ü}|j}d| jjj| jjj	f }t
d||f ƒ ||ji| jjd< ||d k}d}z$| | j¡ | jjdk	ršW  �q*W q$ tk
rÐ } z|j}W Y ¢
 �q*W 5 d}~X Y q$ tk
�r } z0t ¡ rút|tjƒsú|‚|| jj_|�r|‚W 5 d}~X Y q$X q$tdƒ‚d| j_|dk	�rL|W  5 Q R £ S | jjdk	�s^t‚| jjW  5 Q R £ S W 5 Q R X dS )z4
        Populate and run compiler pipeline
        z%s.%szPipeline: %s for %sZpipeline_timeséÿÿÿÿNz!All available pipelines exhausted)r6   ÚenterrÔ   r¥   Úcopyrß   Úpipeline_namerª   ÚmodnameÚfunc_qualnamer   Z
exec_timesrg   r¯   r�   rÂ   rÃ   Ú	Exceptionr   Úuse_new_style_errorsÚ
isinstancer   Ú
NumbaErrorr×   r¹   r   rÖ   ÚAssertionError)ro   ÚpmsÚpmrã   Ú	func_nameZis_final_pipelineÚresÚerY   rY   rZ   Ú_compile_coreÝ  sD    
ÿÿ
ÿ

zCompilerBase._compile_corec                 C   s   | j jdkst‚|  ¡ S )z>
        Populate and run pipeline for bytecode input
        N©rÔ   r´   rê   rð   r„   rY   rY   rZ   rÙ     s    zCompilerBase._compile_bytecodec                 C   s   | j jdk	st‚|  ¡ S )z8
        Populate and run pipeline for IR input
        Nrñ   r„   rY   rY   rZ   rÜ     s    zCompilerBase._compile_ir)rY   N)r>   r?   r@   rŠ   r»   r¡   rÝ   rß   rð   rÙ   rÜ   rY   rY   rY   rZ   rÐ   —  s   *

.rÐ   c                   @   s   e Zd ZdZdd„ ZdS )ÚCompilerzThe default compiler
    c                 C   sJ   g }| j jjs | t | j ¡¡ | j jjs4| j jjrF| t | j ¡¡ |S rƒ   )	rÔ   r¥   rE   rw   ÚDefaultPassBuilderÚdefine_nopython_pipeliner×   rº   Údefine_objectmode_pipeline)ro   rë   rY   rY   rZ   rß     s    

ÿzCompiler.define_pipelinesN)r>   r?   r@   rŠ   rß   rY   rY   rY   rZ   rò     s   rò   c                   @   sr   e Zd ZdZeddd„ƒZeddd„ƒZedd	d
„ƒZeddd„ƒZeddd„ƒZ	eddd„ƒZ
eddd„ƒZdS )ró   zð
    This is the default pass builder, it contains the "classic" default
    pipelines as pre-canned PassManager instances:
      - nopython
      - objectmode
      - interpreted
      - typed
      - untyped
      - nopython lowering
    Únopythonc                 C   s`   t }t|ƒ}| | ¡}|j |j¡ | | ¡}|j |j¡ | | ¡}|j |j¡ | ¡  |S )z<Returns an nopython mode pipeline based PassManager
        )ró   r   Údefine_untyped_pipelineZpassesÚextendÚdefine_typed_pipelineÚ!define_nopython_lowering_pipelineÚfinalize)rÔ   rt   Zdpbrì   Zuntyped_passesÚtyped_passesZlowering_passesrY   rY   rZ   rô   5  s    


z+DefaultPassBuilder.define_nopython_pipelineÚnopython_loweringc                 C   st   t |ƒ}| td¡ | td¡ | td¡ | jjjrD| td¡ n| t	d¡ | t
d¡ | td¡ | ¡  |S )Nú3ensure features that are in use are in a valid formú$ensure IR is legal prior to loweringúannotate typesúnative parfor loweringúnative loweringúnopython mode backendzdump parfor diagnostics)r   Úadd_passr/   r)   r$   r¥   rK   Úenabledr.   r-   r*   r(   rû   ©rÔ   rt   rì   rY   rY   rZ   rú   H  s    ÿÿ
z4DefaultPassBuilder.define_nopython_lowering_pipelineÚparfor_gufunc_nopython_loweringc                 C   sh   t |ƒ}| td¡ | td¡ | td¡ | jjjrD| td¡ n| t	d¡ | t
d¡ | ¡  |S )Nrþ   rÿ   r   r  r  r  )r   r  r/   r)   r$   r¥   rK   r  r.   r-   r*   rû   r  rY   rY   rZ   Ú/define_parfor_gufunc_nopython_lowering_pipeline\  s    ÿÿ
zBDefaultPassBuilder.define_parfor_gufunc_nopython_lowering_pipelineÚtypedc                 C   s�   t |ƒ}| td¡ | td¡ | td¡ | jjjrB| td¡ | jj	sV| t
d¡ | jjjr„| td¡ | td¡ | td¡ | ¡  |S )	ú/Returns the typed part of the nopython pipelineúnopython frontendúremove phis nodeszinline overloaded functionszPreprocessing for parforsúnopython rewriteszconvert to parforszfuse parforsúparfor prelowering)r   r  r#   r,   r+   r¥   rK   r  r&   rM   r%   r'   r0   r1   rû   r  rY   rY   rZ   rù   p  s    

z(DefaultPassBuilder.define_typed_pipelineÚparfor_gufunc_typedc                 C   sB   t |ƒ}| jst‚| td¡ | td¡ | td¡ | ¡  |S )r
  úprocessing IRr  r  )r   r´   rê   r  r   r#   r1   rû   r  rY   rY   rZ   Údefine_parfor_gufunc_pipelineˆ  s    
z0DefaultPassBuilder.define_parfor_gufunc_pipelineÚuntypedc                 C   sö   t |ƒ}| jdkr*| td¡ | td¡ | td¡ | td¡ | td¡ | jj	sz| t
d¡ | td¡ | td	¡ | td
¡ | td¡ | td¡ | jj	s²| td¡ | td¡ | td¡ | jjrÞ| td¡ | td¡ | ¡  |S )z0Returns an untyped part of the nopython pipelineNúanalyzing bytecodeúfix up argsr  zHandle with contextsú(inline calls to locally defined closureszrewrite semantic constantszdead branch pruningr  zrewrite dynamic raisesú(convert make_function into JIT functionszinline inlinable functionszfind literally callszhandles literal_unrollZssazLiteral propagation)r   r´   r  r   r   r   r   r   r¥   rM   r   r   r   r!   r   r   r   r   rD   r    r"   rû   r  rY   rY   rZ   r÷   ”  s6    
ÿÿz*DefaultPassBuilder.define_untyped_pipelineÚobjectc                 C   s°   t |ƒ}| jdkr,| td¡ | td¡ n| td¡ | td¡ | td¡ | td¡ | t	d¡ | t
d	¡ | td
¡ | td¡ | td¡ | td¡ | ¡  |S )z:Returns an object-mode pipeline based PassManager
        Nr  r  r  r  zcanonicalize loop entryzcanonicalize loop exitzobject mode frontendr  r  rÿ   r   zobject mode backend)r   r´   r  r   r   r,   r   r   r   r2   r   r   r)   r$   r3   rû   r  rY   rY   rZ   rõ   Á  s(    
ÿÿz-DefaultPassBuilder.define_objectmode_pipelineN)rö   )rý   )r  )r	  )r  )r  )r  )r>   r?   r@   rŠ   Ústaticmethodrô   rú   r  rù   r  r÷   rõ   rY   rY   rY   rZ   ró   *  s    
 ÿ,ró   c	           
      C   s   || ||||||ƒ}	|	  |¡S )aD  Compiler entry point

    Parameter
    ---------
    typingctx :
        typing context
    targetctx :
        target context
    func : function
        the python function to be compiled
    args : tuple, list
        argument types
    return_type :
        Use ``None`` to indicate void return
    flags : numba.compiler.Flags
        compiler flags
    library : numba.codegen.CodeLibrary
        Used to store the compiled code.
        If it is ``None``, a new CodeLibrary is used.
    pipeline_class : type like numba.compiler.CompilerBase
        compiler pipeline
    )r¡   )
r§   r¨   r¢   r£   r¤   r¥   r¦   rd   Úpipeline_classrÖ   rY   rY   rZ   r¡   à  s       ÿr¡   rY   c              	      sÐ   |	r¨t  |¡}d|_‡ ‡‡‡‡‡‡‡‡f	dd„}||  ¡ |ƒ}d}|js’t ¡ �< t dtj¡ z||  ¡ |ƒ}W n tk
r†   Y nX W 5 Q R X |dk	r |}n|}|S ˆˆˆˆˆ ˆ|ˆƒ}|j	|ˆˆd�S dS )zK
    Compile a function with the given IR.

    For internal use only.
    Tc                    s$   ˆˆˆˆˆ ˆ|ˆƒ}|j | ˆˆd�S )N©r´   rb   rÕ   )rÝ   )Zthe_irZ	the_flagsrÖ   ©	r£   rd   rb   rÕ   r¦   r  r¤   r¨   r§   rY   rZ   Úcompile_local  s       ÿÿz!compile_ir.<locals>.compile_localNÚignorer  )
râ   ÚdeepcopyrM   ÚwarningsÚcatch_warningsÚsimplefilterr   ÚNumbaWarningræ   rÝ   )r§   r¨   r´   r£   r¤   r¥   r¦   rb   rÕ   Úis_lifted_looprd   r  Z
norw_flagsr  Z	norw_cresZrw_cresÚcresrÖ   rY   r  rZ   rÝ   ý  s4    


   ÿÿrÝ   c           	      C   s   t | ||||||ƒ}| |¡S )z 
    For internal use only.
    )rò   r¡   )	r§   r¨   rd   r¢   r£   r¤   r¥   r¦   rÖ   rY   rY   rZ   Úcompile_internal=  s       ÿr%  )FF)YÚcollectionsr   râ   r  Znumba.core.tracingr   Ú
numba.corer   r   r   r   r   r	   r
   r   r   Znumba.parfors.parforr   Únumba.core.errorsr   Únumba.core.environmentr   Znumba.core.compiler_machineryr   Únumba.core.untyped_passesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   Únumba.core.typed_passesr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   Znumba.core.object_mode_passesr2   r3   Znumba.core.targetconfigr4   r5   r6   r7   ÚDEFAULT_FLAGSrL   r‘   rj   rŽ   r™   rš   r©   r·   r  r¸   ræ   rÂ   ÚdictrÄ   rÏ   rÐ   rò   ró   r¡   rÝ   r%  rY   rY   rY   rZ   Ú<module>   s€   ,PD
 ðRüÿ

	  8 ÿ
   þ
@