
    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
 ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZ d	Zd
ZdZ ej        d          ZdZdZeefZdefd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&          Z) G d# d$e'e%          Z*e#e"e$e(e)e*d%Z+dS )&a  Protocol input serializes.

This module contains classes that implement input serialization
for the various AWS protocol types.

These classes essentially take user input, a model object that
represents what the expected input should look like, and it returns
a dictionary that contains the various parts of a request.  A few
high level design decisions:


* Each protocol type maps to a separate class, all inherit from
  ``Serializer``.
* The return value for ``serialize_to_request`` (the main entry
  point) returns a dictionary that represents a request.  This
  will have keys like ``url_path``, ``query_string``, etc.  This
  is done so that it's a) easy to test and b) not tied to a
  particular HTTP library.  See the ``serialize_to_request`` docstring
  for more details.

Unicode
-------

The input to the serializers should be text (str/unicode), not bytes,
with the exception of blob types.  Those are assumed to be binary,
and if a str/unicode type is passed in, it will be encoded as utf-8.
    N)ElementTree)validate)
formatdate)ParamValidationError)register_feature_id)
has_headeris_json_value_headerparse_to_aware_datetimepercent_encodeiso8601z%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fZz^[A-Za-z0-9\.\-]+$defaultmillisecondTc                     t          |          |          }|r(t          j                    }t          j        ||          }|S )a3  Create a serializer for the given protocol.
    :param protocol_name: The protocol name to create a serializer for.
    :type protocol_name: str
    :param include_validation: Whether to include parameter validation.
    :type include_validation: bool
    :param timestamp_precision: Timestamp precision level.
        - 'default': Microseconds for ISO timestamps, seconds for Unix and RFC
        - 'millisecond': Millisecond precision (ISO/Unix), seconds for RFC
    :type timestamp_precision: str
    :return: A serializer instance for the given protocol.
    )timestamp_precision)SERIALIZERSr   ParamValidatorParamValidationDecorator)protocol_nameinclude_validationr   
serializer	validators        O/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/botocore/serialize.pycreate_serializerr   M   sQ    " ]+/  J  N+--	6y*MM
    c                   n    e Zd ZdZeZdZefd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	S )
SerializerPOSTutf-8c                 J    |t           vrt          d|           || _        d S )Nz=Invalid timestamp precision found while creating serializer: )TIMESTAMP_PRECISION_OPTIONS
ValueError_timestamp_precision)selfr   s     r   __init__zSerializer.__init__p   s<    &AAAePcee   %8!!!r   c                      t          d          )a  Serialize parameters into an HTTP request.

        This method takes user provided parameters and a shape
        model and serializes the parameters to an HTTP request.
        More specifically, this method returns information about
        parts of the HTTP request, it does not enforce a particular
        interface or standard for an HTTP request.  It instead returns
        a dictionary of:

            * 'url_path'
            * 'host_prefix'
            * 'query_string'
            * 'headers'
            * 'body'
            * 'method'

        It is then up to consumers to decide how to map this to a Request
        object of their HTTP library of choice.  Below is an example
        return value::

            {'body': {'Action': 'OperationName',
                      'Bar': 'val2',
                      'Foo': 'val1',
                      'Version': '2014-01-01'},
             'headers': {},
             'method': 'POST',
             'query_string': '',
             'host_prefix': 'value.',
             'url_path': '/'}

        :param parameters: The dictionary input parameters for the
            operation (i.e the user input).
        :param operation_model: The OperationModel object that describes
            the operation.
        serialize_to_requestNotImplementedError)r#   
parametersoperation_models      r   r&   zSerializer.serialize_to_requestw   s    H ""8999r   c                      dd| j         i dd}|S )N/ r   )url_pathquery_stringmethodheadersbody)DEFAULT_METHOD)r#   
serializeds     r   _create_default_requestz"Serializer._create_default_request   s*     )
 

 r   c                     | j         t          k    r'|j        dz  }|                    d          d|ddz   S |j        dk    rt          }nt
          }|                    |          S )zEReturn ISO8601 timestamp with precision based on timestamp_precision.  z%Y-%m-%dT%H:%M:%S.03dZr   )r"   TIMESTAMP_PRECISION_MILLISECONDmicrosecondstrftimeISO8601_MICROISO8601)r#   valuemillisecondstimestamp_formats       r   _timestamp_iso8601zSerializer._timestamp_iso8601   s{     $(GGG ,4L2336M,6M6M6M6MM
  1$$#0  #* >>"2333r   c                     | j         t          k    r8t          j        |                                          }|j        dz  dz  }||z   S t          t          j        |                                                    S )zBReturn unix timestamp with precision based on timestamp_precision.r7   g     @@)r"   r;   calendartimegm	timetupler<   int)r#   r@   base_timestamprA   s       r   _timestamp_unixtimestampz#Serializer._timestamp_unixtimestamp   sk     $(GGG%_U__->->??N!-5?L!L00xu'8'899:::r   c                     t          |t          j                  r3t          t          j        |                                                    }t          |d          S )zSReturn RFC822 timestamp (always second precision - RFC doesn't support sub-second).T)usegmt)
