
    ]g                     b   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
JrJr  SSKJrJr  SSKJrJrJrJrJrJr  \R.                  " \5      r\r " S S5      rS rS	 r " S
 S\5      r " S S5      r  " S S\ 5      r! " S S\!5      r" " S S\"5      r# " S S\ 5      r$ " S S\ 5      r% " S S\ 5      r& " S S\&\$5      r' " S S\&\!5      r( " S S\&\%5      r) " S  S!\$5      r* " S" S#\ 5      r+ " S$ S%\ 5      r, " S& S'\+\$5      r- " S( S)\,\%5      r. " S* S+\+\!5      r/\#\"\*\-\/\.S,.r0g)-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                   &    \ rS rSrS rS rS rSrg)ResponseParserFactory   c                     0 U l         g N	_defaultsselfs    2/usr/lib/python3/dist-packages/botocore/parsers.py__init__ResponseParserFactory.__init__   s	        c                 :    U R                   R                  U5        g)a'  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_defaults)ResponseParserFactory.set_parser_defaults   s     	f%r   c                 8    [         U   nU" S0 U R                  D6$ )N )PROTOCOL_PARSERSr   )r   protocol_name
parser_clss      r   create_parser#ResponseParserFactory.create_parser   s    %m4
+DNN++r   r   N)__name__
__module____qualname____firstlineno__r   r   r$   __static_attributes__r    r   r   r   r      s    
&,r   r   c                 4    [        5       R                  U 5      $ r   )r   r$   )protocols    r   r$   r$      s     "00::r   c                    ^  U 4S jnU$ )Nc                 `   > [        US5      (       a  UR                  nUc  SnOUnT" XU5      $ )Ntext )hasattrr/   )r   shapenode_or_stringr/   funcs       r   _get_text_content(_text_content.<locals>._get_text_content   s:    >6**!&&D| !DD&&r   r    )r4   r5   s   ` r   _text_contentr7      s    
' r   c                       \ rS rSrSrg)ResponseParserError   r    N)r&   r'   r(   r)   r*   r    r   r   r9   r9      s    r   r9   c                       \ rS rSrSrSrSrSS jrS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rSrg)ResponseParser   aS  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-8Nc                     Uc  [         nXl        Uc  U R                  nX l        S U l        U R
                  b  U R                  X5      U l        g g 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   ResponseParser.__init__   sZ    #7!133K'$(!''3(,(D(D )D% 4r   c                 .    [         R                  " U5      $ r   )base64	b64decoder   values     r   rB   #ResponseParser._default_blob_parser   s     &&r   c                 d   [         R                  SUS   5        [         R                  SUS   5        US   S:  ac  U R                  U5      (       a  U R                  U5      nOLU R	                  U5      (       a  U R                  X5      nU$ U R                  X5      nOU R                  X5      nU(       a"  UR                  R                  S5      (       a  U$ [        U[        5      (       aB  UR                  S0 5      nUS   US	'   US   n[        U5      US
'   XCS'   U R                  X5        U$ )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: %rheadersz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   responser2   parsedresponse_metadatarP   s         r   parseResponseParser.parse   s(   " 			((9*=>		&(89M"c)..x8855h?--e4455hF--h>^^H4F U((,,];;M fd## &

+=r B2:=2I./ y)G/=g/Fm,):%&00Mr   c                     UR                  S0 5      R                  S0 5      nUR                  S5      nU(       a  XBS'   g g )Ncontextchecksumresponse_algorithmChecksumAlgorithmr`   )r   rd   rf   checksum_context	algorithms        r   rc   .ResponseParser._add_checksum_response_metadata  sB    #<<	26:::rJ$(()=>	5>12 r   c                 P    US L=(       a    UR                   R                  SS5      $ )N	exceptionF)metadatar`   )r   r2   s     r   r[   &ResponseParser._is_modeled_error_shape   s#    D KU^^%7%7U%KKr   c                     US   S:  a?  SU;  d  US   c  gUS   R                  5       nUR                  S5      =(       d    U(       + $ g )NrR   i  rQ   Ts   <html>)strip
startswith)r   rd   rQ   s      r   rY   )ResponseParser._is_generic_error_response#  sT     M"c)X%&)9)AF#))+D??9-9T9 *r   c                     [         R                  S5        [        US   5      [        R                  R
                  R                  US   S5      S.0 S.$ )NzlReceived a non protocol specific error response from the service, unable to populate error code and message.rR   r0   CodeMessageErrorrT   )rW   rX   strhttpclient	responsesr`   r   rd   s     r   rZ   &ResponseParser._do_generic_error_parse6  s[     			B	
 H]34;;0044]+R !#
 	
r   c                 F    [        U R                  R                   S35      e)Nz
._do_parseNotImplementedError	__class__r&   r   rd   r2   s      r   r^   ResponseParser._do_parseG  s    !T^^%<%<$=Z"HIIr   c                 F    [        U R                  R                   S35      e)Nz._do_error_parser   r   s      r   r]   ResponseParser._do_error_parseJ  s     !T^^%<%<$==M"NOOr   c                 F    [        U R                  R                   S35      e)Nz._do_modeled_error_parser   )r   rd   r2   re   s       r   r\   &ResponseParser._do_modeled_error_parseM  s%    !~~&&''?@
 	
r   c                 Z    [        U SUR                   3U R                  5      nU" X5      $ )N_handle_)getattr	type_name_default_handle)r   r2   nodehandlers       r   _parse_shapeResponseParser._parse_shapeR  s2    HU__-.0D0D
 u##r   c                 t    / nUR                   nU H#  nUR                  U R                  XE5      5        M%     U$ r   )memberappendr   )r   r2   r   re   member_shapeitems         r   _handle_listResponseParser._handle_listX  s8     ||DMM$++L?@ r   c                     U$ r   r    r   r2   rM   s      r   r   ResponseParser._default_handlea  s    r   c                 b    U R                   nUS   R                  S5      n[        US   X#U5      $ )Nrj   operation_namerQ   )rD   r`   r   )r   rd   r2   parsernames        r   _create_event_stream#ResponseParser._create_event_streamd  s7    **	"&&'788F+UDAAr   c                     [        U5      S   $ Nr   )listrL   s     r   _get_first_keyResponseParser._get_first_keyi  s    E{1~r   c                    UR                   (       a  UR                  5       nUR                  SS 5        UR                  5        VVs0 s H  u  pEUc  M
  XE_M     nnn[	        U5      S:w  a  Sn[        XaR                  -  5      eU R                  U5      nUR                   Vs/ s H,  nUR                  U   R                  R                  SU5      PM.     n	nXy;  a  Sn
[        R                  X-  5        ggs  snnf s  snf )N__type   CInvalid service response: %s must have one and only one member set.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lenr9   r   r   membersr_   r`   rW   info)r   r2   rM   cleaned_valuekv	error_msgtagr   serialized_member_namesmsgs              r    _has_unknown_tagged_union_member/ResponseParser._has_unknown_tagged_union_memberl  s     !JJLMh-!.!4!4!6!6!!6   =!Q&&  *)jj*@AA%%m4C $mm'+F f%3377G+ $ ' 1( 
 #-'s   	C9C9$3C?c                     SSU00$ )NSDK_UNKNOWN_MEMBERr   r    )r   r   s     r   #_handle_unknown_tagged_union_member2ResponseParser._handle_unknown_tagged_union_member  s    $vsm44r   c                     US   nUR                  S5      n[        U5      S:X  a!  US   (       a  XS   S'   US   US   S'   US   $ U$ )	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   r   QueryErrorCoder   Type)splitr   )r   coderP   errorquery_errorquery_error_componentss         r    _do_query_compatible_error_parse/ResponseParser._do_query_compatible_error_parse  sf     23!,!2!23!7%&!+0Fq0I/3'N+,%;A%>E'N6")!,,r   )rC   rD   rA   NN)r&   r'   r(   r)   __doc__DEFAULT_ENCODINGrE   r   rB   rg   rc   r[   rY   rZ   r^   r]   r\   r   r   r   r   r   r   r   r   r*   r    r   r   r<   r<      st     "'/b?L:&
"JP

$B
85r   r<   c                      ^  \ rS rSrSU 4S jjrS rS rU 4S jrS rS r	S r
S	 rS
 rS r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\r\r\rSrU =r$ )BaseXMLResponseParseri  c                 Z   > [         TU ]  X5        [        R                  " S5      U l        g )Nz{.*})superr   recompile_namespace_re)r   rF   rG   r   s      r   r   BaseXMLResponseParser.__init__  s"    )7ZZ/r   c                    0 nUR                   nUR                  nUR                  R                  S5      =(       d    SnUR                  R                  S5      =(       d    SnUR                  R                  S5      (       a  [	        U[
        5      (       d  U/nU H^  nU HP  n	U R                  U	5      n
X:X  a  U R                  XI5      nM,  X:X  a  U R                  XY5      nMD  [        SU
 35      e   WUW'   M`     U$ )Nr   keyrM   	flattenedzUnknown tag: )	r   rM   r_   r`   ra   r   	_node_tagr   r9   )r   r2   r   re   	key_shapevalue_shapekey_location_namevalue_location_namekeyval_nodesingle_pairtag_namekey_nameval_names                r   _handle_map!BaseXMLResponseParser._handle_map  s    II	kk%3377?H5)77;;FCNw"";//
48N8N6DK*>>+60#00HH4#00JH-hZ.HII  +  (F8   r   c                 N    U R                   R                  SUR                  5      $ Nr0   )r   subr   )r   r   s     r   r   BaseXMLResponseParser._node_tag  s    !!%%b$((33r   c                    > UR                   R                  S5      (       a  [        U[        5      (       d  U/n[        TU ]  X5      $ )Nr   )r_   r`   ra   r   r   r   )r   r2   r   r   s      r   r   "BaseXMLResponseParser._handle_list  s?     "";//
48N8N6Dw#E00r   c                 @   0 nUR                   nUR                  R                  SS5      (       a  U R                  U5      nU R	                  U5      nU R                  X5      (       a"  U R                  U5      nU R                  U5      $ U GH  nXG   nSUR                  ;   d   UR                  R                  S5      (       a  M:  U R                  X5      n	UR                  U	5      n
U
b  U R                  X5      X7'   Mt  UR                  R                  S5      (       d  M  0 nUR                  S   nUR                  R                  5        H:  u  pU R                  R                  UR                  S5      S   S-   U5      nXU'   M<     X;   d  GM  X   X7'   GM     U$ )	Nrs   FlocationeventheaderxmlAttributer   :r   )r   rt   r`   _get_error_root_build_name_to_xml_noder   r   r   r_   _member_key_namer   attribr   r   r   r   )r   r2   r   re   r   xml_dictr   member_namer   xml_namemember_nodeattribslocation_namer   rM   new_keys                   r   _handle_structure'BaseXMLResponseParser._handle_structure  s   -->>k511''-D//500AA%%h/C;;C@@"K"/Ll888--11-@@ ,,\GH",,x0K&&*&7&7 '# ++//?? , : :6 B"&++"3"3"5JC"0044%++C03c93G (-G$	 #6
 !+*1*@F'1 #2 r   c                 t    U R                  U5      S:X  a"  U H  nU R                  U5      S:X  d  M  Us  $    U$ )NErrorResponser   r   )r   original_rootchilds      r   r   %BaseXMLResponseParser._get_error_root  s;    >>-(O;&>>%(G3 L ' r   c                     UR                   S:X  aJ  UR                  R                  S5      (       a*  UR                  R                  R                  S5      nUb  U$ UR                  R                  S5      nUb  U$ U$ )Nr   r   r   )r   r_   r`   r   )r   r2   r   list_member_serialized_nameserialized_names        r   r   &BaseXMLResponseParser._member_key_name  sz    
 ??f$)<)<)@)@)M)M*/,,*D*D*H*H+' +622--11&9&""r   c                    [        U[        5      (       a  U R                  US   5      $ 0 nU HS  nU R                  U5      nXB;   a6  [        X$   [        5      (       a  X$   R	                  U5        ME  X$   U/X$'   MO  X2U'   MU     U$ r   )ra   r   r   r   r   )r   parent_noder   r   r   s        r   r   -BaseXMLResponseParser._build_name_to_xml_node  s     k4((//A??D..&C
 hmT22M((. &.]D$9HM $   r   c                      [         R                  " [         R                  " 5       U R                  S9nUR	                  U5        UR                  5       nU$ ! [         a  n[        SU SU 35      eS nAff = f)N)targetencodingzUnable to parse response (z6), invalid XML received. Further retries may succeed:
)r   	XMLParserTreeBuilderr   feedcloser   r9   )r   
xml_stringr   rootes        r   _parse_xml_string_to_dom.BaseXMLResponseParser._parse_xml_string_to_dom  s    
	__((*T5J5JF KK
#<<>D   	%,QC 0GGQlT 	s   AA 
A7!A22A7c                     UR                  5        HI  u  p#[        U5      (       a&  U R                  U5      nU R                  U5      X'   M;  UR                  X'   MK     U$ r   )r   r   r   _replace_nodesr/   )r   re   r   rM   sub_dicts        r   r  $BaseXMLResponseParser._replace_nodes"  sQ     ,,.JCE{{77>"11(;#jj ) r   c                     US:X  a  gg)NtrueTFr    r   r2   r/   s      r   _handle_boolean%BaseXMLResponseParser._handle_boolean+  s    6>r   c                     [        U5      $ r   floatr$  s      r   _handle_float#BaseXMLResponseParser._handle_float2  s    T{r   c                 $    U R                  U5      $ r   rA   r$  s      r   _handle_timestamp'BaseXMLResponseParser._handle_timestamp6  s    %%d++r   c                     [        U5      $ r   intr$  s      r   _handle_integer%BaseXMLResponseParser._handle_integer:  s    4yr   c                     U$ r   r    r$  s      r   _handle_string$BaseXMLResponseParser._handle_string>  s    r   c                 $    U R                  U5      $ r   rC   r$  s      r   _handle_blob"BaseXMLResponseParser._handle_blobB  s      &&r   )r   r   )r&   r'   r(   r)   r   r   r   r   r  r   r   r   r  r  r7   r%  r*  r.  r3  r6  r:  _handle_character_handle_double_handle_longr*   __classcell__r   s   @r   r   r     s    0*41"H .     , ,     ' ' '"N"Lr   r   c                   <    \ rS rSrS rS rS rS
S jrS rS r	Sr
g	)QueryParseriK  c                     US   nU R                  U5      nU R                  U5      nU R                  U5        SU;   a   UR                  UR	                  S5      5        SU;   a  SUR	                  S5      0US'   U$ )NrQ   Errors	RequestIdrT   )r  r   r  r   r   )r   rd   r2   xml_contentsr  re   s         r   r]   QueryParser._do_error_parseL  s    ',,\:--d3F# vMM&**X./& *5vzz+7N)OF%&r   c                 "    U R                  XSS9$ )NFinject_metadata_parse_body_as_xmlr   s      r   r\   #QueryParser._do_modeled_error_parse\  s    &&x&NNr   c                 "    U R                  XSS9$ )NTrI  rK  r   s      r   r^   QueryParser._do_parse_  s    &&x&MMr   c                     US   nU R                  U5      n0 nUbB  UnSUR                  ;   a  U R                  UR                  S   U5      nU R                  X'5      nU(       a  U R	                  XV5        U$ )NrQ   resultWrapper)r  r_   _find_result_wrapped_shaper   _inject_response_metadata)r   rd   r2   rJ  rF  r  re   starts           r   rL  QueryParser._parse_body_as_xmlb  s    ',,\:E%"5"5577''8$ &&u4F**48r   c                 ,    U R                  U5      nX1   $ r   )r   )r   element_namexml_root_nodemappings       r   rR  &QueryParser._find_result_wrapped_shapeq  s    ..}=$$r   c                     U R                  U5      nUR                  S5      nUb=  U R                  U5      nUR                  5        H  u  pgUR                  XV'   M     XRS'   g g NrT   )r   r`   r   r/   )r   r   inject_intorY  
child_nodesub_mappingr   rM   s           r   rS  %QueryParser._inject_response_metadatau  sf    ..t4[[!34
!66zBK)//1
#(::  2.9*+	 "r   r    N)T)r&   r'   r(   r)   r]   r\   r^   rL  rR  rS  r*   r    r   r   rB  rB  K  s"     ON%:r   rB  c                   4   ^  \ rS rSrS rU 4S jrS rSrU =r$ )EC2QueryParseri  c                 r    U R                  U5      nUR                  S5      nUb  SUR                  0US'   g g )N	requestIdrE  rT   )r   r`   r/   )r   r   r]  rY  r^  s        r   rS  (EC2QueryParser._inject_response_metadata  s?    ..t4[[-
!/:JOO.LK*+ "r   c                 ^   > [         TU ]  X5      nSU;   a  SUR                  S5      0US'   U$ )N	RequestIDrE  rT   )r   r]   r   )r   rd   r2   originalr   s       r   r]   EC2QueryParser._do_error_parse  s>     7*8;("X\\+6,H'( r   c                     U H>  nU R                  U5      S:X  d  M  U H  nU R                  U5      S:X  d  M  Us  s  $    M@     U$ )NrD  r   r  )r   r  r	  errors_childs       r   r   EC2QueryParser._get_error_root  sF    "E~~e$0$)L~~l3w>++ %* #
 r   r    )	r&   r'   r(   r)   rS  r]   r   r*   r?  r@  s   @r   rb  rb    s    M( r   rb  c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)BaseJSONParseri  c                 r   0 nUR                   (       a  UnU$ UR                  nUc  g 0 nU R                  X5      (       a"  U R                  U5      nU R	                  U5      $ U HO  nXF   nUR
                  R                  SU5      nUR                  U5      n	U	c  M9  U R                  XF   U	5      X6'   MQ     U$ )Nr   )is_document_typer   r   r   r   r_   r`   r   )
