// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.17.3
// source: api_proto/kill_switch.proto

package api_proto

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Retrieve kill switch status depending on the environment.
type GetKillSwitchStatusRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Environment *Environment `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"`
}

func (x *GetKillSwitchStatusRequest) Reset() {
	*x = GetKillSwitchStatusRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetKillSwitchStatusRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetKillSwitchStatusRequest) ProtoMessage() {}

func (x *GetKillSwitchStatusRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetKillSwitchStatusRequest.ProtoReflect.Descriptor instead.
func (*GetKillSwitchStatusRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{0}
}

func (x *GetKillSwitchStatusRequest) GetEnvironment() *Environment {
	if x != nil {
		return x.Environment
	}
	return nil
}

type GetKillSwitchStatusResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	KillSwitches []*KillSwitch `protobuf:"bytes,1,rep,name=kill_switches,json=killSwitches,proto3" json:"kill_switches,omitempty"`
}

func (x *GetKillSwitchStatusResponse) Reset() {
	*x = GetKillSwitchStatusResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetKillSwitchStatusResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetKillSwitchStatusResponse) ProtoMessage() {}

func (x *GetKillSwitchStatusResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetKillSwitchStatusResponse.ProtoReflect.Descriptor instead.
func (*GetKillSwitchStatusResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{1}
}

func (x *GetKillSwitchStatusResponse) GetKillSwitches() []*KillSwitch {
	if x != nil {
		return x.KillSwitches
	}
	return nil
}

type GetKillSwitchOverviewRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *GetKillSwitchOverviewRequest) Reset() {
	*x = GetKillSwitchOverviewRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetKillSwitchOverviewRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetKillSwitchOverviewRequest) ProtoMessage() {}

func (x *GetKillSwitchOverviewRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetKillSwitchOverviewRequest.ProtoReflect.Descriptor instead.
func (*GetKillSwitchOverviewRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{2}
}

type GetKillSwitchOverviewResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	KillSwitches []*KillSwitch `protobuf:"bytes,1,rep,name=kill_switches,json=killSwitches,proto3" json:"kill_switches,omitempty"`
}

func (x *GetKillSwitchOverviewResponse) Reset() {
	*x = GetKillSwitchOverviewResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GetKillSwitchOverviewResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetKillSwitchOverviewResponse) ProtoMessage() {}

func (x *GetKillSwitchOverviewResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetKillSwitchOverviewResponse.ProtoReflect.Descriptor instead.
func (*GetKillSwitchOverviewResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{3}
}

func (x *GetKillSwitchOverviewResponse) GetKillSwitches() []*KillSwitch {
	if x != nil {
		return x.KillSwitches
	}
	return nil
}

type ListFeaturesRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	WithDeprecatedFeatures bool `protobuf:"varint,1,opt,name=with_deprecated_features,json=withDeprecatedFeatures,proto3" json:"with_deprecated_features,omitempty"`
}

func (x *ListFeaturesRequest) Reset() {
	*x = ListFeaturesRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListFeaturesRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListFeaturesRequest) ProtoMessage() {}

func (x *ListFeaturesRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListFeaturesRequest.ProtoReflect.Descriptor instead.
func (*ListFeaturesRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{4}
}

func (x *ListFeaturesRequest) GetWithDeprecatedFeatures() bool {
	if x != nil {
		return x.WithDeprecatedFeatures
	}
	return false
}

type ListFeaturesResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Features []*Feature `protobuf:"bytes,1,rep,name=features,proto3" json:"features,omitempty"`
}

func (x *ListFeaturesResponse) Reset() {
	*x = ListFeaturesResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListFeaturesResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListFeaturesResponse) ProtoMessage() {}

func (x *ListFeaturesResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListFeaturesResponse.ProtoReflect.Descriptor instead.
func (*ListFeaturesResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{5}
}

func (x *ListFeaturesResponse) GetFeatures() []*Feature {
	if x != nil {
		return x.Features
	}
	return nil
}

type SyncFeaturesRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Features []*Feature `protobuf:"bytes,1,rep,name=features,proto3" json:"features,omitempty"`
}