isinstancedatetimerH   rE   rF   rG   r   r#   r@   s     r   _timestamp_rfc822zSerializer._timestamp_rfc822   sM     eX.// 	<(9(9::;;E%----r   Nc                     || j         }|                                }t          |          }t          | d|           } ||          }|S )N_timestamp_)TIMESTAMP_FORMATlowerr
   getattr)r#   r@   rB   datetime_obj	converterfinal_values         r   _convert_timestamp_to_strz$Serializer._convert_timestamp_to_str   s^    ##4+1133.u55D"B0@"B"BCC	i--r   c                 8    |j                             d|          S Nnameserializationget)r#   shapedefault_names      r   _get_serialized_namezSerializer._get_serialized_name   s     "&&v|<<<r   c                     t          |t                    r|                    | j                  }t	          j        |                                                              | j                  S N)rM   strencodeDEFAULT_ENCODINGbase64	b64encodestripdecoderO   s     r   _get_base64zSerializer._get_base64   sX     eS!! 	8LL!677E&&,,..55d6KLLLr   c                    |j         }|d|vrd S |d         }|j        |S |j        j        }d |                                D             }i }g }|D ]>}	||	         }
t                              |
          s|                    |	           |
||	<   ?|r't          dd                    |           d           |j	        di |S )N
hostPrefixc                 L    g | ]!\  }}|j                             d           |"S )	hostLabelr]   ).0memberr`   s      r   
<listcomp>z2Serializer._expand_host_prefix.<locals>.<listcomp>   sC     
 
 
"&&{33

 
 
r   z Invalid value for parameter(s): z, z?. Must contain only alphanumeric characters, hyphen, or period.)report )
endpointinput_shapemembersitemsHOST_PREFIX_REmatchappendr   joinformat)r#   r)   r*   operation_endpointhost_prefix_expressioninput_membershost_labelsformat_kwargs
bad_labelsr\   params              r   _expand_host_prefixzSerializer._expand_host_prefix   s*   ,5&#5554!3L!A&.))'3;
 
