
    Xfj                     l   d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZ  ej        e          Z G d dej        j                  Z G d d	ej        j                  Z G d
 dej        j                  Z G d dej        j                  Z G d de          Z G d dej        j                  Z G d dej        j                  Z G d dej        j                  Z G d deej        j         ej!                  Z" G d de"          Z# G d dej        j$        ej        j                   Z% G d dej        j$        ej        j                   Z& G d d ej        j                  Z' G d! d"e'          Z( G d# d$ej        j$        ej        j                   Z)dS )%a_  Contains standard Requirement types that all adhere to the :class:`~volatili
ty.framework.interfaces.configuration.RequirementInterface`.

These requirement types allow plugins to request simple information
types (such as strings, integers, etc) as well as indicating what they
expect to be in the context (such as particular layers or symboltables).
    N)AnyClassVarDictListOptionalTupleType)parserequest)	constants
interfacesc                   ^    e Zd ZdZdej        j        dedeeej	        j
        f         fdZdS )MultiRequirementzClass to hold multiple requirements.

    Technically the Interface could handle this, but it's an interface,
    so this is a concrete implementation.
    contextconfig_pathreturnc                 .    |                      ||          S )N)unsatisfied_childrenselfr   r   s      b/home/panchajanya/Development/work/volatility3/volatility3/framework/configuration/requirements.pyunsatisfiedzMultiRequirement.unsatisfied   s     ((+>>>    N)__name__
__module____qualname____doc__r   r   ContextInterfacestrr   configurationRequirementInterfacer    r   r   r   r      s`         ?!):?IL?	c:+@@	A? ? ? ? ? ?r   r   c                       e Zd ZdZdS )BooleanRequirementz1A requirement type that contains a boolean value.N)r   r   r   r   r"   r   r   r$   r$   #   s        ;;;;r   r$   c                   .    e Zd ZU dZeZee         ed<   dS )IntRequirementz2A requirement type that contains a single integer.instance_typeN)	r   r   r   r   intr'   r   r	   __annotations__r"   r   r   r&   r&   )   s,         <<$'M8D>'''''r   r&   c                   .    e Zd ZU dZeZee         ed<   dS )StringRequirementz9A requirement type that contains a single unicode string.r'   N)	r   r   r   r   r   r'   r   r	   r)   r"   r   r   r+   r+   /   s.         CC %(M8D>'''''r   r+   c                   2    e Zd ZdZededefd            ZdS )URIRequirementzQA requirement type that contains a single unicode string that is a valid
    URI.filenamer   c           
      @   t          j        |d          }|j        dk    st          |j                  dk    rVt          j        t          j        dt          j        t          j        	                    |                                        }|j        dk    rrt          j        
                    t          j        |j                            s<t          j        |j                  }|st          d          t          d|           t          j        |          S )zReturns the URL location from a file parameter (which may be a URL)

        Args:
            filename: The path to the file (either an absolute, relative, or URL path)

        Returns:
            The URL for the location of the file
            zfile:filez0File URL looks incorrect (potentially missing /)zFile does not exist: )r
   urlparseschemelenurljoinr   pathname2urlospathabspathexistsurl2pathname
ValueError
urlunparse)clsr.   single_locations      r   location_from_filez!URIRequirement.location_from_file<   s      .266!R''3/E+F+F!+K+K#ngw';BGOOH<U<U'V'VWW O !V++7>>'"67K"L"LMM E"/0DEE Y$%WXXX !C!C!CDDD000r   N)r   r   r   r   classmethodr   rA   r"   r   r   r-   r-   6   sL         
 1# 1# 1 1 1 [1 1 1r   r-   c                   .    e Zd ZU dZeZee         ed<   dS )BytesRequirementz/A requirement type that contains a byte string.r'   N)	r   r   r   r   bytesr'   r   r	   r)   r"   r   r   rD   rD   U   s,         99$)M8D>)))))r   rD   c            	            e Zd ZdZeddfdeej        j                 de	e
         de	e
         ddf fdZd	ej        j        d
