
    Mhcl                        d dl mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d dlmZmZmZmZ d d	lmZ d d
lmZ d dlZd dlZd dl Z d dl!Z!d dl"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)Z*d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl+Z+e+j4        r
d dl+m5Z5m6Z6m7Z7  G d de          Z8 G d de          Z9 G d de          Z: G d dej;                  Z<e=dk    r ej>        e:            e	             dS dS )    )_unicode)genversion)HTTPResponse	HTTPErrorAsyncHTTPClientmain_RequestProxyHTTPRequest)httputil)HTTP1ConnectionHTTP1ConnectionParameters)IOLoop)StreamClosedErrorIOStream)ResolverOverrideResolver_client_ssl_defaultsis_valid_ip)gen_log)	TCPClientN)BytesIO)DictAnyCallableOptionalTypeUnion)TracebackType)DequeTupleListc                   8     e Zd ZdZdeddf fdZdefdZ xZS )HTTPTimeoutErrorzError raised by SimpleAsyncHTTPClient on timeout.

    For historical reasons, this is a subclass of `.HTTPClientError`
    which simulates a response code of 599.

    .. versionadded:: 5.1
    messagereturnNc                 N    t                                          d|           d S NW  r%   super__init__selfr%   	__class__s     Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/tornado/simple_httpclient.pyr-   zHTTPTimeoutError.__init__5   &    g.....    c                     | j         pdS )NTimeoutr*   r/   s    r1   __str__zHTTPTimeoutError.__str__8   s    |(y(r3   __name__
__module____qualname____doc__strr-   r7   __classcell__r0   s   @r1   r$   r$   ,   sp         / / / / / / / /) ) ) ) ) ) ) ) )r3   r$   c                   8     e Zd ZdZdeddf fdZdefdZ xZS )HTTPStreamClosedErroraZ  Error raised by SimpleAsyncHTTPClient when the underlying stream is closed.

    When a more specific exception is available (such as `ConnectionResetError`),
    it may be raised instead of this one.

    For historical reasons, this is a subclass of `.HTTPClientError`
    which simulates a response code of 599.

    .. versionadded:: 5.1
    r%   r&   Nc                 N    t                                          d|           d S r(   r+   r.   s     r1   r-   zHTTPStreamClosedError.__init__H   r2   r3   c                     | j         pdS )NStream closedr*   r6   s    r1   r7   zHTTPStreamClosedError.__str__K   s    |..r3   r8   r?   s   @r1   rA   rA   <   sp        	 	/ / / / / / / // / / / / / / / /r3   rA   c                   r    e Zd ZdZ	 	 	 	 	 	 	 ddedeeeef                  dedee         d	eeee	f                  d
ee         dee         ddf fdZ
d fdZdedeegdf         ddfdZddZdefdZdedeg df         deegdf         ddfdZdeddfdZdeddfdZddedee         ddfdZ xZS )SimpleAsyncHTTPClienta  Non-blocking HTTP client with no external dependencies.

    This class implements an HTTP 1.1 client on top of Tornado's IOStreams.
    Some features found in the curl-based AsyncHTTPClient are not yet
    supported.  In particular, proxies are not supported, connections
    are not reused, and callers cannot select the network interface to be
    used.

    This implementation supports the following arguments, which can be passed
    to ``configure()`` to control the global singleton, or to the constructor
    when ``force_instance=True``.

    ``max_clients`` is the number of concurrent requests that can be
    in progress; when this limit is reached additional requests will be
    queued. Note that time spent waiting in this queue still counts
    against the ``request_timeout``.

    ``defaults`` is a dict of parameters that will be used as defaults on all
    `.HTTPRequest` objects submitted to this client.

    ``hostname_mapping`` is a dictionary mapping hostnames to IP addresses.
    It can be used to make local DNS changes when modifying system-wide
    settings like ``/etc/hosts`` is not possible or desirable (e.g. in
    unittests). ``resolver`` is similar, but using the `.Resolver` interface
    instead of a simple mapping.

    ``max_buffer_size`` (default 100MB) is the number of bytes
    that can be read into memory at once. ``max_body_size``
    (defaults to ``max_buffer_size``) is the largest response body
    that the client will accept.  Without a
    ``streaming_callback``, the smaller of these two limits
    applies; with a ``streaming_callback`` only ``max_body_size``
    does.

    .. versionchanged:: 4.2
        Added the ``max_body_size`` argument.
    
   N  @max_clientshostname_mappingmax_buffer_sizeresolverdefaultsmax_header_sizemax_body_sizer&   c                    t                                          |           || _        t          j                    | _        i | _        i | _        || _        || _	        || _
        |r|| _        d| _        nt                      | _        d| _        |t          | j        |          | _        t          | j                  | _        d S )N)rM   FT)rL   mapping)rL   )r,   