!.!4!4!6!6
 
 

 
 	( 	(Dt$E!''.. (!!$'''"'M$ 	&!tyy7L7L ! ! !    -%,==}===r   c                 6    |j                             d          S )N	flattenedr]   r#   r`   s     r   _is_shape_flattenedzSerializer._is_shape_flattened  s    "&&{333r   c                     |t          d          k    rd}n,|t          d          k    rd}nt          j        |          rd}|S )NInfinityz	-InfinityNaN)floatmathisnanrO   s     r   _handle_floatzSerializer._handle_float  sR    E*%%%%EEeK((((EEZ 	Er   c                 8    |j         j        rd|d         d<   d S d S )Ntruer1   zx-amzn-query-mode)service_modelis_query_compatible)r#   r*   r4   s      r   _handle_query_compatible_traitz)Serializer._handle_query_compatible_trait  s3    (< 	@9?Jy!"5666	@ 	@r   rd   )__name__
__module____qualname__r3   dictMAP_TYPErg   TIMESTAMP_PRECISION_DEFAULTr$   r&   r5   rC   rJ   rP   rY   rb   rl   r   r   r   r   ru   r   r   r   r   g   s        N
 H+F 8 8 8 8$: $: $:L  4 4 4 ; ; ;. . .   = = =
M M M >  >  >D4 4 4  @ @ @ @ @r   r   c                   h    e Zd ZdZd ZddZddZddZddZddZ	dd	Z
dd
ZddZddZddZdS )QuerySerializerr   c                 b   |j         }|                                 }|j                            d| j                  |d<   ddi|d<   |                                 }|j        |d<   |j        d         |d<   ||                     |||           ||d<   | 	                    ||          }|||d	<   |S )
Nr0   Content-Typez0application/x-www-form-urlencoded; charset=utf-8r1   Action
apiVersionVersionr2   host_prefix)
rw   r5   httpr_   r3   r   r\   metadata
_serializer   )r#   r)   r*   r`   r4   body_paramsr   s          r   r&   z$QuerySerializer.serialize_to_request  s    +1133
.377d) 
  

8 N!

9
 mmoo / 4H!0!9,!GIOOKU;;;(
6..z?KK"(3J}%r   r-   c                 `    t          | d|j         | j                  } |||||           d S )N_serialize_type_)prefixrU   	type_name_default_serialize)r#   r4   r@   r`   r   r0   s         r   r   zQuerySerializer._serialize1  sJ     0u00#
 

 	z5%777777r   c                     |j         }|                                D ]D\  }}||         }|                     ||          }|r| d| }|                     ||||           Ed S )Nr8   )rx   ry   rb   r   )	r#   r4   r@   r`   r   rx   keymember_shapemember_prefixs	            r   _serialize_type_structurez)QuerySerializer._serialize_type_structure@  s    -++-- 	L 	LJC"3<L 55lCHHM <#) ; ;M ; ;OOJ|]KKKK	L 	Lr   c                    |sd||<   d S |                      |          rr|}|j        j                            d          rP|                     |j        d          }d                    |                    d          d d         |gz             }n'|j        j                            dd          }| d| }t          |d          D ]+\  }}	| d| }
|j        }|                     ||	||
           ,d S )Nr-   r\   ra   r8   rr      )	r   rr   r^   r_   rb   r}   split	enumerater   )r#   r4   r@   r`   r   list_prefixr\   	list_nameielementelement_prefixelement_shapes               r   _serialize_type_listz$QuerySerializer._serialize_type_listI  s%    	!#JvF##E** 	2 K|)--f55 H00B0OO!hhv||C'8'8"'='FGG266vxHHI#11i11K#E1-- 	P 	PJAw +11a11N!LMOOJOOOO	P 	Pr   c                    |                      |          r|}n| d}|dz   }|j        }|j        }|                     |d          }	|                     |d          }
t	          |d          D ]i\  }}|                    ||	          }|                    ||
          }|                     ||||           |                     |||         ||           jd S )Nz.entryz.{i}.{suffix}r   r   r@   r   )r   suffix)r   r   r@   rb   r   r~   r   )r#   r4   r@   r`   r   full_prefixtemplate	key_shapevalue_shape
key_suffixvalue_suffixr   r   
key_prefixvalue_prefixs                  r   _serialize_type_mapz#QuerySerializer._serialize_type_map\  s    ##E** 	, KK#+++K0I	k..yu.MM
00gFFq)) 	O 	OFAs!1Z@@J#??Q|?DDLOOJY
CCCOOJc
KNNNN		O 	Or   c                 6    |                      |          ||<   d S rd   rl   r#   r4   r@   r`   r   s        r   _serialize_type_blobz$QuerySerializer._serialize_type_blobl  s     !--e44
6r   c                 h    |                      ||j                            d                    ||<   d S NtimestampFormatrY   r^   r_   r   s        r   _serialize_type_timestampz)QuerySerializer._serialize_type_timestampp  s9    !;;5&**+<==
 

6r   c                 "    |rd||<   d S d||<   d S Nr   falseru   r   s        r   _serialize_type_booleanz'QuerySerializer._serialize_type_booleanu  s*     	)!'Jv!(Jvr   c                     |||<   d S rd   ru   r   s        r   r   z"QuerySerializer._default_serialize{  s    "
6r   c                 6    |                      |          ||<   d S rd   )r   r   s        r   _serialize_type_floatz%QuerySerializer._serialize_type_float~  s     !//66
6r   c                 6    |                      ||||           d S rd   r   r   s        r   _serialize_type_doublez&QuerySerializer._serialize_type_double  "    "":ueVDDDDDr   Nr-   )r   r   r   rS   r&   r   r   r   r   r   r   r   r   r   r   ru   r   r   r   r     s          08 8 8 8L L L LP P P P&O O O O 5 5 5 5
 
 
 

) ) ) )# # # #7 7 7 7E E E E E Er   r   c                        e Zd ZdZd ZddZdS )EC2SerializeraU  EC2 specific customizations to the query protocol serializers.

    The EC2 model is almost, but not exactly, similar to the query protocol
    serializer.  This class encapsulates those differences.  The model
    will have be marked with a ``protocol`` of ``ec2``, so you don't need
    to worry about wiring this class up correctly.

    c                     d|j         v r|j         d         S d|j         v r2|j         d         }|d                                         |dd          z   S |S )N	queryNamer\   r   r   )r^   upper)r#   r`   ra   r\   s       r   rb   z"EC2Serializer._get_serialized_name  sb     %---&{33u*** &v.D7==??T!""X--r   r-   c                 ~    t          |d          D ]+\  }}| d| }|j        }|                     ||||           ,d S )Nr   r8   )r   rr   r   )	r#   r4   r@   r`   r   r   r   r   r   s	            r   r   z"EC2Serializer._serialize_type_list  s^    #E1-- 	P 	PJAw &____N!LMOOJOOOO	P 	Pr   Nr   )r   r   r   __doc__rb   r   ru   r   r   r   r     sG              P P P P P Pr   r   c                   T    e Zd ZdZd ZddZd Zd Zd Zd Z	d	 Z
d
 ZddZddZdS )JSONSerializerunixtimestampc                    d                     |j        d         |j                  }|j        d         }|                                 }|j                            d| j                  |d<   |d| d|d<   |                     ||           |                                 }|j	        }|| 
                    |||           t          j        |                              | j                  |d<   |                     ||          }|||d	<   |S )
Nz{}.{}targetPrefixjsonVersionr0   zapplication/x-amz-json-)zX-Amz-Targetr   r1   r2   r   )r~   r   r\   r5   r   r_   r3   r   r   rw   r   jsondumpsrf   rg   r   )	r#   r)   r*   targetjson_versionr4   r2   rw   r   s	            r   r&   z#JSONSerializer.serialize_to_request  s%   $^4 
 
 '/>1133
.377d) 
  

8 #DlDD!
 !

9 	++OZHHH}}%1"OOD*k:::!Z--44T5JKK
6..z?KK"(3J}%r   Nc                 ^    t          | d|j         | j                  } |||||           d S Nr   r   r#   r4   r@   r`   r   r0   s         r   r   zJSONSerializer._serialize  sE    0u00#
 

 	z5%-----r   c                 
   |j         r|||<   d S ||                                 }|||<   |}|j        }|                                D ];\  }}||         }	d|	j        v r|	j        d         }|                     |||	|           <d S r[   )is_document_typer   rx   ry   r^   r   )
r#   r4   r@   r`   r   new_serializedrx   
member_keymember_valuer   s
             r   r   z(JSONSerializer._serialize_type_structure  s    ! 	#JsOOO "&"0
3+
mG,1KKMM  (
L&z2\777!-!;F!CJlJ   	 r   c                     |                                  }|||<   |                                D ]"\  }}|                     |||j        |           #d S rd   )r   ry   r   r@   )r#   r4   r@   r`   r   map_objsub_key	sub_values           r   r   z"JSONSerializer._serialize_type_map  s_    --//!
3"'++-- 	F 	FGYOOGYWEEEE	F 	Fr   c                     g }|||<   |D ]<}i }|                      |||j        d           |                    |d                    =d S )N__current__)r   rr   r|   )r#   r4   r@   r`   r   list_obj	list_itemwrappers           r   r   z#JSONSerializer._serialize_type_list  sd    "
3 	4 	4IG
 OOGYmLLLOOGM23333	4 	4r   c                     |||<   d S rd   ru   r#   r4   r@   r`   r   s        r   r   z!JSONSerializer._default_serialize  s    
3r   c                 h    |                      ||j                            d                    ||<   d S r   r   r  s        r   r   z(JSONSerializer._serialize_type_timestamp  s6    885&**+<==
 

3r   c                 6    |                      |          ||<   d S rd   r   r  s        r   r   z#JSONSerializer._serialize_type_blob  s    **511
3r   r-   c                     t          |t          j                  rt          |          }|                     |          ||<   d S rd   )rM   decimalDecimalr   r   r   s        r   r   z$JSONSerializer._serialize_type_float  s?    eW_-- 	!%LLE!//66
6r   c                 6    |                      ||||           d S rd   r   r   s        r   r   z%JSONSerializer._serialize_type_double  r   r   rd   r   )r   r   r   rS   r&   r   r   r   r   r   r   r   r   r   ru   r   r   r   r     s        &  8. . . .  ,F F F
4 
4 
4     
 
 

2 2 27 7 7 7
E E E E E Er   r   c                       e Zd ZdZdZd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	S )CBORSerializerr   r                     Nc                     t          | d|j                   }|t          d|j         d           |||||           d S )Nr   zUnrecognized C2J type: z, unable to serialize request)rU   r   r!   r   s         r   _serialize_data_itemz#CBORSerializer._serialize_data_item  si    C%/CCDD>%%/ % % %   	z5%-----r   c                 (   |dk    r| j         }n| j        }d|z
  }|                     |          \  }}|                     ||          }|dk    r|                    |           d S |                    ||                    |d          z              d S )Nr   r   big)UNSIGNED_INT_MAJOR_TYPENEGATIVE_INT_MAJOR_TYPE"_get_additional_info_and_num_bytes_get_initial_byteextendto_bytes)	r#   r4   r@   r`   r   
major_typeadditional_info	num_bytesinitial_bytes	            r   _serialize_type_integerz&CBORSerializer._serialize_type_integer  s    A::5JJ5J JE%)%L%L&
 &
" --j/JJ>>l+++++lU^^Iu-M-MMNNNNNr   c                 6    |                      ||||           d S rd   )r!  r  s        r   _serialize_type_longz#CBORSerializer._serialize_type_long+  s"    $$ZsCCCCCr   c                    t          |t                    r|                    d          }n0t          |t          t          f          s|                                }t          |          }|                     |          \  }}|                     | j	        |          }|dk    r|
                    |           n,|
                    ||                    |d          z              |
                    |           d S Nr   r   r  )rM   re   rf   bytes	bytearrayreadlenr  r  BLOB_MAJOR_TYPEr  r  )	r#   r4   r@   r`   r   lengthr  r  r   s	            r   r   z#CBORSerializer._serialize_type_blob.  s    eS!! 	!LL))EEEE9#566 	! JJLLEU%)%L%L&
 &
" -- /
 
 >>l++++lV__Y-N-NNOOO%     r   c                 R   |                     d          }t          |          }|                     |          \  }}|                     | j        |          }	|dk    r|                    |	|z              d S |                    |	|                    |d          z   |z              d S r%  )rf   r)  r  r  STRING_MAJOR_TYPEr  r  )
r#   r4   r@   r`   r   encodedr+  r  r  r   s
             r   _serialize_type_stringz%CBORSerializer._serialize_type_stringB  s    ,,w''W%)%L%L&
 &
" --"O
 
 >>lW455555vy%@@@7J    r   c                 \   t          |          }|                     |          \  }}|                     | j        |          }|dk    r|                    |           n,|                    ||                    |d          z              |D ]}	|                     ||	|j                   d S Nr   r  )r)  r  r  LIST_MAJOR_TYPEr  r  r  rr   )
r#   r4   r@   r`   r   r+  r  r  r   items
             r   r   z#CBORSerializer._serialize_type_listR  s    U%)%L%L&
 &
" -- /
 
 >>l++++lV__Y-N-NNOOO 	F 	FD%%j$EEEE	F 	Fr   c                    t          |          }|                     |          \  }}|                     | j        |          }|dk    r|                    |           n,|                    ||                    |d          z              |                                D ]=\  }	}
|                     ||	|j                   |                     ||
|j	                   >d S r1  )
r)  r  r  MAP_MAJOR_TYPEr  r  ry   r  r   r@   )r#   r4   r@   r`   r   r+  r  r  r   key_itemr3  s              r   r   z"CBORSerializer._serialize_type_mapa  s    U%)%L%L&
 &
" --
 
 >>l++++lV__Y-N-NNOOO#kkmm 	E 	ENHd%%j(EIFFF%%j$DDDD	E 	Er   c                 r   ||                      |||j                   d |                                D             }t          |          }|                     |          \  }}|                     | j        |          }|dk    r|                    |           n,|                    ||                    |d          z              |j	        }	|                                D ]T\  }
}|	|
         }d|j
        v r|j
        d         }
|/|                     ||
d d            |                      |||           Ud S )Nc                     i | ]
\  }}|||S rd   ru   )rq   kvs      r   
<dictcomp>z<CBORSerializer._serialize_type_structure.<locals>.<dictcomp>w  s    AAA$!Q1=A===r   r   r  r\   )r  r   ry   r)  r  r  r5  r  r  rx   r^   r/  )r#   r4   r@   r`   r   
map_lengthr  r  r   rx   r   r   r   s                r   r   z(CBORSerializer._serialize_type_structureq  sl   ?%%j#uGGG BA%++--AAAZZ
%)%L%L&
 &
" --
 
 >>l++++z229eDDD   -(- 	 	$J":.L333)7?
'++J
D$OOO))l  	 	r   c                    |                      |          }d}|                     | j        |          }|                    |           |                     |          \  }}	|	dk    r2|                     | j        |          }|                    |           d S |                     | j        |          }|                    ||                    |	d          z              d S )Nr   r   r  )rY   r  TAG_MAJOR_TYPEr  r  r  r  )
r#   r4   r@   r`   r   	timestamptagr   r  r  s
             r   r   z(CBORSerializer._serialize_type_timestamp  s    22599	--d.A3GG,'''%)%L%L&
 &
" >>11,i L l+++++11,o L y11)UCCC    r   c                    |                      |          r*|                    |                     |                     d S |                     | j        d          }|                    |t          j        d|          z              d S )N   z>f_is_special_numberr  _get_bytes_for_special_numbersr  FLOAT_AND_SIMPLE_MAJOR_TYPEstructpackr#   r4   r@   r`   r   r   s         r   r   z$CBORSerializer._serialize_type_float      ""5)) 	G33E::      110" L lV[u-E-EEFFFFFr   c                    |                      |          r*|                    |                     |                     d S |                     | j        d          }|                    |t          j        d|          z              d S )N   z>drC  rI  s         r   r   z%CBORSerializer._serialize_type_double  rJ  r   c                 n    |rdnd}|                     |                     | j        |                     d S )N      )r  r  rF  )r#   r4   r@   r`   r   r  s         r   r   z&CBORSerializer._serialize_type_boolean  sM     %-""2""0/ 	
 	
 	
 	
 	
r   c                 J    |dk     r|dfS |dk     rdS |dk     rdS |dk     rdS d	S )
N   r      )rQ  r   i   )   r  l        )rB  r  )rL     ru   rO   s     r   r  z1CBORSerializer._get_additional_info_and_num_bytes  sO     2::!8O S[[5 U]]5 Z5 5r   c                 >    |dz  }||z                       dd          S )Nr  r   r  )r  )r#   r  r  major_type_bytess       r   r  z CBORSerializer._get_initial_byte  s)     &? ?2<<QFFFr   c                     t          |t          d          k    |t          d          k    t          j        |          g          S )Ninf-inf)anyr   r   r   rO   s     r   rD  z!CBORSerializer._is_special_number  sB    u%v&
5!!
 
 	
r   c                 D   d}|                      | j        |          }|t          d          k    r|t          j        dd          z   S |t          d          k    r|t          j        dd          z   S t          j        |          r|t          j        dd          z   S d S )NrS  rX  z>Hi |  rY  i   i ~  )r  rF  r   rG  rH  r   r   )r#   r@   r  r   s       r   rE  z-CBORSerializer._get_bytes_for_special_numbers  s    --,o
 
 E%LL  &+dF";";;;eFmm##&+dF";";;;Z 	<&+dF";";;;	< 	<r   rd   )r   r   r   r  r  r*  r-  r2  r5  r>  rF  r  r!  r#  r   r/  r   r   r   r   r   r   r   r  r  rD  rE  ru   r   r   r  r    sK       OONN"#. . . .O O O$D D D! ! !(   F F FE E E   B  ,	G 	G 	G	G 	G 	G
 
 
  ,G G G
 
 