edeeej        j        f         fdZ xZS )ListRequirementa  Allows for a list of a specific type of requirement (all of which must
    be met for this requirement to be met) to be specified.

    This roughly correlates to allowing a number of arguments to follow a command line parameter,
    such as a list of integers or a list of strings.

    It is distinct from a multi-requirement which stores the subrequirements in a dictionary, not a list,
    and does not allow for a dynamic number of values.
    r   Nelement_typemax_elementsmin_elementsr   c                      t                      j        |i | t          |t          j        j                  st          d          || _        |pd| _        || _	        dS )a3  Constructs the object.

        Args:
            element_type: The (requirement) type of each element within the list
            max_elements; The maximum number of acceptable elements this list can contain
            min_elements: The minimum number of acceptable elements this list can contain
        zGListRequirements can only be populated with simple InstanceRequirementsr   N)
super__init__
issubclassr   r    
BasicTypes	TypeErrorrH   rJ   rI   )r   rH   rI   rJ   argskwargs	__class__s         r   rM   zListRequirement.__init__f   ss     	$)&))),
(@(KLL 	Y   #/!-!2+7r   r   r   c                 n    t           j                            | j                  }d}                     |||          }|s4 j        dk    r)t                              t          j	        d           | iS |0 j
        s)t                              t          j	        d           | iS |
g |j        |<   t          |t                    st          dt          |                      j        t!          |          k    s)t                              t          j	        d           | iS  j        rAt!          |           j        k     s)t                              t          j	        d           | iS t%           fd|D                       s)t                              t          j	        d	           | iS i S )
z|Check the types on each of the returned values and their number and
        then call the element type's check for each one.Nr   zGListRequirement Unsatisfied - ListRequirement has non-zero min_elementsz5ListRequirement Unsatisfied - Value was not specifiedzUnexpected config value found: z3TypeError - Too few values provided to list option.z4TypeError - Too many values provided to list option.c                 :    g | ]}t          |j                  S r"   )
isinstancerH   ).0elementr   s     r   
<listcomp>z/ListRequirement.unsatisfied.<locals>.<listcomp>   s&    PPPwJw(9::PPPr   zHTypeError - At least one element in the list is not of the correct type.)r   r    	path_joinnameconfig_valuerJ   volloglogr   
LOGLEVEL_VoptionalconfigrV   listrP   reprr5   rI   all)r   r   r   defaultvalues   `    r   r   zListRequirement.unsatisfied~   s   
 !.88diPP!!';@@ 	'*Q..JJ$Y    &&==JJ$G    &&]*,GN;'%&& 	MKd5kkKKLLL!SZZ//JJ$E    && 	'c%jj43D&D&DJJ$F    &&PPPP%PPPQQ 	'JJ$Z    &&	r   )r   r   r   r   r   r	   r   r    SimpleTypesr   r(   rM   r   r   r   r!   r   __classcell__rS   s   @r   rG   rG   [   s          DG&'&*	8 8:3?@8 sm8 sm	8 
8 8 8 8 8 80,!):,IL,	c:+@@	A, , , , , , , ,r   rG   c                        e Zd ZdZdee         ddf fdZdej        j	        dede
eej        j        f         fdZ xZS )	ChoiceRequirementz$Allows one from a choice of strings.choicesr   Nc                      t                      j        |i | t          |t                    rt	          d |D                       rt          d          || _        dS )z}Constructs the object.

        Args:
            choices: A list of possible string options that can be chosen from
        c                 :    g | ]}t          |t                     S r"   )rV   r   )rW   choices     r   rY   z.ChoiceRequirement.__init__.<locals>.<listcomp>   s%    ???VFC(((???r   z4ChoiceRequirement takes a list of strings as choicesN)rL   rM   rV   rb   anyrP   rl   )r   rl   rQ   rR   rS   s       r   rM   zChoiceRequirement.__init__   ss     	$)&)))'4(( 	TC??w???-
 -
 	T RSSSr   r   r   c                     t           j                            || j                  }|                     ||          }|| j        vr)t                              t          j	        d           || iS i S )RValidates the provided value to ensure it is one of the available
        choices.z=ValueError - Value is not within the set of available choices)
r   r    rZ   r[   r\   rl   r]   r^   r   r_   r   r   r   rf   s       r   r   zChoiceRequirement.unsatisfied   sq    
 !.88diPP!!';77$$JJ$O    &&	r   )r   r   r   r   r   r   rM   r   r   r   r   r    r!   r   rh   ri   s   @r   rk   rk      s        ..S	 t      !):IL	c:+@@	A       r   rk   c                   `    e Zd ZdZdej        j        dedeeej	        j
        f         f fdZedeej	        j
                 fd            Zej        dej        j        deddfd            Zej        dej	        j
        fd	            Zdej        j        ded
