
    tni                        d 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mZ ddlmZmZ ddlmZmZmZmZmZmZ  ej        e          ZeZ G d d          Zd Zd	 Z G d
 de          Z G d d          Z  G d de           Z! G d de!          Z" G d de"          Z# G d de           Z$ G d de           Z% G d de           Z& G d de&e$          Z' G d de&e!          Z( G d de&e%          Z) G d  d!e$          Z* G d" d#e           Z+ G d$ d%e           Z, G d& d'e+e$          Z- G d( d)e,e%          Z. G d* d+e+e!          Z/e#e"e*e-e/e.d,Z0dS )-a  Response parsers for the various protocol types.

The module contains classes that can take an HTTP response, and given
an output shape, parse the response into a dict according to the
rules in the output shape.

There are many similarities amongst the different protocols with regard
to response parsing, and the code is structured in a way to avoid
code duplication when possible.  The diagram below is a diagram
showing the inheritance hierarchy of the response classes.

::


                                +-------------------+
                                |   ResponseParser  |
                                +-------------------+
                                ^    ^    ^   ^   ^
                                |    |    |   |   |
                                |    |    |   |   +--------------------------------------------+
                                |    |    |   +-----------------------------+                  |
                                |    |    |                                 |                  |
           +--------------------+    |    +----------------+                |                  |
           |                         |                     |                |                  |
+----------+----------+       +------+-------+     +-------+------+  +------+-------+   +------+--------+
|BaseXMLResponseParser|       |BaseRestParser|     |BaseJSONParser|  |BaseCBORParser|   |BaseRpcV2Parser|
+---------------------+       +--------------+     +--------------+  +----------+---+   +-+-------------+
          ^         ^          ^           ^        ^        ^                  ^         ^
          |         |          |           |        |        |                  |         |
          |         |          |           |        |        |                  |         |
          |        ++----------+-+       +-+--------+---+    |              +---+---------+-+
          |        |RestXMLParser|       |RestJSONParser|    |              |RpcV2CBORParser|
    +-----+-----+  +-------------+       +--------------+    |              +---+---------+-+
    |QueryParser|                                            |
    +-----------+                                       +----+-----+
                                                        |JSONParser|
                                                        +----------+

The diagram above shows that there is a base class, ``ResponseParser`` that
contains logic that is similar amongst all the different protocols (``query``,
``json``, ``rest-json``, ``rest-xml``, ``smithy-rpc-v2-cbor``).  Amongst the various services
there is shared logic that can be grouped several ways:

* The ``query`` and ``rest-xml`` both have XML bodies that are parsed in the
  same way.
* The ``json`` and ``rest-json`` protocols both have JSON bodies that are
  parsed in the same way.
* The ``rest-json`` and ``rest-xml`` protocols have additional attributes
  besides body parameters that are parsed the same (headers, query string,
  status code).

This is reflected in the class diagram above.  The ``BaseXMLResponseParser``
and the BaseJSONParser contain logic for parsing the XML/JSON body,
and the BaseRestParser contains logic for parsing out attributes that
come from other parts of the HTTP response.  Classes like the
``RestXMLParser`` inherit from the ``BaseXMLResponseParser`` to get the
XML body parsing logic and the ``BaseRestParser`` to get the HTTP
header/status code/query string parsing.

Additionally, there are event stream parsers that are used by the other parsers
to wrap streaming bodies that represent a stream of events. The
BaseEventStreamParser extends from ResponseParser and defines the logic for
parsing values from the headers and payload of a message from the underlying
binary encoding protocol. Currently, event streams support parsing bodies
encoded as JSON and XML through the following hierarchy.


                                  +--------------+
                                  |ResponseParser|
                                  +--------------+
                                    ^    ^    ^
               +--------------------+    |    +------------------+
               |                         |                       |
    +----------+----------+   +----------+----------+    +-------+------+
    |BaseXMLResponseParser|   |BaseEventStreamParser|    |BaseJSONParser|
    +---------------------+   +---------------------+    +--------------+
                     ^                ^        ^                 ^
                     |                |        |                 |
                     |                |        |                 |
                   +-+----------------+-+    +-+-----------------+-+
                   |EventStreamXMLParser|    |EventStreamJSONParser|
                   +--------------------+    +---------------------+

Return Values
=============

Each call to ``parse()`` returns a dict has this form::

    Standard Response

    {
      "ResponseMetadata": {"RequestId": <requestid>}
      <response keys>
    }

    Error response

    {
      "ResponseMetadata": {"RequestId": <requestid>}
      "Error": {
        "Code": <string>,
        "Message": <string>,
        "Type": <string>,
        <additional keys>
      }
    }

    N)ETreeXMLParseError)EventStreamNoInitialResponseError)CachedPropertyensure_booleanis_json_value_headerlowercase_dictmerge_dictsparse_timestampc                        e Zd Zd Zd Zd ZdS )ResponseParserFactoryc                     i | _         d S N)	_defaultsselfs    M/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/botocore/parsers.py__init__zResponseParserFactory.__init__   s        c                 :    | j                             |           dS )aO  Set default arguments when a parser instance is created.

        You can specify any kwargs that are allowed by a ResponseParser
        class.  There are currently two arguments:

            * timestamp_parser - A callable that can parse a timestamp string
            * blob_parser - A callable that can parse a blob type

        N)r   update)r   kwargss     r   set_parser_defaultsz)ResponseParserFactory.set_parser_defaults   s      	f%%%%%r   c                 6    t           |         } |di | j        S )N )PROTOCOL_PARSERSr   )r   protocol_name