< 
< 
< 
< 
<r   r  c                   v    e Zd ZdZdZdZg 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 )BaseRestSerializera=  Base class for rest protocols.

    The only variance between the various rest protocols is the
    way that the body is serialized.  All other aspects (headers, uri, etc.)
    are the same and logic for serializing those aspects lives here.

    Subclasses must implement the ``_serialize_body_params`` method.

    r   rfc822)uriquerystringheaderr1   c                 P   |                                  }|j                            d| j                  |d<   |j        }|                     ||          }|||d<   ||j        d         |d<   |S |j        }|                                 |                                 |                                 |                                 d}|                                D ] \  }}	|	| 	                    |||	|           !| 
                    |j        d         |d                   |d<   d|j        v r*| 
                    |j        d         |d                   |d<   |d	         |d
<   |d         r|d         |d<   |                     |||||           |                     |||           |S )Nr0   r   
requestUrir.   )uri_path_kwargsquery_string_kwargsbody_kwargsr1   rd  authPath	auth_pathre  r/   r1   )r5   r   r_   r3   rw   r   rx   r   ry   _partition_parameters_render_uri_template_serialize_payload_serialize_content_type)
r#   r)   r*   r4   r`   r   shape_memberspartitioned
param_nameparam_values
             r   r&   z'BaseRestSerializer.serialize_to_request
  s   1133