r   r2   rM   final_parsedmember_shapesr   r   r   	json_name	raw_values
             r   r   BaseJSONParser._handle_structure  s    !! L( % "MMM} L44UBB))%0??DD,,9(66::6;O	!IIi0	(040A0A%2I1L-  - r   c                     0 nUR                   nUR                  nUR                  5        H+  u  pbU R                  XF5      nU R                  XR5      nXU'   M-     U$ r   )r   rM   r   r   )	r   r2   rM   re   r   r   r   
actual_keyactual_values	            r   r   BaseJSONParser._handle_map  sZ    II	kk++-JC**9:J,,[@L!-: ( r   c                 $    U R                  U5      $ r   r9  r   s      r   r:  BaseJSONParser._handle_blob  s      ''r   c                 $    U R                  U5      $ r   r-  r   s      r   r.   BaseJSONParser._handle_timestamp  s    %%e,,r   c                    U R                  US   5      nSSS.0 S.nUS   nUR                  SUR                  SS5      5      US   S'   UR                  S	5      nUR                  S
U=(       a    [        U5      5      nUbU  SU;   a  UR                  SS5      S   nSU;   a  UR	                  SS5      S   nSU;   a  U R                  XuU5      nXtS   S'   U R                  XAS   5        U$ )NrQ   r0   r}   r|   r~   rP   messager}   r   rR   r   r   r   r   #r   r|   )_parse_body_as_jsonr`   r   r   rsplitr   rS  )r   rd   r2   rQ   r   rP   response_coder   s           r   r]   BaseJSONParser._do_error_parse  s   ''(89&("52N9% %)HHtxx	2.%
gy!
 !]3xx-"FC4FG d{zz#q)!,d{{{3*1-#w.<<5 &*'N6"&&uy.ABr   c                 B    SU;   a  US   UR                  S0 5      S'   g g )Nx-amzn-requestidrT   rE  )
setdefault)r   re   rP   s      r   rS  (BaseJSONParser._inject_response_metadata  s0    (EL"FF0"5kB )r   c                     U(       d  0 $ UR                  U R                  5      n [        R                  " U5      nU$ ! [         a    SU0s $ f = f)Nr  )decoder   jsonloads
ValueError)r   body_contentsrQ   original_parseds       r   r  "BaseJSONParser._parse_body_as_json  sU    I##D$9$9:	%"jj.O"" 	% t$$	%s   > AAr    N)r&   r'   r(   r)   r  r   r:  r.  r]   rS  r  r*   r    r   r   rn  rn    s&    2(-"H
%r   rn  c                       \ rS rSrSrSr\S 5       rS rS r	S r
S rS	 rS
 rS rS rS rS rS rS rS rS rS rSrg)BaseCBORParseri        c           	          U R                   U R                  U R                  U R                  U R                  U R
                  U R                  U R                  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_map/BaseCBORParser.major_type_to_parsing_method_map  sR     ++++&&&&  ++	
 		
r   c                 V    [         R                  " [         R                  " U5      5      $ r   )ioBufferedReaderBytesIO)r   bytess     r   get_peekable_stream_from_bytes-BaseCBORParser.get_peekable_stream_from_bytes  s      E!233r   c                     U R                  US5      nUS-	  nUS-  nX0R                  ;   a  U R                  U   nU" X5      $ [        SU SU 35      e)Nr   r  r  z8Unsupported inital byte found for data item- Major type:z, Additional info: )_read_bytes_as_intr  r9   )r   streaminitial_byte
major_typeadditional_infomethods         r   parse_data_itemBaseCBORParser.parse_data_item  sx     ..vq9!Q&
 '3>>>:::FF&22%(\)<"#% r   c                 p    SSSSS.nUS:  a  U$ X#;   a  X2   nU R                  X5      $ [        SU 35      e)Nr   r   r     )            r  zhInvalid CBOR integer returned from the service; unparsable additional info found for major type 0 or 1: )r  r9   )r   r  r  additional_info_to_num_bytes	num_bytess        r   r  &BaseCBORParser._parse_unsigned_integer-  sd    	(
$ R""<4EI**6==%@@O?PR r   c                 *    SU R                  X5      -
  $ )N)r  r   r  r  s      r   r  &BaseCBORParser._parse_negative_integerB  s    D00IIIr   c                 N   X R                   :w  a"  U R                  X5      nU R                  X5      $ / n U R                  U5      (       a  OJU R	                  US5      nUS-  nU R                  X5      nUR                  U R                  X5      5        Ma  SR                  U5      $ )Nr   r  r   )INDEFINITE_ITEM_ADDITIONAL_INFOr  _read_from_stream_handle_break_coder  r   join)r   r  r  lengthchunksr  s         r   r  !BaseCBORParser._parse_byte_stringF  s    BBB11&JF))&99F**622#66vqA".";55fNd44VDE  88F##r   c                 B    U R                  X5      R                  S5      $ )Nr>   )r  r  r  s      r   r  !BaseCBORParser._parse_text_stringV  s    &&v?FFwOOr   c                 D   X R                   :w  a;  U R                  X5      n[        U5       Vs/ s H  o@R                  U5      PM     sn$ / nU R	                  U5      (       d8  UR                  U R                  U5      5        U R	                  U5      (       d  M8  U$ s  snf r   )r  r  ranger  r  r   )r   r  r  r  _r   s         r   r  BaseCBORParser._parse_arrayZ  s    BBB11&JF:?-H-Q((0-HHE--f55T11&9: --f55L Is   Bc                    0 nX R                   :w  a6  U R                  X5      n[        U5       H  nU R                  X5        M     U$ U R	                  U5      (       d)  U R                  X5        U R	                  U5      (       d  M)  U$ r   )r  r  r  _parse_key_value_pairr  )r   r  r  r   r  r  s         r   r  BaseCBORParser._parse_mape  s}    BBB11&JF6]**69 #L --f55**69 --f55Lr   c                 X    U R                  U5      nU R                  U5      nUb  XBU'   g g r   )r  )r   r  r   r   rM   s        r   r  $BaseCBORParser._parse_key_value_pairr  s4    ""6*$$V,#J r   c                     U R                  X5      nU R                  U5      nUS:X  a  U R                  U5      $ [        SU 35      e)Nr   z*Found CBOR tag not supported by botocore: )r  r  _parse_datetimer9   )r   r  r  r   rM   s        r   r  BaseCBORParser._parse_tagz  sQ    **6C$$V,!8''..%<SEB r   c                 v    [        U[        [        45      (       a  U R                  U5      $ [	        SU 35      e)Nz Unable to parse datetime value: )ra   r2  r)  rA   r9   rL   s     r   r  BaseCBORParser._parse_datetime  s;    ec5\**))%00%25': r   c                     SSS S S.nX#;   a  X2   $ SSSS.nX$;   a.  XB   u  pV[         R                  " XPR                  X5      5      S   $ [        S	U S
35      e)NFT)            )z>er   )z>fr  )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  r9   )r   r  r  additional_info_simple_valuesfloat_formatsfloat_formatr  s          r   r  &BaseCBORParser._parse_simple_and_float  s     	)
% ;0AA
 
 +&3&D#L==44VG  ">>O PU V
 	
