
    Pe~                     :   d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd	lm Z m!Z!  ejD                  e#      Z$d
Z%di iZ& G d d      Z' G d de'      Z( G d de)e      Z* G d d      Z+y)zResolves regions and endpoints.

This module implements endpoint resolution, including resolving endpoints for a
given service and region and resolving the available endpoints for a service
in a specific AWS partition.
    N)Enum)UNSIGNED
xform_name)AUTH_TYPE_MAPSHAS_CRTCRT_SUPPORTED_AUTH_TYPES)EndpointProvider)EndpointProviderErrorEndpointVariantError!InvalidEndpointConfigurationErrorInvalidHostLabelErrorMissingDependencyExceptionNoRegionErrorParamValidationError$UnknownEndpointResolutionBuiltInNameUnknownRegionErrorUnknownSignatureVersionError*UnsupportedS3AccesspointConfigurationErrorUnsupportedS3ConfigurationErrorUnsupportedS3ControlArnError&UnsupportedS3ControlConfigurationError)ensure_booleaninstance_cachez{service}.{region}.{dnsSuffix}	endpointsc                   (    e Zd ZdZddZd Z	 ddZy)BaseEndpointResolverz3Resolves regions and endpoints. Must be subclassed.Nc                     t         )a7  Resolves an endpoint for a service and region combination.

        :type service_name: string
        :param service_name: Name of the service to resolve an endpoint for
            (e.g., s3)

        :type region_name: string
        :param region_name: Region/endpoint name to resolve (e.g., us-east-1)
            if no region is provided, the first found partition-wide endpoint
            will be used if available.

        :rtype: dict
        :return: Returns a dict containing the following keys:
            - partition: (string, required) Resolved partition name
            - endpointName: (string, required) Resolved endpoint name
            - hostname: (string, required) Hostname to use for this endpoint
            - sslCommonName: (string) sslCommonName to use for this endpoint.
            - credentialScope: (dict) Signature version 4 credential scope
              - region: (string) region name override when signing.
              - service: (string) service name override when signing.
            - signatureVersions: (list<string>) A list of possible signature
              versions, including s3, v4, v2, and s3v4
            - protocols: (list<string>) A list of supported protocols
              (e.g., http, https)
            - ...: Other keys may be included as well based on the metadata
        NotImplementedError)selfservice_nameregion_names      2/usr/lib/python3/dist-packages/botocore/regions.pyconstruct_endpointz'BaseEndpointResolver.construct_endpoint6   s
    6 "!    c                     t         )zLists the partitions available to the endpoint resolver.

        :return: Returns a list of partition names (e.g., ["aws", "aws-cn"]).
        r   )r!   s    r$   get_available_partitionsz-BaseEndpointResolver.get_available_partitionsS   s
    
 "!r&   c                     t         )a  Lists the endpoint names of a particular partition.

        :type service_name: string
        :param service_name: Name of a service to list endpoint for (e.g., s3)

        :type partition_name: string
        :param partition_name: Name of the partition to limit endpoints to.
            (e.g., aws for the public AWS endpoints, aws-cn for AWS China
            endpoints, aws-us-gov for AWS GovCloud (US) Endpoints, etc.

        :type allow_non_regional: bool
        :param allow_non_regional: Set to True to include endpoints that are
             not regional endpoints (e.g., s3-external-1,
             fips-us-gov-west-1, etc).
        :return: Returns a list of endpoint names (e.g., ["us-east-1"]).
        r   )r!   r"   partition_nameallow_non_regionals       r$   get_available_endpointsz,BaseEndpointResolver.get_available_endpointsZ   s
    & "!r&   N)awsF)__name__
__module____qualname____doc__r%   r(   r,    r&   r$   r   r   3   s    =":" FK"r&   r   c                       e Zd ZdZddgZddZddZd Z	 	 	 ddZ	 dd	Z		 	 	 	 dd
Z
d Z	 ddZd Zd Zd Zd Zd Zd Zd Zy)EndpointResolverz7Resolves endpoints based on partition endpoint metadatazaws-isoz	aws-iso-bc                 >    d|vrt        d      || _        || _        y)a  
        :type endpoint_data: dict
        :param endpoint_data: A dict of partition data.

        :type uses_builtin_data: boolean
        :param uses_builtin_data: Whether the endpoint data originates in the
            package's data directory.
        