.377d) 
  

8  +..z?KK"(3J}%=%4%9,%GJz"  $}}#'==??==??}}	
 
 (2'7'7'9'9 	 	#J"&&Zm    "&!:!: .<M0N"
 "

: ---&*&?&?$Z0-.' 'J{# &11F%G
>"y! 	;$/	$:Jy!Z	
 	
 	
 	$$ZFFFr   c                     i }t          j        d|          D ]R}|                    d          r#t          ||d d                  d          ||<   :t          ||                   ||<   S |j        di |S )Nz{(.*?)}+r   z/~)saferu   )refindallendswithr   r~   )r#   uri_templateparamsencoded_paramstemplate_params        r   rj  z'BaseRestSerializer._render_uri_templateF  s      j\BB 	 	N&&s++ 1?>#2#./d2 2 2~.. 2@>*2 2~.. #|"44^444r   c                    |j                             d          }|                     ||          r2|                    |d          }|                     |          }||d<   d S |Q|                    |          }|!|                     |||                   |d<   d S |                                 |d<   d S |d         r!|                     |d         |          |d<   d S |                     |          r|                                 |d<   d S d S )Npayloadr   r2   rf  )r^   r_   _has_streaming_payload_encode_payload_serialize_body_params_serialize_empty_body_requires_empty_body)	r#   rn  r)   r4   r`   rm  payload_memberbody_payloadr   s	            r   rk  z%BaseRestSerializer._serialize_payloadY  sF    ,00;;&&~}EE 	> &>>.#>>L//==L!-Jv' %..88K&%)%@%@~!>& &
