docs: def StartHuntFlowOnClient(client_id, hunt_id):
    """Starts a flow corresponding to a given hunt on a given client."""
  
    hunt_obj = data_store.REL_DB.ReadHuntObject(hunt_id)
    hunt_obj = CompleteHuntIfExpirationTimeReached(hunt_obj)
    # There may be a little race between foreman rules being removed and
    # foreman scheduling a client on an (already) paused hunt. Making sure
    # we don't lose clients in such a race by accepting clients for paused
    # hunts.
    if not rdf_hunt_objects.IsHuntSuitableForFlowProcessing(hunt_obj.hunt_state):
      return
  
    if hunt_obj.args.hunt_type == hunt_obj.args.HuntType.STANDARD:
      hunt_args = hunt_obj.args.standard
  
      if hunt_obj.client_rate > 0:
        # Given that we use caching in _GetNumClients and hunt_obj may be updated
        # in another process, we have to account for cases where num_clients_diff
        # may go below 0.
        num_clients_diff = max(
            0,
            _GetNumClients(hunt_obj.hunt_id) - hunt_obj.num_clients_at_start_time)
        next_client_due_msecs = int(
            num_clients_diff / hunt_obj.client_rate * 60e6)
  
        start_at = rdfvalue.RDFDatetime.FromMicrosecondsSinceEpoch(
            hunt_obj.last_start_time.AsMicrosecondsSinceEpoch() +
            next_client_due_msecs)
      else:
        start_at = None
  
      # TODO(user): remove client_rate support when AFF4 is gone.
      # In REL_DB always work as if client rate is 0.
  
      flow_cls = registry.FlowRegistry.FlowClassByName(hunt_args.flow_name)
      flow_args = hunt_args.flow_args if hunt_args.HasField("flow_args") else None
      flow.StartFlow(
          client_id=client_id,
          creator=hunt_obj.creator,
          cpu_limit=hunt_obj.per_client_cpu_limit,
          network_bytes_limit=hunt_obj.per_client_network_bytes_limit,
          flow_cls=flow_cls,
          flow_args=flow_args,
          start_at=start_at,
          parent_hunt_id=hunt_id)
  
      if hunt_obj.client_limit:
        if _GetNumClients(hunt_obj.hunt_id) >= hunt_obj.client_limit:
          PauseHunt(hunt_id)
  
    elif hunt_obj.args.hunt_type == hunt_obj.args.HuntType.VARIABLE:
      raise NotImplementedError()
    else:
      raise UnknownHuntTypeError("Can't determine hunt type when starting "
                                 "hunt %s on client %s." % (client_id, hunt_id))