
     h]                       U d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
mZ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 ddlmZmZmZ ddl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+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 erddl6m7Z7 ddl8m9Z9m:Z:  e+d      Z;ejx                  jz                  Z=ejx                  j|                  Z>ej~                  j                  Z@ej~                  j                  ZAej                  j                  ZCej                  j                  ZDej                  j                  ZEej                  j                  ZGej                  j                  ZH e3j                         ZJ ej                  d      ZL G d de	      ZMdeM_N        eej                  gdf   ZPdeQd<   eeMgdf   ZRdeQd<    G d  d!ee!         ZSy)"z
psycopg connection objects
    )annotationsN)TYPE_CHECKINGCallableGeneric
NamedTuple)ReferenceTyperef)warn)partial   )errors)
generatorspostgrespq)PQGen	PQGenConnQuery)SQL
Composable)Xid)Row)AdaptersMap)IsolationLevel)DequeLiteralStringSelf	TypeAliasTypeVar)connection_summary)BasePipeline)PrepareManager)capabilities)ConnectionInfo)BasePool)PGconnPGresult	CursorRowpsycopgc                  4    e Zd ZU dZded<   	 ded<   	 ded<   y)Notifyz8An asynchronous notification received from the database.strchannelpayloadintpidN)__name__
__module____qualname____doc____annotations__     R/var/www/tech_portal/venv/lib/python3.12/site-packages/psycopg/_connection_base.pyr*   r*   :   s    BLIL3	HEr6   r*   r   NoticeHandlerNotifyHandlerc                  &   e Zd ZdZej
                  Zej                  Zej                  Zej                  Zej                  Z	ej                  Z
ej                  Zej                  Zej                  Zej                  Zd9dZd:dZd;dZed<d       Zed<d       Zed<d       Zej,                  d=d       Zd=d	Zd>d
Zed?d       Zej,                  d@d       Zd@dZdAdZedBd       Zej,                  dCd       ZdCdZdDdZedBd       Zej,                  dCd       ZdCdZ dDdZ!dEdZ"edFd       Z#edGd       Z$edHd       Z%dIdZ&d:dZ'd<dZ(dJdZ)dKdZ*dKd Z+e,	 	 	 	 	 	 dLd!       Z-dMd"Z.dMd#Z/e,	 	 	 	 	 	 dNd$       Z0edOd%       Z1e1j,                  dPd&       Z1edOd'       Z2e2j,                  dPd(       Z2e3	 dQd)d*	 	 	 	 	 dRd+       Z4e5f	 	 	 	 	 dSd,Z6dTd-Z7d:d.Z8dUd/Z9dVd0Z:dUd1Z;dUd2Z<dWd3Z=dXd4Z>dUd5Z?	 	 	 	 	 	 dYd6Z@d:d7ZAy8)ZBaseConnectionz
    Base class for different types of connections.

    Share common functionalities such as access to the wrapped PGconn, but
    allow different interfaces (sync/async).
    c                   || _         d| _        d | _        g | _        g | _        d| _        d| _        t               | _        d | _	        t               | _        t        |       }t        t        j                  |      |_        t        t        j"                  |      |_        |  d | _        |  d | _        d | _        d | _        d| _        y )NFr   r6   )pgconn_autocommit	_adapters_notice_handlers_notify_handlers_num_transactions_closedr!   	_prepared_tpcr   _notifies_backlogr	   r   r;   _notice_handlernotice_handler_notify_handlernotify_handler	_pipeline_isolation_level
_read_only_deferrable_begin_statement)selfr=   wselfs      r7   __init__zBaseConnection.__init__a   s      .25757 "#)7)9-1	 8=wD	 '(F(F N '(F(F N 	.2 	7;'+(, #r6   c                z    t        | d      sy | j                  ry t        | d      ry t        d|  dt               y )Nr=   _poolzconnection zV was deleted while still open. Please use 'with' or '.close()' to close the connection)hasattrclosedr
   ResourceWarningrP   s    r7   __del__zBaseConnection.__del__   sH    tX& ;; 4!$  G G	