edej	        j        fdZ xZS )ComplexListRequirementz.Allows a variable length list of requirements.r   r   r   c                 <   t           j                            || j                  }t	                                          ||          }|r|S |                     ||d          4|                     |t           j                            |d                    r|| iS i S )rr   Nnumber_of_elements)r   r    rZ   r[   rL   r   r\   )r   r   r   ret_listrS   s       r   r   z"ComplexListRequirement.unsatisfied   s    
 !.88diPP77&&w<< 	OWk488@DDUDU$..{<PQQE
 E
@  &&	r   c                 (    t          ddd          gS )Nrw   z+Determines how many layers are in this listF)descriptionr`   r&   r?   s    r   get_requirementsz'ComplexListRequirement.get_requirements   s)     $I  
 	
r   Nc                     dS )^Method for constructing within the context any required elements
        from subrequirements.Nr"   r   s      r   	constructz ComplexListRequirement.construct         r   c                     dS )z6Builds a new requirement based on the specified index.Nr"   r   indexs     r   new_requirementz&ComplexListRequirement.new_requirement   r   r   _c                 ^   t           j                                        }t           j                            || j        d          }|j                            |d           }|||d<   t          |          D ]}|                     |          }| 	                    |           t           j                            || j        |j                  }	|j                            |	d           }
|
B|
                    |j        |j        |
                                                    |
||j        <   |S )Nrw   )r   r    HierarchicalDictrZ   r[   ra   getranger   add_requirementsplicelayersbuild_configuration)r   r   r   r   resultnum_elem_config_pathnum_elementsireq
value_pathrf   s              r   r   z*ComplexListRequirement.build_configuration   s!    )::<<)7AA$8 
  
 ~))*>EE#+7F'(<(( 	- 	-**1--$$S)))'5??CH 
  **:t<<$MM#(GN5,A,U,U,W,WXXX',F38$r   )r   r   r   r   r   r   r   r   r   r    r!   r   rB   r   r}   abcabstractmethodr   r   r   r   r   rh   ri   s   @r   ru   ru      s]       
 98!):IL	c:+@@	A       
j&>&S!T 
 
 
 [
 	!!):!IL!	! ! ! ! 	E
(@(U E E E E!):ILQT		!	2       r   ru   )	metaclassc                   Z    e Zd ZdZdej        j        deddfdZdej	        j
        fdZdS )LayerListRequirementz8Allows a variable length list of layers that must exist.r   r   r   Nc                    t           j                            || j                  }t           j                            |d          }|j        |         }t          |t                    st          d          t          |          D ]_}| j	        
                    | j        t          |          z   d          }|+t          |t                    r|                    ||           `dS )r   rw   z#Number of layers must be an integerN)r   r    rZ   r[   ra   rV   r(   rP   r   requirementsr   r   TranslationLayerRequirementr   )r   r   r   new_config_pathnum_layers_pathnumber_of_layersr   	layer_reqs           r   r   zLayerListRequirement.construct  s    
 %2<<[$)TT$2<<1
 
 #>/:*C00 	CABBB '(( 	> 	>A)--di#a&&.@$GGI$6* *$ ##G_===	> 	>r   c                 P    t          | j        t          |          z   dd          S )z:Constructs a new requirement based on the specified index.zLayer for swap spaceF)r[   rz   r`   )r   r[   r   r   s     r   r   z$LayerListRequirement.new_requirement*  s/    *SZZ'.
 
 
 	
r   )r   r   r   r   r   r   r   r   r   r    r!   r   r"   r   r   r   r     sm        BB>!):>IL>	> > > >,