r   c                     [         R                  UR                  S5      S S S5      U R                  :X  a!  UR	                  S[
        R                  5        gg )Nr   bigT)r2  
from_bytespeek
BREAK_CODEseekosSEEK_CUR)r   r  s     r   r  !BaseCBORParser._handle_break_code  sC    >>&++a.!,e4GKK2;;' Hr   c                 P    U R                  X5      n[        R                  US5      $ )Nr  )r  r2  r  )r   r  r  bytes       r   r  !BaseCBORParser._read_bytes_as_int  s#    %%f8~~dE**r   c                 \    UR                  U5      n[        U5      U:w  a  [        S5      eU$ )NzgEnd of stream reached; this indicates a malformed CBOR response from the server or an issue in botocore)readr   r9   )r   r  r  rM   s       r   r   BaseCBORParser._read_from_stream  s5    I&u:"%$ 
 r   r    N)r&   r'   r(   r)   r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r*   r    r   r   r  r    sm    &(#J

 

4**J$ P
D
+r   r  c                   2    \ rS rSrS rS rS rS rS rSr	g)	BaseEventStreamParseri  c                 T   0 nUR                   R                  S5      (       aK  US   R                  S5      nUR                  R                  U5      nU(       a  U R                  X5      X4'   U$ U R	                  XUR                  U5        U R                  XUR                  U5        U$ )NrS   rP   z:event-type)r_   r`   r   r^   _parse_non_payload_attrs_parse_payload)r   rd   r2   rq  
event_typeevent_shapes         r   r^   BaseEventStreamParser._do_parse  s    ""=11!),00?J--++J7K+/>>,( 	 )) Mr   c           	      `   US   R                  S5      nUR                  R                  U5      nUbN  U R                  US   5      nU R                  XE5      nSUUR                  SUR                  SS5      5      S.0nU$ SUS   R                  S	S5      US   R                  S
S5      S.0nU$ )NrP   z:exception-typerQ   r   r}   r  r0   r{   z:error-codez:error-message)r`   r   _initial_body_parser   )r   rd   r2   exception_typeexception_shaper  rQ   r   s           r   r]   %BaseEventStreamParser._do_error_parse  s    !),001BC--++N;&"66x7GHO$$_FD*#xx	488Ir3JKE  $Y/33M2F'	2667GLE r   c                    UR                   R                  S5      (       a  U H  nX5   nUR                   R                  S5      (       d  M)  US   nUR                  S:X  a  UnONUR                  S:X  a  UR                  U R                  5      nO"U R                  U5      n	U R                  Xi5      nXU'     g    U R                  US   5      n
U R                  X*5      nUR                  U5        g g )NeventeventpayloadrQ   blobstring)r_   r`   r   r  r   r  r   r   )r   rd   r2   rr  rq  r   r   rQ   parsed_body	raw_parser  body_parseds               r   r  $BaseEventStreamParser._parse_payload  s    ""7++%,2--11.AA#F+D#--7&*%//8;&*kk$2G2G&H$($<$<T$B	&*&7&7(' *5& &  #66x7GHO++ECK,' ,r   c                     US   nU H\  nX6   nUR                   R                  S5      (       d  M)  Xe;   d  M0  XV   nUR                  S:X  a  U R                  US-  5      nXU'   M^     g )NrP   r   	timestampg     @@)r_   r`   r   rA   )	r   rd   r2   rr  rq  rP   r   r   rM   s	            r   r  .BaseEventStreamParser._parse_non_payload_attrs  so     9%!D(.L))--m<<?#ME#--< !% 6 6uv~ F).& "r   c                     [        S5      eNr  r   r   r  s     r   r  )BaseEventStreamParser._initial_body_parse      
 ""788r   r    N)
