
     hrZ                        d Z ddlZddlZddlZddl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 ddlmZ dd	lmZ dd
lmZmZ ddlmZ d Z eddg           	 ddlZn# e$ rZ e
dez            dZ[ww xY w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& ddl'm(Z( ddl)m*Z*m+Z+ ddl,m-Z- ed             Z. G d d          Z/ G d de          Z0 G d d          Z1 G d  d!          Z2 G d" d#          Z3dS )$ze
Oracle database backend for Django.

Requires cx_Oracle: https://oracle.github.io/python-cx_Oracle/
    N)contextmanager)settings)ImproperlyConfigured)IntegrityError)BaseDatabaseWrapper)debug_transaction)async_unsafe)force_bytes	force_str)cached_propertyc                 r   t          j                                                                        d          r_	 dd l}n$# t
          $ r}t          d|z            d }~ww xY w|                    d          }| D ]\  }}|                    ||           d S t          j
                            |            d S )NCYGWINr   z_Error loading ctypes: %s; the Oracle backend requires ctypes to operate correctly under Cygwin.kernel32)platformsystemupper
startswithctypesImportErrorr   CDLLSetEnvironmentVariableAosenvironupdate)r   r   er   namevalues         ]/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django/db/backends/oracle/base.py_setup_environmentr      s       ++H55 #	MMMM 	 	 	&2456  	 ;;z**" 	: 	:KD%,,T59999	: 	: 	
'"""""s   ? 
A 	AA )NLS_LANGz	.AL32UTF8)ORA_NCHAR_LITERAL_REPLACETRUEz"Error loading cx_Oracle module: %s   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)Oracle_datetimedsn)DatabaseValidationc               #     K   	 d V  d S # t           j        $ rk} | j        d         }t          |d          rHt          |d          r8|j        dk    r-d|j        v s	d|j        v rt          t          | j                    d } ~ ww xY w)Nr   codemessagei+  z	ORA-02291z	ORA-00001)DatabaseDatabaseErrorargshasattrr.   r/   r   tuple)r   xs     r   wrap_oracle_errorsr6   D   s      !    F1IAv	19%%	1 $	))[AI-E-E %--00's   
 BA&A??Bc                       e Zd ZddZdS )!_UninitializedOperatorsDescriptorNc                     |t          d          |                                                                 |j        d         S )Nz*operators not available as class attribute	operators)AttributeErrorcursorclose__dict__)selfinstanceclss      r   __get__z)_UninitializedOperatorsDescriptor.__get___   sC      !MNNN!!! --    N)__name__
