text: # coding=utf-8
  # --------------------------------------------------------------------------
  # Copyright (c) Microsoft Corporation. All rights reserved.
  # Licensed under the MIT License. See License.txt in the project root for license information.
  # Code generated by Microsoft (R) AutoRest Code Generator.
  # Changes may cause incorrect behavior and will be lost if the code is regenerated.
  # --------------------------------------------------------------------------
  from typing import TYPE_CHECKING
  import warnings
  
  from azure.core.exceptions import ClientAuthenticationError, HttpResponseError, ResourceExistsError, ResourceNotFoundError, map_error
  from azure.core.paging import ItemPaged
  from azure.core.pipeline import PipelineResponse
  from azure.core.pipeline.transport import HttpRequest, HttpResponse
  from azure.core.polling import LROPoller, NoPolling, PollingMethod
  from azure.mgmt.core.exceptions import ARMErrorFormat
  from azure.mgmt.core.polling.arm_polling import ARMPolling
  
  from .. import models
  
  if TYPE_CHECKING:
      # pylint: disable=unused-import,ungrouped-imports
      from typing import Any, Callable, Dict, Generic, Iterable, Optional, TypeVar, Union
  
      T = TypeVar('T')
      ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]]
  
  class StorageAccountsOperations(object):
      """StorageAccountsOperations operations.
  
      You should not instantiate this class directly. Instead, you should create a Client instance that
      instantiates it for you and attaches it as an attribute.
  
      :ivar models: Alias to model classes used in this operation group.
      :type models: ~azure.mgmt.storage.v2016_01_01.models
      :param client: Client for service requests.
      :param config: Configuration of service client.
      :param serializer: An object model serializer.
      :param deserializer: An object model deserializer.
      """
  
      models = models
  
      def __init__(self, client, config, serializer, deserializer):
          self._client = client
          self._serialize = serializer
          self._deserialize = deserializer
          self._config = config
  
      def check_name_availability(
          self,
          account_name,  # type: "models.StorageAccountCheckNameAvailabilityParameters"
          **kwargs  # type: Any
      ):
          # type: (...) -> "models.CheckNameAvailabilityResult"
          """Checks that the storage account name is valid and is not already in use.
  
          :param account_name: The name of the storage account within the specified resource group.
           Storage account names must be between 3 and 24 characters in length and use numbers and lower-
           case letters only.
          :type account_name: ~azure.mgmt.storage.v2016_01_01.models.StorageAccountCheckNameAvailabilityParameters
          :keyword callable cls: A custom type or function that will be passed the direct response
          :return: CheckNameAvailabilityResult, or the result of cls(response)
          :rtype: ~azure.mgmt.storage.v2016_01_01.models.CheckNameAvailabilityResult
          :raises: ~azure.core.exceptions.HttpResponseError
          """
          cls = kwargs.pop('cls', None)  # type: ClsType["models.CheckNameAvailabilityResult"]
          error_map = {
              401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
          }
          error_map.update(kwargs.pop('error_map', {}))
          api_version = "2016-01-01"
          content_type = kwargs.pop("content_type", "application/json")
          accept = "application/json, text/json"
  
          # Construct URL
          url = self.check_name_availability.metadata['url']  # type: ignore
          path_format_arguments = {
              'subscriptionId': self._serialize.url("self._config.subscription_id", self._config.subscription_id, 'str'),
          }
          url = self._client.format_url(url, **path_format_arguments)
  
          # Construct parameters
          query_parameters = {}  # type: Dict[str, Any]
          query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
  
          # Construct headers
          header_parameters = {}  # type: Dict[str, Any]
          header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str')
          header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
  
          body_content_kwargs = {}  # type: Dict[str, Any]
          body_content = self._serialize.body(account_name, 'StorageAccountCheckNameAvailabilityParameters')
          body_content_kwargs['content'] = body_content
          request = self._client.post(url, query_parameters, header_parameters, **body_content_kwargs)
          pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
          response = pipeline_response.http_response
  
          if response.status_code not in [200]:
              map_error(status_code=response.status_code, response=response, error_map=error_map)
              raise HttpResponseError(response=response, error_format=ARMErrorFormat)
  
          deserialized = self._deserialize('CheckNameAvailabilityResult', pipeline_response)
  
          if cls:
              return cls(pipeline_response, deserialized, {})
  
          return deserialized
      check_name_availability.metadata = {'url': '/subscriptions/{subscriptionId}/providers/Microsoft.Storage/checkNameAvailability'}  # type: ignore
  
      def _create_initial(
          self,
          resource_group_name,  # type: str
          account_name,  # type: str
          parameters,  # type: "models.StorageAccountCreateParameters"
          **kwargs  # type: Any
      ):
          # type: (...) -> Optional["models.StorageAccount"]
          cls = kwargs.pop('cls', None)  # type: ClsType[Optional["models.StorageAccount"]]
          error_map = {
              401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
          }
          error_map.update(kwargs.pop('error_map', {}))
          api_version = "2016-01-01"
          content_type = kwargs.pop("content_type", "application/json")
          accept = "application/json, text/json"
  
          # Construct URL
          url = self._create_initial.metadata['url']  # type: ignore
          path_format_arguments = {
              'resourceGroupName': self._serialize.url("resource_group_name", resource_group_name, 'str'),
              'accountName': self._serialize.url("account_name", account_name, 'str', max_length=24, min_length=3),
              'subscriptionId': self._serialize.url("self._config.subscription_id", self._config.subscription_id, 'str'),
          }
          url = self._client.format_url(url, **path_format_arguments)
  
          # Construct parameters
          query_parameters = {}  # type: Dict[str, Any]
          query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
  
          # Construct headers
          header_parameters = {}  # type: Dict[str, Any]
          header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str')
          header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
  
          body_content_kwargs = {}  # type: Dict[str, Any]
          body_content = self._serialize.body(parameters, 'StorageAccountCreateParameters')
          body_content_kwargs['content'] = body_content
          request = self._client.put(url, query_parameters, header_parameters, **body_content_kwargs)
          pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
          response = pipeline_response.http_response
  
          if response.status_code not in [200, 202]:
              map_error(status_code=response.status_code, response=response, error_map=error_map)
              raise HttpResponseError(response=response, error_format=ARMErrorFormat)
  
          deserialized = None
          if response.status_code == 200:
              deserialized = self._deserialize('StorageAccount', pipeline_response)
  
          if cls:
              return cls(pipeline_response, deserialized, {})
  
          return deserialized
      _create_initial.metadata = {'url': '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}'}  # type: ignore
  
      def begin_create(
          self,
          resource_group_name,  # type: str
          account_name,  # type: str
          parameters,  # type: "models.StorageAccountCreateParameters"
          **kwargs  # type: Any
      ):
          # type: (...) -> LROPoller["models.StorageAccount"]
          """Asynchronously creates a new storage account with the specified parameters. If an account is
          already created and a subsequent create request is issued with different properties, the
          account properties will be updated. If an account is already created and a subsequent create or
          update request is issued with the exact same set of properties, the request will succeed.
  
          :param resource_group_name: The name of the resource group within the user's subscription.
          :type resource_group_name: str
          :param account_name: The name of the storage account within the specified resource group.
           Storage account names must be between 3 and 24 characters in length and use numbers and lower-
           case letters only.
          :type account_name: str
          :param parameters: The parameters to provide for the created account.
          :type parameters: ~azure.mgmt.storage.v2016_01_01.models.StorageAccountCreateParameters
          :keyword callable cls: A custom type or function that will be passed the direct response
          :keyword str continuation_token: A continuation token to restart a poller from a saved state.
          :keyword polling: True for ARMPolling, False for no polling, or a
           polling object for personal polling strategy
          :paramtype polling: bool or ~azure.core.polling.PollingMethod
          :keyword int polling_interval: Default waiting time between two polls for LRO operations if no Retry-After header is present.
          :return: An instance of LROPoller that returns either StorageAccount or the result of cls(response)
          :rtype: ~azure.core.polling.LROPoller[~azure.mgmt.storage.v2016_01_01.models.StorageAccount]
          :raises ~azure.core.exceptions.HttpResponseError:
          """
          polling = kwargs.pop('polling', True)  # type: Union[bool, PollingMethod]
          cls = kwargs.pop('cls', None)  # type: ClsType["models.StorageAccount"]
          lro_delay = kwargs.pop(
              'polling_interval',
              self._config.polling_interval
          )
          cont_token = kwargs.pop('continuation_token', None)  # type: Optional[str]
          if cont_token is None:
              raw_result = self._create_initial(
                  resource_group_name=resource_group_name,
                  account_name=account_name,
                  parameters=parameters,
                  cls=lambda x,y,z: x,
                  **kwargs
              )
  
          kwargs.pop('error_map', None)
          kwargs.pop('content_type', None)
  
          def get_long_running_output(pipeline_response):
              deserialized = self._deserialize('StorageAccount', pipeline_response)
  
              if cls:
                  return cls(pipeline_response, deserialized, {})
              return deserialized
  
          if polling is True: polling_method = ARMPolling(lro_delay,  **kwargs)
          elif polling is False: polling_method = NoPolling()
          else: polling_method = polling
          if cont_token:
              return LROPoller.from_continuation_token(
                  polling_method=polling_method,
                  continuation_token=cont_token,
                  client=self._client,
                  deserialization_callback=get_long_running_output
              )
          else:
              return LROPoller(self._client, raw_result, get_long_running_output, polling_method)
      begin_create.metadata = {'url': '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}'}  # type: ignore
  
      def delete(
          self,
          resource_group_name,  # type: str
          account_name,  # type: str
          **kwargs  # type: Any
      ):
          # type: (...) -> None
          """Deletes a storage account in Microsoft Azure.
  
          :param resource_group_name: The name of the resource group within the user's subscription.
          :type resource_group_name: str
          :param account_name: The name of the storage account within the specified resource group.
           Storage account names must be between 3 and 24 characters in length and use numbers and lower-
           case letters only.
          :type account_name: str
          :keyword callable cls: A custom type or function that will be passed the direct response
          :return: None, or the result of cls(response)
          :rtype: None
          :raises: ~azure.core.exceptions.HttpResponseError
          """
          cls = kwargs.pop('cls', None)  # type: ClsType[None]
          error_map = {
              401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
          }
          error_map.update(kwargs.pop('error_map', {}))
          api_version = "2016-01-01"
  
          # Construct URL
          url = self.delete.metadata['url']  # type: ignore
          path_format_arguments = {
              'resourceGroupName': self._serialize.url("resource_group_name", resource_group_name, 'str'),
              'accountName': self._serialize.url("account_name", account_name, 'str', max_length=24, min_length=3),
              'subscriptionId': self._serialize.url("self._config.subscription_id", self._config.subscription_id, 'str'),
          }
          url = self._client.format_url(url, **path_format_arguments)
  
          # Construct parameters
          query_parameters = {}  # type: Dict[str, Any]
          query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
  
          # Construct headers
          header_parameters = {}  # type: Dict[str, Any]
  
          request = self._client.delete(url, query_parameters, header_parameters)
          pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
          response = pipeline_response.http_response
  
          if response.status_code not in [200, 204]:
              map_error(status_code=response.status_code, response=response, error_map=error_map)
              raise HttpResponseError(response=response, error_format=ARMErrorFormat)
  
          if cls:
              return cls(pipeline_response, None, {})
  
      delete.metadata = {'url': '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}'}  # type: ignore
  
      def get_properties(
          self,
          resource_group_name,  # type: str
          account_name,  # type: str
          **kwargs  # type: Any
      ):
          # type: (...) -> "models.StorageAccount"
          """Returns the properties for the specified storage account including but not limited to name, SKU
          name, location, and account status. The ListKeys operation should be used to retrieve storage
          keys.
  
          :param resource_group_name: The name of the resource group within the user's subscription.
          :type resource_group_name: str
          :param account_name: The name of the storage account within the specified resource group.
           Storage account names must be between 3 and 24 characters in length and use numbers and lower-
           case letters only.
          :type account_name: str
          :keyword callable cls: A custom type or function that will be passed the direct response
          :return: StorageAccount, or the result of cls(response)
          :rtype: ~azure.mgmt.storage.v2016_01_01.models.StorageAccount
          :raises: ~azure.core.exceptions.HttpResponseError
          """
          cls = kwargs.pop('cls', None)  # type: ClsType["models.StorageAccount"]
          error_map = {
              401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
          }
          error_map.update(kwargs.pop('error_map', {}))
          api_version = "2016-01-01"
          accept = "application/json, text/json"
  
          # Construct URL
          url = self.get_properties.metadata['url']  # type: ignore
          path_format_arguments = {
              'resourceGroupName': self._serialize.url("resource_group_name", resource_group_name, 'str'),
              'accountName': self._serialize.url("account_name", account_name, 'str', max_length=24, min_length=3),
              'subscriptionId': self._serialize.url("self._config.subscription_id", self._config.subscription_id, 'str'),
          }
          url = self._client.format_url(url, **path_format_arguments)
  
          # Construct parameters
          query_parameters = {}  # type: Dict[str, Any]
          query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
  
          # Construct headers
          header_parameters = {}  # type: Dict[str, Any]
          header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
  
          request = self._client.get(url, query_parameters, header_parameters)
          pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
          response = pipeline_response.http_response
  
          if response.status_code not in [200]:
              map_error(status_code=response.status_code, response=response, error_map=error_map)
              raise HttpResponseError(response=response, error_format=ARMErrorFormat)
  
          deserialized = self._deserialize('StorageAccount', pipeline_response)
  
          if cls:
              return cls(pipeline_response, deserialized, {})
  
          return deserialized
      get_properties.metadata = {'url': '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}'}  # type: ignore
  
      def update(
          self,
          resource_group_name,  # type: str
          account_name,  # type: str
          parameters,  # type: "models.StorageAccountUpdateParameters"
          **kwargs  # type: Any
      ):
          # type: (...) -> "models.StorageAccount"
          """The update operation can be used to update the SKU, encryption, access tier, or tags for a
          storage account. It can also be used to map the account to a custom domain. Only one custom
          domain is supported per storage account; the replacement/change of custom domain is not
          supported. In order to replace an old custom domain, the old value must be cleared/unregistered
          before a new value can be set. The update of multiple properties is supported. This call does
          not change the storage keys for the account. If you want to change the storage account keys,
          use the regenerate keys operation. The location and name of the storage account cannot be
          changed after creation.
  
          :param resource_group_name: The name of the resource group within the user's subscription.
          :type resource_group_name: str
          :param account_name: The name of the storage account within the specified resource group.
           Storage account names must be between 3 and 24 characters in length and use numbers and lower-
           case letters only.
          :type account_name: str
          :param parameters: The parameters to provide for the updated account.
          :type parameters: ~azure.mgmt.storage.v2016_01_01.models.StorageAccountUpdateParameters
          :keyword callable cls: A custom type or function that will be passed the direct response
          :return: StorageAccount, or the result of cls(response)
          :rtype: ~azure.mgmt.storage.v2016_01_01.models.StorageAccount
          :raises: ~azure.core.exceptions.HttpResponseError
          """
          cls = kwargs.pop('cls', None)  # type: ClsType["models.StorageAccount"]
          error_map = {
              401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
          }
          error_map.update(kwargs.pop('error_map', {}))
          api_version = "2016-01-01"
          content_type = kwargs.pop("content_type", "application/json")
          accept = "application/json, text/json"
  
          # Construct URL
          url = self.update.metadata['url']  # type: ignore
          path_format_arguments = {
              'resourceGroupName': self._serialize.url("resource_group_name", resource_group_name, 'str'),
              'accountName': self._serialize.url("account_name", account_name, 'str', max_length=24, min_length=3),
              'subscriptionId': self._serialize.url("self._config.subscription_id", self._config.subscription_id, 'str'),
          }
          url = self._client.format_url(url, **path_format_arguments)
  
          # Construct parameters
          query_parameters = {}  # type: Dict[str, Any]
          query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
  
          # Construct headers
          header_parameters = {}  # type: Dict[str, Any]
          header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str')
          header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
  
          body_content_kwargs = {}  # type: Dict[str, Any]
          body_content = self._serialize.body(parameters, 'StorageAccountUpdateParameters')
          body_content_kwargs['content'] = body_content
          request = self._client.patch(url, query_parameters, header_parameters, **body_content_kwargs)
          pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
          response = pipeline_response.http_response
  
          if response.status_code not in [200]:
              map_error(status_code=response.status_code, response=response, error_map=error_map)
              raise HttpResponseError(response=response, error_format=ARMErrorFormat)
  
          deserialized = self._deserialize('StorageAccount', pipeline_response)
  
          if cls:
              return cls(pipeline_response, deserialized, {})
  
          return deserialized
      update.metadata = {'url': '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}'}  # type: ignore
  
      def list(
          self,
          **kwargs  # type: Any
      ):
          # type: (...) -> Iterable["models.StorageAccountListResult"]
          """Lists all the storage accounts available under the subscription. Note that storage keys are not
          returned; use the ListKeys operation for this.
  
          :keyword callable cls: A custom type or function that will be passed the direct response
          :return: An iterator like instance of either StorageAccountListResult or the result of cls(response)
          :rtype: ~azure.core.paging.ItemPaged[~azure.mgmt.storage.v2016_01_01.models.StorageAccountListResult]
          :raises: ~azure.core.exceptions.HttpResponseError
          """
          cls = kwargs.pop('cls', None)  # type: ClsType["models.StorageAccountListResult"]
          error_map = {
              401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
          }
          error_map.update(kwargs.pop('error_map', {}))
          api_version = "2016-01-01"
          accept = "application/json, text/json"
  
          def prepare_request(next_link=None):
              # Construct headers
              header_parameters = {}  # type: Dict[str, Any]
              header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
  
              if not next_link:
                  # Construct URL
                  url = self.list.metadata['url']  # type: ignore
                  path_format_arguments = {
                      'subscriptionId': self._serialize.url("self._config.subscription_id", self._config.subscription_id, 'str'),
                  }
                  url = self._client.format_url(url, **path_format_arguments)
                  # Construct parameters
                  query_parameters = {}  # type: Dict[str, Any]
                  query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
  
                  request = self._client.get(url, query_parameters, header_parameters)
              else:
                  url = next_link
                  query_parameters = {}  # type: Dict[str, Any]
                  request = self._client.get(url, query_parameters, header_parameters)
              return request
  
          def extract_data(pipeline_response):
              deserialized = self._deserialize('StorageAccountListResult', pipeline_response)
              list_of_elem = deserialized.value
              if cls:
                  list_of_elem = cls(list_of_elem)
              return None, iter(list_of_elem)
  
          def get_next(next_link=None):
              request = prepare_request(next_link)
  
              pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
              response = pipeline_response.http_response
  
              if response.status_code not in [200]:
                  map_error(status_code=response.status_code, response=response, error_map=error_map)
                  raise HttpResponseError(response=response, error_format=ARMErrorFormat)
  
              return pipeline_response
  
          return ItemPaged(
              get_next, extract_data
          )
      list.metadata = {'url': '/subscriptions/{subscriptionId}/providers/Microsoft.Storage/storageAccounts'}  # type: ignore
  
      def list_by_resource_group(
          self,
          resource_group_name,  # type: str
          **kwargs  # type: Any
      ):
          # type: (...) -> Iterable["models.StorageAccountListResult"]
          """Lists all the storage accounts available under the given resource group. Note that storage keys
          are not returned; use the ListKeys operation for this.
  
          :param resource_group_name: The name of the resource group within the user's subscription.
          :type resource_group_name: str
          :keyword callable cls: A custom type or function that will be passed the direct response
          :return: An iterator like instance of either StorageAccountListResult or the result of cls(response)
          :rtype: ~azure.core.paging.ItemPaged[~azure.mgmt.storage.v2016_01_01.models.StorageAccountListResult]
          :raises: ~azure.core.exceptions.HttpResponseError
          """
          cls = kwargs.pop('cls', None)  # type: ClsType["models.StorageAccountListResult"]
          error_map = {
              401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
          }
          error_map.update(kwargs.pop('error_map', {}))
          api_version = "2016-01-01"
          accept = "application/json, text/json"
  
          def prepare_request(next_link=None):
              # Construct headers
              header_parameters = {}  # type: Dict[str, Any]
              header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
  
              if not next_link:
                  # Construct URL
                  url = self.list_by_resource_group.metadata['url']  # type: ignore
                  path_format_arguments = {
                      'resourceGroupName': self._serialize.url("resource_group_name", resource_group_name, 'str'),
                      'subscriptionId': self._serialize.url("self._config.subscription_id", self._config.subscription_id, 'str'),
                  }
                  url = self._client.format_url(url, **path_format_arguments)
                  # Construct parameters
                  query_parameters = {}  # type: Dict[str, Any]
                  query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
  
                  request = self._client.get(url, query_parameters, header_parameters)
              else:
                  url = next_link
                  query_parameters = {}  # type: Dict[str, Any]
                  request = self._client.get(url, query_parameters, header_parameters)
              return request
  
          def extract_data(pipeline_response):
              deserialized = self._deserialize('StorageAccountListResult', pipeline_response)
              list_of_elem = deserialized.value
              if cls:
                  list_of_elem = cls(list_of_elem)
              return None, iter(list_of_elem)
  
          def get_next(next_link=None):
              request = prepare_request(next_link)
  
              pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
              response = pipeline_response.http_response
  
              if response.status_code not in [200]:
                  map_error(status_code=response.status_code, response=response, error_map=error_map)
                  raise HttpResponseError(response=response, error_format=ARMErrorFormat)
  
              return pipeline_response
  
          return ItemPaged(
              get_next, extract_data
          )
      list_by_resource_group.metadata = {'url': '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts'}  # type: ignore
  
      def list_keys(
          self,
          resource_group_name,  # type: str
          account_name,  # type: str
          **kwargs  # type: Any
      ):
          # type: (...) -> "models.StorageAccountListKeysResult"
          """Lists the access keys for the specified storage account.
  
          :param resource_group_name: The name of the resource group within the user's subscription.
          :type resource_group_name: str
          :param account_name: The name of the storage account within the specified resource group.
           Storage account names must be between 3 and 24 characters in length and use numbers and lower-
           case letters only.
          :type account_name: str
          :keyword callable cls: A custom type or function that will be passed the direct response
          :return: StorageAccountListKeysResult, or the result of cls(response)
          :rtype: ~azure.mgmt.storage.v2016_01_01.models.StorageAccountListKeysResult
          :raises: ~azure.core.exceptions.HttpResponseError
          """
          cls = kwargs.pop('cls', None)  # type: ClsType["models.StorageAccountListKeysResult"]
          error_map = {
              401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
          }
          error_map.update(kwargs.pop('error_map', {}))
          api_version = "2016-01-01"
          accept = "application/json, text/json"
  
          # Construct URL
          url = self.list_keys.metadata['url']  # type: ignore
          path_format_arguments = {
              'resourceGroupName': self._serialize.url("resource_group_name", resource_group_name, 'str'),
              'accountName': self._serialize.url("account_name", account_name, 'str', max_length=24, min_length=3),
              'subscriptionId': self._serialize.url("self._config.subscription_id", self._config.subscription_id, 'str'),
          }
          url = self._client.format_url(url, **path_format_arguments)
  
          # Construct parameters
          query_parameters = {}  # type: Dict[str, Any]
          query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
  
          # Construct headers
          header_parameters = {}  # type: Dict[str, Any]
          header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
  
          request = self._client.post(url, query_parameters, header_parameters)
          pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
          response = pipeline_response.http_response
  
          if response.status_code not in [200]:
              map_error(status_code=response.status_code, response=response, error_map=error_map)
              raise HttpResponseError(response=response, error_format=ARMErrorFormat)
  
          deserialized = self._deserialize('StorageAccountListKeysResult', pipeline_response)
  
          if cls:
              return cls(pipeline_response, deserialized, {})
  
          return deserialized
      list_keys.metadata = {'url': '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/listKeys'}  # type: ignore
  
      def regenerate_key(
          self,
          resource_group_name,  # type: str
          account_name,  # type: str
          regenerate_key,  # type: "models.StorageAccountRegenerateKeyParameters"
          **kwargs  # type: Any
      ):
          # type: (...) -> "models.StorageAccountListKeysResult"
          """Regenerates one of the access keys for the specified storage account.
  
          :param resource_group_name: The name of the resource group within the user's subscription.
          :type resource_group_name: str
          :param account_name: The name of the storage account within the specified resource group.
           Storage account names must be between 3 and 24 characters in length and use numbers and lower-
           case letters only.
          :type account_name: str
          :param regenerate_key: Specifies name of the key which should be regenerated -- key1 or key2.
          :type regenerate_key: ~azure.mgmt.storage.v2016_01_01.models.StorageAccountRegenerateKeyParameters
          :keyword callable cls: A custom type or function that will be passed the direct response
          :return: StorageAccountListKeysResult, or the result of cls(response)
          :rtype: ~azure.mgmt.storage.v2016_01_01.models.StorageAccountListKeysResult
          :raises: ~azure.core.exceptions.HttpResponseError
          """
          cls = kwargs.pop('cls', None)  # type: ClsType["models.StorageAccountListKeysResult"]
          error_map = {
              401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
          }
          error_map.update(kwargs.pop('error_map', {}))
          api_version = "2016-01-01"
          content_type = kwargs.pop("content_type", "application/json")
          accept = "application/json, text/json"
  
          # Construct URL
          url = self.regenerate_key.metadata['url']  # type: ignore
          path_format_arguments = {
              'resourceGroupName': self._serialize.url("resource_group_name", resource_group_name, 'str'),
              'accountName': self._serialize.url("account_name", account_name, 'str', max_length=24, min_length=3),
              'subscriptionId': self._serialize.url("self._config.subscription_id", self._config.subscription_id, 'str'),
          }
          url = self._client.format_url(url, **path_format_arguments)
  
          # Construct parameters
          query_parameters = {}  # type: Dict[str, Any]
          query_parameters['api-version'] = self._serialize.query("api_version", api_version, 'str')
  
          # Construct headers
          header_parameters = {}  # type: Dict[str, Any]
          header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str')
          header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
  
          body_content_kwargs = {}  # type: Dict[str, Any]
          body_content = self._serialize.body(regenerate_key, 'StorageAccountRegenerateKeyParameters')
          body_content_kwargs['content'] = body_content
          request = self._client.post(url, query_parameters, header_parameters, **body_content_kwargs)
          pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
          response = pipeline_response.http_response
  
          if response.status_code not in [200]:
              map_error(status_code=response.status_code, response=response, error_map=error_map)
              raise HttpResponseError(response=response, error_format=ARMErrorFormat)
  
          deserialized = self._deserialize('StorageAccountListKeysResult', pipeline_response)
  
          if cls:
              return cls(pipeline_response, deserialized, {})
  
          return deserialized
      regenerate_key.metadata = {'url': '/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/regenerateKey'}  # type: ignore
  