r&   r'   r(   r)   r^   r]   r  r  r  r*   r    r   r   r  r    s     *-,/9r   r  c                       \ rS rSrS rSrg)EventStreamJSONParseri  c                 $    U R                  U5      $ r   r  r  s     r   r  )EventStreamJSONParser._initial_body_parse      ''66r   r    Nr&   r'   r(   r)   r  r*   r    r   r   r  r    s    7r   r  c                       \ rS rSrS rSrg)EventStreamXMLParseri  c                 ^    U(       d  [         R                  " S5      $ U R                  U5      $ r   r   Elementr  r   r  s     r   r  (EventStreamXMLParser._initial_body_parse  %    ==$$,,Z88r   r    Nr  r    r   r   r  r    s    9r   r  c                       \ rS rSrS rSrg)EventStreamCBORParseri$  c                 R    US:X  a  0 $ U R                  U R                  U5      5      $ Nr   )r  r  r  s     r   r  )EventStreamCBORParser._initial_body_parse%  s0    CI##//>
 	
r   r    Nr  r    r   r   r$  r$  $  s    
r   r$  c                   2    \ rS rSr\r S rS rS rS r	Sr
g)
JSONParseri-  c                     0 nUb;  UR                   nU(       a  U R                  XU5      nOU R                  US   U5      nU R                  X1S   5        U$ )NrQ   rP   )event_stream_name_handle_event_stream_handle_json_bodyrS  )r   rd   r2   re   
event_names        r   r^   JSONParser._do_parse2  s\    00J228JO//0@%H&&v	/BCr   c                 ,    U R                  US   U5      $ NrQ   )r-  r   s      r   r\   "JSONParser._do_modeled_error_parse=  s    %%hv&6>>r   c                     UR                   U   nU R                  X5      n UR                  5       nU R                  UR                  U5      nXXU'   U$ ! [         a    Sn[	        U5      ef = fNz,First event was not of type initial-response)r   r   get_initial_responser   r9   r-  payload	r   rd   r2   r.  event_stream_shapeevent_streamr  r   re   s	            r   r,  JSONParser._handle_event_stream@  sz    "]]:600N	1 557E ''u=)z & 	1FI%i00	1s   A A,c                 F    U R                  U5      nU R                  X#5      $ r   )r  r   )r   raw_bodyr2   parsed_jsons       r   r-  JSONParser._handle_json_bodyL  s%     ..x8  44r   r    N)r&   r'   r(   r)   r  rE   r^   r\   r,  r-  r*   r    r   r   r)  r)  -  s    32	?
5r   r)  c                   ^   ^  \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rU 4S jrSrU =r$ )BaseRestParseriT  c                 V    0 nU R                  U5      US'   U R                  XU5        U$ r\  )_populate_response_metadata_add_modeled_parser   rd   r2   rq  s       r   r^   BaseRestParser._do_parseU  s8    +/+K+K,
'( 	>r   c                 n    Uc  U$ UR                   nU R                  XXC5        U R                  XXC5        g r   )r   r  r  )r   rd   r2   rq  rr  s        r   rC  !BaseRestParser._add_modeled_parse]  s;    =%%]	
 	H]Ir   c                 .    0 nU R                  XU5        U$ r   rC  rD  s       r   r\   &BaseRestParser._do_modeled_error_parsef      >r   c                 z    0 nUS   nSU;   a
  US   US'   U$ SU;   a  US   US'   UR                  SS5      US'   U$ )NrP   r  rE  x-amz-request-id
