
    *ha                    n   % S r SSKJr  SSKrSSKrSSKJrJr  SSKJ	r	  SSK
JrJrJrJrJrJrJr  \(       a  SSKJrJr  SS	KJr  S
SKJr  SSKJrJr  SSKJr  SSKJr   SSKJ r   SSK!J"r"  SSK#J$r$  SSKJ)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4  \Rj                  " S5      r6S\7S'   S(S jr8S)S jr9S*S jr: S+       S,S jjr;S-S jr<S-S jr=S-S jr> " S S \5      r? " S! S"\?5      r@ " S# S$\?5      rA S+     S.S% jjrB " S& S'5      rCg! \% a!  r&\RN                  RQ                  S5      \&eSr&C&ff = f)/z1MySQL instrumentation supporting mysql-connector.    )annotationsN)ABCabstractmethod)nullcontext)TYPE_CHECKINGAnyCallable
CollectionDictOptionalUnion   )MySQLConnectionAbstractMySQLCursorAbstract)PooledMySQLConnection   )	connector)CNX_POOL_ARGSDEFAULT_CONFIGURATION)logger)VERSION_TEXT)trace)TracerProvider)SpanAttributeszGOpenTelemetry installation not found. You must install the API and SDK.   )CONNECTION_SPAN_NAME	DB_SYSTEMDEFAULT_THREAD_IDDEFAULT_THREAD_NAMEFIRST_SUPPORTED_VERSIONNET_SOCK_FAMILYNET_SOCK_HOST_ADDRNET_SOCK_HOST_PORTNET_SOCK_PEER_ADDRNET_SOCK_PEER_PORTOPTION_CNX_SPANOPTION_CNX_TRACERz
^/\*.*?\*/z
re.Patternleading_comment_removerc                    U (       a  U R                  5       (       a  U(       d  gU R                  [        R                  " [        R                  R
                  5      5        U R                  U5        g)zRecords an exeception event.N)is_recording
set_statusr   Status
StatusCodeERRORrecord_exception)spanexcs     e/var/www/auris/envauris/lib/python3.13/site-packages/mysql/connector/opentelemetry/instrumentation.pyrecord_exception_eventr3   X   sG    t((**#OOELL!1!1!7!789#    c                ^    U (       a  U R                  5       (       d  gU R                  5         g)z
Ends span.N)r*   end)r0   s    r2   end_spanr7   a   s    t((**HHJr4   c                    U (       a<  [        U [        5      (       a'  [        R                  SU 5      R	                  5       S   $ g)z&Parse query to extract operation name. r   )
isinstancestrr(   subsplit)	operations    r2   get_operation_namer?   i   s5    Z	3//&**2y9??A!DDr4   c                   U(       a  UR                  5       (       d  gUc  0 nU (       a  U R                  (       + OSU;  n[        R                  [        [        R                  U(       a  SOS[
        U(       a  SOS0nU(       Ga!  U (       a  U R                  OUR                  S[        S   5      U[        R                  '   U (       a  U R                  OUR                  S[        S   5      U[        R                  '   [        U S	5      (       a  U R                  (       a   U R                  R                  R                  5       u  U[         '   nU R                  R                  R#                  5       u  U[$        '   U[&        '   U[        R                     U:w  a  XT[(        '   OzOyU (       a  U R                  OUR                  S5      U[         '   [        U S	5      (       a=  U R                  (       a,   U R                  R                  R#                  5       U[$        '   UR1                  U5        g! [*         a!  n[,        R.                  " S
U5         SnAN8SnAff = f! [*         a!  n[,        R.                  " S
U5         SnANfSnAff = f)a  Defines connection span attributes. If `cnx` is None then we use `cnx_kwargs`
to get basic net information. Basic net attributes are defined such as:

* DB_SYSTEM
* NET_TRANSPORT
* NET_SOCK_FAMILY

Socket-level attributes [*] are also defined [**].

[*]: Socket-level attributes identify peer and host that are directly connected to
each other. Since instrumentations may have limited knowledge on network
information, instrumentations SHOULD populate such attributes to the best of
their knowledge when populate them at all.

[**]: `CMySQLConnection` connections have no access to socket-level
details so socket-level attributes aren't included. `MySQLConnection`
connections, on the other hand, do include socket-level attributes.

References:
    [1]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/            specification/trace/semantic_conventions/span-general.md
Nunix_socketip_tcpinprocinetunixhostport_socketzConnection socket is down %s)r*   _unix_socketr   r   NET_TRANSPORTr!   _hostgetr   NET_PEER_NAME_portNET_PEER_PORThasattrrH   sockgetpeernamer$   getsocknamer"   r#   r%   	Exceptionr   warningset_attributes)cnxcnx_span
cnx_kwargsis_tcpattrssock_peer_portsock_errs          r2   set_connection_span_attrsr^   q   s   8 80022
%(!!!m:.MF 	  )$$&hh6vE CII*..9Nv9V"W 	n**+ CII*..9Nv9V"W 	n**+ 3	""s{{? KK$$002,-" KK$$002,-,-
 556.H 1?,-
 !$C)F 	 ! 3	""s{{I,/KK,<,<,H,H,J() E")  I=xHHI"  I=xHHIs1   #A#H2 5+I  2
I<II 
J*JJc                   ^  SU 4S jjnU$ )zAAttach the connection span while executing the connection method.c                  > U R                   (       a>  U R                   R                  5       (       a  [        R                  " U R                   SS9O	[	        5          T" U /UQ70 UD6sSSS5        $ ! , (       d  f       g= f)z#Connection span attacher decorator.Fend_on_exitN)_spanr*   r   use_spanr   )rW   argskwargsmethods      r2   wrapper'with_cnx_span_attached.<locals>.wrapper   sg     YY3991133 ^^II5
9DG #///G G Gs   A11
A?)rW   'MySQLConnectionAbstract're   r   rf   r   returnr    rg   rh   s   ` r2   with_cnx_span_attachedrn      s    0 Nr4   c                   ^  SU 4S jjnU$ )z:Create a query span while executing the connection method.c                  > [         R                  " STR                  5        [        R                  [        [        R
                  U R                  [        R                  [        [        R                  [        SU R                  5       0nU R                  (       a  U R                  R                  5       (       ay  U R                  R                  TR                  R!                  5       ["        R$                  R&                  ["        R(                  " U R                  R+                  5       5      /US9O	[-        5          T" U /UQ70 UD6sSSS5        $ ! , (       d  f       g= f)Query span creator decorator.z%Creating query span for connection.%sconnection_typenamekindlinks
attributesN)r   info__name__r   r   DB_USER_user	THREAD_IDr   THREAD_NAMEr   get_wrapped_classrc   r*   _tracerstart_as_current_spanupperr   SpanKindCLIENTLinkget_span_contextr   )rW   re   rf   query_span_attributesrg   s       r2   rh   $with_cnx_query_span.<locals>.wrapper   s   ;V__M $$i""CII$$&7&&(;s446'
 YY3991133 [[..&&(&&::cii88:;<,	 / 

 :EG #///G G Gs   >E
E")rW   TracedMySQLConnectionre   r   rf   r   rk   r   rl   rm   s   ` r2   with_cnx_query_spanr      s    0( Nr4   c                   ^  SU 4S jjnU$ )z6Create a query span while executing the cursor method.c                  > [         R                  " STR                  5        [        U R                  S5      (       a  [        U R                  S5      O[        U R                  S5      n[        R                  [        [        R                  UR                  [        R                  [        [        R                  [        SU R                  5       0nU R                  R!                  [#        US   5      =(       d    S[$        R&                  R(                  U R*                  /US9   T" U /UQ70 UD6sSSS5        $ ! , (       d  f       g= f)	rq   z!Creating query span for cursor.%s_connection_cnxcursor_typer   zSQL statementrs   N)r   rx   ry   rP   _wrappedgetattrr   r   rz   r{   r|   r   r}   r   r~   r   r   r?   r   r   r   _connection_span_link)curre   rf   
connectionr   rg   s        r2   rh   'with_cursor_query_span.<locals>.wrapper   s   7I s||]33 CLL-0v. 	 $$i""J$4$4$$&7&&(;3002'
 [[..#DG,?&&,,-,	 / 
 #///
 
 
s   &D<<
E
)r   TracedMySQLCursorre   r   rf   r   rk   r   rl   rm   s   ` r2   with_cursor_query_spanr      s    04 Nr4   c                  l   ^  \ rS rSrSr\S
S j5       rSS jrSU 4S jjrSS jr	SS jr
SS jrS	rU =r$ )BaseMySQLTraceri  z<Base class that provides basic object wrapper functionality.c                    g)z"Must be implemented by subclasses.Nrl   selfs    r2   __init__BaseMySQLTracer.__init__  s    r4   c                b    XR                   ;   a  [        X5      $ [        U R                  U5      $ )zGets an attribute.

Attributes defined in the wrapper object have higher precedence
than those wrapped object equivalent. Attributes not found in
the wrapper are then searched in the wrapped object.
)__dict__r   r   )r   attrs     r2   __getattr__BaseMySQLTracer.__getattr__  s*     == 4&&t}}d++r4   c                   > SU R                   ;  a  X R                   S'   g XR                   ;   d  US:X  a  [        TU ]	  X5        g U R                  R                  X5        g )Nr   
autocommit)r   super__setattr__r   )r   rt   value	__class__s      r2   r   BaseMySQLTracer.__setattr__!  sQ    T]]*(-MM*%== DL$8G,!!$.r4   c                :    U R                   R                  5         U $ )Magic method.)r   	__enter__r   s    r2   r   BaseMySQLTracer.__enter__-  s    !r4   c                <    U R                   R                  " U0 UD6  g)r   N)r   __exit__r   re   rf   s      r2   r   BaseMySQLTracer.__exit__2  s    //r4   c                B    U R                   R                  R                  $ )zGets the wrapped class name.)r   r   ry   r   s    r2   r~   !BaseMySQLTracer.get_wrapped_class6  s    }}&&///r4   rl   )rk   None)r   r;   rk   r   )rt   r;   r   r   rk   r   )rk   r   )re   r   rf   r   rk   r   rk   r;   )ry   
__module____qualname____firstlineno____doc__r   r   r   r   r   r   r~   __static_attributes____classcell__)r   s   @r2   r   r     s6    F1 1,
/
00 0r4   r   c                  j    \ rS rSrSr      S	S jr\S
S j5       r\S
S j5       r\S
S j5       r	Sr
g)r   i;  z;Wrapper class for a `MySQLCursor` or `CMySQLCursor` object.c                n    Xl         X l        [        R                  " UR	                  5       5      U l        gzConstructor.N)r   r   r   r   r   r   )r   wrappedtracerconnection_spans       r2   r   TracedMySQLCursor.__init__>  s+     07%+16,,.2
"r4   c                :    U R                   R                  " U0 UD6$ Instrument method.)r   executer   s      r2   r   TracedMySQLCursor.executeK  s     }}$$d5f55r4   c                :    U R                   R                  " U0 UD6$ r   )r   executemanyr   s      r2   r   TracedMySQLCursor.executemanyP       }}(($9&99r4   c                :    U R                   R                  " U0 UD6$ r   )r   callprocr   s      r2   r   TracedMySQLCursor.callprocU       }}%%t6v66r4   )r   r   r   N)r   z'MySQLCursorAbstract'r   ztrace.Tracerr   
trace.Spanre   r   rf   r   rk   r   )ry   r   r   r   r   r   r   r   r   r   r   rl   r4   r2   r   r   ;  sb    E
&
 
 $	
 6 6 : : 7 7r4   r   c                     \ rS rSrSrS$S jrS%S jr\S&S j5       r\S&S j5       r	\S&S j5       r
\S&S j5       r\S&S	 j5       r\S&S
 j5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\\S'S j5       5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\S&S j5       r\\S'S j5       5       r \\S'S j5       5       r!\\S(S j5       5       r"\"RF                  \S)S j5       5       r"\S&S  j5       r$\S&S! j5       r%S"r&g#)*r   i[  zCWrapper class for a `MySQLConnection` or `CMySQLConnection` object.c                <    Xl         U R                   R                  ngr   r   sql_mode)r   r   _s      r2   r   TracedMySQLConnection.__init__^  s    3: MM""r4   c                t    [        U R                  R                  " U0 UD6U R                  U R                  S9$ )zWraps the object method.)r   r   r   )r   r   cursorr   rc   r   s      r2   r   TracedMySQLConnection.cursorf  s4     MM(($9&9<< JJ
 	
r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_change_userr   s      r2   r   %TracedMySQLConnection.cmd_change_usern  s     }},,d=f==r4   c                :    U R                   R                  " U0 UD6$ r   )r   commitr   s      r2   r   TracedMySQLConnection.commits  s     }}##T4V44r4   c                :    U R                   R                  " U0 UD6$ r   )r   rollbackr   s      r2   r   TracedMySQLConnection.rollbackx  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   	cmd_queryr   s      r2   r   TracedMySQLConnection.cmd_query}       }}&&777r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_init_dbr   s      r2   r   !TracedMySQLConnection.cmd_init_db  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_refreshr   s      r2   r   !TracedMySQLConnection.cmd_refresh  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_quitr   s      r2   r   TracedMySQLConnection.cmd_quit  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_shutdownr   s      r2   r   "TracedMySQLConnection.cmd_shutdown       }}))4:6::r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_statisticsr   s      r2   r   $TracedMySQLConnection.cmd_statistics       }}++T<V<<r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_process_killr   s      r2   r   &TracedMySQLConnection.cmd_process_kill       }}--t>v>>r4   c                :    U R                   R                  " U0 UD6$ r   )r   	cmd_debugr   s      r2   r   TracedMySQLConnection.cmd_debug  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_pingr   s      r2   r  TracedMySQLConnection.cmd_ping  r   r4   c                .    U R                   R                  $ r   )r   databaser   s    r2   r  TracedMySQLConnection.database       }}%%%r4   c                :    U R                   R                  " U0 UD6$ r   )r   is_connectedr   s      r2   r  "TracedMySQLConnection.is_connected  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   reset_sessionr   s      r2   r  #TracedMySQLConnection.reset_session  s     }}**D;F;;r4   c                :    U R                   R                  " U0 UD6$ r   )r   pingr   s      r2   r  TracedMySQLConnection.ping  s     }}!!42622r4   c                :    U R                   R                  " U0 UD6$ r   )r   
info_queryr   s      r2   r   TracedMySQLConnection.info_query  s     }}''888r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_stmt_preparer   s      r2   r  &TracedMySQLConnection.cmd_stmt_prepare  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_stmt_executer   s      r2   r  &TracedMySQLConnection.cmd_stmt_execute  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_stmt_closer   s      r2   r  $TracedMySQLConnection.cmd_stmt_close  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_stmt_send_long_datar   s      r2   r  -TracedMySQLConnection.cmd_stmt_send_long_data  s     }}44dEfEEr4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_stmt_resetr   s      r2   r   $TracedMySQLConnection.cmd_stmt_reset  r   r4   c                :    U R                   R                  " U0 UD6$ r   )r   cmd_reset_connectionr   s      r2   r#  *TracedMySQLConnection.cmd_reset_connection  s     }}114B6BBr4   c                .    U R                   R                  $ r   )r   	time_zoner   s    r2   r&  TracedMySQLConnection.time_zone  s     }}&&&r4   c                .    U R                   R                  $ r   r   r   s    r2   r   TracedMySQLConnection.sql_mode  r  r4   c                .    U R                   R                  $ r   r   r   r   s    r2   r    TracedMySQLConnection.autocommit  s     }}'''r4   c                $    XR                   l        g)r   Nr+  )r   r   s     r2   r   r,    s     $) r4   c                :    U R                   R                  " U0 UD6$ r   )r   set_charset_collationr   s      r2   r/  +TracedMySQLConnection.set_charset_collation  s     }}22DCFCCr4   c                :    U R                   R                  " U0 UD6$ r   )r   start_transactionr   s      r2   r2  'TracedMySQLConnection.start_transaction  s     }}..???r4   )r   N)r   rj   rk   r   )re   r   rf   r   rk   r   r   r   )rk   bool)r   r4  rk   r   )'ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  propertyr  r  r  r  r  r  r  r  r  r   r#  r&  r   r   setterr/  r2  r   rl   r4   r2   r   r   [  s   M#
 > > 5 5 7 7 8 8 : : : : 7 7 ; ; = = ? ? 8 8 7 7 &  & ; ; < < 3 3 9 9 ? ? ? ? = = F F = = C C '  ' &  & (  ( )  ) D D @ @r4   r   c                Z   ^ ^ [         R                  " T 5            SU U4S jj5       nU$ )z.Retrurn the instrumented version of `connect`.c                   >^ [        U4S j[         5       5      (       a  [        R                  " S5        T" U 0 TD6$ [        R
                  " S[        TS9nUR                  [        [        R                  R                  S9T[        '   UT[        '   [        R                  " T[           SS9 n[        SUT5        T" U 0 TD6n[        XCT5        [        US	9sSSS5        $ ! , (       d  f       g= f)
zwWraps the connection object returned by the method `connect`.

Instrumentation for PooledConnections is not supported.
c              3  ,   >#    U  H	  oT;   v   M     g 7fNrl   ).0keyrf   s     r2   	<genexpr>7_instrument_connect.<locals>.wrapper.<locals>.<genexpr>  s     6f}s   z4Instrumentation for pooled connections not supportedMySQL Connector/Pythoninstrumenting_module_nameinstrumenting_library_versiontracer_providerrt   ru   Fra   Nr   )anyr   r   rU   r   
get_tracerr   
start_spanr   r   r   r&   r'   rd   r^   r   )re   rf   r   rX   rW   connectrC  s    `   r2   rh   $_instrument_connect.<locals>.wrapper  s     6666NNQRD+F++!!&>*6+
 #)"3"3%ENN,A,A #4 #
 %+ ! ^^F?3G8%dHf= 4*6*C &cV<( HGGs   1*C%%
C3)re   r   rf   r   rk   z9Union['MySQLConnectionAbstract', 'PooledMySQLConnection'])	functoolswraps)rI  rC  rh   s   `` r2   _instrument_connectrM    s@     __W&&!&	B& &P Nr4   c                  |    \ rS rSr% SrSrS\S'   SS jrSS jrSS jr	 S     SS	 jjr
SS
 jr    SS jrSrg)MySQLInstrumentori8  z8MySQL instrumentation supporting mysql-connector-python.NzOptional[MySQLInstrumentor]	_instancec                    U R                   cD  [        R                  " U /UQ70 UD6U l         [        U R                   S[        R
                  5        U R                   $ )zASinglenton.

Restricts the instantiation to a singular instance.
_original_connect)rP  object__new__setattrr   rI  )clsre   rf   s      r2   rT  MySQLInstrumentor.__new__=  sI    
 == "NN3@@@CMCMM#6	8I8IJ}}r4   c                    S[          3/$ )zgReturn a list of python packages with versions
that the will be instrumented (e.g., versions >= 8.1.0).zmysql-connector-python >= )r    r   s    r2   instrumentation_dependencies.MySQLInstrumentor.instrumentation_dependenciesI  s     --D,EFGGr4   c                    [         R                  [        U S5      :w  a  [        R                  " S5        g[        [        U S5      UR                  S5      S9[         l        g)zInstrument the library.

Args:
    trace_module: reference to the 'trace' module from opentelemetry.
    tracer_provider (optional): TracerProvider instance.

NOTE: Instrumentation for pooled connections not supported.
rR  z3MySQL Connector/Python module already instrumented.NrC  )rI  rC  )r   rI  r   r   rU   rM  rL   r   rf   s     r2   
instrumentMySQLInstrumentor.instrumentN  sO     .A BBNNPQ/D"56"JJ'89
	r4   c                   [        U[        5      (       a  [        R                  " S5        U$ [	        US5      (       a  [	        US5      (       d-  [        R                  " SUR
                  R                  5        U$ [        R                  " S[        US9nUR                  [        [        R                  R                  S9Ul        X1l        [!        XR                  5        [        US9$ )	a`  Enable instrumentation in a MySQL connection.

Args:
    connection: uninstrumented connection instance.
    trace_module: reference to the 'trace' module from opentelemetry.
    tracer_provider (optional): TracerProvider instance.

Returns:
    connection: instrumented connection instace.

NOTE: Instrumentation for pooled connections not supported.
z Connection already instrumented.rc   r   z+Instrumentation for class %s not supported.r?  r@  rD  rE  )r:   r   r   rU   rP   r   ry   r   rG  r   rH  r   r   r   rc   r   r^   )r   r   rC  r   s       r2   instrument_connection'MySQLInstrumentor.instrument_connection_  s    " j"788NN=>z7++7:y3Q3QNN=$$-- !!&>*6+

 ",,%ENN,A,A - 

 $!*.>.>?$Z88r4   c                    [         R                  [        U S5      :X  a  [        R                  " S5        g[        U S5      [         l        g)zUninstrument the library.rR  z5MySQL Connector/Python module already uninstrumented.N)r   rI  r   r   rU   r\  s     r2   uninstrumentMySQLInstrumentor.uninstrument  s:     .A BBNNRS#D*=>	r4   c                   [        US5      (       d-  [        R                  " SUR                  R                  5        U$ [        U[        5      (       d  [        R                  " S5        U$ UR                  (       a@  UR                  R                  5       (       a!  UR                  R                  5         SUl        UR                  $ )zDisable instrumentation in a MySQL connection.

Args:
    connection: instrumented connection instance.

Returns:
    connection: uninstrumented connection instace.

NOTE: Instrumentation for pooled connections not supported.
rc   z-Uninstrumentation for class %s not supported.z"Connection already uninstrumented.N)rP   r   rU   r   ry   r:   r   rc   r*   r6   r   )r   r   s     r2   uninstrument_connection)MySQLInstrumentor.uninstrument_connection  s     z7++NN?$$-- *&;<<NN?@ 
 0 0 = = ? ?  "#J"""r4   rl   )re   r   rf   r   rk   rO  )rk   zCollection[str])rf   r   rk   r   r:  )r   rj   rC  Optional[trace.TracerProvider]rk   rj   )r   rj   rk   rj   )ry   r   r   r   r   rP  __annotations__rT  rY  r]  r`  rc  rf  r   rl   r4   r2   rO  rO  8  sa    B-1I*1
H

( ;?(9-(9 8(9 
#	(9T?#3#	"#r4   rO  )r0   r   r1   zOptional[Exception]rk   r   )r0   r   rk   r   )r>   r;   rk   r;   r:  )rW   z#Optional['MySQLConnectionAbstract']rX   r   rY   zOptional[Dict[str, Any]]rk   r   )rg   r	   rk   r	   )rI  HCallable[..., Union['MySQLConnectionAbstract', 'PooledMySQLConnection']]rC  rh  rk   rj  )Dr   
__future__r   rK  reabcr   r   
contextlibr   typingr   r   r	   r
   r   r   r   	abstractsr   r   poolingr   r9   r   	constantsr   r   r   versionr   opentelemetryr   opentelemetry.sdk.tracer   opentelemetry.semconv.tracer   ImportErrormissing_dependencies_errerrorsProgrammingErrorr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   compiler(   ri  r3   r7   r?   r^   rn   r   r   r   r   r   rM  rO  rl   r4   r2   <module>r|     sZ  : 8 #  	 # " R R R  I/  <  "	$ $6:    ')jj&?  ? ,0R#	,R#R# )R# 
	R#j
4@+0c +0\7 7@g@O g@X 7;0U030 N0fv# v#q  $



+
+Q#$$s   "D D4D//D4