parser_clss      r   create_parserz#ResponseParserFactory.create_parser   s$    %m4
z++DN+++r   N)__name__
__module____qualname__r   r   r    r   r   r   r   r      sA          
& 
& 
&, , , , ,r   r   c                 D    t                                          |           S r   )r   r    )protocols    r   r    r       s     ""00:::r   c                       fd}|S )Nc                 Z    t          |d          r|j        }|d}n|} | ||          S )Ntext )hasattrr(   )r   shapenode_or_stringr(   funcs       r   _get_text_contentz(_text_content.<locals>._get_text_content   sC    >6** 	"!&D| !DtD%&&&r   r   )r-   r.   s   ` r   _text_contentr/      s$    
' 
' 
' 
' 
' r   c                       e Zd ZdS )ResponseParserErrorN)r!   r"   r#   r   r   r   r1   r1      s        Dr   r1   c                       e Zd ZdZdZdZdZddZd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )ResponseParserao  Base class for response parsing.

    This class represents the interface that all ResponseParsers for the
    various protocols must implement.

    This class will take an HTTP response and a model shape and parse the
    HTTP response into a dictionary.

    There is a single public method exposed: ``parse``.  See the ``parse``
    docstring for more info.

    utf-8N)headerheaders
statusCodec                     |t           }|| _        || j        }|| _        d | _        | j        |                     ||          | _        d S d S r   )DEFAULT_TIMESTAMP_PARSER_timestamp_parser_default_blob_parser_blob_parser_event_stream_parserEVENT_STREAM_PARSER_CLS)r   timestamp_parserblob_parsers      r   r   zResponseParser.__init__   sh    #7!13K'$(!'3(,(D(D +) )D%%% 43r   c                 *    t          j        |          S r   )base64	b64decoder   values     r   r;   z#ResponseParser._default_blob_parser   s     &&&r   c                    t                               d|d                    t                               d|d                    |d         dk    ro|                     |          r|                     |          }nZ|                     |          r|                     ||          }|S |                     ||          }n|                     ||          }|r|j        	                    d          r|S t          |t                    rV|	                    di           }|d         |d	<   |d         }t          |          |d
<   ||d<   |                     ||           |S )a>  Parse the HTTP response given a shape.

        :param response: The HTTP response dictionary.  This is a dictionary
            that represents the HTTP request.  The dictionary must have the
            following keys, ``body``, ``headers``, and ``status_code``.

        :param shape: The model shape describing the expected output.
        :return: Returns a dictionary representing the parsed response
            described by the model.  In addition to the shape described from
            the model, each response will also have a ``ResponseMetadata``
            which contains metadata about the response, which contains at least
            two keys containing ``RequestId`` and ``HTTPStatusCode``.  Some
            responses may populate additional keys, but ``RequestId`` will
            always be present.

        zResponse headers: %rr6   zResponse body:
%rbodystatus_codei-  eventstreamResponseMetadataHTTPStatusCodeHTTPHeaders)LOGdebug_is_generic_error_response_do_generic_error_parse_is_modeled_error_shape_do_modeled_error_parse_do_error_parse	_do_parseserializationget
isinstancedictr
   _add_checksum_response_metadata)r   responser+   parsedresponse_metadatar6   s         r   parsezResponseParser.parse   su   " 			((9*=>>>		&(8999M"c))..x88 ?55h??--e44 ?55hFF--h>>^^He44F  	U(,,];; 	M fd## 		N &

+=r B B2:=2I./ y)G/=g/F/Fm,):F%&00;LMMMr   c                     |                     di                                di           }|                     d          }|r||d<   d S d S )Ncontextchecksumresponse_algorithmChecksumAlgorithmrV   )r   rZ   r\   checksum_context	algorithms        r   rY   z.ResponseParser._add_checksum_response_metadata  s^    #<<	266:::rJJ$(()=>>	 	?5>1222	? 	?r   c                 @    |d uo|j                             dd          S )N	exceptionF)metadatarV   )r   r+   s     r   rQ   z&ResponseParser._is_modeled_error_shape%  s$    D KU^%7%7U%K%KKr   c                     |d         dk    r@d|vs|d         dS |d                                          }|                    d          p| S d S )NrH   i  rG   Ts   <html>)strip
startswith)r   rZ   rG   s      r   rO   z)ResponseParser._is_generic_error_response(  se     M"c))X%%&)9)AtF#))++D??9--9T9 *)r   c                     t                               d           t          |d                   t          j        j                            |d         d          di dS )NzlReceived a non protocol specific error response from the service, unable to populate error code and message.rH   r)   CodeMessageErrorrJ   )rM   rN   strhttpclient	responsesrV   r   rZ   s     r   rP   z&ResponseParser._do_generic_error_parse;  sr     			B	
 	
 	
 H]344;044]+R   !#
 
 	
r   c                 :    t          | j        j         d          )Nz
._do_parseNotImplementedError	__class__r!   r   rZ   r+   s      r   rT   zResponseParser._do_parseL  s    !T^%<"H"H"HIIIr   c                 :    t          | j        j         d          )Nz._do_error_parserx   r{   s      r   rS   zResponseParser._do_error_parseO  s    !T^%<"N"N"NOOOr   c                 :    t          | j        j         d          )Nz._do_modeled_error_parserx   )r   rZ   r+   r[   s       r   rR   z&ResponseParser._do_modeled_error_parseR  s%    !~&@@@
 
 	
r   c                 V    t          | d|j         | j                  } |||          S )N_handle_)getattr	type_name_default_handle)r   r+   nodehandlers       r   _parse_shapezResponseParser._parse_shapeW  s:    .U_..0D
 
 wud###r   c                 t    g }|j         }|D ]+}|                    |                     ||                     ,|S r   )memberappendr   )r   r+   r   r[   member_shapeitems         r   _handle_listzResponseParser._handle_list]  sK     | 	A 	ADMM$++L$??@@@@r   c                     |S r   r   r   r+   rE   s      r   r   zResponseParser._default_handlef  s    r   c                 v    | j         }|d                             d          }t          |d         |||          S )Nr_   operation_namerG   )r=   rV   r   )r   rZ   r+   parsernames        r   _create_event_streamz#ResponseParser._create_event_streami  s<    *	"&&'7888F+UFDAAAr   c                 ,    t          |          d         S Nr   )listrD   s     r   _get_first_keyzResponseParser._get_first_keyn  s    E{{1~r   c                    j         r|                                }|                    dd            d |                                D             }t	          |          dk    rd}t          |j        z            |                     |          }fdj        D             }||vrt          
                    d|           dS dS )	N__typec                     i | ]
