
    hi                        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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mZmZmZmZmZmZ d dlZd dlZd dlmZ d	d
l m!Z!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/m0Z0 d	dl1m2Z2m3Z3 d	dl4m5Z5 d	dl6m7Z7m8Z8 d	dl9m:Z: d	dl;m<Z< d	dl=m>Z>m?Z? dZ@er
d dlAZAd	dlBmCZC ee*e3de"dge<f         ZDee<gee?         f         ZE e*dde)i i dddd ejF        d          
  
        ZG G d deH          ZI G d  d!eH          ZJ eJ            ZK ejL        ddd"           G d# d$                      ZMeee*eMf         e3f         ZN G d% de$          ZOdS )&    N)deque)suppress)escape)
HTTPStatus)Logger)TYPE_CHECKINGAny	AwaitableCallableDequeOptionalSequenceTupleTypeUnioncast)under_cached_property   )AbstractAccessLoggerAbstractStreamWriter)BaseProtocol)ceil_timeout)HttpProcessingErrorHttpRequestParserHttpVersion10RawRequestMessageStreamWriter)BadHttpMethod)access_loggerserver_logger)EMPTY_PAYLOADStreamReader)tcp_keepalive)HTTPExceptionHTTPInternalServerError)AccessLogger)BaseRequest)ResponseStreamResponse)RequestHandlerRequestPayloadErrorPayloadAccessError)Serverr*   zasyncio.Task[None]UNKNOWN/TFc                       e Zd ZdZdS )r+   zPayload parsing error.N__name__
__module____qualname____doc__     V/var/www/html/prod/cognitive/venv/lib/python3.11/site-packages/aiohttp/web_protocol.pyr+   r+   S   s            r7   r+   c                       e Zd ZdZdS )r,   z-Payload was accessed after response was sent.Nr1   r6   r7   r8   r,   r,   W   s        7777r7   r,   )auto_attribsfrozenslotsc                   .    e Zd ZU eed<   eed<   eed<   dS )_ErrInfostatusexcmessageN)r2   r3   r4   int__annotations__BaseExceptionstrr6   r7   r8   r>   r>   ^   s.         KKK	LLLLLr7   r>   c            !       F    e Zd ZdZdZddeeeej        dddddd	dd
dddde	j
        dedededee         dedededededededededef  fdZdefdZeded          fd!            Zedeeeeeeeef         eeef         f                  fd"            Zedefd#            ZdJd%ee         dd&fd'Zd(e	j        dd&f fd)Zd*ee         dd&f fd+Z d,e!dd&fd-Z"dKd.Z#d/e$dd&fd0Z%d1edd&fd2Z&dKd3Z'dKd4Z(d5e)d6e*d7ee         dd&fd8Z+d9e!d:e!dd&fd;Z,d9e!d:e!dd&fd<Z-dKd=Z.d5e)d>ee         d?e/e)ge0e*         f         dee*ef         fd@Z1dKdAZ2d5e)dBe*d>ee         dee*ef         fdCZ3	 	 	 dLd5e)dEed*ee         dFee         de*f
dGZ4dHe5de/e)ge0e*         f         fdIZ6 xZ7S )Mr*   aj  HTTP protocol implementation.

    RequestHandler handles incoming HTTP request. It reads request line,
    request headers and request payload and calls handle_request() method.
    By default it always returns with 404 response.

    RequestHandler handles errors in incoming request, like bad
    status line, bad headers or incomplete payload. If any error occurs,
    connection gets closed.

    keepalive_timeout -- number of seconds before closing
                         keep-alive connection

    tcp_keepalive -- TCP keep-alive is on, default is on

    debug -- enable debug mode

    logger -- custom logger object

    access_log_class -- custom class for access_logger

    access_log -- custom logging object

    access_log_format -- access log format string

    loop -- Optional event loop

    max_line_size -- Optional maximum header line size

    max_field_size -- Optional maximum header field size

    max_headers -- Optional maximum header size

    timeout_ceil_threshold -- Optional value to specify
                              threshold to ceil() timeout
                              values

    )_request_count
