code: def get_normalized_parameters(self):
          
          items = []
          for key, value in self.items():
              if key == 'oauth_signature':
                  continue
              # 1.0a/9.1.1 states that kvp must be sorted by key, then by value,
              # so we unpack sequence values into multiple items for sorting.
              if isinstance(value, STRING_TYPES):
                  items.append((to_utf8_if_string(key), to_utf8(value)))
              else:
                  try:
                      value = list(value)
                  except TypeError as e:
                      assert 'is not iterable' in str(e)
                      items.append((to_utf8_if_string(key), to_utf8_if_string(value)))
                  else:
                      items.extend((to_utf8_if_string(key), to_utf8_if_string(item)) for item in value)
  
          # Include any query string parameters from the provided URL
          query = urlparse(self.url)[4]
  
          url_items = self._split_url_string(query).items()
          url_items = [(to_utf8(k), to_utf8_optional_iterator(v)) for k, v in url_items if k != 'oauth_signature' ]
          items.extend(url_items)
  
          items.sort()
          encoded_str = urlencode(items, True)
          # Encode signature parameters per Oauth Core 1.0 protocol
          # spec draft 7, section 3.6
          # (http://tools.ietf.org/html/draft-hammer-oauth-07#section-3.6)
          # Spaces must be encoded with "%20" instead of "+"
          return encoded_str.replace('+', '%20').replace('%7E', '~')
docs: Return a string that contains the parameters that must be signed.