func (x *SyncFeaturesRequest) Reset() {
	*x = SyncFeaturesRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SyncFeaturesRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SyncFeaturesRequest) ProtoMessage() {}

func (x *SyncFeaturesRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SyncFeaturesRequest.ProtoReflect.Descriptor instead.
func (*SyncFeaturesRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{6}
}

func (x *SyncFeaturesRequest) GetFeatures() []*Feature {
	if x != nil {
		return x.Features
	}
	return nil
}

type SyncFeaturesResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *SyncFeaturesResponse) Reset() {
	*x = SyncFeaturesResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SyncFeaturesResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SyncFeaturesResponse) ProtoMessage() {}

func (x *SyncFeaturesResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SyncFeaturesResponse.ProtoReflect.Descriptor instead.
func (*SyncFeaturesResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{7}
}

type EnableKillSwitchRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	KillSwitch *KillSwitch `protobuf:"bytes,1,opt,name=kill_switch,json=killSwitch,proto3" json:"kill_switch,omitempty"`
}

func (x *EnableKillSwitchRequest) Reset() {
	*x = EnableKillSwitchRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *EnableKillSwitchRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EnableKillSwitchRequest) ProtoMessage() {}

func (x *EnableKillSwitchRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[8]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EnableKillSwitchRequest.ProtoReflect.Descriptor instead.
func (*EnableKillSwitchRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{8}
}

func (x *EnableKillSwitchRequest) GetKillSwitch() *KillSwitch {
	if x != nil {
		return x.KillSwitch
	}
	return nil
}

type EnableKillSwitchResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *EnableKillSwitchResponse) Reset() {
	*x = EnableKillSwitchResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *EnableKillSwitchResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EnableKillSwitchResponse) ProtoMessage() {}

func (x *EnableKillSwitchResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[9]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use EnableKillSwitchResponse.ProtoReflect.Descriptor instead.
func (*EnableKillSwitchResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{9}
}

type DisableKillSwitchRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	KillSwitchId int32 `protobuf:"varint,1,opt,name=kill_switch_id,json=killSwitchId,proto3" json:"kill_switch_id,omitempty"`
}

func (x *DisableKillSwitchRequest) Reset() {
	*x = DisableKillSwitchRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DisableKillSwitchRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DisableKillSwitchRequest) ProtoMessage() {}

func (x *DisableKillSwitchRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[10]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DisableKillSwitchRequest.ProtoReflect.Descriptor instead.
func (*DisableKillSwitchRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{10}
}

func (x *DisableKillSwitchRequest) GetKillSwitchId() int32 {
	if x != nil {
		return x.KillSwitchId
	}
	return 0
}

type DisableKillSwitchResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *DisableKillSwitchResponse) Reset() {
	*x = DisableKillSwitchResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DisableKillSwitchResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DisableKillSwitchResponse) ProtoMessage() {}

func (x *DisableKillSwitchResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[11]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DisableKillSwitchResponse.ProtoReflect.Descriptor instead.
func (*DisableKillSwitchResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{11}
}

type ListAuthorizedUsersRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *ListAuthorizedUsersRequest) Reset() {
	*x = ListAuthorizedUsersRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListAuthorizedUsersRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListAuthorizedUsersRequest) ProtoMessage() {}

func (x *ListAuthorizedUsersRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[12]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListAuthorizedUsersRequest.ProtoReflect.Descriptor instead.
func (*ListAuthorizedUsersRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{12}
}

type ListAuthorizedUsersResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	AuthorizedUsers *KillSwitchAuthorizedUser `protobuf:"bytes,1,opt,name=authorized_users,json=authorizedUsers,proto3" json:"authorized_users,omitempty"`
}

func (x *ListAuthorizedUsersResponse) Reset() {
	*x = ListAuthorizedUsersResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ListAuthorizedUsersResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListAuthorizedUsersResponse) ProtoMessage() {}