partitionsz%Missing "partitions" in endpoint dataN)
ValueError_endpoint_datauses_builtin_data)r!   endpoint_datar:   s      r$   __init__zEndpointResolver.__init__u   s(     },DEE+!2r&   c                 d    | j                   d   D ]  }|d   |k7  r|d   }||vr||   d   c S  y )Nr7   	partitionservicesr   )r9   )r!   r"   r*   r>   r?   s        r$   get_service_endpoints_dataz+EndpointResolver.get_service_endpoints_data   sQ    ,,\: 	7I%7 ,H8+L)+66	7r&   c                 Z    g }| j                   d   D ]  }|j                  |d           |S )Nr7   r>   )r9   append)r!   resultr>   s      r$   r(   z)EndpointResolver.get_available_partitions   s7    ,,\: 	2IMM)K01	2r&   Nc                    g }| j                   d   D ]o  }|d   |k7  r|d   }||vr||   d   }|D ]M  }	|	|d   v }
|r,|
r*| j                  ||	   |      }|s&|j                  |	       8|s|
s=|j                  |	       O q |S )Nr7   r>   r?   r   regions)r9   _retrieve_variant_datarB   )r!   r"   r*   r+   endpoint_variant_tagsrC   r>   r?   service_endpointsendpoint_nameis_regional_endpointvariant_datas               r$   r,   z(EndpointResolver.get_available_endpoints   s     ,,\: 	1I%7 ,H8+ ( 6{ C!2 
1'4	)8L'L$(-A#'#>#>)-8:O$L $m4'+?MM-0
1	1$ r&   c                     | j                   d   D ]C  }|d   |k(  s|r0| j                  |j                  d      |      }|s2d|v s7|d   c S |d   c S  y )Nr7   r>   defaults	dnsSuffix)r9   rF   get)r!   r*   rG   r>   variants        r$   get_partition_dns_suffixz)EndpointResolver.get_partition_dns_suffix   st     ,,\: 		2I%7("99!j13HG ;'#9&{33$[11		2 r&   c                    |dk(  r|r|d}|<d }| j                   d   D ]  }|d   |k(  s|} || j                  |||||d      }|S y | j                   d   D ]1  }|r|d   | j                  v r| j                  |||||      }|s/|c S  y )Ns3z	us-east-1r7   r>   T)r9   _endpoint_for_partition!_UNSUPPORTED_DUALSTACK_PARTITIONS)	r!   r"   r#   r*   use_dualstack_endpointuse_fips_endpointvalid_partitionr>   rC   s	            r$   r%   z#EndpointResolver.construct_endpoint   s     D &#%K%"O!00> 0	[)^;&/O0 *55# *%  ,,\: 	I%+&99: 11&!F 	r&   c                 v    | j                   d   D ]  }| j                  ||      s|d   c S  t        |d      )Nr7   r>   z,No partition found for provided region_name.)r#   	error_msg)r9   _region_matchr   )r!   r#   r>   s      r$   get_partition_for_regionz)EndpointResolver.get_partition_for_region   sL    ,,\: 	.I!!)[9 --	. !#D
 	
r&   c                    |d   }|r!|| j                   v rd|z  }t        dg|      |d   j                  |t              }	|d|	v r|	d   }n
t	               |||	|||d}
||	d   v r | j
                  di |
S | j                  ||      s|r|	j                  d      }|	j                  d	d
      }|r1|s/t        j                  d|||       ||
d<    | j
                  di |
S t        j                  d||        | j
                  di |
