'This class method creates new hunts.'

@classmethod
def StartHunt(cls, args=None, runner_args=None, token=None, **kwargs):

    if (not token):
        raise access_control.UnauthorizedAccess('A    token    must    be    specified.')
    if (runner_args is None):
        runner_args = rdf_hunts.HuntRunnerArgs()
    cls.FilterArgsFromSemanticProtobuf(runner_args, kwargs)
    if ((runner_args.hunt_name not in cls.classes) or (not aff4.issubclass(cls.classes[runner_args.hunt_name], GRRHunt))):
        raise RuntimeError(('Unable    to    locate    hunt    %s' % runner_args.hunt_name))
    hunt_obj = aff4.FACTORY.Create(None, cls.classes[runner_args.hunt_name], mode='w', token=token)
    if (hunt_obj.args_type and (args is None)):
        args = hunt_obj.args_type()
        cls.FilterArgsFromSemanticProtobuf(args, kwargs)
    if (hunt_obj.args_type and (not isinstance(args, hunt_obj.args_type))):
        raise RuntimeError(('Hunt    args    must    be    instance    of    %s' % hunt_obj.args_type))
    if kwargs:
        raise type_info.UnknownArg(('Unknown    parameters    to    StartHunt:    %s' % kwargs))
    hunt_obj.args = args
    hunt_obj.runner_args = runner_args
    hunt_obj.Set(hunt_obj.Schema.STATE('PAUSED'))
    runner = hunt_obj.CreateRunner(runner_args=runner_args)
    runner.RunStateMethod('Start')
    hunt_obj.Flush()
    try:
        flow_name = args.flow_runner_args.flow_name
    except AttributeError:
        flow_name = ''
    event = events_lib.AuditEvent(user=token.username, action='HUNT_CREATED', urn=hunt_obj.urn, flow_name=flow_name, description=runner_args.description)
    events_lib.Events.PublishEvent('Audit', event, token=token)
    return hunt_obj