(@(U 
 
 
 
 
 
r   r   c                       e Zd ZdZ	 	 	 	 	 ddededej        j        dede	d	e	d
df fdZ
dej        j        ded
eeej        j        f         fdZdej        j        ded
dfdZdej        j        deded
ej        j        fdZ xZS )r   zXClass maintaining the limitations on what sort of translation layers are
    acceptable.NFr[   rz   re   r`   osesarchitecturesr   c                 |    |g }|g }|| _         || _        t                                          ||||           dS )ao  Constructs a Translation Layer Requirement.

        The configuration option's value will be the name of the layer once it exists in the store

        Args:
            name: Name of the configuration requirement
            description: Description of the configuration requirement
            default: A default value (should not be used for TranslationLayers)
            optional: Whether the translation layer is required or not
            oses: A list of valid operating systems which can satisfy this requirement
            architectures: A list of valid architectures which can satisfy this requirement
        N)r   r   rL   rM   )r   r[   rz   re   r`   r   r   rS   s          r   rM   z$TranslationLayerRequirement.__init__:  sM    * <D M	*{GX>>>>>r   r   r   c                    t           j                            || j                  }|                     ||d          }t          |t                    r||j        vr,t          	                    t          j        d|            || iS | j        rY|j        |         j                            dd          | j        vr,t          	                    t          j        d|            || iS | j        rY|j        |         j                            dd          | j        vr,t          	                    t          j        d|            || iS i S |9t          	                    t          j        dt!          |                      || iS |                     |t           j                            |                     t          	                    t          j        d|            || iS )	zeValidate that the value is a valid layer name and that the layer
        adheres to the requirements.Nz.IndexError - Layer not found in memory space: r8   z*TypeError - Layer is not the required OS: architecturez4TypeError - Layer is not the required Architecture: zFTypeError - Translation Layer Requirement only accepts string labels: (IndexError - No configuration provided: )r   r    rZ   r[   r\   rV   r   r   r]   r^   r   r_   r   metadatar   r   rc   _validate_classparent_pathrs   s       r   r   z'TranslationLayerRequirement.unsatisfiedW  s   
 !.88diPP!!';==eS!! 	GN**

(LULL   $T**	+N5)266tTBB$)SS

(HHH   $T**"	+N5)266~tLL)* * 

(R5RR   $T**IJJ$fY]^cYdYdff    && 	Wj&>&J&J;&W&WXXX

 D{DD	
 	
 	
 T""r   c                    t           j                            | j                  | j        }d}|j        v r%| j        t          |          z   }|dz  }|j        v %|d}t          fd| j                                        D                       rdS | 	                    |          }|4t          |t           j        j                  r                    |           dS )zRConstructs the appropriate layer and adds it based on the class
        parameter.   r1   r   r   r[   c                 J    g | ]}|j         	|                               S r"   r`   r   rW   subreqr   r   s     r   rY   z9TranslationLayerRequirement.construct.<locals>.<listcomp>  A       ""7K88  r   N)r   r    rZ   r[   r   r   rp   r   values_construct_classrV   DataLayerInterface	add_layerr   r   r   r[   counterrQ   objs    ``    r   r   z%TranslationLayerRequirement.construct  s   
 !.88diPP ygn$$9s7||+DqLG gn$$ #;MM    "/6688  
 
 	 4##G[$???z#z/@/STT?c""" tr   r   rf   c                 @    |j         |                                         S zKBuilds the appropriate configuration for the specified
        requirement.)r   r   r   r   r   rf   s       r   r   z/TranslationLayerRequirement.build_configuration  s    
 ~e$88:::r   )NNFNN)r   r   r   r   r   r   r    ConfigSimpleTypeboolr   rM   r   r   r   r!   r   r   r   r   r   rh   ri   s   @r   r   r   3  s]          =A"? ?? ? ):	?
 ? ? ? 
? ? ? ? ? ?:3#!):3#IL3#	c:+@@	A3# 3# 3# 3#j!):IL	   @;!):;?B;KN;		!	2; ; ; ; ; ; ; ;r   r   c                       e Zd ZdZdej        j        dedeeej	        j
        f         fdZdej        j        deddfdZdej        j        ded	edej	        j        fd