_keepalive_manager_request_handler_request_factory_tcp_keepalive_next_keepalive_close_time_keepalive_handle_keepalive_timeout_lingering_time	_messages_message_tail_handler_waiter_waiter_task_handler_upgrade_payload_parser_request_parser_reading_pausedloggerdebug
access_logr   _close_force_close_current_request_timeout_ceil_threshold_request_in_progress_logging_enabled_cachei.  TFi  i   g      $@i      )keepalive_timeoutr#   rZ   access_log_classr\   access_log_formatr[   max_line_sizemax_headersmax_field_sizelingering_timeread_bufsizeauto_decompresstimeout_ceil_thresholdmanagerr-   loopre   r#   rZ   rf   r\   rg   r[   rh   ri   rj   rk   rl   rm   rn   c          
         t                                          |           d| _        d| _        d | _        || _        |j        | _        |j        | _	        || _
        d| _        d | _        || _        t          |          | _        t!                      | _        d| _        d | _        d | _        d | _        d| _        d | _        t1          | |||
||t2          |          | _        d| _        	 t          |          | _        n# t8          t:          f$ r Y nw xY w|| _        |	| _        || _         |r# |||          | _!        | j!        j"        | _#        nd | _!        d| _#        d| _$        d| _%        d| _&        i | _'        d S )Nr   Fg        r7   )rh   rj   ri   payload_exceptionrm   rd   )(super__init__rG   rH   r_   rI   request_handlerrJ   request_factoryrK   rL   rM   rN   rO   floatrP   r   rQ   rR   rT   rS   rU   rV   rW   r   r+   rX   r`   	TypeError
ValueErrorrZ   r[   r\   r   enabledrb   r]   r^   ra   rc   )selfro   rp   re   r#   rZ   rf   r\   rg   r[   rh   ri   rj   rk   rl   rm   rn   	__class__s                    r8   rt   zRequestHandler.__init__   s   * 	  7;*1;B;R;B;R+*-';?"3$^44*/'' 7;?C;?$(<M')#1+	=
 	=
 	=
 /0$	+01G+H+HD((:& 	 	 	D	 
$ 	*AQAQ-B BD %)$6$>D!!!%D$)D!!$)!&(s   -D DDreturnc                 T    d                     | j        j        | j        dnd          S )Nz<{} {}>	connecteddisconnected)formatr|   r2   	transportr{   s    r8   __repr__zRequestHandler.__repr__  s0    N#>5KK>
 
 	
r7   zssl.SSLContextc                 H    | j         dn| j                             d          S )zReturn SSLContext if available.N
sslcontextr   get_extra_infor   s    r8   ssl_contextzRequestHandler.ssl_context  s+    
 ~% D..|<<	
r7   c                 H    | j         dn| j                             d          S )zReturn peername if available.Npeernamer   r   s    r8   r   zRequestHandler.peername  s+     ~% D..z::	
r7   c                     | j         S N)rO   r   s    r8   re   z RequestHandler.keepalive_timeout  s    &&r7         .@timeoutNc                 l  K   d| _         | j        | j                                         | j        r| j                                        | _        	 t          |          4 d{V  | j         d{V  ddd          d{V  n# 1 d{V swxY w Y   nb# t          j	        t          j
        f$ rD d| _        t          j        dk    r*t          j                    x}r|                                r Y nw xY w	 t          |          4 d{V  | j        +| j                            t          j	                               | j        8| j                                        st          j        | j                   d{V  ddd          d{V  n# 1 d{V swxY w Y   n[# t          j	        t          j
        f$ r= t          j        dk    r*t          j                    x}r|                                r Y nw xY w| j        | j                                         |                                  dS )zDo worker process exit preparations.

        We need to clean up everything and stop accepting requests.
        It is especially important for keep-alive connections.
        TN      )r^   rN   cancelra   _loopcreate_futurerS   r   asyncioCancelledErrorTimeoutErrorsysversion_infocurrent_task
cancellingr_   _cancelrU   doneshieldforce_close)r{   r   tasks      r8   shutdownzRequestHandler.shutdown   sg      !!-"))+++ $ 	 $(:#;#;#=#=D 
'00 / / / / / / / /......../ / / / / / / / / / / / / / / / / / / / / / / / / / /*G,@A   '+$$//!(!5!7!77 0)) 0 	#G,, = = = = = = = =(4)11'2H2J2JKKK%1$:L:Q:Q:S:S1!.);<<<<<<<<<= = = = = = = = = = = = = = = = = = = = = = = = = = = &(<= 	 	 	 G++$1333T ,OO%% , 	 )%%'''so   B %B3B 
BB BB AC65C6:F% A2FF% 
FF%  F!F% %AG=<G=r   c                    t                                          |           t          t          j        |          }| j        rt          |           | j        J | j                            | |           | j        }t          j
        dk    r*t          j        |                                 |d          }n'|                    |                                           }|| _        d S )Nr      Trp   eager_start)rs   connection_mader   r   	TransportrL   r#   rI   r   r   r   Taskstartcreate_taskrU   )r{   r   real_transportrp   r   r|   s        r8   r   zRequestHandler.connection_madeR  s    	***g/;; 	*.)))}(((%%dN;;;zw&&<