func (x *ListAuthorizedUsersResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[13]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListAuthorizedUsersResponse.ProtoReflect.Descriptor instead.
func (*ListAuthorizedUsersResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{13}
}

func (x *ListAuthorizedUsersResponse) GetAuthorizedUsers() *KillSwitchAuthorizedUser {
	if x != nil {
		return x.AuthorizedUsers
	}
	return nil
}

type AddAuthorizedUserRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	User *KillSwitchAuthorizedUser `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"`
}

func (x *AddAuthorizedUserRequest) Reset() {
	*x = AddAuthorizedUserRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AddAuthorizedUserRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AddAuthorizedUserRequest) ProtoMessage() {}

func (x *AddAuthorizedUserRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[14]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AddAuthorizedUserRequest.ProtoReflect.Descriptor instead.
func (*AddAuthorizedUserRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{14}
}

func (x *AddAuthorizedUserRequest) GetUser() *KillSwitchAuthorizedUser {
	if x != nil {
		return x.User
	}
	return nil
}

type AddAuthorizedUserResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *AddAuthorizedUserResponse) Reset() {
	*x = AddAuthorizedUserResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AddAuthorizedUserResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AddAuthorizedUserResponse) ProtoMessage() {}

func (x *AddAuthorizedUserResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[15]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AddAuthorizedUserResponse.ProtoReflect.Descriptor instead.
func (*AddAuthorizedUserResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{15}
}

type UpdateAuthorizedUserRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	UserId int32                     `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	User   *KillSwitchAuthorizedUser `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"`
}

func (x *UpdateAuthorizedUserRequest) Reset() {
	*x = UpdateAuthorizedUserRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[16]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *UpdateAuthorizedUserRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UpdateAuthorizedUserRequest) ProtoMessage() {}

func (x *UpdateAuthorizedUserRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[16]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UpdateAuthorizedUserRequest.ProtoReflect.Descriptor instead.
func (*UpdateAuthorizedUserRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{16}
}

func (x *UpdateAuthorizedUserRequest) GetUserId() int32 {
	if x != nil {
		return x.UserId
	}
	return 0
}

func (x *UpdateAuthorizedUserRequest) GetUser() *KillSwitchAuthorizedUser {
	if x != nil {
		return x.User
	}
	return nil
}

type UpdateAuthorizedUserResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *UpdateAuthorizedUserResponse) Reset() {
	*x = UpdateAuthorizedUserResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *UpdateAuthorizedUserResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UpdateAuthorizedUserResponse) ProtoMessage() {}

func (x *UpdateAuthorizedUserResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[17]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UpdateAuthorizedUserResponse.ProtoReflect.Descriptor instead.
func (*UpdateAuthorizedUserResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{17}
}

type DeleteAuthorizedUserRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	UserId int32 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
}

func (x *DeleteAuthorizedUserRequest) Reset() {
	*x = DeleteAuthorizedUserRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DeleteAuthorizedUserRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeleteAuthorizedUserRequest) ProtoMessage() {}

func (x *DeleteAuthorizedUserRequest) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[18]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DeleteAuthorizedUserRequest.ProtoReflect.Descriptor instead.
func (*DeleteAuthorizedUserRequest) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{18}
}

func (x *DeleteAuthorizedUserRequest) GetUserId() int32 {
	if x != nil {
		return x.UserId
	}
	return 0
}

type DeleteAuthorizedUserResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *DeleteAuthorizedUserResponse) Reset() {
	*x = DeleteAuthorizedUserResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_api_proto_kill_switch_proto_msgTypes[19]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DeleteAuthorizedUserResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeleteAuthorizedUserResponse) ProtoMessage() {}