x-amz-id-2r0   HostIdrn   r   rd   rt   rP   s       r   rB  *BaseRestParser._populate_response_metadatak  sf    9%($+,>$?H[!   7*$+,>$?H[! ")\2!>HXr   c                    SUR                   ;   a  UR                   S   nX5   nUR                   R                  S5      (       a  U R                  X5      nXtU'   g UR                  S;   a:  US   n[	        U[
        5      (       a  UR                  U R                  5      nXtU'   g U R                  US   5      nU R                  Xh5      XE'   g U R                  US   5      nU R                  X(5      n	UR                  U	5        g )Nr6  rS   )r  r  rQ   )r_   r`   r   r   ra   r  r  r   r  r   r   )
r   rd   r2   rr  rq  payload_member_name
body_shaperQ   r  r	  s
             r   r  BaseRestParser._parse_payloadx  s    +++ #("5"5i"@&;J''++M::00F4801%%);;'dE**;;t'<'<=D4801"&":":8F;K"L484E4E51 #66x7GHO++ECK,r   c                 \   US   nU H  nX6   nUR                   R                  S5      nUc  M'  US:X  a  U R                  XqS   5      XF'   ME  US:X  a  U R                  Xu5      XF'   M`  US:X  d  Mh  UR                   R                  SU5      n	X;   d  M  U R                  XuU	   5      XF'   M     g )NrP   r   
statusCoderR   headerr   )r_   r`   r   _parse_header_map)
r   rd   r2   rr  rq  rP   r   r   r   header_names
             r   r  'BaseRestParser._parse_non_payload_attrs  s     9%!D(.L#1155jAH\)%)%6%6 ="9&" Y&%)%;%; &" X%*88<<VTJ))-):):$k&:*L&! "r   c                     0 nUR                   R                  SS5      R                  5       nU H=  nUR                  5       R                  U5      (       d  M)  U[	        U5      S  nX%   X6'   M?     U$ )Nr   r0   )r_   r`   lowerrx   r   )r   r2   rP   re   prefixrZ  r   s          r   rY   BaseRestParser._parse_header_map  sq     $$((4::<"K  "--f55 #3v;=1&3 # r   c                     [        S5      er  r  r  s     r   r  "BaseRestParser._initial_body_parse  r  r   c                     Un[        U5      (       aE  [        R                  " U5      R                  U R                  5      n[
        R                  " U5      nU$ r   )r	   rJ   rK   r  r   r  r  )r   r2   rM   re   decodeds        r   r6  BaseRestParser._handle_string  sF    &&&&u-44T5J5JKGZZ(Fr   c                    > UR                   R                  S5      nUS:X  aC  [        U[        5      (       d.  UR	                  S5       Vs/ s H  oDR                  5       PM     nn[        TU ]  X5      $ s  snf )Nr   rX  ,)r_   r`   ra   r   r   rw   r   r   )r   r2   r   r   r  r   s        r   r   BaseRestParser._handle_list  sb    &&**:6x
4(>(>'+zz#7!GGID7w#E00 8s   A5r    )r&   r'   r(   r)   r^   rC  r\   rB  r  r  rY  r  r6  r   r*   r?  r@  s   @r   r@  r@  T  s;    J
-2091 1r   r@  c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)BaseRpcV2Parseri  c                     0 nUbN  UR                   nU(       a  U R                  XU5      nO0 nU R                  XU5        U R                  U5      US'   U$ r\  )r+  r,  r  rB  )r   rd   r2   re   r+  s        r   r^   BaseRpcV2Parser._do_parse  si     % 7 7 22%6 ##HV<)-)I)I*F%& r   c                 2    Uc  U$ U R                  XU5        g r   )r  rD  s       r   rC  "BaseRpcV2Parser._add_modeled_parse  s    =H\:r   c                 .    0 nU R                  XU5        U$ r   rI  rD  s       r   r\   'BaseRpcV2Parser._do_modeled_error_parse  rK  r   c                 0    0 nUS   nSU;   a  US   US'   U$ )NrP   r  rE  r    rP  s       r   rB  +BaseRpcV2Parser._populate_response_metadata  s.    9%($+,>$?H[!r   c                    0 nUR                   nUR                  (       as  UR                  5       nUR                  SS 5        UR	                  5        VVs0 s H  u  pgUc  M
  Xg_M     nnn[        U5      S:w  a  Sn[        XR                  -  5      eU H0  n	XI   n
UR                  U	5      nUc  M  U R                  X5      X9'   M2     U$ s  snnf )Nr   r   r   )
r   r   r   r   r   r   r9   r   r`   r   )r   r2   r   re   r   r   r   r   r   r   r   r   s               r   r  !BaseRpcV2Parser._handle_structure  s    --   IIKMh-!.!4!4!6!6!!6   =!Q&&  *)jj*@AA"K"/L((;/K&&*&7&7 '#	 # !s   	C"Cc                 p    U R                  US   5      nU R                  X$5      nUR                  U5        g r1  )r  r   r   )r   rd   r2   rq  r  r	  s         r   r  BaseRpcV2Parser._parse_payload  s5    228F3CD''?K(r   c                     [        S5      er  r  r  s     r   r  #BaseRpcV2Parser._initial_body_parse  r  r   r    N)r&   r'   r(   r)   r^   rC  r\   rB  r  r  r  r*   r    r   r   ri  ri    s%     ;

0)
9r   ri  c                   R   ^  \ rS rSr\rS rU 4S jrS rS r	S r
S r\
r\rSrU =r$ )	RestJSONParseri  c                 $    U R                  U5      $ r   r  r  s     r   r  "RestJSONParser._initial_body_parse  r  r   c                 H   > [         TU ]  X5      nU R                  X15        U$ r   )r   r]   _inject_error_code)r   rd   r2   r   r   s       r   r]   RestJSONParser._do_error_parse  s%    '80r   c                 @   U R                  US   5      nS nSUS   ;   a	  US   S   nO.SU;   d  SU;   a"  UR                  SUR                  SS5      5      nUc  g [        U[        5      (       a(  UR	                  SS5      S	   R                  S
S5      S   nXAS   S'   g )NrQ   zx-amzn-errortyperP   r   r|   r0   r   r   r   r  r  r   )r  r`   ra   r   r   r  )r   r   rd   rQ   r   s        r   r}  !RestJSONParser._inject_error_code  s     ''(89)!44I&'9:Dt^v~88FDHHVR$89D<dC  ::c1%a(//Q7;D!%gvr   c                     [        U5      $ r   )r   r   s      r   r%  RestJSONParser._handle_boolean-  s    e$$r   c                     [        U5      $ r   r1  r   s      r   r3  RestJSONParser._handle_integer0  s    5zr   c                     [        U5      $ r   r(  r   s      r   r*  RestJSONParser._handle_float3  s    U|r   r    )r&   r'   r(   r)   r  rE   r  r]   r}  r%  r3  r*  r>  r=  r*   r?  r@  s   @r   ry  ry    s3    37
&% #L"Nr   ry  c                   *    \ rS rSr\rS rS rS rSr	g)RpcV2CBORParseri:  c                 V    US:X  a  U$ U R                  U5      nU R                  U5      $ r&  )r  r  )r   r  body_contents_streams      r   r  #RpcV2CBORParser._initial_body_parse=  s8    C  #BB 
 ##$899r   c                    U R                  US   5      nUR                  SUR                  SS5      5      SS.0 S.nUS   nUR                  S5      nUc  UR                  S	5      nUb  [        U5      nUbU  S
U;   a  UR                  S
S5      S   nSU;   a  UR	                  SS5      S   nSU;   a  U R                  XeU5      nXdS   S'   SU;   a  US   UR                  S0 5      S'   U$ )NrQ   r  r}   r0   r  r~   rP   r   rR   r   r   r   r  r   r   r|   r  rT   rE  )r  r`   r   r   r  r   r  )r   rd   r2   rQ   r   rP   r   r  s           r   r]   RpcV2CBORParser._do_error_parseE  s   ''(89  88Itxx	2/FG !#
 9%xx!<$LL7M(=)d{zz#q)!,d{{{3*1-#w.<<5 &*'N6"(DK"EE/4[A r   c                     UR                   U   nU R                  X5      n UR                  5       nU R                  UR                  5      nXXU'   U$ ! [         a    Sn[	        U5      ef = fr4  )r   r   r5  r   r9   r  r6  r7  s	            r   r,  $RpcV2CBORParser._handle_event_streame  sx    "]]:600N	1 557E ))%--8)z & 	1FI%i00	1s   A A+r    N)
r&   r'   r(   r)   r$  rE   r  r]   r,  r*   r    r   r   r  r  :  s    3:@
r   r  c                   N   ^  \ rS rSr\rS rS rS rS r	\
U 4S j5       rSrU =r$ )RestXMLParserir  c                 ^    U(       d  [         R                  " S5      $ U R                  U5      $ r   r  r   s     r   r  !RestXMLParser._initial_body_parseu  r"  r   c                     US   (       a   U R                  U5      $ U R	                  U5      $ ! [         a    [        R                  SSS9   N1f = f)NrQ   z2Exception caught when parsing error response body:T)exc_info)_parse_error_from_bodyr9   rW   rX   _parse_error_from_http_statusr   s      r   r]   RestXMLParser._do_error_parsez  s]     F228<< 11(;; ' 		H!  s   . AAc                     [        US   5      [        R                  R                  R	                  US   S5      S.US   R	                  SS5      US   R	                  SS5      S.S.$ )	NrR   r0   r{   rP   rM  rN  )rE  rO  r~   )r   r   r   r   r`   r   s     r   r  +RestXMLParser._parse_error_from_http_status  st     H]34;;0044]+R &i0445GL"9-11,C!
 	