6""" &*%?%?%A%A
6"""' 	>!%!<!<M*E" "Jv &&u-- 	>!%!;!;!=!=Jv	> 	>r   c                     dS )Nr   ru   r#   s    r   r  z(BaseRestSerializer._serialize_empty_bodyy  s    sr   c                     dS )z
        Some protocols require varied Content-Type headers
        depending on user input. This allows subclasses to apply
        this conditionally.
        Nru   )r#   r4   r`   rm  s       r   rl  z*BaseRestSerializer._serialize_content_type|  s	     	r   c                     dS )z
        Some protocols require a specific body to represent an empty
        payload. This allows subclasses to apply this conditionally.
        Fru   r   s     r   r  z'BaseRestSerializer._requires_empty_body  s	    
 ur   c                 (    |duo||         j         dv S )z5Determine if payload is streaming (a blob or string).N)blobstring)r   )r#   r|  rm  s      r   r}  z)BaseRestSerializer._has_streaming_payload  s)    d" 
}W'='G L
 (
 	
r   c                 d    t          |t                    r|                    | j                  S |S rd   )rM   re   rf   rg   )r#   r2   s     r   r~  z"BaseRestSerializer._encode_payload  s.    dC   	6;;t4555r   c                     ||         j                             d          }j                             d|          }|dk    r#                     |          }||d         |<   d S |dk    r|t          |t                    r|d                             |           d S j        dk    r fd|D             }||d         |<   d S                      |          }||d         |<   d S |d	k    r8||         }	|s|	j        dk    rd S                      |	|          |d
         |<   d S |d
k    r!|}
                     |
|d
         |           d S ||d         |<   d S )Nlocationr\   r_  rd  r`  re  listc                 F    g | ]}                     |j                  S ru   )_get_uri_and_query_string_valuerr   )rq   r@   rr   r#   s     r   rs   z<BaseRestSerializer._partition_parameters.<locals>.<listcomp>  s;        88NN  r   ra  r1   rf  )	r^   r_   r  rM   r   updater   _convert_header_value_do_serialize_header_map)r#   rn  ro  rp  rm  r  key_nameuri_path_value	new_paramr`   header_prefixrr   s   `          @r   ri  z(BaseRestSerializer._partition_parameters  s    z*'++J77'++FJ??u!AAV N 8FK)*8444&&+t,, I1299+FFFFF!V++    !,  	 @I128<<< @@ 	 @I128<<<!!!*-E 5?f#<#</3/I/I{0 0K	"8,,, "" %M
 )){95{     6AK&z222r   c                 6   |j         dk    r!t          |                                          S |j         dk    r6|j                            d| j                  }|                     ||          S |j         dv r"t          |                     |                    S |S )Nbooleanr?  r   r   double)r   re   rT   r^   r_   QUERY_STRING_TIMESTAMP_FORMATrY   r   )r#   rp  rr   rB   s       r   r  z2BaseRestSerializer._get_uri_and_query_string_value  s    y(({##))+++,,%377!4#E    11-   !444t))+66777r   c                 N    |                                 D ]\  }}||z   }|||<   d S rd   )ry   )r#   r  r1   
user_inputr   valfull_keys          r   r  z+BaseRestSerializer._do_serialize_header_map  sB    "((** 	$ 	$HC$s*H #GH	$ 	$r   c                      t          d          Nr  r'   )r#   rx  r`   s      r   r  z)BaseRestSerializer._serialize_body_params      !":;;;r   c                     j         dk    rxt          |          }t          j        |                                          }j                            d j                  }t           	                    ||                    S j         dk    rCj
        j         dk    r fd|D             }n fd|D             }d                    |          S t                    r)                     t          j        |d	                    S j         d