__module____qualname__rB    rC   r   r8   r8   ^   s(        . . . . . .rC   r8   c                   J    e Zd ZdZdZi ddddddd	d
dddddddddddddddddddddddd d!d"dddddd#dddd$d%d&Zd'd(d)d)d)d*Zd+Z e            Z	d,d-d.d/d0d1d2d3d.d.d/d/d4Z
i e
d5d6d5d5d6d6d7Zd8Zd9d:d;d<d=d>d?Zd@ e                                D             ZdA e                                D             ZeZeZeZeZeZeZeZeZ fdBZ dC Z!dD Z"e#dE             Z$ fdFZ%e#dPdH            Z&dI Z'dJ Z(dK Z)dPdLZ*dM Z+e,dN             Z-e,dO             Z. xZ/S )QDatabaseWrapperoracleOracle	AutoFieldz3NUMBER(11) GENERATED BY DEFAULT ON NULL AS IDENTITYBigAutoFieldz3NUMBER(19) GENERATED BY DEFAULT ON NULL AS IDENTITYBinaryFieldBLOBBooleanFieldz	NUMBER(1)	CharFieldzNVARCHAR2(%(max_length)s)	DateFieldDATEDateTimeField	TIMESTAMPDecimalFieldz*NUMBER(%(max_digits)s, %(decimal_places)s)DurationFieldzINTERVAL DAY(9) TO SECOND(6)	FileFieldFilePathField
FloatFieldzDOUBLE PRECISIONIntegerFieldz
NUMBER(11)	JSONFieldNCLOBBigIntegerFieldz
NUMBER(19)IPAddressFieldzVARCHAR2(15)GenericIPAddressFieldzVARCHAR2(39)z2NUMBER(5) GENERATED BY DEFAULT ON NULL AS IDENTITYzVARCHAR2(%(max_length)s)zVARCHAR2(32))OneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	SlugFieldSmallAutoFieldSmallIntegerField	TextField	TimeFieldURLField	UUIDFieldz%(qn_column)s IN (0,1)z%(qn_column)s IS JSONz%(qn_column)s >= 0)rQ   r]   rc   rd   re   )clobnclobblobz= %sz= UPPER(%s)zFLIKE TRANSLATE(%s USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS)zMLIKE UPPER(TRANSLATE(%s USING NCHAR_CS)) ESCAPE TRANSLATE('\' USING NCHAR_CS)z> %sz>= %sz< %sz<= %s)exactiexactcontains	icontainsgtgteltlter   endswithistartswith	iendswithzLIKEC %s ESCAPE '\'zLIKEC UPPER(%s) ESCAPE '\')rr   rs   r   rx   ry   rz   z@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')z'%%' || {} || '%%'z'%%' || UPPER({}) || '%%'z
{} || '%%'zUPPER({}) || '%%'z
'%%' || {}z'%%' || UPPER({}))rr   rs   r   ry   rx   rz   c                 &    i | ]\  }}|d |z   dz   S )zLIKE TRANSLATE( z5 USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS)rH   .0kvs      r   
<dictcomp>zDatabaseWrapper.<dictcomp>   s@        Aq 	
! %1 1  rC   c                 &    i | ]\  }}|d |z   dz   S )zLIKEC z ESCAPE '\'rH   r|   s      r   r   zDatabaseWrapper.<dictcomp>   s4       -1Q8a<.(  rC   c                      t                      j        |i | | j        d                             dd          }|| j        _        d S )NOPTIONSuse_returning_intoT)super__init__settings_dictgetfeaturescan_return_columns_from_insert)r?   r2   kwargsr   	__class__s       r   r   zDatabaseWrapper.__init__   sU    $)&)))!/	:>> $
 
 8J444rC   c                     | j         S rD   )oracle_versionr?   s    r   get_database_versionz$DatabaseWrapper.get_database_version   s    ""rC   c                 R    | j         d                                         }d|v r|d= |S )Nr   r   )r   copyr?   conn_paramss     r   get_connection_paramsz%DatabaseWrapper.get_connection_params   s5    (388::;..01rC   c                 |    t          j        d| j        d         | j        d         t          | j                  d|S )NUSERPASSWORD)userpasswordr+   rH   )r0   connectr   r+   r   s     r   get_new_connectionz"DatabaseWrapper.get_new_connection   sO     
#F+'
3D&''
 
 	
 
 	
rC   c                    t                                                       |                                 }|                    d           |                    dt          j        rdndz              |                                 d| j        vr|                                 }	 |                    d| j        d         z  dg           | j        | _	        | j
        | _        n-# t          j        $ r | j        | _	        | j        | _        Y nw xY w|                                 d	| j        _        |                                 s|                                  d S d S )