r6   c                    | j                   j                   d| j                   j                   }t        | j                        }d| d| dt        |       ddS )N.< z at 0xx>)	__class__r1   r2   r   r=   id)rP   clsinfos      r7   __repr__zBaseConnection.__repr__   sW    **+1T^^-H-H,IJ!$++.3%qfRXaL22r6   c                <    | j                   j                  t        k(  S )z$`!True` if the connection is closed.)r=   statusBADrX   s    r7   rV   zBaseConnection.closed   s     {{!!S((r6   c                Z    | j                   j                  t        k(  xr | j                   S )z
        `!True` if the connection was interrupted.

        A broken connection is always `closed`, but wasn't closed in a clean
        way, such as using `close()` or a `!with` block.
        )r=   rf   rg   rC   rX   s    r7   brokenzBaseConnection.broken   s%     {{!!S(=-==r6   c                    | j                   S )z'The autocommit state of the connection.)r>   rX   s    r7   
autocommitzBaseConnection.autocommit   s     r6   c                &    | j                  |       y N)_set_autocommitrP   values     r7   rk   zBaseConnection.autocommit       U#r6   c                    t         rm   NotImplementedErrorro   s     r7   rn   zBaseConnection._set_autocommit       !!r6   c              #  b   K   | j                  d      E d {    t        |      | _        y 7 w)Nrk   )_check_intrans_genboolr>   ro   s     r7   _set_autocommit_genz"BaseConnection._set_autocommit_gen   s+     **<888; 	9s   /-/c                    | j                   S )zX
        The isolation level of the new transactions started on the connection.
        )rL   rX   s    r7   isolation_levelzBaseConnection.isolation_level   s    
 $$$r6   c                &    | j                  |       y rm   )_set_isolation_levelro   s     r7   r{   zBaseConnection.isolation_level   s    !!%(r6   c                    t         rm   rs   ro   s     r7   r}   z#BaseConnection._set_isolation_level   ru   r6   c              #  x   K   | j                  d      E d {    |t        |      nd | _        d| _        y 7  w)Nr{   r6   )rw   r   rL   rO   ro   s     r7   _set_isolation_level_genz'BaseConnection._set_isolation_level_gen   s=     **+<===9>9Ju 5PT # 	>   :8!:c                    | j                   S )zX
        The read-only state of the new transactions started on the connection.
        )rM   rX   s    r7   	read_onlyzBaseConnection.read_only   s    
 r6   c                &    | j                  |       y rm   )_set_read_onlyro   s     r7   r   zBaseConnection.read_only   s    E"r6   c                    t         rm   rs   ro   s     r7   r   zBaseConnection._set_read_only   ru   r6   c              #  x   K   | j                  d      E d {    |t        |      nd | _        d| _        y 7  w)Nr   r6   )rw   rx   rM   rO   ro   s     r7   _set_read_only_genz!BaseConnection._set_read_only_gen   s9     **;777).):$u+ # 	8r   c                    | j                   S )zY
        The deferrable state of the new transactions started on the connection.
        )rN   rX   s    r7   
deferrablezBaseConnection.deferrable   s    
 r6   c                &    | j                  |       y rm   )_set_deferrablero   s     r7   r   zBaseConnection.deferrable   rq   r6   c                    t         rm   rs   ro   s     r7   r   zBaseConnection._set_deferrable   ru   r6   c              #  x   K   | j                  d      E d {    |t        |      nd | _        d| _        y 7  w)Nr   r6   )rw   rx   rN   rO   ro   s     r7   _set_deferrable_genz"BaseConnection._set_deferrable_gen   s:     **<888*/*;4; # 	9r   c              #    K   | j                   j                  x}t        k(  rD| j                  r8| j                  j	                         E d {    | j                   j                  }|t        k7  r]| j
                  rt        j                  d|d      t        j                  d|dt        j                  |      j                         y 7 w)Nzcan't change z2 now: connection.transaction() context in progressz' now: connection in transaction status )r=   transaction_statusIDLErK   	_sync_genrB   eProgrammingErrorr   TransactionStatusname)rP   	attributerf   s      r7   rw   z!BaseConnection._check_intrans_gen   s     kk444F=$..~~//111[[33FT>%%((#I= 1C C 
 ((#I= 18++F3889;   2s   A	CCBCc                ,    t        | j                        S )z>A `ConnectionInfo` attribute to inspect connection properties.)r#   r=   rX   s    r7   rc   zBaseConnection.info
  s     dkk**r6   c                n    | j                   st        t        j                        | _         | j                   S rm   )r?   r   r   adaptersrX   s    r7   r   zBaseConnection.adapters  s%    ~~():):;DN~~r6   c                    | S rm   r5   rX   s    r7   