4TJJJDD##DJJLL11D!r7   r@   c                 R   | j         d S | j                             | |           | j         j        }|                                  t	                                          |           d | _         d | _        d | _        d | _        | j        | j        	                                 | j
        +|t          d          }| j
                            |           |r | j        | j        	                                 d | _        | j        "| j                                         d | _        d S d S )NzConnection lost)rI   connection_losthandler_cancellationr   rs   rK   rJ   rX   rN   r   r_   ConnectionResetErrorr   rU   rW   feed_eof)r{   r@   r   r|   s      r8   r   zRequestHandler.connection_lostc  s0   = F%%dC000  $}A$$$ $ $#!-"))+++ ,{*+<==!))#... 	(D$6$B%%'''!+ ))+++#'D    ,+r7   parserc                     | j         J || _         | j        r(| j                             | j                   d| _        d S d S )Nr7   )rW   rR   	feed_data)r{   r   s     r8   
set_parserzRequestHandler.set_parser  sV    #+++% 	% **4+=>>>!$D	% 	%r7   c                     d S r   r6   r   s    r8   eof_receivedzRequestHandler.eof_received  s    r7   datac                    | j         s| j        rd S | j        | j        s| j        J 	 | j                            |          \  }}}n:# t          $ r-}t          d||j                  t          fg}d}d}Y d }~nd }~ww xY w|pdD ]1\  }}| xj
        dz  c_
        | j                            ||f           2| j        }|r+|)|                                s|                    d            || _        |r|r|| _        d S d S d S | j        | j        r|r| xj        |z  c_        d S |r5| j                            |          \  }	}|	r|                                  d S d S d S )Ni  )r?   r@   rA   Fr7   r6   r   )r^   r]   rW   rV   rX   r   r   r>   rA   r!   rG   rQ   appendrT   r   