initializerI   collectionsdequequeueactivewaitingrK   rN   rO   rL   own_resolverr   r   r   
tcp_client)	r/   rI   rJ   rK   rL   rM   rN   rO   r0   s	           r1   rR   z SimpleAsyncHTTPClient.initializev   s     	H---& 	
  	  	  /.*  	%$DM %D$JJDM $D',0@  DM $T];;;r3   c                     t                                                       | j        r| j                                         | j                                         d S N)r,   closerX   rL   rY   )r/   r0   s    r1   r\   zSimpleAsyncHTTPClient.close   sM     	"M!!!r3   requestcallbackc                 |   t                      }| j                            |||f           |j        J |j        J d }t          | j                  | j        k    rxt          |j        |j                  p|j        p|j        }|rN| j	        
                    | j	                                        |z   t          j        | j        |d                    }|||f| j        |<   |                                  | j        r?t#          j        dt          | j                  t          | j                  fz             d S d S )Nzin request queuezImax_clients limit reached, request queued. %d active, %d queued requests.)objectrU   appendconnect_timeoutrequest_timeoutlenrV   rI   minio_loopadd_timeouttime	functoolspartial_on_timeoutrW   _process_queuer   debug)r/   r]   r^   keytimeout_handletimeouts         r1   
fetch_implz SimpleAsyncHTTPClient.fetch_impl   s^    hh
32333&222&222t{t///G+W-DEE +*+* 
  !%!9!9L%%'''1%d&6=OPP" " %h?S: 	M1474D4Dc$*oo3VW    	 	r3   c                    | j         rt          | j                  | j        k     r| j                                         \  }}}|| j        vrK|                     |           ||f| j        |<   t          j        | j	        |          }| 
                    |||           | j         r#t          | j                  | j        k     d S d S d S d S r[   )rU   rd   rV   rI   popleftrW   _remove_timeoutri   rj   _release_fetch_handle_request)r/   rn   r]   r^   release_callbacks        r1   rl   z$SimpleAsyncHTTPClient._process_queue   s    j 	FS--0@@@%)Z%7%7%9%9"C($,&&  %%% '2DK(01DcJJ  *:HEEE j 	FS--0@@@@@ 	F 	F@@ 	F 	Fr3   c                     t           S r[   )_HTTPConnectionr6   s    r1   _connection_classz'SimpleAsyncHTTPClient._connection_class   s    r3   rw   final_callbackc           
      v     |                                  | |||| j        | j        | j        | j                   d S r[   )rz   rK   rY   rN   rO   )r/   r]   rw   r{   s       r1   rv   z%SimpleAsyncHTTPClient._handle_request   sQ     	!   O 		
 		
 		
 		
 		
r3   rn   c                 >    | j         |= |                                  d S r[   )rV   rl   )r/   rn   s     r1   ru   z$SimpleAsyncHTTPClient._release_fetch   s$    Kr3   c                     || j         v r7| j         |         \  }}}|| j                            |           | j         |= d S d S r[   )rW   rf   remove_timeout)r/   rn   r]   r^   ro   s        r1   rt   z%SimpleAsyncHTTPClient._remove_timeout   sV    $,04S0A-GX~)++N;;;S!!!	 r3   infoc                 8   | j         |         \  }}}| j                            |||f           |rd| nd}t          |dt	          |          | j                                        |j        z
            }| j                            ||           | j         |= dS )zTimeout callback of request.

        Construct a timeout HTTPResponse when a timeout occurs.

        :arg object key: A simple object to mark the request.
        :info string key: More detailed timeout information.
        Timeout r5   r)   )errorrequest_timeN)	rW   rU   remover   r$   rf   rh   
start_timeadd_callback)r/   rn   r   r]   r^   ro   error_messagetimeout_responses           r1   rk   z!SimpleAsyncHTTPClient._on_timeout   s     -1L,=)>
32333-1@)4)))y'"=11**,,w/AA	
 
 
 	!!(,<===Lr3   )rG   NrH   NNNNr&   Nr[   )r9   r:   r;   r<   intr   r   r=   r   r   rR   r\   r   r   r   rq   rl   typerz   rv   r`   ru   rt   rk   r>   r?   s   @r1   rF   rF   O   s(       $ $P 59('+-1)-'+$< $<$< #4S>2$< 	$<
 8$$< 4S>*$< "#$<  }$< 
$< $< $< $< $< $<L           ".6~t7K.L	   6F F F F4    

 #2t8,
 !,!56	

 

 
 
 
"& T    "6 "d " " " " v Xc] d        r3   rF   c                      e Zd Zh dZdee         dedeg df         deegdf         de	de
d	e	d
e	ddfdZd(dZdededeeef         ej        f         fdZd)dee         ddfdZd(dZdedefdZdeddfdZd(dZdeddfdZdddee         dee         defdZd(dZ d ee!j"        e!j#        f         d!e!j$        ddfd"Z%defd#Z&d(d$Z'd(d%Z(d&e)ddfd'Z*dS )*ry   >   GETPUTHEADPOSTPATCHDELETEOPTIONSclientr]   rw   Nr{   rK   rY   rN   rO   r&   c	                    t          j                    | _        | j                                        | _        t          j                    | _        || _        || _        || _        || _	        || _
        || _        || _        || _        d | _        d | _        g | _        d | _        d | _        d | _        t          j                                        t+          j        |                                           d            d S )Nc                 *    |                                  S r[   result)fs    r1   <lambda>z*_HTTPConnection.__init__.<locals>.<lambda>  s    qxxzz r3   )r   currentrf   rh   r   start_wall_timer   r]   rw   r{   rK   rY   rN   rO   codeheaderschunks_decompressor_timeout	_sockaddr
add_futurer   convert_yieldedrun)	r/   r   r]   rw   r{   rK   rY   rN   rO   s	            r1   r-   z_HTTPConnection.__init__   s     ~'',++--#y{{ 0,.$.*	!##

++-A-A	
 	
 	
 	
 	
r3   c           	      B  K   	 t           j                            t          | j        j                            | _        | j        j        dvrt          d| j        j        z            | j        j	        }d|v r|
                    d          \  }}}t          j        |          \  }}|| j        j        dk    rdnd}t          j        d|          r
|dd	         }|| _        | j        j        d
u rt"          j        }nt"          j        }|                     | j        j                  }d }| j        j        rBt-          | j        j                  r| j        j        }nt          d| j        j                  | j        j        r1| j        j        r%t3          | j        j        | j        j                  }	n4| j        j        r| j        j        }	n| j        j        r| j        j        }	nd}	|	r@| j                            | j        |	z   t;          j        | j        d                    | _         | j!        "                    ||||| j#        |           d {V }
| j$        |
%                                 d S |
| _&        | j&        '                    | j(                   | )                                 | j$        d S | j        j        rJ| j                            | j        | j        j        z   t;          j        | j        d                    | _         | j        j*        | j+        vr(| j        j,        st[          d| j        j*        z            dD ]*}t]          | j        |d           rt_          d|z            +d| j        j0        vrd| j        j0        d<   d| j        j0        vrZd| j        j	        v r3| j        j	        
                    d          d	         | j        j0        d<   n| j        j	        | j        j0        d<   d\  }}| j        j1        | j        j1        | j        j2        }}n&| j        j3        | j        j3        }| j        j4        pd}|p|J | j        j5        dvrt          d| j        j5                  dt          tm          j7        t          j8        ||                              z   | j        j0        d<   | j        j9        r| j        j9        | j        j0        d<   n6| j        j0        :                    d          dtv           | j        j0        d<   | j        j,        sV| j        j*        dv }| j        j<        d up| j        j=        d u}|r|r|r&|s$t          d|rd ndd!| j        j*        d"          | j        j>        rd#| j        j0        d$<   | j        j<        3t          t          | j        j<                            | j        j0        d%<   | j        j*        d&k    rd'| j        j0        vrd(| j        j0        d'<   | j        jA        rd)| j        j0        d*<   | j        jB        pd+| j        jC        rd,| j        jC        z   ndz   }| D                    |
          | _E        t          jF        | j        j*        |d          }| jE        G                    || j        j0                   | j        j>        r"| jE        H                    |            d {V  d S | I                    d-           d {V  d S # t          $ r   | jK        t          jM                     s Y d S w xY w).N)httphttpszUnsupported url scheme: %s@r   i  P   z^\[.*\]$   Fz=Unrecognized IPv4 or IPv6 address for network_interface, got r   zwhile connecting)afssl_optionsrK   	source_ipzduring requestzunknown method %s)
proxy_host
proxy_portproxy_usernameproxy_passwordproxy_auth_modez%s not supported
Connectionr\   Host)NN )Nbasiczunsupported auth_mode %szBasic Authorizationz
User-AgentzTornado/)r   r   r   z
Body must znot zbe None for method z+ (unless allow_nonstandard_methods is true)z100-continueExpectContent-Lengthr   Content-Typez!application/x-www-form-urlencodedgzipzAccept-Encoding/?T)Nurllibparseurlsplitr   r]   urlparsedscheme
ValueErrornetloc
rpartitionr   split_host_and_portrematchparsed_hostname
allow_ipv6socketAF_INET	AF_UNSPEC_get_ssl_optionsnetwork_interfacer   rb   rc   re   rf   rg   r   ri   rj   rk   r   rY   connectrK   r{   r\   streamset_close_callbackon_connection_closert   method_SUPPORTED_METHODSallow_nonstandard_methodsKeyErrorgetattrNotImplementedErrorr   usernamepasswordauth_usernameauth_password	auth_modebase64	b64encodeencode_username_password
user_agentgetr   bodybody_producerexpect_100_continuer=   rd   decompress_responsepathquery_create_connection
connectionRequestStartLinewrite_headersread_response_write_body	Exception_handle_exceptionsysexc_info)r/   r   userpass_hostportr   r   r   rp   r   rn   r   r   body_expectedbody_presentreq_path
start_lines                     r1   r   z_HTTPConnection.run   s     ^	 ,//9I0J0JKKDK{!)::: !=@P!PQQQ ['Ff}}&,&7&7&<&<#!V!5f==JD$|"k0G;;ssxT** "AbDz#'D |&%//^%//0BCCKI|- t|=>>  $ >II$*<99<  
 |+ 	0L 	L0$,2N  - ,6- ,6  $ 8 8Og-%d&68JKK! !  ?22' $ 4# 3        F "* DKK**4+CDDD  """"*|+  $ 8 8Odl&BB%d&68HII! !
 #4+BBB> C 2T\5HHIII H H 4<d33 H-.@3.FGGGH4<#7775<$\2T\111$+,,,37;3E3P3PQT3U3U4DL(00 48;3EDL(0!+Hh{#/%)[%94;;O(+7<5<5;#+++<)@@$%?AWXXX8@8$ 9(HMM D D 9$_5
 |& J59\5L$\22%)),77?5I5I5I$\2<9  !% 37O OL%T1 >|1=  " ,  )6 %* &3:66::DL<O<O<OQ  
 |/ @1?$X.| , :=SAR=S=S9T9T$%56#v--"$,*>>> 8 $^4 |/ A:@$%67(/C-1[->Ft{(((BH #55f==DO!24<3FRTUUJO))*dl6JKKK|/ -o33D99999999999&&t,,,,,,,,,,, 	 	 	)4)3<>>:   	s&   I0[4 6A[4 9P[4 [4 4&\\r   c                 &   |dk    r	| j         j        | j         j        S | j         j        r+| j         j        | j         j        | j         j        t          S t          j        t          j	        j
        | j         j                  }| j         j        sd|_        t          j        |_        | j         j        *|                    | j         j        | j         j                   t          t          d          r|xj        t          j        z  c_        |S d S )Nr   )cafileFOP_NO_COMPRESSION)r]   r   validate_certca_certsclient_cert
client_keyr   sslcreate_default_contextPurposeSERVER_AUTHcheck_hostname	CERT_NONEverify_modeload_cert_chainhasattroptionsr  )r/   r   ssl_ctxs      r1   r   z _HTTPConnection._get_ssl_options  s    W|'3|// *,L)1L,4L+3++0'0E  G <- 4).&&)m#|'3''L,dl.E   s/00 93#88Ntr3   r   c                     d| _         |rd| nd}| j        +|                     t          t          |          d           dS dS )zTimeout callback of _HTTPConnection instance.

        Raise a `HTTPTimeoutError` when a timeout occurs.

        :info string key: More detailed timeout information.
        Nr   r5   )r   r{   r   r$   )r/   r   r   s      r1   rk   z_HTTPConnection._on_timeout  sf     -1@)4)))y*"" "2="A"A4     +*r3   c                 d    | j         (| j                            | j                    d | _         d S d S r[   )r   rf   r   r6   s    r1   rt   z_HTTPConnection._remove_timeout  s5    =$L''666 DMMM %$r3   r   c                     |                     d           t          |dt          d| j        | j        t          | j        j                            | j                  }|S )NT)no_keep_aliverN   rO   
decompress)	set_nodelayr   r   rN   rO   boolr]   r   r   )r/   r   r   s      r1   r   z"_HTTPConnection._create_connection  sk    4   $%" $ 4"0 @AA	   N

 


 r3   
start_readc                   K   | j         j        %| j                            | j         j                   n:| j         j        .| j                             | j        j                  }|| d {V  | j                                         |rP	 | j                            |            d {V  d S # t          $ r   | j        t          j
                     s Y d S w xY wd S r[   )r]   r   r   writer   finishr   r   r   r   r   )r/   r  futs      r1   r   z_HTTPConnection._write_body  s     <(O!!$,"34444\'3,,,T_-BCCC							    	o33D99999999999$   -t-s|~~>   	 	s   
 B, ,&CCc                 H    | j         | j         }d | _          |             d S d S r[   )rw   )r/   rw   s     r1   _releasez_HTTPConnection._release  s9     ,#4$(D! -,r3   responsec                     |                                   | j        +| j        }d | _        | j                            ||           d S d S r[   )r  r{   rf   r   )r/   r   r{   s      r1   _run_callbackz_HTTPConnection._run_callback  sN    *!0N"&DL%%nh????? +*r3   typzOptional[Type[BaseException]]valuetbc           	         | j         |                                  t          |t                    r|j        t          d          }n|j        }|                     t          | j        d|| j	        
                                | j        z
  | j                             t          | d          r| j                                         dS t          |t                    S )NrD   r)   )r   r   r   r   T)r{   rt   
isinstancer   
real_errorrA   r"  r   r]   rf   rh   r   r   r  r   r\   )r/   r#  r$  r%  s       r1   r   z!_HTTPConnection._handle_exception  s     *  """%!233 -#+1/BBEE!,EL!%!2!2!4!4t!F#3     tX&& $ !!###4 e%6777r3   c                     | j         Vd}| j        j        r| j        j        	 t          |          # t          $ r  | j        t          j                      Y d S w xY wd S )NzConnection closed)r{   r   r   rA   r   r   r   )r/   r%   s     r1   r   z#_HTTPConnection.on_connection_closeB  s}    *)G{  (k''8+G444( 8 8 8&&777778 +*s   2 %AA
first_liner   c                   K   t          |t          j                  sJ | j        j        r(|j        dk    r|                     d           d {V  d S |j        | _        |j        | _        || _        | 	                                rd S | j        j
        x| j        
                    d|z             | j                                        D ]%\  }}| j        
                    | d| d           &| j        
                    d           d S d S )Nd   Fz
%s %s %s
z: z
)r'  r   ResponseStartLiner]   r   r   r   reasonr   _should_follow_redirectheader_callbackget_all)r/   r*  r   kvs        r1   headers_receivedz _HTTPConnection.headers_receivedL  s(     
 *h&@AAAAA<+ 	
30F0F""5)))))))))FO	 ''')) 	F<'3L((*)DEEE,,.. > >1,,__Q___====L((00000 43r3   c                     | j         j        rL| j         j        J | j        dv o4| j         j        dk    o$| j        d uo| j                            d          d uS dS )N)-  .  /  i3  i4  r   LocationF)r]   follow_redirectsmax_redirectsr   r   r   r6   s    r1   r/  z'_HTTPConnection._should_follow_redirectc  sw    <( 	<-999	66 =L.2=L,= L$$Z00<	 ur3   c           
      H   | j         J d                    | j                  }|                                  t	          | j        d| j                  }|                                 rt          | j        t                    sJ | j	        J t          j
        | j        j                  }t          j                            | j        j        | j	        d                   |_        | j        j        J | j        j        dz
  |_        |j	        d= | j         dk    r| j        j        dk    s| j         dv rA| j        j        d	k    r1d