Nz+ALTER SESSION SET NLS_TERRITORY = 'AMERICA'zmALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'z TIME_ZONE = 'UTC' r:   z!SELECT 1 FROM DUAL WHERE DUMMY %srr   X   )r   init_connection_statecreate_cursorexecuter   USE_TZr=   r>   _standard_operatorsr:   _standard_pattern_opspattern_opsr0   r1   _likec_operators_likec_pattern_ops
connectionstmtcachesizeget_autocommitcommit)r?   r<   r   s     r   r   z%DatabaseWrapper.init_connection_state  sr   %%'''##%%
 	DEEE
 	A'/>##B@	
 	
 	

 	dm++ ''))F>7.z:;E   "&!9#'#=   ) ; ; ;!%!6#'#:   ; LLNNN(*%""$$ 	KKMMMMM	 	s   #%C! !'D
DNc                 *    t          | j                  S rD   )FormatStylePlaceholderCursorr   )r?   r   s     r   r   zDatabaseWrapper.create_cursor0  s    +DO<<<rC   c                     | j         vt          | d          5  t                      5  | j                                         cd d d            cd d d            S # 1 swxY w Y   d d d            d S # 1 swxY w Y   d S d S )NCOMMIT)r   r   r6   r   r   s    r   _commitzDatabaseWrapper._commit4  s    ?&"422 0 04F4H4H 0 0--//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 '&s4   A1A A1A	A1 A	!A11A58A5c                     | j         r:| j                            d| j                            |          z  dd           d S d S )Nz-- RELEASE SAVEPOINT %s (faked)z0.000)sqltime)queries_loggedqueries_logappendops
quote_name)r?   sids     r   _savepoint_commitz!DatabaseWrapper._savepoint_commit;  sb     	##<tx?R?RSV?W?WW#     	 	rC   c                 ^    | j         5  || j        _        d d d            d S # 1 swxY w Y   d S rD   )wrap_database_errorsr   
autocommit)r?   r   s     r   _set_autocommitzDatabaseWrapper._set_autocommitD  sy    & 	4 	4)3DO&	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   "&&c                     |                                  5 }|                    d           |                    d           ddd           dS # 1 swxY w Y   dS )zl
        Check constraints by setting them to immediate. Return them to deferred
        afterward.
        zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)r<   r   )r?   table_namesr<   s      r   check_constraintsz!DatabaseWrapper.check_constraintsH  s    
 [[]] 	;fNN:;;;NN9:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s   +AAAc                 f    	 | j                                          dS # t          j        $ r Y dS w xY w)NTF)r   pingr0   Errorr   s    r   	is_usablezDatabaseWrapper.is_usableQ  sH    	O  """ 4 ~ 	 	 	55	    00c                 n    t          d t          j                            d          D                       S )Nc              3   4   K   | ]}t          |          V  d S rD   intr}   r5   s     r   	<genexpr>z4DatabaseWrapper.cx_oracle_version.<locals>.<genexpr>[  s(      AASVVAAAAAArC   .)r4   r0   versionsplitr   s    r   cx_oracle_versionz!DatabaseWrapper.cx_oracle_versionY  s0    AAX%5%;%;C%@%@AAAAAArC   c                     |                                  5  t          d | j        j                            d          D                       cd d d            S # 1 swxY w Y   d S )Nc              3   4   K   | ]}t          |          V  d S rD   r   r   s     r   r   z1DatabaseWrapper.oracle_version.<locals>.<genexpr>`  s(      LLAQLLLLLLrC   r   )temporary_connectionr4   r   r   r   r   s    r   r   zDatabaseWrapper.oracle_version]  s    &&(( 	M 	MLL)@)F)Fs)K)KLLLLL	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	Ms   6AAArD   )0rE   rF   rG   vendordisplay_name
data_typesdata_type_check_constraints_limited_data_typesr8   r:   r   r   pattern_esc_pattern_opsitemsr   r   r0   r)   SchemaEditorClassr$   client_classr%   creation_classr&   features_classr'   introspection_classr(   	ops_classr,   validation_classr   r   r   r	   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   rJ   rJ   j   s       FLJM 	v 		
 	0 	V 	 	D 	7 	0 	4 	( 	 	W 	<  	.!" 	 #$ &#/ ,%10N) .#9  J> 1,#7 4%9# # 41133I U4 U V443 <
*2,*42  $ VK(0"* ( L  !&&((  
 5A5G5G5I5I   H,!L%N%N/"I)J J J J J# # #   
 
 \
) ) ) ) )V = = = \=0 0 0  4 4 4; ; ; ;   B B _B M M _M M M M MrC   rJ   c                       e Zd ZdZddZdS )OracleParama  
    Wrapper object for formatting parameters for Oracle. If the string
    representation of the value is large enough (greater than 4000 characters)
    the input size needs to be set as CLOB. Alternatively, if the parameter
    has an `input_size` attribute, then the value of the `input_size` attribute
    will be used instead. Otherwise, no input size will be set for the
    parameter when executing the query.
    Fc                    t           j        rCt          |t          j                  r)t          |t                    st	          j        |          }d}|du rd}n|du rd}t          |d          r|                    |          | _        nt          |t          j
        t          j        f          r|| _        nXt          ||j        |          | _        t          | j        t                    r#t          t          ||j        |                    }t          |d          r|j        | _        d S |dk    rt          j        | _        d S t          |t          j                  rt          j        | _        d S d | _        d S )Nr   Tr#   Fbind_parameter
input_sizei  )r   r   
isinstancedatetimer*   from_datetimer3   r   r
   r0   Binary	timedeltar   charsetstrlenr   CLOBrV   )r?   paramr<   strings_onlystring_sizes        r   r   zOracleParam.__init__m  sn    ? 	9uh/00	9uo66	9 $1%88ED==EEe^^E5*++ 
	T$33F;;D1CDEE 	T$D  )MMD$*C00 T!+eV^\"R"RSS5,'' 		##.DOOO4&mDOOOx011 	#&0DOOO"DOOOrC   NF)rE   rF   rG   __doc__r   rH   rC   r   r   r   c  s2         ## ## ## ## ## ##rC   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )VariableWrappera	  
    An adapter class for cursor variables that prevents the wrapped object
    from being converted into a string when used to instantiate an OracleParam.
    This can be used generally for any other object that should be passed into
    Cursor.execute as-is.
    c                     || _         d S rD   var)r?   r   s     r   r   zVariableWrapper.__init__  s    rC   c                     | j         S rD   r   )r?   r<   s     r   r   zVariableWrapper.bind_parameter  s	    xrC   c                 ,    t          | j        |          S rD   )getattrr   )r?   keys     r   __getattr__zVariableWrapper.__getattr__  s    tx%%%rC   c                 V    |dk    r|| j         |<   d S t          | j        ||           d S )Nr   )r>   setattrr   )r?   r  r   s      r   __setattr__zVariableWrapper.__setattr__  s7    %<<!&DM#DHc5)))))rC   N)rE   rF   rG   r   r   r   r  r  rH   rC   r   r   r     sZ             & & &* * * * *rC   r   c                       e Zd ZdZdZd Zed             Zed             Zed             Z	d Z
d Zd	 ZddZddZddZd Zd Zd Zd Zd ZdS )r   z
    Django uses "format" (e.g. '%s') style placeholders, but Oracle uses ":var"
    style. This fixes it -- but note that if you want to use a literal "%s" in
    a query, you'll need to use "%%s".
    zutf-8c                 Z    |                                 | _         | j        | j         _        d S rD   )r<   _output_type_handleroutputtypehandler)r?   r   s     r   r   z%FormatStylePlaceholderCursor.__init__  s(     ''))(,(A%%%rC   c                 P    d| v rt          j        |           nt          |           S )Nr   )decimalDecimalr   )r   s    r   _output_number_converterz5FormatStylePlaceholderCursor._output_number_converter  s%    ),wu%%%3u::ErC   c                     |dk    rt           S t          j        |           t          j        d                              |           fdS )Nr   )precr#   c                 V    t          j        |                                         S )N)context)r  r  quantize)r   r  quantize_values    r   <lambda>zEFormatStylePlaceholderCursor._get_decimal_converter.<locals>.<lambda>  s$    ++44^W4UU rC   )r   r  Contextr  scaleb)	precisionscaler  r  s     @@r   _get_decimal_converterz3FormatStylePlaceholderCursor._get_decimal_converter  sU    A::J/y111 ++22E6::UUUUUUrC   c                    |t           j        k    rw|dk    r|dk    rt          j        }n6t          }n.|dk    rt                              ||          }nt          j        }|                     t           j        d| j        |          S dS )zx
        Called for each db column fetched from cursors. Return numbers as the
        appropriate Python type.
        ir      )size	arraysizeoutconverterN)	r0   NUMBERr   r  floatr  r   STRINGr  )r<   r   defaultTypelengthr  r  r  s          r   r  z1FormatStylePlaceholderCursor._output_type_handler  s     (/))}}>> $@#XLL $)LLQ  <RRu     <T:: *)	    - *)rC   c                      	  fd|                                 D             S # t          $ r t           fd|D                       cY S w xY w)Nc                 :    i | ]\  }}|t          |d           S )Tr   )r}   r~   r   r?   s      r   r   z?FormatStylePlaceholderCursor._format_params.<locals>.<dictcomp>  s+    MMMdaA{1dD11MMMrC   c              3   :   K   | ]}t          |d           V  dS )TNr&  r}   pr?   s     r   r   z>FormatStylePlaceholderCursor._format_params.<locals>.<genexpr>  s/      DDQd33DDDDDDrC   )r   r;   r4   r?   paramss   ` r   _format_paramsz+FormatStylePlaceholderCursor._format_params  ss    	EMMMMfllnnMMMM 	E 	E 	EDDDDVDDDDDDDD	Es   # %A
Ac                 `   t          |d         d          rEi }|D ]-}|                                D ]\  }}|j        r
|j        ||<   .|r | j        di | d S d S d gt	          |d                   z  }|D ](}t          |          D ]\  }}|j        r
|j        ||<   )|r | j        |  d S d S )Nr   keysrH   )r3   r   r   setinputsizesr   	enumerate)r?   params_listsizesr+  r~   r   is          r   _guess_input_sizesz/FormatStylePlaceholderCursor._guess_input_sizes  s"   ;q>6** 	+E% 4 4 & 4 4HAu' 4#(#3a4  ,""++U+++++, , FSQ000E% 4 4 )& 1 1 4 4HAu' 4#(#3a4  +""E****+ +rC   c                 v    t          |d          rd |                                D             S d |D             S )Nr   c                 $    i | ]\  }}||j         S rH   r
   r|   s      r   r   zAFormatStylePlaceholderCursor._param_generator.<locals>.<dictcomp>  s     @@@AAq}@@@rC   c                     g | ]	}|j         
S rH   r7  )r}   r)  s     r   
<listcomp>zAFormatStylePlaceholderCursor._param_generator.<locals>.<listcomp>  s    222aAM222rC   )r3   r   r*  s     r   _param_generatorz-FormatStylePlaceholderCursor._param_generator  sD    67## 	3@@@@@@2262222rC   Fc                 @   |                     d          s|                     d          r
|d d         }|g }nt          |d          rd |D             }||z  }n|rr|rpd t          t                              |                    D             fd|D             }d                                 D             }|t          |          z  }n8d	 t          t          |                    D             }|t          |          z  }|| 	                    |          fS )
N;/r.  c                     i | ]}|d |z  	S )z:%srH   )r}   r~   s     r   r   z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<dictcomp>  s    111QAuqy111rC   c                      i | ]\  }}|d |z  S z:arg%drH   )r}   r3  r   s      r   r   z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<dictcomp>  s/       (05x!|  rC   c                      g | ]
}|         S rH   rH   )r}   r   params_dicts     r   r9  z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<listcomp>   s    ;;;5K&;;;rC   c                     i | ]\  }}||	S rH   rH   )r}   r  r   s      r   r   z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<dictcomp>!  s    GGGZS%eSGGGrC   c                     g | ]}d |z  S rA  rH   )r}   r3  s     r   r9  z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<listcomp>%  s    ???qX\???rC   )
rx   r3   r0  dictfromkeysr   r4   ranger   r,  )r?   queryr+  unify_by_valuesr2   rC  s        @r   _fix_for_paramsz,FormatStylePlaceholderCursor._fix_for_params  sO   
 >># 	%.."5"5 	#2#JE>FFVV$$ 	!11&111DTMEE 	! 	! 4=dmmF>S>S4T4T  K <;;;F;;;DGG;3D3D3F3FGGGFU4[[ EE @?E#f++,>,>???DU4[[ Ed))&1111rC   Nc                    |                      ||d          \  }}|                     |g           t                      5  | j                            ||                     |                    cd d d            S # 1 swxY w Y   d S )NT)rJ  )rK  r4  r6   r<   r   r:  )r?   rI  r+  s      r   r   z$FormatStylePlaceholderCursor.execute)  s    ,,UFD,QQv)))!! 	M 	M;&&ud.C.CF.K.KLL	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	Ms    .A;;A?A?c                 b    |sd S t          |          }                     |t          |                    \  }}|g fd|D             z   }                     |           t	                      5   j                            | fd|D                       cd d d            S # 1 swxY w Y   d S )Nc                 :    g | ]}                     |          S rH   )r,  r(  s     r   r9  z<FormatStylePlaceholderCursor.executemany.<locals>.<listcomp>8  s'    $Q$Q$QT%8%8%;%;$Q$Q$QrC   c                 :    g | ]}                     |          S rH   )r:  r(  s     r   r9  z<FormatStylePlaceholderCursor.executemany.<locals>.<listcomp><  s'    DDDQ--a00DDDrC   )iterrK  nextr4  r6   r<   executemany)r?   rI  r+  params_iterfirstparams	formatteds   `     r   rR  z(FormatStylePlaceholderCursor.executemany/  s    	46ll!11%k9J9JKK{ !M$Q$Q$Q$Q[$Q$Q$QQ		***!! 	 	;**DDDD)DDD 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   0'B$$B(+B(c                 f    	 | j                                          d S # t          j        $ r Y d S w xY wrD   )r<   r=   r0   InterfaceErrorr   s    r   r=   z"FormatStylePlaceholderCursor.close?  sF    	K& 	 	 	DD	r   c                 :    t           | j        j        |           S rD   )r   r<   r   r?   r2   s     r   r   z FormatStylePlaceholderCursor.varF  s    t{5666rC   c                 :    t           | j        j        |           S rD   )r   r<   arrayvarrY  s     r   r[  z%FormatStylePlaceholderCursor.arrayvarI  s    3t{3T:;;;rC   c                 ,    t          | j        |          S rD   )r   r<   )r?   attrs     r   r  z(FormatStylePlaceholderCursor.__getattr__L  s    t{D)))rC   c                 *    t          | j                  S rD   )rP  r<   r   s    r   __iter__z%FormatStylePlaceholderCursor.__iter__O  s    DK   rC   r   rD   )rE   rF   rG   r   r   r   staticmethodr  r  r  r,  r4  r:  rK  r   rR  r=   r   r[  r  r_  rH   rC   r   r   r     sK         GB B B F F \F V V \V     \ DE E E+ + +(3 3 32 2 2 2BM M M M      7 7 7< < <* * *! ! ! ! !rC   r   )4r   r   r  r   r   
contextlibr   django.confr   django.core.exceptionsr   	django.dbr   django.db.backends.base.baser   django.db.backends.utilsr   django.utils.asyncior	   django.utils.encodingr
   r   django.utils.functionalr   r   	cx_Oracler0   r   r   clientr$   creationr%   r   r&   introspectionr'   
operationsr(   schemar)   utilsr*   r+   
validationr,   r6   r8   rJ   r   r   r   rH   rC   r   <module>rr     s   
   				  % % % % % %             7 7 7 7 7 7 $ $ $ $ $ $ < < < < < < 6 6 6 6 6 6 - - - - - - 8 8 8 8 8 8 8 8 3 3 3 3 3 3# # #&   	" 	.  I      I I I

CaG
H
HHI # " " " " " & & & & & & & & & & & & 0 0 0 0 0 0 * * * * * * ( ( ( ( ( ( ' ' ' ' ' ' ' ' * * * * * *   2	. 	. 	. 	. 	. 	. 	. 	.vM vM vM vM vM) vM vM vMr-# -# -# -# -# -# -# -#`* * * * * * * *0e! e! e! e! e! e! e! e! e! e!s   A! !A9&A44A9