r   c                 d   US   nU R                  U5      nU R                  U5      nU R                  U5        UR                  S:X  a9  U R	                  U5      nUR                  SS5        UR                  SS5        XES.$ SU;   a  SUR                  S5      0US'   SSSS.0n[        Xd5        U$ )	NrQ   r   rE  r0   rO  r~   rT   r  )r  r   r  r   rB  r   r   )r   rd   rF  r  re   rt   defaults          r   r  $RestXMLParser._parse_error_from_body  s    ',,\:--d3F#88w 77AH
 JJ{B'JJx$#BBF"*5vzz+7N)OF%&B78G$r   c                 &   > [         TU ]  X5      nU$ r   )r   r6  )r   r2   r/   r   s      r   r6  RestXMLParser._handle_string  s    w%e2r   r    )r&   r'   r(   r)   r  rE   r  r]   r  r  r7   r6  r*   r?  r@  s   @r   r  r  r  s1    29
<6
.  r   r  )ec2queryr  z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor)1r   rJ   http.clientr   r  r  loggingr  r   r  botocore.compatr   r   botocore.eventstreamr   r   botocore.utilsr   r   r	   r
   r   r   	getLoggerr&   rW   r@   r   r$   r7   	Exceptionr9   r<   r   rB  rb  rn  r  r  r  r  r$  r)  r@  ri  ry  r  r  r!   r    r   r   <module>r     sw  kZ   	   	 	  0 D  !* , ,*;*	) 	S Slm#N m#`1:' 1:h![ !H^%^ ^%B~^ ~BP9N P9f71> 7
902G 9
1> 
$5 $5Nu1^ u1pD9n D9N$#^^ $#N5o~ 5pKN$9 K^ ) r   