connectionzBaseConnection.connection  s	     r6   c                .    | j                   j                  S )zReturn the file descriptor of the connection.

        This function allows to use the connection as file-like object in
        functions waiting for readiness, such as the ones defined in the
        `selectors` module.
        )r=   socketrX   s    r7   filenozBaseConnection.fileno  s     {{!!!r6   c                z    | j                         r+| j                  j                         }|j                          yy)z/Cancel the current operation on the connection.N)_should_cancelr=   
get_cancelcancel)rP   cs     r7   r   zBaseConnection.cancel$  s.     &&(AHHJ !r6   c                ~    | j                   ry| j                  r$| j                  d   rt        j                  d      y)zhCheck whether the current command should actually be cancelled when
        invoking cancel*().
        Fr   z=cancel() cannot be used with a prepared two-phase transactionT)rV   rE   r   r   rX   s    r7   r   zBaseConnection._should_cancel*  s:     ;;991$$O  r6   c             #     K   | j                   j                         }|j                          t        j                  ||      E d {    y 7 w)Ntimeout)r=   cancel_connstartr   r   )rP   r   r   s      r7   _cancel_genzBaseConnection._cancel_gen9  s:     kk--/$$['BBBs   AAAAc                :    | j                   j                  |       y)z
        Register a callable to be invoked when a notice message is received.

        :param callback: the callback to call upon message received.
        :type callback: Callable[[~psycopg.errors.Diagnostic], None]
        N)r@   appendrP   callbacks     r7   add_notice_handlerz!BaseConnection.add_notice_handler>       	$$X.r6   c                :    | j                   j                  |       y)z
        Unregister a notice message callable previously registered.

        :param callback: the callback to remove.
        :type callback: Callable[[~psycopg.errors.Diagnostic], None]
        N)r@   remover   s     r7   remove_notice_handlerz$BaseConnection.remove_notice_handlerG  r   r6   c                    |        }|r|j                   sy t        j                  ||j                  j                        }|j                   D ]  }	  ||        y # t
        $ r!}t        j                  d||       Y d }~4d }~ww xY w)Nz)error processing notice callback '%s': %s)r@   r   
Diagnosticr=   	_encoding	Exceptionlogger	exception)rQ   resrP   diagcbexs         r7   rG   zBaseConnection._notice_handlerP  s     w..||C!6!67'' 	VBV4	V  V  !LbRTUUVs   A	B%BBc                :    | j                   j                  |       y)z
        Register a callable to be invoked whenever a notification is received.

        :param callback: the callback to call upon notification received.
        :type callback: Callable[[~psycopg.Notify], None]
        N)rA   r   r   s     r7   add_notify_handlerz!BaseConnection.add_notify_handler_  r   r6   c                :    | j                   j                  |       y)z
        Unregister a notification callable previously registered.

        :param callback: the callback to remove.
        :type callback: Callable[[~psycopg.Notify], None]
        N)rA   r   r   s     r7   remove_notify_handlerz$BaseConnection.remove_notify_handlerh  r   r6   c                F    |        x}sy |j                   j                  }t        |j                  j	                  |      |j
                  j	                  |      |j                        }|j                  x}|j                  |       |j                  D ]
  } ||        y rm   )
