diff --git a/api_proto/kill_switch.pb.go b/api_proto/kill_switch.pb.go
new file mode 100644
index 0000000..22622f8
--- /dev/null
+++ b/api_proto/kill_switch.pb.go
@@ -0,0 +1,1381 @@
+// 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
+}