S y )Nr>   z@Dualstack endpoints are currently not supported for %s partition	dualstacktagsrZ   r?   partitionEndpoint)r>   r"   service_datarI   rV   rW   r   isRegionalizedTz'Using partition endpoint for %s, %s: %srI   z*Creating a regex based endpoint for %s, %sr3   )	rU   r   rO   DEFAULT_SERVICE_DATAr   _resolver[   LOGdebug)r!   r>   r"   r#   rV   rW   force_partitionr*   rZ   rb   resolve_kwargspartition_endpointis_regionalizeds                r$   rT   z(EndpointResolver._endpoint_for_partition   sh    #;/"$"H"HH$&45  '[MYOO !,00.
 "l2*+>?#o% #(((&<!2
 ,{33 4==2>22 i5!-!1!12E!F*../?FO!/		= &	 3E/$t}}6~66II<
 !4==2>22% :Ir&   c                 j    ||d   v ryd|v r't        j                  |d         j                  |      S y)NrE   TregionRegexF)recompilematch)r!   r>   r#   s      r$   r[   zEndpointResolver._region_match9  s<    )I..I%::i67==kJJr&   c                     |j                  dg       }|D ]0  }t        |d         t        |      k(  s|j                         }|c S  y )Nvariantsr`   )rO   setcopy)r!   r;   r`   rr   rP   rC   s         r$   rF   z'EndpointResolver._retrieve_variant_data@  sH     $$Z4 	G76?#s4y0 	r&   c                 V    g }|r|j                  d       |r|j                  d       |S )Nr^   fips)rB   )r!   rV   rW   r`   s       r$   _create_tag_listz!EndpointResolver._create_tag_listG  s*    !KK$KKr&   c                 l    i }|||fD ])  }| j                  ||      }|s| j                  ||       + |S r-   )rF   _merge_keys)r!   r`   r;   service_defaultspartition_defaultsrC   rr   rP   s           r$   _resolve_variantz!EndpointResolver._resolve_variantO  sM     &(8:LM 	2H11(DAG  &1	2 r&   c                    |j                  di       j                  |i       }|j                  d      rt        j                  d|z         |j                  di       }|j                  di       }	| j                  ||      }
|
rA| j	                  |
|||	      }|i k(  rd| d| }t        |
|      | j                  ||       n|}d|vr|d   |d<   |d	   |d	<   ||d
<   | j                  ||       | j                  |	|       | j                  ||d   |||d         |d<   d|v r| j                  ||d   |||d         |d<   |S )Nr   
deprecatedz5Client is configured with the deprecated endpoint: %srM   zEndpoint does not exist for z in region r_   rN   r>   endpointNamehostnamesslCommonName)rO   rf   warningrw   r|   r   ry   _expand_template)r!   r>   r"   rb   rI   rV   rW   r;   rz   r{   r`   rC   rZ   s                r$   re   zEndpointResolver._resolveY  s    %((b9==2
 \*KKG "
 (++J;&]]:r:$$%;=NO**m%57IF |2<. A!!.1  +	JJ]F3"F f$"+K"8F;'4{!.~ 	)62+V4!22:;
z f$&*&;&;'{#'F?# r&   c                 ,    |D ]  }||vs||   ||<    y r-   r3   )r!   	from_datarC   keys       r$   ry   zEndpointResolver._merge_keys  s&     	-C& 'ns	-r&   c                 *    |j                  |||      S )N)serviceregionrN   )format)r!   r>   templater"   rI   rN   s         r$   r   z!EndpointResolver._expand_template  s!      )  
 	
r&   )F)r.   )r.   FNr-   )NNFF)r/   r0   r1   r2   rU   r<   r@   r(   r,   rQ   r%   r\   rT   r[   rF   rw   r|   re   ry   r   r3   r&   r$   r5   r5   p   s    A)2K(@%37  ": 59$ $0d
  ?3B@D-

r&   r5   c                   8    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y)EndpointResolverBuiltinszAWS::RegionzAWS::UseFIPSzAWS::UseDualStackzAWS::STS::UseGlobalEndpointzAWS::S3::UseGlobalEndpointzAWS::S3::AcceleratezAWS::S3::ForcePathStylezAWS::S3::UseArnRegionzAWS::S3Control::UseArnRegionz'AWS::S3::DisableMultiRegionAccessPointszSDK::EndpointN)r/   r0   r1   
AWS_REGIONAWS_USE_FIPSAWS_USE_DUALSTACKAWS_STS_USE_GLOBAL_ENDPOINTAWS_S3_USE_GLOBAL_ENDPOINTAWS_S3_ACCELERATEAWS_S3_FORCE_PATH_STYLEAWS_S3_USE_ARN_REGIONAWS_S3CONTROL_USE_ARN_REGIONAWS_S3_DISABLE_MRAPSDK_ENDPOINTr3   r&   r$   r   r     sO    J "L , #@ ">-7 4 $B C"Lr&   r   c                       e Zd ZdZ	 	 ddZd Zd Zd Zd Zd Z	d	 Z
d
 Zed        Zed        Zed        Zd Zd Zd Zd Zd Zy)EndpointRulesetResolverz5Resolves endpoints using a service's endpoint rulesetNc	                     t        ||      | _        | j                  j                  j                  | _        || _        || _        || _        || _        || _	        || _
        i | _        y )N)ruleset_datapartition_data)r
   	_providerruleset
