code: def generate_query_string(self, otp, nonce, timestamp=False, sl=None,
                                timeout=None):
          
          data = [('id', self.client_id),
                  ('otp', otp),
                  ('nonce', nonce)]
  
          if timestamp:
              data.append(('timestamp', '1'))
  
          if sl is not None:
              if sl not in range(0, 101) and sl not in ['fast', 'secure']:
                  raise Exception('sl parameter value must be between 0 and '
                                  '100 or string "fast" or "secure"')
  
              data.append(('sl', sl))
  
          if timeout:
              data.append(('timeout', timeout))
  
          query_string = urlencode(data)
  
          if self.key:
              hmac_signature = self.generate_message_signature(query_string)
              hmac_signature = hmac_signature
              query_string += '&h=%s' % (hmac_signature.replace('+', '%2B'))
  
          return query_string
docs: Returns a query string which is sent to the validation servers.