func (x *DeleteAuthorizedUserResponse) ProtoReflect() protoreflect.Message {
	mi := &file_api_proto_kill_switch_proto_msgTypes[19]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DeleteAuthorizedUserResponse.ProtoReflect.Descriptor instead.
func (*DeleteAuthorizedUserResponse) Descriptor() ([]byte, []int) {
	return file_api_proto_kill_switch_proto_rawDescGZIP(), []int{19}
}

var File_api_proto_kill_switch_proto protoreflect.FileDescriptor

var file_api_proto_kill_switch_proto_rawDesc = []byte{
	0x0a, 0x1b, 0x61, 0x70, 0x69, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6b, 0x69, 0x6c, 0x6c,
	0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x61,
	0x70, 0x69, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x61, 0x70, 0x69, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2f, 0x6b, 0x69, 0x6c, 0x6c, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x6f, 0x62, 0x6a,
	0x65, 0x63, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4c, 0x0a, 0x1a, 0x47, 0x65,
	0x74, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75,
	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69,
	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e,
	0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x76,
	0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4b,
	0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0d, 0x6b, 0x69, 0x6c, 0x6c, 0x5f,
	0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b,
	0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x0c, 0x6b, 0x69, 0x6c,
	0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, 0x74,
	0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69,
	0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x51, 0x0a, 0x1d, 0x47, 0x65, 0x74,
	0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69,
	0x65, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0d, 0x6b, 0x69,
	0x6c, 0x6c, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x0b, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x0c,
	0x6b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x13,
	0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x18, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, 0x65, 0x70, 0x72,
	0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x77, 0x69, 0x74, 0x68, 0x44, 0x65, 0x70, 0x72, 0x65,
	0x63, 0x61, 0x74, 0x65, 0x64, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x3c, 0x0a,
	0x14, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72,
	0x65, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x3b, 0x0a, 0x13, 0x53,
	0x79, 0x6e, 0x63, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x12, 0x24, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x08, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x08,
	0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x53, 0x79, 0x6e, 0x63,
	0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x22, 0x47, 0x0a, 0x17, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77,
	0x69, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x0b, 0x6b,
	0x69, 0x6c, 0x6c, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x0b, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x0a, 0x6b,
	0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x1a, 0x0a, 0x18, 0x45, 0x6e, 0x61,
	0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x0a, 0x18, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
	0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6b, 0x69, 0x6c, 0x6c, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68,
	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6b, 0x69, 0x6c, 0x6c, 0x53,
	0x77, 0x69, 0x74, 0x63, 0x68, 0x49, 0x64, 0x22, 0x1b, 0x0a, 0x19, 0x44, 0x69, 0x73, 0x61, 0x62,
	0x6c, 0x65, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x68,
	0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x22, 0x63, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,
	0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x12, 0x44, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f,
	0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x4b, 0x69,
	0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
	0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
	0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x22, 0x49, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x41, 0x75,
	0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x19, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x41, 0x75,
	0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73,
	0x65, 0x72, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,
	0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
	0x65, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,
	0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17,
	0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,
	0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74,
	0x63, 0x68, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72,
	0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x1e, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
	0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
	0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x1e,
	0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
	0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xa8,
	0x06, 0x0a, 0x11, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6c, 0x6c, 0x53,
	0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x2e, 0x47, 0x65,
	0x74, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75,
	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69,
	0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4b,
	0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65,
	0x77, 0x12, 0x1d, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63,
	0x68, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x1a, 0x1e, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68,
	0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72,
	0x65, 0x73, 0x12, 0x14, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46,
	0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
	0x00, 0x12, 0x3d, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
	0x73, 0x12, 0x14, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x65,
	0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
	0x12, 0x49, 0x0a, 0x10, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77,
	0x69, 0x74, 0x63, 0x68, 0x12, 0x18, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6c,
	0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19,
	0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63,
	0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x11, 0x44,
	0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68,
	0x12, 0x19, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77,
	0x69, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x44, 0x69,
	0x73, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6c, 0x6c, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x13, 0x4c, 0x69, 0x73,
	0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73,
	0x12, 0x1b, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65,
	0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e,
	0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73,
	0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a,
	0x11, 0x41, 0x64, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73,
	0x65, 0x72, 0x12, 0x19, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
	0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e,
	0x41, 0x64, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65,
	0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x14, 0x55,
	0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55,
	0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68,
	0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x1a, 0x1d, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,
	0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x22, 0x00, 0x12, 0x55, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68,
	0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x44, 0x65, 0x6c,
	0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65,
	0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
	0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x6f, 0x6d,
	0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x61, 0x76, 0x6d, 0x39, 0x39, 0x39, 0x36, 0x33, 0x2e,
	0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x77, 0x70, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f,
	0x61, 0x70, 0x69, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_api_proto_kill_switch_proto_rawDescOnce sync.Once
	file_api_proto_kill_switch_proto_rawDescData = file_api_proto_kill_switch_proto_rawDesc
)

func file_api_proto_kill_switch_proto_rawDescGZIP() []byte {
	file_api_proto_kill_switch_proto_rawDescOnce.Do(func() {
		file_api_proto_kill_switch_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_proto_kill_switch_proto_rawDescData)
	})
	return file_api_proto_kill_switch_proto_rawDescData
}