\  }}|||S r   r   .0kvs      r   
<dictcomp>zCResponseParser._has_unknown_tagged_union_member.<locals>.<dictcomp>u  &       A!-1---r      CInvalid service response: %s must have one and only one member set.c                 \    g | ](}j         |         j                            d |          )S )r   )membersrU   rV   )r   r   r+   s     r   
<listcomp>zCResponseParser._has_unknown_tagged_union_member.<locals>.<listcomp>  sC     ' ' ' f%377GG' ' 'r   zqReceived a tagged union response with member unknown to client: %s. Please upgrade SDK for full response support.TF)is_tagged_unioncopypopitemslenr1   r   r   r   rM   info)r   r+   rE   cleaned_value	error_msgtagserialized_member_namess    `     r    _has_unknown_tagged_union_memberz/ResponseParser._has_unknown_tagged_union_memberq  s     	!JJLLMh--- !.!4!4!6!6  M =!!Q&&&  *)ej*@AAA%%m44C' ' ' '#m' ' '# 111D  
 tur   c                     dd|iiS )NSDK_UNKNOWN_MEMBERr   r   )r   r   s     r   #_handle_unknown_tagged_union_memberz2ResponseParser._handle_unknown_tagged_union_member  s    $vsm44r   c                     |d         }|                     d          }t          |          dk    r,|d         r$||d         d<   |d         |d         d<   |d         S |S )	z
        Error response may contain an x-amzn-query-error header to translate
        errors codes from former `query` services into other protocols. We use this
        to do our lookup in the errorfactory for modeled errors.
        x-amzn-query-error;   r   rq   QueryErrorCoder   Type)splitr   )r   coder6   errorquery_errorquery_error_componentss         r    _do_query_compatible_error_parsez/ResponseParser._do_query_compatible_error_parse  st     23!,!2!23!7!7%&&!++0Fq0I+/3E'N+,%;A%>E'N6")!,,r   NN)r!   r"   r#   __doc__DEFAULT_ENCODINGr>   KNOWN_LOCATIONSr   r;   r]   rY   rQ   rO   rP   rT   rS   rR   r   r   r   r   r   r   r   r   r   r   r   r3   r3      sS         "
 :O   ' ' '/ / /b? ? ?L L L: : :&
 
 
"J J JP P P
 
 

$ $ $    B B B
    65 5 5    r   r3   c                        e Zd Zd fd	Zd Zd Z fdZd Zd Zd Z	d	 Z
d
 Zd Zed             Zed             Zed             Zed             Zed             Zed             ZeZeZeZ xZS )BaseXMLResponseParserNc                 ~    t                                          ||           t          j        d          | _        d S )Nz{.*})superr   recompile_namespace_re)r   r?   r@   rz   s      r   r   zBaseXMLResponseParser.__init__  s6    );777Z//r   c                    i }|j         }|j        }|j                            d          pd}|j                            d          pd}|j                            d          rt	          |t
                    s|g}|D ]l}|D ]b}	|                     |	          }
|
|k    r|                     ||	          }4|
|k    r|                     ||	          }Qt          d|
           |||<   m|S )Nr   keyrE   	flattenedzUnknown tag: )	r   rE   rU   rV   rW   r   	_node_tagr   r1   )r   r+   r   r[   	key_shapevalue_shapekey_location_namevalue_location_namekeyval_nodesingle_pairtag_namekey_nameval_names                r   _handle_mapz!BaseXMLResponseParser._handle_map  s   I	k%377??H5)7;;FCCNw"";// 	
48N8N 	6D 
	( 
	(K* J J>>+66000#00KHHHH!444#00kJJHH-.Hh.H.HIII'F8r   c                 B    | j                             d|j                  S Nr)   )r   subr   )r   r   s     r   r   zBaseXMLResponseParser._node_tag  s    !%%b$(333r   c                     |j                             d          rt          |t                    s|g}t	                                          ||          S )Nr   )rU   rV   rW   r   r   r   )r   r+   r   rz   s      r   r   z"BaseXMLResponseParser._handle_list  sP     "";// 	
48N8N 	6Dww##E4000r   c                 p   i }|j         }|j                            dd          r|                     |          }|                     |          }|                     ||          r*|                     |          }|                     |          S |D ]#}||         }|j                            d          }	|	| j	        v s|j                            d          rI| 
                    ||          }
|                    |
          }||                     ||          ||<   |j                            d          ryi }|j        d         }|j                                        D ]A\  }}| j                            |                    d          d         dz   |          }|||<   B||v r||         ||<   %|S )	Nrg   FlocationeventheaderxmlAttributer   :r   )r   rh   rV   _get_error_root_build_name_to_xml_noder   r   r   rU   r   _member_key_namer   attribr   r   r   r   )r   r+   r   r[   r   xml_dictr   member_namer   r   xml_namemember_nodeattribslocation_namer   rE   new_keys                    r   _handle_structurez'BaseXMLResponseParser._handle_structure  s   ->k511 	.''--D//5500AA 	A%%h//C;;C@@@" 	A 	AK";/L#155jAAHD000-11-@@ 1
 ,,\;GGH",,x00K&&*&7&7 +' '{## +//?? 	A , :6 B"&+"3"3"5"5 - -JC"044%++C003c93 G (-GG$$ G++*1-*@F;'r   c                 |    |                      |          dk    r"|D ]}|                      |          dk    r|c S  |S )NErrorResponserq   r   )r   original_rootchilds      r   r   z%BaseXMLResponseParser._get_error_root  sS    >>-((O;;& ! !>>%((G33 LLL 4r   c                     |j         dk    r=|j                            d          r#|j        j                            d          }||S |j                            d          }||S |S )Nr   r   r   )r   rU   rV   r   )r   r+   r   list_member_serialized_nameserialized_names        r   r   z&BaseXMLResponseParser._member_key_name  s{    
 ?f$$)<)@)@)M)M$*/,*D*H*H+ +' +622-11&99&""r   c                 :   t          |t                    r|                     |d                   S i }|D ]e}|                     |          }||v rEt          ||         t                    r||                             |           R||         |g||<   `|||<   f|S r   )rW   r   r   r   r   )r   parent_noder   r   r   s        r   r   z-BaseXMLResponseParser._build_name_to_xml_node  s     k4(( 	@//A??? 	% 	%D..&&Ch
 hsmT22 :SM((.... &.c]D$9HSMM $r   c                    	 t          j        t          j                    | j                  }|                    |           |                                }n'# t          $ r}t          d| d|           d }~ww xY w|S )N)targetencodingzUnable to parse response (z6), invalid XML received. Further retries may succeed:
)r   	XMLParserTreeBuilderr   feedcloser   r1   )r   
xml_stringr   rootes        r   _parse_xml_string_to_domz.BaseXMLResponseParser._parse_xml_string_to_dom  s    
	_(**T5J  F KK
###<<>>DD 	 	 	%TQ T TGQT T  	
 s   AA 
A<"A77A<c                     |                                 D ]L\  }}t          |          r.|                     |          }|                     |          ||<   B|j        ||<   M|S r   )r   r   r   _replace_nodesr(   )r   r[   r   rE   sub_dicts        r   r  z$BaseXMLResponseParser._replace_nodes'  si     ,,.. 	) 	)JCE{{ )77>>"11(;;s#jsr   c                     |dk    rdS dS )NtrueTFr   r   r+   r(   s      r   _handle_booleanz%BaseXMLResponseParser._handle_boolean0  s    6>>45r   c                      t          |          S r   floatr  s      r   _handle_floatz#BaseXMLResponseParser._handle_float7  s    T{{r   c                 ,    |                      |          S r   r:   r  s      r   _handle_timestampz'BaseXMLResponseParser._handle_timestamp;  s    %%d+++r   c                      t          |          S r   intr  s      r   _handle_integerz%BaseXMLResponseParser._handle_integer?  s    4yyr   c                     |S r   r   r  s      r   _handle_stringz$BaseXMLResponseParser._handle_stringC  s    r   c                 ,    |                      |          S r   r<   r  s      r   _handle_blobz"BaseXMLResponseParser._handle_blobG  s      &&&r   r   )r!   r"   r#   r   r   r   r   r   r   r   r   r  r  r/   r  r  r  r  r  r  _handle_character_handle_double_handle_long__classcell__rz   s   @r   r   r     sw       0 0 0 0 0 0  *4 4 41 1 1 1 1# # #J       .       ]   ] , , ],   ]   ] ' ' ]' '"N"LLLLLr   r   c                   4    e Zd Zd Zd Zd Zd	dZd Zd ZdS )
QueryParserc                 (   |d         }|                      |          }|                     |          }|                     |           d|v r(|                    |                    d                     d|v rd|                    d          i|d<   |S )NrG   Errors	RequestIdrJ   )r  r   r  r   r   )r   rZ   r+   xml_contentsr   r[   s         r   rS   zQueryParser._do_error_parseQ  s    ',,\::--d33F### vMM&**X..///&  *5vzz+7N7N)OF%&r   c                 2    |                      ||d          S )NFinject_metadata_parse_body_as_xmlr{   s      r   rR   z#QueryParser._do_modeled_error_parsea  s    &&x&NNNr   c                 2    |                      ||d          S )NTr%  r'  r{   s      r   rT   zQueryParser._do_parsed  s    &&x&MMMr   Tc                     |d         }|                      |          }i }|B|}d|j        v r!|                     |j        d         |          }|                     ||          }|r|                     ||           |S )NrG   resultWrapper)r  rU   _find_result_wrapped_shaper   _inject_response_metadata)r   rZ   r+   r&  r#  r   r[   starts           r   r(  zQueryParser._parse_body_as_xmlg  s    ',,\::E%"55577'8$  &&ue44F 	9**4888r   c                 <    |                      |          }||         S r   )r   )r   element_namexml_root_nodemappings       r   r,  z&QueryParser._find_result_wrapped_shapev  s     ..}==|$$r   c                     |                      |          }|                    d          }|@|                      |          }|                                D ]\  }}|j        ||<   ||d<   d S d S NrJ   )r   rV   r   r(   )r   r   inject_intor2  
child_nodesub_mappingr   rE   s           r   r-  z%QueryParser._inject_response_metadataz  s    ..t44[[!344
!66zBBK)//11 . .
U#(:C  .9K*+++	 "!r   N)T)	r!   r"   r#   rS   rR   rT   r(  r,  r-  r   r   r   r  r  P  sy           O O ON N N   % % %: : : : :r   r  c                   *     e Zd Zd Z fdZd Z xZS )EC2QueryParserc                 z    |                      |          }|                    d          }|d|j        i|d<   d S d S )N	requestIdr"  rJ   )r   rV   r(   )r   r   r5  r2  r6  s        r   r-  z(EC2QueryParser._inject_response_metadata  sL    ..t44[[--
!/:JO.LK*+++ "!r   c                     t                                          ||          }d|v rd|                    d          i|d<   |S )N	RequestIDr"  rJ   )r   rS   r   )r   rZ   r+   originalrz   s       r   rS   zEC2QueryParser._do_error_parse  sN     77**8U;;(""X\\+66,H'( r   c                     |D ]?}|                      |          dk    r$|D ]!}|                      |          dk    r|c c S "@|S )Nr!  rq   r   )r   r   r   errors_childs       r   r   zEC2QueryParser._get_error_root  sl    " 	, 	,E~~e$$00$) , ,L~~l33w>>++++++ ?r   )r!   r"   r#   r-  rS   r   r  r  s   @r   r9  r9    sY        M M M    (      r   r9  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	BaseJSONParserc                 t   i }|j         r|}n|j        }|d S i }|                     ||          r*|                     |          }|                     |          S |D ][}||         }|j                            d|          }|                    |          }	|	|                     ||         |	          ||<   \|S )Nr   )is_document_typer   r   r   r   rU   rV   r   )
r   r+   rE   final_parsedmember_shapesr   r   r   	json_name	raw_values
             r   r   z BaseJSONParser._handle_structure  s    ! 	 LL!MM} tL44UEBB E))%00??DDD,  ,[9(6::6;OO	!IIi00	(040A0A%k2I1 1L- r   c                     i }|j         }|j        }|                                D ]6\  }}|                     ||          }|                     ||          }|||<   7|S r   )r   rE   r   r   )	r   r+   rE   r[   r   r   r   
actual_keyactual_values	            r   r   zBaseJSONParser._handle_map  sl    I	k++-- 	. 	.JC**9c::J,,[%@@L!-F:r   c                 ,    |                      |          S r   r  r   s      r   r  zBaseJSONParser._handle_blob  s      '''r   c                 ,    |                      |          S r   r  r   s      r   r  z BaseJSONParser._handle_timestamp  s    %%e,,,r   c                 >   |                      |d                   }dddi d}|d         }|                    d|                    dd                    |d         d<   |                    d	          }|                    d
|ot          |                    }|fd|v r|                    dd          d         }d|v r|                    dd          d         }d|v r|                     |||          }||d         d<   |                     ||d                    |S )NrG   r)   ro   rn   rp   r6   messagero   rq   rH   r   r   r   r   #r   rn   )_parse_body_as_jsonrV   rr   r   rsplitr   r-  )r   rZ   r+   rG   r   r6   response_coder   s           r   rS   zBaseJSONParser._do_error_parse  s>   ''(899&("552NN9% %)HHtxx	2..%
 %
gy!
 !]33xx-"FC4F4FGG d{{zz#q))!,d{{{{3**1-#w..<<'5  &*E'N6"&&uhy.ABBBr   c                 P    d|v r!|d         |                     di           d<   d S d S )Nx-amzn-requestidrJ   r"  )
setdefault)r   r[   r6   s      r   r-  z(BaseJSONParser._inject_response_metadata  s?    ((EL"FF0"55kBBB )(r   c                     |si S |                     | j                  }	 t          j        |          }|S # t          $ r d|icY S w xY w)NrP  )decoder   jsonloads
ValueError)r   body_contentsrG   original_parseds       r   rR  z"BaseJSONParser._parse_body_as_json  sm     	I##D$9::	%"j..O"" 	% 	% 	% t$$$$	%s   6 AAN)
r!   r"   r#   r   r   r  r  rS   r-  rR  r   r   r   rB  rB    s~          2  ( ( (- - -" " "H  
% 
% 
% 
% 
%r   rB  c                       e Zd ZdZdZed             Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd ZdS )BaseCBORParser      c           	      h    | j         | j        | j        | j        | j        | j        | j        | j        dS )N)r   r   r                  )_parse_unsigned_integer_parse_negative_integer_parse_byte_string_parse_text_string_parse_array
_parse_map
_parse_tag_parse_simple_and_floatr   s    r    major_type_to_parsing_method_mapz/BaseCBORParser.major_type_to_parsing_method_map  sA     ++&& +	
 	
 		
r   c                 N    t          j        t          j        |                    S r   )ioBufferedReaderBytesIO)r   bytess     r   get_peekable_stream_from_bytesz-BaseCBORParser.get_peekable_stream_from_bytes  s     E!2!2333r   c                     |                      |d          }|dz	  }|dz  }|| j        v r| j        |         } |||          S t          d| d|           )Nr   rf  ra  z8Unsupported inital byte found for data item- Major type:z, Additional info: )_read_bytes_as_intrq  r1   )r   streaminitial_byte
major_typeadditional_infomethods         r   parse_data_itemzBaseCBORParser.parse_data_item  s     ..vq99!Q&
 '3>>>::FF6&/222%%(% %"% %  r   c                     ddddd}|dk     r|S ||v r||         }|                      ||          S t          d|           )Nr   r   re     )            r  zhInvalid CBOR integer returned from the service; unparsable additional info found for major type 0 or 1: )ry  r1   )r   rz  r}  additional_info_to_num_bytes	num_bytess        r   ri  z&BaseCBORParser._parse_unsigned_integer2  s    	(
 (
$ R"" <<<4_EI**69===%R@OR R  r   c                 4    d|                      ||          z
  S )N)ri  r   rz  r}  s      r   rj  z&BaseCBORParser._parse_negative_integerG  s    D00IIIIr   c                    || j         k    r,|                     ||          }|                     ||          S g }	 |                     |          rn[|                     |d          }|dz  }|                     ||          }|                    |                     ||                     qd                    |          S )NTr   ra  r   )INDEFINITE_ITEM_ADDITIONAL_INFOri  _read_from_stream_handle_break_codery  r   join)r   rz  r}  lengthchunksr{  s         r   rk  z!BaseCBORParser._parse_byte_stringK  s    dBBB11&/JJF))&&999FF**622 #66vqAA".";55foNNd44VVDDEEEF 88F###r   c                 T    |                      ||                              d          S )Nr4   )rk  rY  r  s      r   rl  z!BaseCBORParser._parse_text_string[  s&    &&v??FFwOOOr   c                 ,    | j         k    r2                     |          } fdt          |          D             S g }                               s=|                                                                                             =|S )Nc                 :    g | ]}                               S r   r  )r   _r   rz  s     r   r   z/BaseCBORParser._parse_array.<locals>.<listcomp>b  s'    HHHQD((00HHHr   )r  ri  ranger  r   r  )r   rz  r}  r  r   s   ``   r   rm  zBaseCBORParser._parse_array_  s    dBBB11&/JJFHHHHH%--HHHHE--f55 ;T11&99::: --f55 ;Lr   c                     i }|| j         k    r@|                     ||          }t          |          D ]}|                     ||           |S |                     |          s+|                     ||           |                     |          +|S r   )r  ri  r  _parse_key_value_pairr  )r   rz  r}  r   r  r  s         r   rn  zBaseCBORParser._parse_mapj  s    dBBB11&/JJF6]] : :**659999L --f55 :**65999 --f55 :Lr   c                 l    |                      |          }|                      |          }||||<   d S d S r   r  )r   rz  r   r   rE   s        r   r  z$BaseCBORParser._parse_key_value_pairw  sC    ""6**$$V,,E#JJJ r   c                     |                      ||          }|                     |          }|dk    r|                     |          S t          d|           )Nr   z*Found CBOR tag not supported by botocore: )ri  r  _parse_datetimer1   )r   rz  r}  r   rE   s        r   ro  zBaseCBORParser._parse_tag  sd    **6?CC$$V,,!88''...%BSBB  r   c                     t          |t          t          f          r|                     |          S t	          d|           )Nz Unable to parse datetime value: )rW   r  r  r:   r1   rD   s     r   r  zBaseCBORParser._parse_datetime  sI    ec5\** 	))%000%:5::  r   c                     ddd d d}||v r||         S dddd}||v r:||         \  }}t          j        ||                     ||                    d         S t          d	| d
          )NFT)            )z>er   )z>fre  )z>dr  )r  r  r  r   z0Invalid additional info found for major type 7: zI.  This indicates an unsupported simple type or an indefinite float value)structunpackr  r1   )r   rz  r}  additional_info_simple_valuesfloat_formatsfloat_formatr  s          r   rp  z&BaseCBORParser._parse_simple_and_float  s     	)
 )
% ;;;0AA
 
 
 m++&3O&D#L)=d44VYGG   "V V V V
 
 	
r   c                     t                               |                    d          d d         d          | j        k    r"|                    dt
          j                   dS d S )Nr   bigT)r  
from_bytespeek
BREAK_CODEseekosSEEK_CUR)r   rz  s     r   r  z!BaseCBORParser._handle_break_code  sT    >>&++a..!,e44GGKK2;'''4 HGr   c                 d    |                      ||          }t                              |d          S )Nr  )r  r  r  )r   rz  r  bytes       r   ry  z!BaseCBORParser._read_bytes_as_int  s+    %%fi88~~dE***r   c                 t    |                     |          }t          |          |k    rt          d          |S )NzgEnd of stream reached; this indicates a malformed CBOR response from the server or an issue in botocore)readr   r1   )r   rz  r  rE   s       r   r  z BaseCBORParser._read_from_stream  sB    I&&u::""%$  
 r   N)r!   r"   r#   r  r  r   rq  rw  r  ri  rj  rk  rl  rm  rn  r  ro  r  rp  r  ry  r  r   r   r   r`  r`  	  s        &(#J

 

 ^