k    r!t          |                                          S j         dv r"t                               |                    S t          |          S )Nr?  r   r  r  c                 >    g | ]}|                     |          S rd   )_escape_header_list_string)rq   r:  r#   s     r   rs   z<BaseRestSerializer._convert_header_value.<locals>.<listcomp>  s4     # # #} 33A66$}}r   c                 J    g | ]}|                     j        |           S rd   )r  rr   )rq   r:  r#   r`   s     r   rs   z<BaseRestSerializer._convert_header_value.<locals>.<listcomp>  s8     # # #} ..u|Q??$}}r   ,)r  :)
separatorsr  r  )r   r
   rE   rF   utctimetupler^   r_   HEADER_TIMESTAMP_FORMATre   rY   rr   r}   r	   rl   r   r   rT   r   )r#   r`   r@   rV   r?  rB   converted_values   ``     r   r  z(BaseRestSerializer._convert_header_value  s   ?k))2599L (A(A(C(CDDI$266!4#?    ..y:JKK   _&&|%11# # # #"# # ## # # # #"# # #
 88O,,,!%(( 		 ##DJu$L$L$LMMM_	))u::##%%%_ 333t))%00111u::r   c                 N    d|v sd|v rd|                     dd          z   dz   S |S )N"r  z\")replacerO   s     r   r  z-BaseRestSerializer._escape_header_list_string  s8     %<<3%<<sE222S88Lr   N)r   r   r   r   r  r  KNOWN_LOCATIONSr&   rj  rk  r  rl  r  r}  r~  ri  r  r  r  r  r  ru   r   r   r]  r]    s         %.!& BAAO: : :x5 5 5&> > >@      
 
 
  
1A 1A 1Af  $ $ $
< < <! ! !F    r   r]  c                   *    e Zd ZdZd Zd Zd Zd ZdS )BaseRpcV2Serializera`  Base class for RPCv2 protocols.

    The only variance between the various RPCv2 protocols is the
    way that the body is serialized.  All other aspects (headers, uri, etc.)
    are the same and logic for serializing those aspects lives here.

    Subclasses must implement the ``_serialize_body_params``  and
    ``_serialize_headers`` methods.

    c                    |                                  }|j        j        d         }|j        }d| d| |d<   |j        }||                     |||           |                     ||          }|||d<   |                     ||           |S )Nr   z	/service/z/operation/r.   r   )r5   r   r   r\   rw   rk  r   _serialize_headers)r#   r)   r*   r4   service_nameoperation_namerw   r   s           r   r&   z(BaseRpcV2Serializer.serialize_to_request  s    1133
&4=nM(-AAAAA 	: &1"##J
KHHH..z?KK"(3J}%
O<<<r   c                 <    |                      ||          }||d<   d S )Nr2   )r  )r#   r)   r4   r`   r  s        r   rk  z&BaseRpcV2Serializer._serialize_payload,  s'    22:uEE)
6r   c                      t          d          )Nr  r'   )r#   r4   r*   s      r   r  z&BaseRpcV2Serializer._serialize_headers0  s    !"6777r   c                      t          d          r  r'   )r#   r)   r`   s      r   r  z*BaseRpcV2Serializer._serialize_body_params3  r  r   N)r   r   r   r   r&   rk  r  r  ru   r   r   r  r    sZ        	 	  (* * *8 8 8< < < < <r   r  c                   &    e Zd Zd Zd Zd Zd ZdS )RestJSONSerializerc                     dS )Ns   {}ru   r  s    r   r  z(RestJSONSerializer._serialize_empty_body8  s    ur   c                 \    |j                                         D ]\  }}d|j        vr dS dS )zq
        Serialize an empty JSON object whenever the shape has
        members not targeting a location.
        r  TF)rx   ry   r^   )r#   r`   rr   r  s       r   r  z'RestJSONSerializer._requires_empty_body;  sD    
 !=..00 	 	KFC!222tt 3ur   c                     |j                             d          }|                     ||          rdS |d         dk    }t          d|d                   }|r|sd|d         d<   dS dS dS )z?Set Content-Type to application/json for all structured bodies.r|  Nr2   r   r   r1   zapplication/json)r^   r_   r}  r   )r#   r4   r`   rm  r|  has_bodyhas_content_types          r   rl  z*RestJSONSerializer._serialize_content_typeE  s    %)))44&&w>> 	Ff%,%nj6KLL 	G, 	G4FJy!.111	G 	G 	G 	Gr   c                     |                                  }|                     |||           t          j        |                              | j                  S rd   )r   r   r   r   rf   rg   )r#   rx  r`   serialized_bodys       r   r  z)RestJSONSerializer._serialize_body_paramsQ  sF    --//777z/**11$2GHHHr   N)r   r   r   r  r  rl  r  ru   r   r   r  r  7  sX            
G 
G 
GI I I I Ir   r  c                   Z    e 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 )RestXMLSerializerr   c                     |j         d         }t          j        d          }|                     ||||           t	          |          d         }t          j        || j                  S )Nr\   r-   r   )encoding)r^   r   Elementr   r  tostringrg   )r#   rx  r`   	root_namepseudo_root	real_roots         r   r  z(RestXMLSerializer._serialize_body_paramsZ  sb    '/	!)"--v{I>>>%%a(	#I8MNNNNr   c                 ^    t          | d|j         | j                  } |||||           d S r   r   )r#   r`   rx  xmlnoder\   r0   s         r   r   zRestXMLSerializer._serializea  sE    0u00#
 

 	wt,,,,,r   c                 ~   t          j        ||          }|                     ||           |                                D ]|\  }}|j        |         }|j                            d|          }	| d S |j                            d          r|j        d         }
||j        |
<   d|                     ||||	           }d S )Nr\   xmlAttribute)	r   
SubElement_add_xml_namespacery   rx   r^   r_   attribr   )r#   r  rx  r`   r\   structure_noder   r@   r   member_namexml_attribute_names              r   r   z+RestXMLSerializer._serialize_type_structurei  s    $/>>~666 ,,.. 	N 	NJC =-L&488EEK
 })--n== %1%?%G"<A%&89OOL%MMMM	N 	Nr   c                    |j         }|j                            d          r|}|}n0|j                            dd          }t          j        ||          }|                     ||           |D ]}|                     ||||           d S )Nr   r\   rr   )rr   r^   r_   r   r  r  r   )	r#   r  rx  r`   r\   r   element_name	list_noder3  s	            r   r   z&RestXMLSerializer._serialize_type_list~  s    |"";// 	>LII'599&(KKL#.w==Iy111 	I 	IDOOL$	<HHHH	I 	Ir   c                    |                      |          s+t          j        ||          }|                     ||           |                                D ]\  }}|                      |          rt          j        ||          nt          j        |d          }|                     |j        d          }	|                     |j        d          }