ZdS )SymbolTableRequirementzSClass maintaining the limitations on what sort of symbol spaces are
    acceptable.r   r   r   c                 j   t           j                            || j                  }|                     ||d          }t          |t                    s;|9t                              t          j
        dt          |                      || iS |r||j        v ri S |r:t                              t          j
        d                    |pd                     |                     |t           j                            |                     t                              t          j
        d|            || iS )z[Validate that the value is a valid within the symbol space of the
        provided context.Nz?TypeError - SymbolTableRequirement only accepts string labels: z6IndexError - Value not present in the symbol space: {}r0   z,Symbol table requirement not yet fulfilled: )r   r    rZ   r[   r\   rV   r   r]   r^   r   r_   rc   symbol_spaceformatr   r   rs   s       r   r   z"SymbolTableRequirement.unsatisfied  s?   
 !.88diPP!!';==%%% 	'%*;JJ$_RVW\R]R]__    && 		Ug222I 	JJ$HOOKR    	Wj&>&J&J;&W&WXXX

 H;HH	
 	
 	
 T""r   Nc                 h   t           j                            | j                  j                            | j                  }|d}t          fd| j                                        D                       rdS t          | j        d         t           j        j
                  s:t          d                    t          | j        d                                       | j        d         j        }|dS j                                      }|                                D ]5}|j        |j        v r%|j        dk    r|j        |j                 ||j        <   6|                     |          }|9t          |t           j        j                  rj                            |           dS )zTConstructs the symbol space within the context based on the
        subrequirements.r   c                 J    g | ]}|j         	|                               S r"   r   r   s     r   rY   z4SymbolTableRequirement.construct.<locals>.<listcomp>  r   r   Nclassz5Class requirement is not of type ClassRequirement: {})r   r    rZ   r[   r   free_table_namerp   r   r   rV   ClassRequirementrP   r   rc   r?   ra   branchr}   datar   symbolsSymbolTableInterfaceappend)	r   r   r   r[   rQ   r?   node_configr   r   s	    ``      r   r   z SymbolTableRequirement.construct  s   
 !.88diPP#33DI>>";MM    "/6688  
 
 	 4 g&