r=   r   r*   relnamedecodeextrabe_pidrF   r   rA   )rQ   pgnrP   encndr   s          r7   rI   zBaseConnection._notify_handlerq  s     kk##3;;%%c*CII,<,<S,A3::N '''A4HHQK'' 	BqE	r6   c                .    | j                   j                  S )a&  
        Number of times a query is executed before it is prepared.

        - If it is set to 0, every query is prepared the first time it is
          executed.
        - If it is set to `!None`, prepared statements are disabled on the
          connection.

        Default value: 5
        rD   prepare_thresholdrX   s    r7   r   z BaseConnection.prepare_threshold  s     ~~///r6   c                &    || j                   _        y rm   r   ro   s     r7   r   z BaseConnection.prepare_threshold  s    +0(r6   c                \    | j                   j                  }|t        j                  k7  r|S dS )z
        Maximum number of prepared statements on the connection.

        `!None` means no max number of prepared statements. The default value
        is 100.
        N)rD   prepared_maxsysmaxsize)rP   rvs     r7   r   zBaseConnection.prepared_max  s)     ^^((3;;&r0D0r6   c                J    |t         j                  }|| j                  _        y rm   )r   r   rD   r   ro   s     r7   r   zBaseConnection.prepared_max  s    =KKE&+#r6   g        r   c             #  `   K   t        j                  ||      E d{   } | |      }|S 7 w)z?Generator to connect to the database and create a new instance.r   N)r   connect)rb   conninfor   r=   conns        r7   _connect_genzBaseConnection._connect_gen  s1     
 '..xII6{ Js   .,.c              #    K   | j                          t        |t              r&|j                  | j                  j
                        }n!t        |t              r|j                  |       }| j                  rnt        | j                  j                  |d|      }| j                  j                  j                  |       | j                  j                  j                  d       y|t        k(  r| j                  j                  |       n| j                  j                  |d|       t!        j"                  | j                        E d{   d   }|j$                  t&        k7  r|j$                  t(        k7  r|j$                  t*        k(  r+t-        j.                  || j                  j
                        t-        j0                  dt3        j4                  |j$                        j6                   d|j9                               |S 7 w)z
        Generator to send a command and receive the result to the backend.

        Only used to implement internal commands such as "commit", with eventual
        arguments bound client-side. The cursor can do more complex stuff.
        N)result_formatencodingunexpected result z from command )_check_connection_ok
isinstancer+   encoder=   r   r   as_bytesrK   r   send_query_paramscommand_queuer   result_queueTEXT
send_queryr   executerf   
COMMAND_OK	TUPLES_OKFATAL_ERRORr   error_from_resultInterfaceErrorr   
ExecStatusr   r   )rP   commandr   cmdresults        r7   _exec_commandzBaseConnection._exec_command  s     	!!#gs#nnT[[%:%:;G,&&t,G>>--+	C NN((//4NN''..t4
 D KK""7+KK))'4})U'1'9'9$++'FFK==J&6==I+E}}+))&4;;;P;PQQ&&(v}})E)J)J(K$W^^%5$8:   Gs   EH		H
B>H	c              #  &  K   |t         s#|d|z   nd}| j                  |      E d{    y| j                          | j                  rkt	        | j
                  j                  |      }| j                  j                  j                  |       | j                  j                  j                  d       y| j
                  j                  |       t        j                  | j
                        E d{   d   }|j                  t        k7  r~|j                  t        k(  r+t        j                   || j
                  j"                        t        j$                  dt'        j(                  |j                        j*                   d      y7 d7 w)ae  
        Deallocate one, or all, prepared statement in the session.

        ``name == None`` stands for DEALLOCATE ALL.

        If possible, use protocol-level commands; otherwise use SQL statements.

        Note that PgBouncer doesn't support DEALLOCATE name, but it supports
        protocol-level Close from 1.21 and DEALLOCATE ALL from 1.22.
        Ns   DEALLOCATE s   DEALLOCATE ALLr   r   r   z0 from sending closing prepared statement message)_HAS_SEND_CLOSEr   r   rK   r   r=   send_close_preparedr   r   r   r   r   rf   r   r   r   r   r   r   r   r   r   )rP   r   stmtr   r   s        r7   _deallocatezBaseConnection._deallocate  s>     <,0,<>D(BSD))$///!!#>>$++994@CNN((//4NN''..t4''-'//<<bA==J&}}+))&4;;;P;PQQ&&(v}})E)J)J(KFG 	 ' 0 =s#   &FFC	F2F3BFFc                    | j                   j                  t        k(  ry | j                   j                  t        k(  rt	        j
                  d      t	        j                  d| j                   j                         )Nzthe connection is closedz7cannot execute operations: the connection is in status )r=   rf   OKrg   r   OperationalErrorr   rX   s    r7   r   z#BaseConnection._check_connection_ok
  sh    ;;#;;$$$%?@@++,,-/
 	