|_        d |_        dD ] }	 | j        j	        |= # t$          $ r Y w xY w||_        | j        d | _        |                                  | j        J | j                            |d          }|                    fd           |                                  d S | j        j        rt7                      }nt7          |          }t9          || j         t	          | dd           | j	        | j                                        | j        z
  | j         || j        j                  }| !                    |           |                                  d S )Nr3   original_requestr9  r   r   r8  r   )r6  r7  r   r   )r   r   zContent-EncodingzTransfer-EncodingF)raise_errorc                 >     |                                            S r[   r   )r   r{   s    r1   r   z(_HTTPConnection.finish.<locals>.<lambda>  s    NN188::,F,F r3   r.  )r.  r   r   r   buffereffective_url)"r   joinr   rt   r   r]   r/  r'  r
   r   copyr   r   urljoinr   r;  r   r   r   r=  r{   r  r   fetchadd_done_callback_on_end_requeststreaming_callbackr   r   rf   rh   r   r   r"  )	r/   datar=  new_requesthr  r@  r   r{   s	           @r1   r  z_HTTPConnection.finishn  s   y$$$xx$$"4<1CT\RR'')) *	dlM:::::<+++)DL$899K$l22 $,z": KO <-999(,(BQ(FK%#F+ 	S  T\%8F%B%B	Z''DL,?6,I,I%*"#'  	 	A L033#   +;K(!0N"&DMMOOO;***+##KU#CCC!!"F"F"F"FGGG  """F<* 	#YYFFT]]FI4400L**,,t>+,*	
 	
 	
 	8$$$s   E%%