(@(Q
 
 	 GNN*7344   
 (,;4n++K88'')) 	< 	<Cx;+++G0C0C!,!1#(!;SX##G[$???z#z/A/VWW? '',,,tr   r   rf   c                 @    |j         |                                         S r   )r   r   r   s       r   r   z*SymbolTableRequirement.build_configuration  s    
 #E*>>@@@r   )r   r   r   r   r   r   r   r   r   r    r!   r   r   r   r   r   r"   r   r   r   r     s         #!):#IL#	c:+@@	A# # # #B(!):(IL(	( ( ( (TA!):A?BAKNA		!	2A A A A A Ar   r   c                       e Zd Z	 	 	 	 	 ddededededeej        j                 de	e
ed	f                  d
df fdZdej        j        ded
eeej        j        f         fdZede
ed	f         de
eeef         d
efd            Z xZS )VersionRequirementNFr[   rz   re   r`   	componentversion.r   c                     t                                          ||||           |t          d          || _        |t          d          || _        d S )Nr[   rz   re   r`   zComponent cannot be NonezVersion cannot be None)rL   rM   rP   
_component_version)r   r[   rz   re   r`   r   r   rS   s          r   rM   zVersionRequirement.__init__  sl     	;( 	 	
 	
 	
 6777OX?4555r   r   r   c                     t           j                            || j                  }|                     | j        | j        j                  s|| iS d|j        t           j                            || j                  <   i S )NT)	r   r    rZ   r[   matches_requiredr   r   r   ra   r   s      r   r   zVersionRequirement.unsatisfied"  ss     !.88diPP$$T]DO4KLL 	'&& 	z/99+tyQQR 	r   requiredc                     t          |          dk    r|d         |d         k    rdS t          |          dk    r|d         |d         k     rdS dS )Nr   Fr1   T)r5   )r?   r   r   s      r   r   z#VersionRequirement.matches_required.  sY     x==1x{!:!:5x==1hqk!9!95tr   NFFNN)r   r   r   r   r   r	   r   r    VersionableInterfacer   r   r(   rM   r   r   r   r!   r   rB   r   rh   ri   s   @r   r   r     s<         IM-1       	 
   
0EF  %S/*  
           &
!):
IL
	c:+@@	A
 
 
 
 S#X16sC}1E	   [    r   r   c                        e Zd Z	 	 	 	 	 ddededededeej        j                 de	e
ed	f                  d
df fdZ xZS )PluginRequirementNFr[   rz   re   r`   pluginr   .r   c                 V    t                                          ||||||           d S )N)r[   rz   re   r`   r   r   )rL   rM   )r   r[   rz   re   r`   r   r   rS   s          r   rM   zPluginRequirement.__init__:  sB     	# 	 	
 	
 	
 	
 	
r   r   )r   r   r   r   r   r	   r   pluginsPluginInterfacer   r   r(   rM   rh   ri   s   @r   r   r   9  s          ;?-1
 

 
 	

 
 Z'78
 %S/*
 

 
 
 
 
 
 
 
 
 
r   r   c                       e Zd Z	 	 	 	 ddedededeee                  def
 fdZed	ee	j
        j                 fd
            Zddded	eee	j
        j        f         fdZde	j        j        ded	dfdZdddeded	e	j
        j        fdZ xZS )ModuleRequirementNFr[   rz   re   r   r`   c                     t                                          ||||           |                     t          d|                     |                     t	          d                     d S )Nr   
layer_name)r[   r   symbol_table_namer[   )rL   rM   r   r   r   )r   r[   rz   re   r   r`   rS   s         r   rM   zModuleRequirement.__init__Q  s     	;( 	 	
 	
 	
 	'\WWW	
 	
 	
 	39LMMMNNNNNr   r   c                 $    t          d          gS )Noffsetr   r{   r|   s    r   r}   z"ModuleRequirement.get_requirementsa  s     )))
 	
r   r   z#interfaces.context.ContextInterfacer   c                    t           j                            || j                  }|                     ||d          }t          |t                    r7||j        vr,t          	                    t          j        d|            || iS i S |It          	                    t          j        d                    t          |                               || iS i }| j        D ]:}| j        |                             ||          }|r|                    |           ;|s,t          	                    t          j        d|            || i}|                     |t           j                            |                     |S )z)Validate that the value is a valid moduleNz*IndexError - Module not found in context: z=TypeError - Module Requirement only accepts string labels: {}r   )r   r    rZ   r[   r\   rV   r   modulesr]   r^   r   r_   r   rc   _requirementsr   updater   r   )r   r   r   rf   r   r   req_unsatisfieds          r   r   zModuleRequirement.unsatisfiedg  s    !.88diPP!!';==eS!! 	GO++

(HHH   $T**IJJ$OVVKK     &&( 	/ 	/F"08DD O  /o... 	)JJ$H;HH   "4(F 	Wj&>&J&J;&W&WXXXr   c                    t           j                            | j                  | j        }d}|j        v r%| j        t          |          z   }|dz  }|j        v %|d}t          fd| j                                        D                       rdS | 	                    |          }|4t          |t           j        j                  r                    |           dS )zJConstructs the appropriate layer and adds it based on the class parameter.r   r1   r   c                 J    g | ]}|j         	|                               S r"   r   r   s     r   rY   z/ModuleRequirement.construct.<locals>.<listcomp>  r   r   N)r   r    rZ   r[   r   r   rp   r   r   r   rV   r   ModuleInterface
add_moduler   s    ``    r   r   zModuleRequirement.construct  s    !.88diPP ygo%%9s7||+DqLG go%% #;MM    "/6688  
 
 	 4##G[$???z#z/A/QRR?s### tr   r   rf   c                 @    |j         |                                         S r   )r   r   r   s       r   r   z%ModuleRequirement.build_configuration  s    
 u%99;;;r   )NFNF)r   r   r   r   r   r   r   rM   rB   r   r    r!   r}   r   r   r   r   r   r   r   r   rh   ri   s   @r   r   r   M  sp         -1O OO O 	O
  S	*O O O O O O O  
j&>&S!T 
 
 
 [

*<*KN*	c:+@@	A* * * *X!):IL	   ><<<AD<MP<		!	2< < < < < < < <r   r   )*r   r   loggingr8   typingr   r   r   r   r   r   r	   urllibr
   r   volatility3.frameworkr   r   	getLoggerr   r]   r    r!   r   SimpleTypeRequirementr$   r&   r+   r-   rD   rG   rk    ConfigurableRequirementInterfaceABCMetaru   r   !ConstructableRequirementInterfacer   r   r   r   r   r"   r   r   <module>r      s    


  				 C C C C C C C C C C C C C C C C C C ! ! ! ! ! ! ! ! 7 7 7 7 7 7 7 7		8	$	$
? 
? 
? 
? 
?z/D 
? 
? 
?< < < < <1G < < <( ( ( ( (Z-C ( ( (( ( ( ( (
0F ( ( (1 1 1 1 1& 1 1 1>* * * * *z/E * * *O O O O Oj.C O O Od    
0E   @A A A A A=kA A A AH
 
 
 
 
1 
 
 
D~; ~; ~; ~; ~;>=~; ~; ~;BWA WA WA WA WA>=WA WA WAt( ( ( ( (1F ( ( (V
 
 
 
 
* 
 
 
(j< j< j< j< j<>=j< j< j< j< j<r   