r6   c              #    K   | j                   ry| j                  j                  t        k7  ry| j	                  | j                               E d{    | j                  r#| j                  j                         E d{    yy7 47 w)z.Generator to start a transaction if necessary.N)r>   r=   r   r   r   _get_tx_start_commandrK   r   rX   s    r7   _start_queryzBaseConnection._start_query  sp     ;;))T1%%d&@&@&BCCC>>~~//111  	D1s$   AB	B-B	>B?B	B	c                   | j                   r| j                   S dg}| j                  _t        | j                        }|j                  d       |j                  |j                  j                  dd      j                                | j                  |j                  | j                  rdnd       | j                  |j                  | j                  rdnd       d	j                  |      | _         | j                   S )
Ns   BEGINs   ISOLATION LEVEL_r]   s	   READ ONLYs
   READ WRITEs
   DEFERRABLEs   NOT DEFERRABLE    )
rO   r{   r   r   r   replacer   r   r   join)rP   partsvals      r7   r   z$BaseConnection._get_tx_start_command!  s      (((
+ !5!56CLL+,LL))#s3::<=>>%LL]K??&LL$//?PQ $		% 0$$$r6   c              #  d  K   | j                   rt        j                  d      | j                  rt        j                  d      | j                  j
                  t        k(  ry| j                  d      E d{    | j                  r#| j                  j                         E d{    yy7 47 w)z-Generator implementing `Connection.commit()`.zExplicit commit() forbidden within a Transaction context. (Transaction will be automatically committed on successful exit from context.)z6commit() cannot be used during a two-phase transactionNs   COMMIT)
rB   r   r   rE   r=   r   r   r   rK   r   rX   s    r7   _commit_genzBaseConnection._commit_gen5  s     !!$$4 
 99$$H  ;;))T1%%i000>>~~//111  	1 2s$   A5B07B,8-B0%B.&B0.B0c              #  B  K   | j                   rt        j                  d      | j                  rt        j                  d      | j                  r"| j                  j                         E d{    | j                  j                  t        k(  ry| j                  d      E d{    | j                  j                          | j                  j                  |       E d{    | j                  r#| j                  j                         E d{    yy7 7 s7 87 w)z/Generator implementing `Connection.rollback()`.zExplicit rollback() forbidden within a Transaction context. (Either raise Rollback() or allow an exception to propagate out of the context.)z8rollback() cannot be used during a two-phase transactionNs   ROLLBACK)rB   r   r   rE   rK   r   r=   r   r   r   rD   clearmaintain_genrX   s    r7   _rollback_genzBaseConnection._rollback_genI  s     !!$$A 
 99$$J 
 >>~~//111;;))T1%%k222>>..t444>>~~//111  2
 	34 2sH   A,D.D/6D%D&<D"D#-DDDDDDc                P    | j                          t        j                  |||      S )aL  
        Returns a `Xid` to pass to the `!tpc_*()` methods of this connection.

        The argument types and constraints are explained in
        :ref:`two-phase-commit`.

        The values passed to the method will be available on the returned
        object as the members `~Xid.format_id`, `~Xid.gtrid`, `~Xid.bqual`.
        )