E21E2c                 8    | j                                          d S r[   )r   r\   r6   s    r1   rG  z_HTTPConnection._on_end_request  s    r3   chunkc                     |                                  rd S | j        j        | j                            |           d S | j                            |           d S r[   )r/  r]   rH  r   ra   )r/   rM  s     r1   data_receivedz_HTTPConnection.data_received  s^    '')) 	F<*6L++E22222Ku%%%%%r3   r   r[   )+r9   r:   r;   r   r   rF   r   r   r   r   r   r-   r   r=   r   r   r   r  
SSLContextr   rk   rt   r   r   r   r  r   r  r"  BaseExceptionr   r   r   r   r-  r   HTTPHeadersr4  r/  r  rG  bytesrO   r3   r1   ry   ry      s       UUU
./
 
 #2t8,	

 !,!56
 
 
 
 
 

 
 
 
B_ _ _ _B	tT#s(^S^3	4   >      ! ! ! !
 o    D T       @l @t @ @ @ @"8,"8 &"8 ]#	"8
 
"8 "8 "8 "8H8 8 8 81(4h6OOP1 %1 
	1 1 1 1.	 	 	 	 	? ? ? ?B   &5 &T & & & & & &r3   ry   __main__)?tornado.escaper   tornador   r   tornado.httpclientr   r   r   r	   r
   r   r   tornado.http1connectionr   r   tornado.ioloopr   tornado.iostreamr   r   tornado.netutilr   r   r   r   tornado.logr   tornado.tcpclientr   r   rS   rC  ri   r   r   r  r   rh   ior   urllib.parser   typingr   r   r   r   r   r   typesr   TYPE_CHECKINGr    r!   r"   r$   rA   rF   HTTPMessageDelegatery   r9   	configurerT  r3   r1   <module>rf     s   # # # # # #                                      N N N N N N N N ! ! ! ! ! ! 8 8 8 8 8 8 8 8                   ' ' ' ' ' '           				  



 



            = = = = = = = = = = = = = = = =       	 *))))))))))) ) ) ) )y ) ) ) / / / / /I / / /&j j j j jO j j jZ}& }& }& }& }&h2 }& }& }&@ zO3444DFFFFF r3   