|                     |j        |||	           |                     |j        |||
           d S )Nentryr   r   r@   )	r   r   r  r  ry   rb   r   r@   r   )r#   r  rx  r`   r\   noder   r@   sub_noder  val_names              r   r   z%RestXMLSerializer._serialize_type_map  s     ''.. 	1)'488D##E4000 ,,.. 	D 	DJC ++E22;&w555 +D':: 
 000OOH00' 1  H OOEIsHh???OOEK(CCCC	D 	Dr   c                 x    t          j        ||          }|rd}nd}||_        |                     ||           d S r   )r   r  textr  )r#   r  rx  r`   r\   r  	str_values          r   r   z)RestXMLSerializer._serialize_type_boolean  sM     %gt44 	 III	t,,,,,r   c                     t          j        ||          }|                     |          |_        |                     ||           d S rd   )r   r  rl   r  r  r#   r  rx  r`   r\   r  s         r   r   z&RestXMLSerializer._serialize_type_blob  sE    %gt44$$V,,	t,,,,,r   c                     t          j        ||          }t          |                     ||j                            d                              |_        |                     ||           d S r   )r   r  re   rY   r^   r_   r  r  r  s         r   r   z+RestXMLSerializer._serialize_type_timestamp  sm    %gt44**+//0ABB 
 
	
 	t,,,,,r   c                     t          j        ||          }t          |                     |                    |_        |                     ||           d S rd   )r   r  re   r   r  r  r  s         r   r   z'RestXMLSerializer._serialize_type_float  sM    %gt44**62233	t,,,,,r   c                 6    |                      ||||           d S rd   r   )r#   r  rx  r`   r\   s        r   r   z(RestXMLSerializer._serialize_type_double  s"    ""7FE4@@@@@r   c                     t          j        ||          }t          |          |_        |                     ||           d S rd   )r   r  re   r  r  r  s         r   r   z$RestXMLSerializer._default_serialize  s=    %gt44KK	t,,,,,r   c                    d|j         v rz|j         d         }d}t          |t                    r5|                    d          r|d|d          z  }|d         |j        |<   d S t          |t
                    r||j        |<   d S d S d S )NxmlNamespacexmlnsr   r  r_  )r^   rM   r   r_   r  re   )r#   r`   r  namespace_metadataattribute_names        r   r  z$RestXMLSerializer._add_xml_namespace  s    U000!&!4^!D$N,d33 K%))(33 I"&H*<X*F&H&HHN8J9%n555 .44 K8J%n555 10K Kr   N)r   r   r   rS   r  r   r   r   r   r   r   r   r   r   r   r  ru   r   r   r  r  W  s         O O O- - -N N N*
I 
I 
ID D D4
- 
- 
-- - -
- - -- - -
A A A- - -
K K K K Kr   r  c                   .     e Zd ZdZ fdZd Zd Z xZS )RpcV2CBORSerializerr   c                 f    t          d           t                                          ||          S )NPROTOCOL_RPC_V2_CBOR)r   superr&   )r#   r)   r*   	__class__s      r   r&   z(RpcV2CBORSerializer.serialize_to_request  s,    2333ww++JHHHr   c                 j    t                      }|                     |||           t          |          S rd   )r'  r  r&  )r#   r)   rw   r2   s       r   r  z*RpcV2CBORSerializer._serialize_body_params  s/    {{!!$
K@@@T{{r   c                     d|d         d<   |j         rd}nd}|                     ||           |d         dk    }t          d|d                   }||d         d	<   |s|r||d         d<   d S d S d S )
Nzrpc-v2-cborr1   zsmithy-protocolz"application/vnd.amazon.eventstreamzapplication/cborr2   r   r   Accept)has_event_stream_outputr   r   )r#   r4   r*   
header_valr  r  s         r   r  z&RpcV2CBORSerializer._serialize_headers  s    3@
9/02 	,=JJ+J++OZHHHf%,%nj6KLL*4
9h' 	?H 	?4>Jy!.111	? 	? 	? 	?r   )r   r   r   rS   r&   r  r  __classcell__)r  s   @r   r  r    sa        &I I I I I  
? ? ? ? ? ? ?r   r  )ec2queryr   z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor),r   rh   rE   rN   r  r   r   rt  rG  	xml.etreer   botocorer   botocore.compatr   botocore.exceptionsr   botocore.useragentr   botocore.utilsr   r	   r
   r   DEFAULT_TIMESTAMP_FORMATr?   r>   compilerz   r   r;   r    r   r   r   r   r   r  r]  r  r  r  r  r   ru   r   r   <module>r     s~   8       				  ! ! ! ! ! !       & & & & & & 4 4 4 4 4 4 2 2 2 2 2 2            % 
'122' "/ #  3   4l@ l@ l@ l@ l@ l@ l@ l@^lE lE lE lE lEj lE lE lE^P P P P PO P P P<`E `E `E `E `EZ `E `E `EFo< o< o< o< o<Z o< o< o<dQ Q Q Q Q Q Q Qh(< (< (< (< (<* (< (< (<VI I I I I+^ I I I@K K K K K* K K KD? ? ? ? ?-~ ? ? ?< #!- r   