parameters_param_definitions_service_model	_builtins_client_context_event_emitter_use_ssl_requested_auth_scheme_instance_cache)	r!   endpoint_ruleset_datar   service_modelbuiltinsclient_contextevent_emitteruse_sslrequested_auth_schemes	            r$   r<   z EndpointRulesetResolver.__init__  sf     *.)
 #'.."8"8"C"C+!-+&;#!r&   c           	      \   |i }|i }| j                  |||      }t        j                  d|z         	  | j                  j                  d
i |}t        j                  d|j                  z         | j                  s=|j                  j                  d      r"|j                  d|j                  dd        }|j                  |j                  j                         D 	ci c]  \  }}	||	d    c}	}	      }|S # t
        $ r}| j                  ||      }| ||d}~ww xY wc c}	}w )zAInvokes the provider with params defined in the service's rulesetNz-Calling endpoint provider with parameters: %szEndpoint provider result: %szhttps://zhttp://   )urlr   )headersr3   )_get_provider_paramsrf   rg   r   resolve_endpointr   #ruleset_error_to_botocore_exceptionr   r   
startswith_replacer   items)
r!   operation_model	call_argsrequest_contextprovider_paramsprovider_resultexbotocore_exceptionr   vals
             r$   r%   z*EndpointRulesetResolver.construct_endpoint  sY    I" O33Y
 			;oM	
	1=dnn== !O 			0?3F3FFG }}!4!4!?!?
!K-66o11!"567 7 O *22,;,C,C,I,I,K (SSV 3 
 3 % 	1!%!I!IO" ")(b0	1(s   C? $D(
?	D%D  D%c                    i }| j                  |||      }| j                  j                         D ]L  \  }}| j                  |||      }|)|j                  | j                  |j                  |      }|H|||<   N |S )a  Resolve a value for each parameter defined in the service's ruleset

        The resolution order for parameter values is:
        1. Operation-specific static context values from the service definition
        2. Operation-specific dynamic context values from API parameters
        3. Client-specific context parameters
        4. Built-in values such as region, FIPS usage, ...
        )
param_namer   r   )builtin_namer   )_get_customized_builtinsr   r   _resolve_param_from_contextbuiltin_resolve_param_as_builtin)	r!   r   r   r   r   customized_builtinsr   	param_def	param_vals	            r$   r   z,EndpointRulesetResolver._get_provider_params  s      #;;Y
 &*%<%<%B%B%D 	8!J	88% /# 9 I
  Y%6%6%B ::!*!2!20 ; 	 $.7
+	8 r&   c                 ~    | j                  ||      }||S | j                  |||      }||S | j                  |      S r-   )&_resolve_param_as_static_context_param'_resolve_param_as_dynamic_context_param&_resolve_param_as_client_context_param)r!   r   r   r   staticdynamics         r$   r   z3EndpointRulesetResolver._resolve_param_from_context5  s[     <<
 M>>
 N:::FFr&   c                 F    | j                  |      }|j                  |      S r-   )_get_static_context_paramsrO   )r!   r   r   static_ctx_paramss       r$   r   z>EndpointRulesetResolver._resolve_param_as_static_context_paramD  s&     !;;OL $$Z00r&   c                 Z    | j                  |      }||v r||   }|j                  |      S y r-   )_get_dynamic_context_paramsrO   )r!   r   r   r   dynamic_ctx_paramsmember_names         r$   r   z?EndpointRulesetResolver._resolve_param_as_dynamic_context_paramJ  s<     "==oN++,Z8K==-- ,r&   c                 l    | j                         }||v r ||   }| j                  j                  |      S y r-   )_get_client_context_paramsr   rO   )r!   r   client_ctx_paramsclient_ctx_varnames       r$   r   z>EndpointRulesetResolver._resolve_param_as_client_context_paramR  sB     ;;=**!2:!>''++,>?? +r&   c                 |    |t         j                  j                         vrt        |      |j	                  |      S )N)name)r   __members__valuesr   rO   )r!   r   r   s      r$   r   z1EndpointRulesetResolver._resolve_param_as_builtinX  s4    7CCJJLL6LII||L))r&   c                 j    |j                   D ci c]  }|j                  |j                   c}S c c}w )z=Mapping of param names to static param value for an operation)static_context_parametersr   valuer!   r   params      r$   r   z2EndpointRulesetResolver._get_static_context_params]  s7    
 )BB
 JJ#
 	
 
   0c                 j    |j                   D ci c]  }|j                  |j                   c}S c c}w )z7Mapping of param names to member names for an operation)context_parametersr   r   r   s      r$   r   z3EndpointRulesetResolver._get_dynamic_context_paramse  s9    
 );;
 JJ)))
 	
 