var file_api_proto_kill_switch_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
var file_api_proto_kill_switch_proto_goTypes = []interface{}{
	(*GetKillSwitchStatusRequest)(nil),    // 0: GetKillSwitchStatusRequest
	(*GetKillSwitchStatusResponse)(nil),   // 1: GetKillSwitchStatusResponse
	(*GetKillSwitchOverviewRequest)(nil),  // 2: GetKillSwitchOverviewRequest
	(*GetKillSwitchOverviewResponse)(nil), // 3: GetKillSwitchOverviewResponse
	(*ListFeaturesRequest)(nil),           // 4: ListFeaturesRequest
	(*ListFeaturesResponse)(nil),          // 5: ListFeaturesResponse
	(*SyncFeaturesRequest)(nil),           // 6: SyncFeaturesRequest
	(*SyncFeaturesResponse)(nil),          // 7: SyncFeaturesResponse
	(*EnableKillSwitchRequest)(nil),       // 8: EnableKillSwitchRequest
	(*EnableKillSwitchResponse)(nil),      // 9: EnableKillSwitchResponse
	(*DisableKillSwitchRequest)(nil),      // 10: DisableKillSwitchRequest
	(*DisableKillSwitchResponse)(nil),     // 11: DisableKillSwitchResponse
	(*ListAuthorizedUsersRequest)(nil),    // 12: ListAuthorizedUsersRequest
	(*ListAuthorizedUsersResponse)(nil),   // 13: ListAuthorizedUsersResponse
	(*AddAuthorizedUserRequest)(nil),      // 14: AddAuthorizedUserRequest
	(*AddAuthorizedUserResponse)(nil),     // 15: AddAuthorizedUserResponse
	(*UpdateAuthorizedUserRequest)(nil),   // 16: UpdateAuthorizedUserRequest
	(*UpdateAuthorizedUserResponse)(nil),  // 17: UpdateAuthorizedUserResponse
	(*DeleteAuthorizedUserRequest)(nil),   // 18: DeleteAuthorizedUserRequest
	(*DeleteAuthorizedUserResponse)(nil),  // 19: DeleteAuthorizedUserResponse
	(*Environment)(nil),                   // 20: Environment
	(*KillSwitch)(nil),                    // 21: KillSwitch
	(*Feature)(nil),                       // 22: Feature
	(*KillSwitchAuthorizedUser)(nil),      // 23: KillSwitchAuthorizedUser
}
var file_api_proto_kill_switch_proto_depIdxs = []int32{
	20, // 0: GetKillSwitchStatusRequest.environment:type_name -> Environment
	21, // 1: GetKillSwitchStatusResponse.kill_switches:type_name -> KillSwitch
	21, // 2: GetKillSwitchOverviewResponse.kill_switches:type_name -> KillSwitch
	22, // 3: ListFeaturesResponse.features:type_name -> Feature
	22, // 4: SyncFeaturesRequest.features:type_name -> Feature
	21, // 5: EnableKillSwitchRequest.kill_switch:type_name -> KillSwitch
	23, // 6: ListAuthorizedUsersResponse.authorized_users:type_name -> KillSwitchAuthorizedUser
	23, // 7: AddAuthorizedUserRequest.user:type_name -> KillSwitchAuthorizedUser
	23, // 8: UpdateAuthorizedUserRequest.user:type_name -> KillSwitchAuthorizedUser
	0,  // 9: KillSwitchService.GetKillSwitchStatus:input_type -> GetKillSwitchStatusRequest
	2,  // 10: KillSwitchService.GetKillSwitchOverview:input_type -> GetKillSwitchOverviewRequest
	4,  // 11: KillSwitchService.ListFeatures:input_type -> ListFeaturesRequest
	6,  // 12: KillSwitchService.SyncFeatures:input_type -> SyncFeaturesRequest
	8,  // 13: KillSwitchService.EnableKillSwitch:input_type -> EnableKillSwitchRequest
	10, // 14: KillSwitchService.DisableKillSwitch:input_type -> DisableKillSwitchRequest
	12, // 15: KillSwitchService.ListAuthorizedUsers:input_type -> ListAuthorizedUsersRequest
	14, // 16: KillSwitchService.AddAuthorizedUser:input_type -> AddAuthorizedUserRequest
	16, // 17: KillSwitchService.UpdateAuthorizedUser:input_type -> UpdateAuthorizedUserRequest
	18, // 18: KillSwitchService.DeleteAuthorizedUser:input_type -> DeleteAuthorizedUserRequest
	1,  // 19: KillSwitchService.GetKillSwitchStatus:output_type -> GetKillSwitchStatusResponse
	3,  // 20: KillSwitchService.GetKillSwitchOverview:output_type -> GetKillSwitchOverviewResponse
	5,  // 21: KillSwitchService.ListFeatures:output_type -> ListFeaturesResponse
	7,  // 22: KillSwitchService.SyncFeatures:output_type -> SyncFeaturesResponse
	9,  // 23: KillSwitchService.EnableKillSwitch:output_type -> EnableKillSwitchResponse
	11, // 24: KillSwitchService.DisableKillSwitch:output_type -> DisableKillSwitchResponse
	13, // 25: KillSwitchService.ListAuthorizedUsers:output_type -> ListAuthorizedUsersResponse
	15, // 26: KillSwitchService.AddAuthorizedUser:output_type -> AddAuthorizedUserResponse
	17, // 27: KillSwitchService.UpdateAuthorizedUser:output_type -> UpdateAuthorizedUserResponse
	19, // 28: KillSwitchService.DeleteAuthorizedUser:output_type -> DeleteAuthorizedUserResponse
	19, // [19:29] is the sub-list for method output_type
	9,  // [9:19] is the sub-list for method input_type
	9,  // [9:9] is the sub-list for extension type_name
	9,  // [9:9] is the sub-list for extension extendee
	0,  // [0:9] is the sub-list for field type_name
}