_check_tpcr   
from_parts)rP   	format_idgtridbquals       r7   xidzBaseConnection.xidd  s!     	~~i66r6   c              #    K   | j                          t        |t              st        j                  |      }| j                  j
                  t        k7  rIt        j                  dt        j                  | j                  j
                        j                         | j                  rt        j                  d      |df| _        | j                  | j                               E d {    y 7 w)Nz8can't start two-phase transaction: connection in status z3can't use two-phase transactions in autocommit modeF)r  r   r   from_stringr=   r   r   r   r   r   r   r   r>   rE   r   r   rP   r  s     r7   _tpc_begin_genzBaseConnection._tpc_begin_genq  s     #s#//#&C;;))T1$$(()G)GHMMNP 
 $$E  %L	%%d&@&@&BCCCs   C(C2*C0+C2c              #    K   | j                   st        j                  d      | j                   d   rt        j                  d      | j                   d   }|df| _         | j                  t	        d      j                  t        |                  E d {    | j                  r#| j                  j                         E d {    y y 7 47 w)Nz='tpc_prepare()' must be called inside a two-phase transactionr   zF'tpc_prepare()' cannot be used during a prepared two-phase transactionr   TzPREPARE TRANSACTION {})	rE   r   r   r   r   formatr+   rK   r   r  s     r7   _tpc_prepare_genzBaseConnection._tpc_prepare_gen  s     yy$$O  99Q<$$X  iil$K	%%c*B&C&J&J3s8&TUUU>>~~//111  	V1s$   BCC
-CCCCc              #  p  K   d|j                          d}|4| j                  st        j                  | d      | j                  d   }nI| j                  rt        j                  | d      t	        |t
              st        j                  |      }| j                  rD| j                  d   s5t        | d|j                          d      }d | _         |       E d {    y | j                  t        d	      j                  t        |      t        |                  E d {    d | _        y 7 Q7 w)
Ntpc_z()z? without xid must must be called inside a two-phase transactionr   z= with xid must must be called outside a two-phase transactionr   r  _genz{} PREPARED {})lowerrE   r   r   r   r   r  getattrr   r   r  r+   )rP   actionr  fnamemeths        r7   _tpc_finish_genzBaseConnection._tpc_finish_gen  s&     v||~&b);99((g = =  ))A,Cyy((g 7 7  c3'ooc*99TYYq\41V\\^$4D!9:DDIv))$%,,S[#c(C   DI s%   CD6 D2!AD6%D4&D64D6c                     y)z0Raise NotSupportedError if TPC is not supported.Nr5   rX   s    r7   r  zBaseConnection._check_tpc  s     	r6   N)r=   r%   )returnNone)r&  r+   )r&  rx   )rp   rx   r&  r'  )rp   rx   r&  PQGen[None])r&  IsolationLevel | None)rp   r)  r&  r'  )rp   r)  r&  r(  )r&  bool | None)rp   r*  r&  r'  )rp   r*  r&  r(  )r   r+   r&  r(  )r&  r#   )r&  r   )r&  zBaseConnection[Row])r&  r.   )r   floatr&  zPQGenConn[None])r   r8   r&  r'  )rQ   "ReferenceType[BaseConnection[Row]]r   r&   r&  r'  )r   r9   r&  r'  )rQ   r,  r   zpq.PGnotifyr&  r'  )r&  
int | None)rp   r-  r&  r'  ) )r   r+   r   r+  r&  zPQGenConn[Self])r   r   r   z	pq.Formatr&  zPQGen[PGresult | None])r   zbytes | Noner&  r(  )r&  r(  )r&  bytes)r  r.   r  r+   r  r+   r&  r   )r  z	Xid | strr&  r(  )r!  r   r  zXid | str | Noner&  r(  )Br0   r1   r2   r3   r   WarningErrorr   DatabaseError	DataErrorr   IntegrityErrorInternalErrorr   NotSupportedErrorrR   rY   rd   propertyrV   ri   rk   setterrn   ry   r{   r}   r   r   r   r   r   r   r   rw   rc   r   r   r   r   r   r   r   r   staticmethodrG   r   r   rI   r   r   classmethodr   r   r   r   r   r   r   r	  r  r  r  r  r$  r  r5   r6   r7   r;   r;   M   sV    iiGGGE%%NOOMI))%%NOOM))++%$N
&3
 ) ) > >     $ $"' % % ) )"$
   # #"$
     $ $"$
$ + +    "C
// V1V8@V	V V// 18C	   0 0 1 1 1 1 , , 58-2	  :>,,-6,	,\"H	

2%(2(267D(2#*:	>r6   r;   )Tr3   
__future__r   r   loggingtypingr   r   r   r   weakrefr   r	   warningsr
   	functoolsr   r.  r   r   r   r   r   abcr   r   r   sqlr   r   rE   r   rowsr   adaptr   _enumsr   _compatr   r   r   r   r   pq.miscr   rK   r    
_preparingr!   _capabilitiesr"   _connection_infor#   psycopg_pool.baser$   pq.abcr%   r&   r'   Formatr   BINARY
ConnStatusr   rg   r   r   r   r   r   r   INTRANShas_send_close_preparedr   	getLoggerr   r*   r1   r   r8   r4   r9   r;   r5   r6   r7   <module>rS     sp   # 
  ? ? &    & & ( (      " C C ' # & ' ,*( K 		yy~~			]]mm]]%%
MM##	mm''	  



&
&6,668			9	%
FZ 
F  #Q\\ND$89y 9#VHdN3y 3i	WS\ i	r6   