r   c                     | j                   j                  D ci c]"  }|j                  t        |j                        $ c}S c c}w )z7Mapping of param names to client configuration variable)r   client_context_parametersr   r   )r!   r   s     r$   r   z2EndpointRulesetResolver._get_client_context_paramsm  sB    
 ,,FF
 JJ
5::..
 	
 
s   'Ac                     | j                   j                  j                         }t        j                  | j                        }| j
                  j                  d|z  ||||       |S )Nzbefore-endpoint-resolution.%s)r   modelparamscontext)r   
service_id	hyphenizert   r   r   emit)r!   r   r   r   r   r   s         r$   r   z0EndpointRulesetResolver._get_customized_builtinsu  sf     ((33==?
"ii7  +j8(!# 	! 	
 #"r&   c                     t        |t              rt        |      dk(  rt        d      t        j                  ddj                  |D cg c]  }d|j                  d       d c}       j                          j                  t        k(  rdi fS |D cg c]  }i |d j                  |d         i }} j                  	 t         fd	|D              \  }}n	 t        d
 |D              \  }}i }d|v r	|d   |d<   n d|v rt        |d         dkD  r|d   d   |d<   d|v r|j#                  |d          d|v rt%        |d         |d<   t        j                  d|d   ||       ||fS c c}w c c}w # t        $ r di fcY S w xY w# t        $ r\ d}|D cg c]  }|d   	 nc c}w }}t        st        d |D              }|rt        d      t!        dj                  |            w xY w)a  Convert an Endpoint's authSchemes property to a signing_context dict

        :type auth_schemes: list
        :param auth_schemes: A list of dictionaries taken from the
            ``authSchemes`` property of an Endpoint object returned by
            ``EndpointProvider``.

        :rtype: str, dict
        :return: Tuple of auth type string (to be used in
            ``request_context['auth_type']``) and signing context dict (for use
            in ``request_context['signing']``).
        r   z&auth_schemes must be a non-empty list.z_Selecting from endpoint provider's list of auth schemes: %s. User selected auth scheme is: "%s"z, "r   noneNc              3   x   K   | ]1  }j                  j                  |d          rj                  |f 3 ywr   N)._does_botocore_authname_match_ruleset_authnamer   ).0sr!   s     r$   	<genexpr>zFEndpointRulesetResolver.auth_schemes_to_signing_ctx.<locals>.<genexpr>  sA      $JJ33QvY 00!4$s   7:c              3   @   K   | ]  }|d    t         v r	|d    |f  ywr   )r   )r   r   s     r$   r   zFEndpointRulesetResolver.auth_schemes_to_signing_ctx.<locals>.<genexpr>  s,      $yN2 vYN$s   Fc              3   ,   K   | ]  }|t         v   y wr-   r   )r   schemes     r$   r   zFEndpointRulesetResolver.auth_schemes_to_signing_ctx.<locals>.<genexpr>  s      +" "::+s   zbThis operation requires an additional dependency. Use pip install botocore[crt] before proceeding.msg)signature_versionsigningRegionr   signingRegionSetsigningName)signing_namedisableDoubleEncodingz?Selected auth type "%s" as "%s" with signing context params: %s)