func init() { file_api_proto_kill_switch_proto_init() }
func file_api_proto_kill_switch_proto_init() {
	if File_api_proto_kill_switch_proto != nil {
		return
	}
	file_api_proto_common_proto_init()
	file_api_proto_kill_switch_objects_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_api_proto_kill_switch_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetKillSwitchStatusRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetKillSwitchStatusResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetKillSwitchOverviewRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetKillSwitchOverviewResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListFeaturesRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListFeaturesResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SyncFeaturesRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SyncFeaturesResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EnableKillSwitchRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EnableKillSwitchResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DisableKillSwitchRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DisableKillSwitchResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListAuthorizedUsersRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListAuthorizedUsersResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AddAuthorizedUserRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AddAuthorizedUserResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UpdateAuthorizedUserRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UpdateAuthorizedUserResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeleteAuthorizedUserRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_api_proto_kill_switch_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeleteAuthorizedUserResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_api_proto_kill_switch_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   20,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_api_proto_kill_switch_proto_goTypes,
		DependencyIndexes: file_api_proto_kill_switch_proto_depIdxs,
		MessageInfos:      file_api_proto_kill_switch_proto_msgTypes,
	}.Build()
	File_api_proto_kill_switch_proto = out.File
	file_api_proto_kill_switch_proto_rawDesc = nil
	file_api_proto_kill_switch_proto_goTypes = nil
	file_api_proto_kill_switch_proto_depIdxs = nil
}