4 4 4  *  *J J J$ $ $ P P P          
 
 
D  
+ + +    r   r`  c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )BaseEventStreamParserc                 T   i }|j                             d          rQ|d                             d          }|j                            |          }|r|                     ||          ||<   n:|                     |||j        |           |                     |||j        |           |S )NrI   r6   z:event-type)rU   rV   r   rT   _parse_non_payload_attrs_parse_payload)r   rZ   r+   rE  
event_typeevent_shapes         r   rT   zBaseEventStreamParser._do_parse  s    ""=11 	N!),00??J-++J77K +/>>k, ,Z( ))%   %MMMr   c           	         |d                              d          }|j                             |          }|a|                     |d                   }|                     ||          }d||                     d|                     dd                    di}n;d|d                              d	d          |d                              d
d          di}|S )Nr6   z:exception-typerG   rq   ro   rP  r)   rm   z:error-codez:error-message)rV   r   _initial_body_parser   )r   rZ   r+   exception_typeexception_shaper^  rG   r   s           r   rS   z%BaseEventStreamParser._do_error_parse  s    !),001BCC-++N;;&"66x7GHHO$$_oFFD*#xx	488Ir3J3JKK EE $Y/33M2FF'	2667GLL E r   c                    |j                             d          r|D ]}||         }|j                             d          ro|d         }|j        dk    r|}nQ|j        dk    r|                    | j                  }n+|                     |          }	|                     ||	          }|||<    d S |                     |d                   }
|                     ||
          }|                    |           d S d S )NeventeventpayloadrG   blobstring)rU   rV   r   rY  r   r  r   r   )r   rZ   r+   rF  rE  r   r   rG   parsed_body	raw_parser^  body_parseds               r   r  z$BaseEventStreamParser._parse_payload  s(   ""7++ 	-%  ,T2-11.AA #F+D#-77&*%/8;;&*kk$2G&H&H$($<$<T$B$B	&*&7&7()' ' *5L&FF #66x7GHHO++E?CCK,,,,,'	- 	-r   c                     |d         }|D ]X}||         }|j                             d          r4||v r0||         }|j        dk    r|                     |dz            }|||<   Yd S )Nr6   r   	timestampg     @@)rU   rV   r   r:   )	r   rZ   r+   rF  rE  r6   r   r   rE   s	            r   r  z.BaseEventStreamParser._parse_non_payload_attrs  s     9%! 		/ 		/D(.L)--m<< /7??#DME#-<< !% 6 6uv~ F F).L&		/ 		/r   c                      t          d          Nr  ry   r   r]  s     r   r  z)BaseEventStreamParser._initial_body_parse      
 ""7888r   N)r!   r"   r#   rT   rS   r  r  r  r   r   r   r  r    s_             *- - -,/ / /9 9 9 9 9r   r  c                       e Zd Zd ZdS )EventStreamJSONParserc                 ,    |                      |          S r   rR  r  s     r   r  z)EventStreamJSONParser._initial_body_parse      ''666r   Nr!   r"   r#   r  r   r   r   r  r    s#        7 7 7 7 7r   r  c                       e Zd Zd ZdS )EventStreamXMLParserc                 X    |st          j        d          S |                     |          S r   r   Elementr  r   r   s     r   r  z(EventStreamXMLParser._initial_body_parse#  .     	%=$$$,,Z888r   Nr  r   r   r   r  r  "  s#        9 9 9 9 9r   r  c                       e Zd Zd ZdS )EventStreamCBORParserc                 b    |dk    ri S |                      |                     |                    S Nr   )r  rw  r  s     r   r  z)EventStreamCBORParser._initial_body_parse*  s;    CI##//>>
 
 	
r   Nr  r   r   r   r  r  )  s#        
 
 
 
 
r   r  c                   ,    e Zd ZeZ	 d Zd Zd Zd ZdS )
JSONParserc                     i }|=|j         }|r|                     |||          }n|                     |d         |          }|                     ||d                    |S )NrG   r6   )event_stream_name_handle_event_stream_handle_json_bodyr-  )r   rZ   r+   r[   
event_names        r   rT   zJSONParser._do_parse7  sq    0J I228UJOO//0@%HH&&vx	/BCCCr   c                 :    |                      |d         |          S NrG   )r  r{   s      r   rR   z"JSONParser._do_modeled_error_parseB  s    %%hv&6>>>r   c                     |j         |         }|                     ||          }	 |                                }n# t          $ r d}t	          |          w xY w|                     |j        |          }|||<   |S Nz,First event was not of type initial-response)r   r   get_initial_responser   r1   r  payload	r   rZ   r+   r  event_stream_shapeevent_streamr  r   r[   s	            r   r  zJSONParser._handle_event_streamE  s    "]:600;MNN	1 5577EE% 	1 	1 	1FI%i000	1 ''u==)z	   : Ac                 X    |                      |          }|                     ||          S r   )rR  r   )r   raw_bodyr+   parsed_jsons       r   r  zJSONParser._handle_json_bodyQ  s-     ..x88  444r   N)	r!   r"   r#   r  r>   rT   rR   r  r  r   r   r   r  r  2  sY        32	 	 	? ? ?
 
 
5 5 5 5 5r   r  c                   T     e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Z fd
Z xZS )BaseRestParserc                 h    i }|                      |          |d<   |                     |||           |S r4  )_populate_response_metadata_add_modeled_parser   rZ   r+   rE  s       r   rT   zBaseRestParser._do_parseZ  sE    +/+K+K,
 ,
'( 	%>>>r   c                 |    ||S |j         }|                     ||||           |                     ||||           d S r   )r   r  r  )r   rZ   r+   rE  rF  s        r   r  z!BaseRestParser._add_modeled_parseb  sW    =%%e]L	
 	
 	
 	He]LIIIIIr   c                 8    i }|                      |||           |S r   r  r  s       r   rR   z&BaseRestParser._do_modeled_error_parsek  %    %>>>r   c                     i }|d         }d|v r|d         |d<   n(d|v r$|d         |d<   |                     dd          |d<   |S )Nr6   rV  r"  x-amz-request-id
x-amz-id-2r)   HostIdrc   r   rZ   rh   r6   s       r   r  z*BaseRestParser._populate_response_metadatap  si    9%(($+,>$?H[!!7**$+,>$?H[! ")\2!>!>HXr   c                 6   d|j         v r|j         d         }||         }|j                             d          r|                     ||          }|||<   d S |j        dv r>|d         }t	          |t
                    r|                    | j                  }|||<   d S |                     |d                   }| 	                    ||          ||<   d S |                     |d                   }| 	                    ||          }	|
                    |	           d S )Nr  rI   )r  r  rG   )rU   rV   r   r   rW   rv  rY  r   r  r   r   )
r   rZ   r+   rF  rE  payload_member_name
body_shaperG   r^  r  s
             r   r  zBaseRestParser._parse_payload}  sA   +++ #("5i"@&':;J'++M:: 00:FF480111%);;;'dE** >;;t'<==D480111"&":":8F;K"L"L484E4E5 50111 #66x7GHHO++E?CCK,,,,,r   c                 ~   |d         }|D ]}||         }|j                             d          }|'|dk    r |                     ||d                   ||<   M|dk    r|                     ||          ||<   m|dk    r>|j                             d|          }	|	|v r|                     |||	                   ||<   d S )Nr6   r   r7   rH   r5   r   )rU   rV   r   _parse_header_map)
r   rZ   r+   rF  rE  r6   r   r   r   header_names
             r   r  z'BaseRestParser._parse_non_payload_attrs  s    9%! 	 	D(.L#155jAAH\))%)%6%6 (="9& &T"" Y&&%)%;%; '& &T"" X%%*8<<VTJJ')))-):):$gk&:* *L&!	 	r   c                     i }|j                             dd                                          }|D ]K}|                                                    |          r"|t	          |          d          }||         ||<   L|S )Nr   r)   )rU   rV   lowerrk   r   )r   r+   r6   r[   prefixr  r   s          r   r  z BaseRestParser._parse_header_map  s     $((44::<<" 	4 	4K  ""--f55 4 #3v;;==1&{3tr   c                      t          d          r  r  r  s     r   r  z"BaseRestParser._initial_body_parse  r  r   c                     |}t          |          r@t          j        |                              | j                  }t          j        |          }|S r   )r	   rB   rC   rY  r   rZ  r[  )r   r+   rE   r[   decodeds        r   r  zBaseRestParser._handle_string  sL    && 	)&u--44T5JKKGZ((Fr   c                     |j                             d          }|dk    r4t          |t                    sd |                    d          D             }t                                          ||          S )Nr   r5   c                 6    g | ]}|                                 S r   )rj   )r   r   s     r   r   z/BaseRestParser._handle_list.<locals>.<listcomp>  s     777!AGGII777r   ,)rU   rV   rW   r   r   r   r   )r   r+   r   r   rz   s       r   r   zBaseRestParser._handle_list  sj    &**:66x
4(>(>77tzz#777Dww##E4000r   )r!   r"   r#   rT   r  rR   r  r  r  r  r  r  r   r  r  s   @r   r  r  Y  s          J J J  
  - - -2  0  9 9 9  1 1 1 1 1 1 1 1 1r   r  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	BaseRpcV2Parserc                     i }|R|j         }|r|                     |||          }ni }|                     |||           |                     |          |d<   |S r4  )r  r  r  r  )r   rZ   r+   r[   r  s        r   rT   zBaseRpcV2Parser._do_parse  s     % 7  =22e%6  ##HeV<<<)-)I)I* *F%& r   c                 <    ||S |                      |||           d S r   )r  r  s       r   r  z"BaseRpcV2Parser._add_modeled_parse  s+    =He\:::::r   c                 8    i }|                      |||           |S r   r  r  s       r   rR   z'BaseRpcV2Parser._do_modeled_error_parse  r  r   c                 8    i }|d         }d|v r|d         |d<   |S )Nr6   rV  r"  r   r  s       r   r  z+BaseRpcV2Parser._populate_response_metadata  s1    9%(($+,>$?H[!r   c                    i }|j         }|j        rt|                                }|                    dd            d |                                D             }t          |          dk    rd}t          ||j        z            |D ]:}||         }|                    |          }	|	| 	                    ||	          ||<   ;|S )Nr   c                     i | ]
\  }}|||S r   r   r   s      r   r   z5BaseRpcV2Parser._handle_structure.<locals>.<dictcomp>  r   r   r   r   )
r   r   r   r   r   r   r1   r   rV   r   )
r   r+   r   r[   r   r   r   r   r   r   s
             r   r   z!BaseRpcV2Parser._handle_structure  s    -  	B IIKKMh--- !.!4!4!6!6  M =!!Q&&&  *)ej*@AAA" 	 	K";/L((;//K&&*&7&7 +' '{# r   c                     |                      |d                   }|                     ||          }|                    |           d S r  )r  r   r   )r   rZ   r+   rE  r^  r  s         r   r  zBaseRpcV2Parser._parse_payload  sI    228F3CDD''??K(((((r   c                      t          d          r  r  r  s     r   r  z#BaseRpcV2Parser._initial_body_parse  r  r   N)
r!   r"   r#   rT   r  rR   r  r   r  r  r   r   r   r  r    s}           ; ; ;
  
    0) ) )
9 9 9 9 9r   r  c                   H     e Zd ZeZd Z fdZd Zd Zd Z	d Z
e	Ze
Z xZS )RestJSONParserc                 ,    |                      |          S r   r  r  s     r   r  z"RestJSONParser._initial_body_parse  r  r   c                 x    t                                          ||          }|                     ||           |S r   )r   rS   _inject_error_code)r   rZ   r+   r   rz   s       r   rS   zRestJSONParser._do_error_parse  s7    ''%88x000r   c                    |                      |d                   }d }d|d         v r|d         d         }n2d|v sd|v r*|                    d|                    dd                    }|d S t          |t                    r6|                    dd          d	                             d
d          d         }||d         d<   d S )NrG   zx-amzn-errortyper6   r   rn   r)   r   r   r   rQ  r  rq   )r  rV   rW   rr   r   rS  )r   r   rZ   rG   r   s        r   r  z!RestJSONParser._inject_error_code#  s     ''(899)!444I&'9:DDt^^v~~88FDHHVR$8$899D<FdC   	<::c1%%a(//Q77;D!%gvr   c                      t          |          S r   )r   r   s      r   r  zRestJSONParser._handle_boolean2  s    e$$$r   c                      t          |          S r   r  r   s      r   r  zRestJSONParser._handle_integer5  s    5zzr   c                      t          |          S r   r
  r   s      r   r  zRestJSONParser._handle_float8  s    U||r   )r!   r"   r#   r  r>   r  rS   r  r  r  r  r  r  r  r  s   @r   r  r    s        37 7 7    
& & &% % %     #L"NNNNNr   r  c                   $    e Zd ZeZd Zd Zd ZdS )RpcV2CBORParserc                 f    |dk    r|S |                      |          }|                     |          S r  )rw  r  )r   r]  body_contents_streams      r   r  z#RpcV2CBORParser._initial_body_parseB  sC    C  #BB 
  
 ##$8999r   c                 <   |                      |d                   }|                    d|                    dd                    ddi d}|d         }|                    d          }|&|                    d	          }|t          |          }|fd
|v r|                    d
d          d         }d|v r|                    dd          d         }d|v r|                     |||          }||d         d<   d|v r|d         |                    di           d<   |S )NrG   rP  ro   r)   rO  rp   r6   r   rH   r   r   r   rQ  r   rq   rn   rV  rJ   r"  )r  rV   rr   r   rS  r   rW  )r   rZ   r+   rG   r   r6   r   rT  s           r   rS   zRpcV2CBORParser._do_error_parseJ  sT   ''(899  88Itxx	2/F/FGG  !#
 
 9%xx!!<$LL77M(=))d{{zz#q))!,d{{{{3**1-#w..<<'5  &*E'N6"((DK"EE/44[A r   c                     |j         |         }|                     ||          }	 |                                }n# t          $ r d}t	          |          w xY w|                     |j                  }|||<   |S r  )r   r   r  r   r1   r  r  r  s	            r   r  z$RpcV2CBORParser._handle_event_streamj  s    "]:600;MNN	1 5577EE% 	1 	1 	1FI%i000	1 ))%-88)zr  N)r!   r"   r#   r  r>   r  rS   r  r   r   r   r%  r%  ?  sH        3: : :  @
 
 
 
 
r   r%  c                   J     e Zd ZeZd Zd Zd Zd Ze	 fd            Z
 xZS )RestXMLParserc                 X    |st          j        d          S |                     |          S r   r  r  s     r   r  z!RestXMLParser._initial_body_parsez  r  r   c                     |d         rB	 |                      |          S # t          $ r t                              dd           Y nw xY w|                     |          S )NrG   z2Exception caught when parsing error response body:T)exc_info)_parse_error_from_bodyr1   rM   rN   _parse_error_from_http_statusr{   s      r   rS   zRestXMLParser._do_error_parse  s     F 
	228<<<&   		H!      
 11(;;;s    &AAc                     t          |d                   t          j        j                            |d         d          d|d                             dd          |d                             dd          ddS )	NrH   r)   rm   r6   r  r  )r"  r   rp   )rr   rs   rt   ru   rV   rv   s     r   r0  z+RestXMLParser._parse_error_from_http_status  s     H]344;044]+R   &i0445GLL"9-11,CC! !
 
 	
r   c                    |d         }|                      |          }|                     |          }|                     |           |j        dk    rF|                     |          }|                    dd           |                    dd           ||dS d|v rd|                    d          i|d<   ddddi}t          ||           |S )	NrG   rq   r"  r)   r   rp   rJ   rO  )r  r   r  r   r  r   r   )r   rZ   r#  r   r[   rh   defaults          r   r/  z$RestXMLParser._parse_error_from_body  s    ',,\::--d33F###8w 77AAH
 JJ{B'''JJx$$$#BBBF""*5vzz+7N7N)OF%&B778GV$$$r   c                 L    t                                          ||          }|S r   )r   r  )r   r+   r(   rz   s      r   r  zRestXMLParser._handle_string  s!    ww%%eT22r   )r!   r"   r#   r  r>   r  rS   r0  r/  r/   r  r  r  s   @r   r+  r+  w  s        29 9 9
< < <6
 
 
  .     ]    r   r+  )ec2queryrZ  z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor)1r   rB   http.clientrs   rs  rZ  loggingr  r   r  botocore.compatr   r   botocore.eventstreamr   r   botocore.utilsr   r   r	   r
   r   r   	getLoggerr!   rM   r9   r   r    r/   	Exceptionr1   r3   r   r  r9  rB  r`  r  r  r  r  r  r  r  r  r%  r+  r   r   r   r   <module>r>     s  k kZ      				   				 				  0 0 0 0 0 0 0 0 D D D D D D D D                g!!* , , , , , , , ,*; ; ;  *	 	 	 	 	) 	 	 	W W W W W W W Wtn# n# n# n# n#N n# n# n#b1: 1: 1: 1: 1:' 1: 1: 1:h! ! ! ! ![ ! ! !H^% ^% ^% ^% ^%^ ^% ^% ^%B~ ~ ~ ~ ~^ ~ ~ ~BP9 P9 P9 P9 P9N P9 P9 P9f7 7 7 7 71> 7 7 7
9 9 9 9 902G 9 9 9
 
 
 
 
1> 
 
 
$5 $5 $5 $5 $5 $5 $5 $5Nu1 u1 u1 u1 u1^ u1 u1 u1pD9 D9 D9 D9 D9n D9 D9 D9N$# $# $# $# $#^^ $# $# $#N5 5 5 5 5o~ 5 5 5pK K K K KN$9 K K K^ )    r   