set_resultrR   close)
r{   r   messagesupgradedtailr@   msgpayloadwaitereofs
             r8   data_receivedzRequestHandler.data_received  s    	 	F '''333+/+?+I+I$+O+O((DD&   Sc3;GGGW ! !)B 6 6W##q(##%%sGn5555\F (F.v{{}}.!!$'''$DM *D *%)"""* * * * !)dm))$&  	,66t<<IC 

	 	 s   A 
A?#A::A?valc                 f    || _         | j        r"| j                                         d| _        dS dS )zMSet keep-alive connection mode.

        :param bool val: new state.
        N)rH   rN   r   )r{   r   s     r8   
keep_alivezRequestHandler.keep_alive  sC    
 ! 	*"))+++%)D"""	* 	*r7   c                 X    d| _         | j        r| j                                         dS dS )zClose connection.

        Stop accepting new pipelining messages and close
        connection when handlers done processing messages.
        TN)r]   rT   r   r   s    r8   r   zRequestHandler.close  s9     < 	"L!!!!!	" 	"r7   c                     d| _         | j        r| j                                         | j        "| j                                         d| _        dS dS )zForcefully close connection.TN)r^   rT   r   r   r   r   s    r8   r   zRequestHandler.force_close  sW     < 	"L!!!>%N  """!DNNN &%r7   requestresponsetimec                     | j         O| j         j        rEt          r|J | j                             ||| j                                        |z
             d S d S d S r   )r   rz   r   logr   r   )r{   r   r   r   s       r8   
log_accesszRequestHandler.log_access  sl     )d.@.H) ('''""7Hdjoo6G6G$6NOOOOO *)))r7   argskwc                 <    | j         r | j        j         |i | d S d S r   )r[   rZ   r{   r   r   s      r8   	log_debugzRequestHandler.log_debug  s6    : 	+DKt*r*****	+ 	+r7   c                 *     | j         j        |i | d S r   )rZ   	exceptionr   s      r8   log_exceptionzRequestHandler.log_exception  s"    t*r*****r7   c                 8   d | _         | j        s| j        sd S | j        }|                                }| j        }||k     r"|                    || j                  | _         d S | j        r/| j        	                                s| 
                                 d S d S d S r   )rN   r^   rH   r   r   rM   call_at_process_keepaliverT   r   r   )r{   rp   now
close_times       r8   r   z!RequestHandler._process_keepalive  s    !% 	DO 	Fziikk4
%)\\*d>U%V%VD"F < 	 1 1 3 3 		 	 	 	r7   
start_timeru   c                   K   d| _         	 	 || _         ||           d {V }d | _        n# d | _        w xY w	 t          |dd          rt          j        dt
                     |                     |||           d {V \  }}n# t          $ r,}|}|                     |||           d {V \  }}Y d }~nd }~wt          j	        $ r  t          j
        $ rW}|                     d|           |                     |d          }|                     |||           d {V \  }}Y d }~nQd }~wt          $ rA}|                     |d|          }|                     |||           d {V \  }}Y d }~nd }~ww xY wd| _         | j        | j                            d            n.# d| _         | j        | j                            d            w w xY w||fS )	NT__http_exception__Fzlreturning HTTPException object is deprecated (#2415) and will be removed, please raise the exception insteadzRequest handler timed out.exc_infoi    )ra   r_   getattrwarningswarnDeprecationWarningfinish_responser$   r   r   r   r   handle_error	ExceptionrS   r   )r{   r   r   ru   respresetr@   s          r8   _handle_requestzRequestHandler._handle_request  s      %)! 	6-(/%,_W55555555(,%%%,,,,% t1599 9 '	   !% 4 4WdJ O OOOOOOOKD%%-  	P 	P 	PD $ 4 4WdJ O OOOOOOOKD%%%%%%% 	 	 	# 	P 	P 	PNN7#NFFF$$Wc22D $ 4 4WdJ O OOOOOOOKD%%%%%% 	P 	P 	P$$Wc377D $ 4 4WdJ O OOOOOOOKD%%%%%%	P ).D%#/$//555 ).D%#/$//5555 0 U{sa   , B 	5B AF# 
E7"B61F# 6!E7AD)$F# )E767E2-F# 2E77F# #+Gc           	      
  K   | j         }| j        }|J | j        }d}| j        J | j        J | j        s
| j        s;	 |                                | _        | j         d{V  d| _        n# d| _        w xY w| j        	                                \  }}| j
        r|                                nd}|xj        dz  c_        t          | |          }t          |t                    r|                     |          }	t"          }n| j        }	|                     ||| || j        pt'          j        |                    }
	 |                     |
||	          }t,          j        dk    rt'          j        ||d          }n|                    |          }	 | d{V \  }}nK# t4          $ r> |                     d           Y d|
_        | j        ||                     d           n[w xY w~|r=|                     d           	 d|
_        | j        ||                     d           nt=          |j                  | _         |!                                s| j"        }| j        s-|r*|                     d	|           |                                }||z   }	 |!                                s||k     rtG          ||z
            4 d{V  |$                                 d{V  ddd          d{V  n# 1 d{V swxY w Y   |                                }|!                                s||k     n[# t&          j%        t&          j&        f$ r= t,          j        d
k    r*t'          j                    x}r|'                                r Y nw xY w|!                                s0| j        s)|                     d           | (                                 |)                    tT                     n# t&          j%        $ r+ |                     d           | +                                  tX          $ r5}| -                    d|           | +                                 Y d}~n&d}~wt\          $ r | +                                  w xY wd|
_        | j        ||                     d           n,# d|
_        | j        ||                     d           w w w xY w| j         rT| j/        sM| j        sF|                                |z   }|| _0        | j1         |2                    || j3                  | _1        nn| j        
| j        s)d| _        | j        | j        (                                 dS dS dS )a_  Process incoming request.

        It reads request line, request headers and request payload, then
        calls handle_request() method. Subclass has to override
        handle_request(). start() handles various exceptions in request
        or response handling. Connection is being closed always unless
        keep_alive(True) specified.
        Nr   r   Tr   z&Ignored premature client disconnectionz'Ignored premature client disconnection.z(Ignored premature client disconnection 2z'Start lingering close timer for %s sec.r   zUncompleted request.zUnhandled exceptionr   )4r   rI   rO   rK   rJ   r^   rQ   r   rT   popleftrb   r   requests_countr   
isinstancer>   _make_error_handlerERRORrU   r   r   r   r   r   r   r   ConnectionErrorr   _taskr   boolr   rH   is_eofrP   r   readanyr   r   r   r   set_exception_PAYLOAD_ACCESS_ERRORr   r   r   rD   r]   rM   rN   r   r   )r{   rp   ro   re   r   rA   r   r   writerru   r   coror   r   rk   r   end_ttr@   r   s                       r8   r   zRequestHandler.start  s      z-""" 3$000$000# p	> ((#'#5#5#7#7DL,&&&&&&&#'DLL4DL''''#~5577GW $(#8BDIIKKKdE""a'""!$--F'8,, 8"&":":7"C"C"&"7
 ++"@g&:4&@&@ GCN++GUOLL#w.."<4TJJJDD++D11D(,******KD%%&   NN#KLLLl !%>)d.>NN#LMMMu
  NN#MNNN` !%>)d.>NN#LMMM_ #'t"7"7 ~~'' %%)%9N, & &E~   #iikk #n 4&&-nn&6&6 23;;+7+D+D !< !< !< !< !< !< !< !<*1//*;*;$;$;$;$;$;$;$;!< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< !< '+iikk	 '.nn&6&6 23;;
 !( 68LM & & & # 0G ; ;*1*>*@*@%@Q !<$%LLNN !< !&& #>>++ %D4E %'=>>>

%%&;<<<<)   GHHH  """ # # #""#83"GGG  """"""""      """ !%>)d.>NN#LMMM !%>)d.>NN#LMMMM *.>  	t{ 	4;L 	!YY[[+<<
2</)1-1\\"D$;. .D* a # p	f   	'!%D~)$$&&&&&	' 	'))s    &A. .	A7?AO4 F  O4  G(?O4 'G((O4 +A/O4 2L: K:(L: :
LL: L1L: 9O4 :ANO4 NA!O4 3R2 4AR	6+Q&!R2 &#R		R2 2)Sr   c                   K   |                                  | j        N| j                            d           d| _        | j        r&| j                            | j                   d| _        	 |j        }n# t          $ r ||                     d           n(|                     d	                    |                     t                      }t          |j        |j        |j        |j                  }|j        }Y nw xY w	  ||           d{V  |                                 d{V  n+# t"          $ r |                     |||           |dfcY S w xY w|                     |||           |dfS )a   Prepare the response and write_eof, then log access.

        This has to
        be called within the context of any exception so the access logger
        can get exception information. Returns True if the client disconnects
        prematurely.
        NFr7   z+Missing return statement on request handlerz7Web-handler should return a response instance, got {!r})r?   reasontextheadersT)_finishrX   set_upgradedrV   rR   r   prepareAttributeErrorr   r   r%   r(   r?   r  r  r  	write_eofr   r   )r{   r   r   r   prepare_methr@   s         r8   r   zRequestHandler.finish_response  s      	+ --e444!DM! )$..t/ABBB%("	(<LL 	( 	( 	(|""#PQQQQ""%vd||   *++Cz#*38S[  D  <LLL	(	,w'''''''''.."""""""""" 	 	 	OOGT:666:	 	z222U{s%   -A5 5BC>=C>+D. .%EEr   r?   rA   c                    | j         dk    r8t          |t                    r#| j                            d|j        |           n|                     d|j        |           |j        j        dk    rt          d          d}|t          j        k    rd                    t          j                  }t          j        j        }d}| j        r?t          t                    5  t!          j                    }ddd           n# 1 swxY w Y   d	|j                            d
d          v r1|rt)          |          }d| d}d                    ||          }d	}n|r|}|dz   |z   }t+          |||          }	|	                                 |	S )zHandle errors.

        Returns HTTP response with specific status code. Logs additional
        information. It always closes current connection.
        r   zError handling request from %sr   r   zMResponse is sent already, cannot send another response with the error messagez
text/plainz{0.value} {0.phrase}Nz	text/htmlAccept z<h2>Traceback:</h2>
<pre>z</pre>zV<html><head><title>{title}</title></head><body>
<h1>{title}</h1>
{msg}
</body></html>
)titler   z

)r?   r  content_type)rG   r   r   rZ   r[   remoter   r   output_sizer   r   INTERNAL_SERVER_ERRORr   descriptionr   r   	traceback
format_excr  gethtml_escaper(   r   )
r{   r   r?   r@   rA   ctr  r   tbr   s
             r8   r   zRequestHandler.handle_error  s    !##
3(F(F#
 K0'.3      0'.3    
 >%))!)  
 Z555*11*2RSSE2>CBz 0i(( 0 0"-//B0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 go11(B???? B$RBArAAAC0 &u#&..  ! C&.3.vG"EEEs   C??DDerr_infoc                 4     dt           dt          f fd}|S )Nr   r}   c                 V   K                        | j        j        j                  S r   )r   r?   r@   rA   )r   r  r{   s    r8   handlerz3RequestHandler._make_error_handler.<locals>.handler  s/      $$(,8H  r7   )r'   r)   )r{   r  r  s   `` r8   r   z"RequestHandler._make_error_handler  s<    	; 	> 	 	 	 	 	 	 	
 r7   )r   )r}   N)r   NN)8r2   r3   r4   r5   	__slots__r    r&   r   
LOG_FORMATr   AbstractEventLooprw   r   r   r   r   rE   rB   rt   r   r   r   r   r   r   r   propertyre   r   BaseTransportr   rD   r   r	   r   r   bytesr   r   r   r   r'   r)   r   r   r   r   r   r
   r   r   r   r   r>   r   __classcell__)r|   s   @r8   r*   r*   h   s(       % %NIN $("&7C*!-!8! " $! $()'O) O) O)O) '	O) !O) O) O) 34O) O) O) O) O) O) O)  !O)" #O)$ %O)& !&'O) O) O) O) O) O)b
# 
 
 
 
 
X&67 
 
 
 
 
	%U3S##56c3hGH	I
 
 
 
 '5 ' ' ' X'0 0huo 0 0 0 0 0d")> "4 " " " " " ""(8M#: (t ( ( ( ( ( (@% % % % % %   %% %D % % % %N*d *t * * * *" " " "" " " "P"P.<PDLUOP	P P P P+s +# +$ + + + ++3 +c +d + + + +   ")) UO) ";->1J"JK	)
 
~t#	$) ) ) )VG' G' G' G'R("(*8(FNuo(	~t#	$( ( ( (Z '+!%< << < m$	<
 #< 
< < < <| 	;->!::	;       r7   )Pr   asyncio.streamsr   r  r   collectionsr   
contextlibr   htmlr   r  httpr   loggingr   typingr   r	   r
   r   r   r   r   r   r   r   r   attryarl	propcacher   abcr   r   base_protocolr   helpersr   r   r   r   r   r   http_exceptionsr   r   r   r    streamsr!   r"   tcp_helpersr#   web_exceptionsr$   r%   web_logr&   web_requestr'   web_responser(   r)   __all__ssl
web_serverr-   _RequestFactory_RequestHandlerURLr   r   r+   r,   r   sr>   _MsgTyper*   r6   r7   r8   <module>r@     s        



                  & & & & & &                                        + + + + + + ; ; ; ; ; ; ; ; ' ' ' ' ' ' ! ! ! ! ! !              + * * * * * - - - - - - - - 0 0 0 0 0 0 0 0 & & & & & & B B B B B B B B ! ! ! ! ! ! $ $ $ $ $ $ 2 2 2 2 2 2 2 2
I #JJJ""""""  	 K=)N*CCD		DHSMM	 	! ! ! ! !) ! ! !8 8 8 8 8 8 8 8 +*,,  T$d333       43 ((23\ABp
 p
 p
 p
 p
\ p
 p
 p
 p
 p
r7   