isinstancelistlen	TypeErrorrf   rg   joinrO   r   r   _strip_sig_prefixnextStopIterationr   anyr   r   updater   )r!   auth_schemesr   r   r   fixable_with_crtauth_type_optionssigning_contexts   `       r$   auth_schemes_to_signing_ctxz3EndpointRulesetResolver.auth_schemes_to_signing_ctx  sp    ,-\1Ba1GDEE		1II\B155=/+BC''		
 &&(22: '
 GvFvt55fVnEF
 
 &&2   $ $)$  f# $)$  f6 f$(.(?OH%6)6,-.2,23E,Fq,I)F"""}0E"F"f,7E./8O34 			M6N		
 _$$Y C
  !   Rx	  !  $) 8D$E1QvY$E$E!$E'* +&7+ ($
 $4L 
 7*.))4E*F %s7   
E1!E6E;  F ;F
FG3F*)A
G3c                 2    |j                  d      r|dd S |S )z6Normalize auth type names by removing any "sig" prefixsig   N)r   )r!   	auth_names     r$   r  z)EndpointRulesetResolver._strip_sig_prefix  s      ) 4 4U ;y}JJr&   c                     | j                  |      }|j                  d      d   }|dk7  r|j                  d      r|dd }||k(  S )a\  
        Whether a valid string provided as signature_version parameter for
        client construction refers to the same auth methods as a string
        returned by the endpoint ruleset provider. This accounts for:

        * The ruleset prefixes auth names with "sig"
        * The s3 and s3control rulesets don't distinguish between v4[a] and
          s3v4[a] signers
        * The v2, v3, and HMAC v1 based signers (s3, s3-*) are botocore legacy
          features and do not exist in the rulesets
        * Only characters up to the first dash are considered

        Example matches:
        * v4, sigv4
        * v4, v4
        * s3v4, sigv4
        * s3v7, sigv7 (hypothetical example)
        * s3v4a, sigv4a
        * s3v4-query, sigv4

        Example mismatches:
        * v4a, sigv4
        * s3, sigv4
        * s3-presign-post, sigv4
        -r   rS      N)r  splitr   )r!   botonamersnames      r$   r   zFEndpointRulesetResolver._does_botocore_authname_match_ruleset_authname  sR    4 ''/>>#&q)t 3 3D 9|H!!r&   c                    |j                   j                  d      }|y|j                  d      r!	 |j                  d      d   }t        |      S | j                  j                  }|dk(  r|dk(  s|d	k(  rt        |
      S |j                  d      sU|j                  d      sD|j                  d      s3|j                  d      s"|j                  d      s|j                  d      rt        |
      S |j                         j                  d      rt        |      S |dk(  rn|j                  d      r|j                  d      }t        ||      S |j                  d      s|j                  d      rt        |
      S |dk(  rt        |      S |dk(  r.|j                  d      rt        |
      S |dk(  rt        |
      S y# t        $ r |}Y w xY w)zAttempts to translate ruleset errors to pre-existing botocore
        exception types by string matching exception strings.
        r   NzInvalid region in ARN: `   )labelrS   z/S3 Object Lambda does not support S3 Acceleratez#Accelerate cannot be used with FIPSr   zS3 Outposts does not supportzS3 MRAP does not supportz!S3 Object Lambda does not supportzAccess Points do not supportzInvalid configuration:z#Client was configured for partitionzinvalid arn:)report	s3controlzInvalid ARN:Bucket)arnr   z!AccountId is required but not seteventszUInvalid Configuration: FIPS is not supported with EventBridge multi-region endpoints.z&EndpointId must be a valid host label.)kwargsrO   r   r  
IndexErrorr   r   r"   r   r   lowerr   r   r   r   )r!   ruleset_exceptionr   r   r"  r"   r&  s          r$   r   z;EndpointRulesetResolver.ruleset_error_to_botocore_exception	  s     &&**51;>>34		#q) )u55**774HH??63??=>>>"<=>>"EF>>"@A>>":;>>"GHAcJJyy{%%n5+377;&~~n-jj*3EE~~673>>5< >#FF99+3778#~~6 9SAA>>8SAAQ  s   G GG)TN)r/   r0   r1   r2   r<   r%   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r3   r&   r$   r   r     s    ? ""00dBG1.@*
 
 
 
 
 
 
#_%BK"@5r&   r   ),r2   rt   loggingrn   enumr   botocorer   r   botocore.authr   r   botocore.crtr	   botocore.endpoint_providerr
   botocore.exceptionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   botocore.utilsr   r   	getLoggerr/   rf   DEFAULT_URI_TEMPLATErd   r   r5   strr   r   r3   r&   r$   <module>r7     s      	  ) 1 1 7     :g!7 #R( :" :"zu
+ u
p	#sD #>w wr&   