// Copyright 2014 The LUCI Authors. All rights reserved.
// Use of this source code is governed under the Apache License, Version 2.0
// that can be found in the LICENSE file.

// Messages for Primary <-> Replica auth DB replication protocol.
// Used from both Primary side (i.e. auth_service) and Replica side (any service
// that uses auth component).

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.12.1
// source: components/auth/proto/replication.proto

package protocol

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)
)

// Status codes.
type ServiceLinkResponse_Status int32

const (
	// The service is now linked and primary will be pushing updates to it.
	ServiceLinkResponse_SUCCESS ServiceLinkResponse_Status = 0
	// Primary do not replies.
	ServiceLinkResponse_TRANSPORT_ERROR ServiceLinkResponse_Status = 1
	// Linking ticket is invalid or expired.
	ServiceLinkResponse_BAD_TICKET ServiceLinkResponse_Status = 2
	// Linking ticket was generated for another app, not the calling one.
	ServiceLinkResponse_AUTH_ERROR ServiceLinkResponse_Status = 3
)

// Enum value maps for ServiceLinkResponse_Status.
var (
	ServiceLinkResponse_Status_name = map[int32]string{
		0: "SUCCESS",
		1: "TRANSPORT_ERROR",
		2: "BAD_TICKET",
		3: "AUTH_ERROR",
	}
	ServiceLinkResponse_Status_value = map[string]int32{
		"SUCCESS":         0,
		"TRANSPORT_ERROR": 1,
		"BAD_TICKET":      2,
		"AUTH_ERROR":      3,
	}
)

func (x ServiceLinkResponse_Status) Enum() *ServiceLinkResponse_Status {
	p := new(ServiceLinkResponse_Status)
	*p = x
	return p
}

func (x ServiceLinkResponse_Status) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ServiceLinkResponse_Status) Descriptor() protoreflect.EnumDescriptor {
	return file_components_auth_proto_replication_proto_enumTypes[0].Descriptor()
}

func (ServiceLinkResponse_Status) Type() protoreflect.EnumType {
	return &file_components_auth_proto_replication_proto_enumTypes[0]
}

func (x ServiceLinkResponse_Status) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ServiceLinkResponse_Status.Descriptor instead.
func (ServiceLinkResponse_Status) EnumDescriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{2, 0}
}

// Overall status of the operation.
type ReplicationPushResponse_Status int32

const (
	// Replica accepted the push request and updated its copy of auth db.
	ReplicationPushResponse_APPLIED ReplicationPushResponse_Status = 0
	// Replica has a newer version of AuthDB, the push request is skipped.
	ReplicationPushResponse_SKIPPED ReplicationPushResponse_Status = 1
	// Non fatal error happened, the push request may be retried.
	ReplicationPushResponse_TRANSIENT_ERROR ReplicationPushResponse_Status = 2
	// Fatal error happened, the push request must not be retried.
	ReplicationPushResponse_FATAL_ERROR ReplicationPushResponse_Status = 3
)

// Enum value maps for ReplicationPushResponse_Status.
var (
	ReplicationPushResponse_Status_name = map[int32]string{
		0: "APPLIED",
		1: "SKIPPED",
		2: "TRANSIENT_ERROR",
		3: "FATAL_ERROR",
	}
	ReplicationPushResponse_Status_value = map[string]int32{
		"APPLIED":         0,
		"SKIPPED":         1,
		"TRANSIENT_ERROR": 2,
		"FATAL_ERROR":     3,
	}
)

func (x ReplicationPushResponse_Status) Enum() *ReplicationPushResponse_Status {
	p := new(ReplicationPushResponse_Status)
	*p = x
	return p
}

func (x ReplicationPushResponse_Status) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ReplicationPushResponse_Status) Descriptor() protoreflect.EnumDescriptor {
	return file_components_auth_proto_replication_proto_enumTypes[1].Descriptor()
}

func (ReplicationPushResponse_Status) Type() protoreflect.EnumType {
	return &file_components_auth_proto_replication_proto_enumTypes[1]
}

func (x ReplicationPushResponse_Status) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ReplicationPushResponse_Status.Descriptor instead.
func (ReplicationPushResponse_Status) EnumDescriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{11, 0}
}

// Error codes, for TRANSIENT_ERROR and FATAL_ERROR statuses.
type ReplicationPushResponse_ErrorCode int32

const (
	// Some unrecognized error.
	ReplicationPushResponse_ERROR_UNKNOWN ReplicationPushResponse_ErrorCode = 0
	// Trying to push an update to service that is not a replica.
	ReplicationPushResponse_NOT_A_REPLICA ReplicationPushResponse_ErrorCode = 1
	// Replica doesn't know about the service that pushing the update.
	ReplicationPushResponse_FORBIDDEN ReplicationPushResponse_ErrorCode = 2
	// Signature headers are missing.
	ReplicationPushResponse_MISSING_SIGNATURE ReplicationPushResponse_ErrorCode = 3
	// Signature is not valid.
	ReplicationPushResponse_BAD_SIGNATURE ReplicationPushResponse_ErrorCode = 4
	// Format of the request is not valid.
	ReplicationPushResponse_BAD_REQUEST ReplicationPushResponse_ErrorCode = 5
)

// Enum value maps for ReplicationPushResponse_ErrorCode.
var (
	ReplicationPushResponse_ErrorCode_name = map[int32]string{
		0: "ERROR_UNKNOWN",
		1: "NOT_A_REPLICA",
		2: "FORBIDDEN",
		3: "MISSING_SIGNATURE",
		4: "BAD_SIGNATURE",
		5: "BAD_REQUEST",
	}
	ReplicationPushResponse_ErrorCode_value = map[string]int32{
		"ERROR_UNKNOWN":     0,
		"NOT_A_REPLICA":     1,
		"FORBIDDEN":         2,
		"MISSING_SIGNATURE": 3,
		"BAD_SIGNATURE":     4,
		"BAD_REQUEST":       5,
	}
)

func (x ReplicationPushResponse_ErrorCode) Enum() *ReplicationPushResponse_ErrorCode {
	p := new(ReplicationPushResponse_ErrorCode)
	*p = x
	return p
}

func (x ReplicationPushResponse_ErrorCode) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ReplicationPushResponse_ErrorCode) Descriptor() protoreflect.EnumDescriptor {
	return file_components_auth_proto_replication_proto_enumTypes[2].Descriptor()
}

func (ReplicationPushResponse_ErrorCode) Type() protoreflect.EnumType {
	return &file_components_auth_proto_replication_proto_enumTypes[2]
}

func (x ReplicationPushResponse_ErrorCode) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ReplicationPushResponse_ErrorCode.Descriptor instead.
func (ReplicationPushResponse_ErrorCode) EnumDescriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{11, 1}
}

// Generated by Primary, passed to Replica to initiate linking process.
type ServiceLinkTicket struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// GAE application ID of Primary that generated this ticket. Replica will send
	// ServiceLinkRequest to this service when it processes the ticket.
	PrimaryId string `protobuf:"bytes,1,opt,name=primary_id,json=primaryId,proto3" json:"primary_id,omitempty"`
	// URL to the root page of a primary service, i.e. https://<...>.appspot.com.
	// Useful when testing on dev appserver and on non-default version.
	PrimaryUrl string `protobuf:"bytes,2,opt,name=primary_url,json=primaryUrl,proto3" json:"primary_url,omitempty"`
	// Identity of a user that generated this ticket.
	GeneratedBy string `protobuf:"bytes,3,opt,name=generated_by,json=generatedBy,proto3" json:"generated_by,omitempty"`
	// Opaque blob passed back to Primary in ServiceLinkRequest. Its exact
	// structure is an implementation detail of Primary. It contains app_id of
	// a replica this ticket is intended for, timestamp and HMAC tag.
	Ticket []byte `protobuf:"bytes,4,opt,name=ticket,proto3" json:"ticket,omitempty"`
}

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

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

func (*ServiceLinkTicket) ProtoMessage() {}

func (x *ServiceLinkTicket) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 ServiceLinkTicket.ProtoReflect.Descriptor instead.
func (*ServiceLinkTicket) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{0}
}

func (x *ServiceLinkTicket) GetPrimaryId() string {
	if x != nil {
		return x.PrimaryId
	}
	return ""
}

func (x *ServiceLinkTicket) GetPrimaryUrl() string {
	if x != nil {
		return x.PrimaryUrl
	}
	return ""
}

func (x *ServiceLinkTicket) GetGeneratedBy() string {
	if x != nil {
		return x.GeneratedBy
	}
	return ""
}

func (x *ServiceLinkTicket) GetTicket() []byte {
	if x != nil {
		return x.Ticket
	}
	return nil
}

// Sent from Replica to Primary via direct service <-> service HTTP call,
// replicas app_id would be available via X-Appengine-Inbound-Appid header.
type ServiceLinkRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Same ticket that was passed to Replica via ServiceLinkTicket.
	Ticket []byte `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"`
	// URL to use when making requests to Replica from Primary.
	ReplicaUrl string `protobuf:"bytes,2,opt,name=replica_url,json=replicaUrl,proto3" json:"replica_url,omitempty"`
	// Identity of a user that accepted the ticket and initiated this request.
	InitiatedBy string `protobuf:"bytes,3,opt,name=initiated_by,json=initiatedBy,proto3" json:"initiated_by,omitempty"`
}

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

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

func (*ServiceLinkRequest) ProtoMessage() {}

func (x *ServiceLinkRequest) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 ServiceLinkRequest.ProtoReflect.Descriptor instead.
func (*ServiceLinkRequest) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{1}
}

func (x *ServiceLinkRequest) GetTicket() []byte {
	if x != nil {
		return x.Ticket
	}
	return nil
}

func (x *ServiceLinkRequest) GetReplicaUrl() string {
	if x != nil {
		return x.ReplicaUrl
	}
	return ""
}

func (x *ServiceLinkRequest) GetInitiatedBy() string {
	if x != nil {
		return x.InitiatedBy
	}
	return ""
}

// Primary's response to ServiceLinkRequest. Always returned with HTTP code 200.
type ServiceLinkResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Status ServiceLinkResponse_Status `protobuf:"varint,1,opt,name=status,proto3,enum=components.auth.ServiceLinkResponse_Status" json:"status,omitempty"`
}

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

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

func (*ServiceLinkResponse) ProtoMessage() {}

func (x *ServiceLinkResponse) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 ServiceLinkResponse.ProtoReflect.Descriptor instead.
func (*ServiceLinkResponse) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{2}
}

func (x *ServiceLinkResponse) GetStatus() ServiceLinkResponse_Status {
	if x != nil {
		return x.Status
	}
	return ServiceLinkResponse_SUCCESS
}

// Some user group. Corresponds to AuthGroup entity in model.py.
type AuthGroup struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the group.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// List of members that are explicitly in this group.
	Members []string `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"`
	// List of identity-glob expressions (like 'user:*@example.com').
	Globs []string `protobuf:"bytes,3,rep,name=globs,proto3" json:"globs,omitempty"`
	// List of nested group names.
	Nested []string `protobuf:"bytes,4,rep,name=nested,proto3" json:"nested,omitempty"`
	// Human readable description.
	Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
	// When the group was created. Microseconds since epoch.
	CreatedTs int64 `protobuf:"varint,6,opt,name=created_ts,json=createdTs,proto3" json:"created_ts,omitempty"`
	// Who created the group.
	CreatedBy string `protobuf:"bytes,7,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"`
	// When the group was modified last time. Microseconds since epoch.
	ModifiedTs int64 `protobuf:"varint,8,opt,name=modified_ts,json=modifiedTs,proto3" json:"modified_ts,omitempty"`
	// Who modified the group last time.
	ModifiedBy string `protobuf:"bytes,9,opt,name=modified_by,json=modifiedBy,proto3" json:"modified_by,omitempty"`
	// A name of the group that can modify or delete this group.
	Owners string `protobuf:"bytes,10,opt,name=owners,proto3" json:"owners,omitempty"`
}

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

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

func (*AuthGroup) ProtoMessage() {}

func (x *AuthGroup) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 AuthGroup.ProtoReflect.Descriptor instead.
func (*AuthGroup) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{3}
}

func (x *AuthGroup) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *AuthGroup) GetMembers() []string {
	if x != nil {
		return x.Members
	}
	return nil
}

func (x *AuthGroup) GetGlobs() []string {
	if x != nil {
		return x.Globs
	}
	return nil
}

func (x *AuthGroup) GetNested() []string {
	if x != nil {
		return x.Nested
	}
	return nil
}

func (x *AuthGroup) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

func (x *AuthGroup) GetCreatedTs() int64 {
	if x != nil {
		return x.CreatedTs
	}
	return 0
}

func (x *AuthGroup) GetCreatedBy() string {
	if x != nil {
		return x.CreatedBy
	}
	return ""
}

func (x *AuthGroup) GetModifiedTs() int64 {
	if x != nil {
		return x.ModifiedTs
	}
	return 0
}

func (x *AuthGroup) GetModifiedBy() string {
	if x != nil {
		return x.ModifiedBy
	}
	return ""
}

func (x *AuthGroup) GetOwners() string {
	if x != nil {
		return x.Owners
	}
	return ""
}

// A named set of whitelisted IP addresses. Corresponds to AuthIPWhitelist
// entity in model.py.
type AuthIPWhitelist struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the IP whitelist.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The list of IP subnets.
	Subnets []string `protobuf:"bytes,2,rep,name=subnets,proto3" json:"subnets,omitempty"`
	// Human readable description.
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// When the list was created. Microseconds since epoch.
	CreatedTs int64 `protobuf:"varint,4,opt,name=created_ts,json=createdTs,proto3" json:"created_ts,omitempty"`
	// Who created the list.
	CreatedBy string `protobuf:"bytes,5,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"`
	// When the list was modified. Microseconds since epoch.
	ModifiedTs int64 `protobuf:"varint,6,opt,name=modified_ts,json=modifiedTs,proto3" json:"modified_ts,omitempty"`
	// Who modified the list the last time.
	ModifiedBy string `protobuf:"bytes,7,opt,name=modified_by,json=modifiedBy,proto3" json:"modified_by,omitempty"`
}

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

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

func (*AuthIPWhitelist) ProtoMessage() {}

func (x *AuthIPWhitelist) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 AuthIPWhitelist.ProtoReflect.Descriptor instead.
func (*AuthIPWhitelist) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{4}
}

func (x *AuthIPWhitelist) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *AuthIPWhitelist) GetSubnets() []string {
	if x != nil {
		return x.Subnets
	}
	return nil
}

func (x *AuthIPWhitelist) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

func (x *AuthIPWhitelist) GetCreatedTs() int64 {
	if x != nil {
		return x.CreatedTs
	}
	return 0
}

func (x *AuthIPWhitelist) GetCreatedBy() string {
	if x != nil {
		return x.CreatedBy
	}
	return ""
}

func (x *AuthIPWhitelist) GetModifiedTs() int64 {
	if x != nil {
		return x.ModifiedTs
	}
	return 0
}

func (x *AuthIPWhitelist) GetModifiedBy() string {
	if x != nil {
		return x.ModifiedBy
	}
	return ""
}

// A pair (identity, IP whitelist name) plus some metadata. Corresponds to
// AuthIPWhitelistAssignments.Assignment model in model.py.
type AuthIPWhitelistAssignment struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Identity name to limit by IP whitelist.
	Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"`
	// Name of IP whitelist to use (see AuthIPWhitelist).
	IpWhitelist string `protobuf:"bytes,2,opt,name=ip_whitelist,json=ipWhitelist,proto3" json:"ip_whitelist,omitempty"`
	// Why the assignment was created.
	Comment string `protobuf:"bytes,3,opt,name=comment,proto3" json:"comment,omitempty"`
	// When the assignment was created. Microseconds since epoch.
	CreatedTs int64 `protobuf:"varint,4,opt,name=created_ts,json=createdTs,proto3" json:"created_ts,omitempty"`
	// Who created the assignment.
	CreatedBy string `protobuf:"bytes,5,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"`
}

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

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

func (*AuthIPWhitelistAssignment) ProtoMessage() {}

func (x *AuthIPWhitelistAssignment) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 AuthIPWhitelistAssignment.ProtoReflect.Descriptor instead.
func (*AuthIPWhitelistAssignment) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{5}
}

func (x *AuthIPWhitelistAssignment) GetIdentity() string {
	if x != nil {
		return x.Identity
	}
	return ""
}

func (x *AuthIPWhitelistAssignment) GetIpWhitelist() string {
	if x != nil {
		return x.IpWhitelist
	}
	return ""
}

func (x *AuthIPWhitelistAssignment) GetComment() string {
	if x != nil {
		return x.Comment
	}
	return ""
}

func (x *AuthIPWhitelistAssignment) GetCreatedTs() int64 {
	if x != nil {
		return x.CreatedTs
	}
	return 0
}

func (x *AuthIPWhitelistAssignment) GetCreatedBy() string {
	if x != nil {
		return x.CreatedBy
	}
	return ""
}

// An entire database of auth configuration that is being replicated.
type AuthDB struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// OAuth2 client_id to use to mint new OAuth2 tokens.
	OauthClientId string `protobuf:"bytes,1,opt,name=oauth_client_id,json=oauthClientId,proto3" json:"oauth_client_id,omitempty"`
	// OAuth2 client secret. Not so secret really, since it's passed to clients.
	OauthClientSecret string `protobuf:"bytes,2,opt,name=oauth_client_secret,json=oauthClientSecret,proto3" json:"oauth_client_secret,omitempty"`
	// Additional OAuth2 client_ids allowed to access the services.
	OauthAdditionalClientIds []string `protobuf:"bytes,3,rep,name=oauth_additional_client_ids,json=oauthAdditionalClientIds,proto3" json:"oauth_additional_client_ids,omitempty"`
	// All groups.
	Groups []*AuthGroup `protobuf:"bytes,4,rep,name=groups,proto3" json:"groups,omitempty"`
	// All IP whitelists.
	IpWhitelists []*AuthIPWhitelist `protobuf:"bytes,6,rep,name=ip_whitelists,json=ipWhitelists,proto3" json:"ip_whitelists,omitempty"`
	// Mapping 'account -> IP whitlist to use for that account'.
	IpWhitelistAssignments []*AuthIPWhitelistAssignment `protobuf:"bytes,7,rep,name=ip_whitelist_assignments,json=ipWhitelistAssignments,proto3" json:"ip_whitelist_assignments,omitempty"`
	// URL of a token server to use to generate delegation tokens.
	TokenServerUrl string `protobuf:"bytes,8,opt,name=token_server_url,json=tokenServerUrl,proto3" json:"token_server_url,omitempty"`
	// Serialized security_config.SecurityConfig proto with security-related
	// configuration to distribute across all services.
	//
	// It is distributed in a serialized form to make sure old services ingest it
	// fully, even if they don't understand some SecurityConfig proto fields
	// (yet). As soon as their code is updated, they SHOULD start using all
	// SecurityConfig fields, without waiting for another push from Auth Service.
	//
	// If we use SecurityConfig directly here, old services would just drop fields
	// they don't understand when accepting an AuthDB push.
	SecurityConfig []byte `protobuf:"bytes,9,opt,name=security_config,json=securityConfig,proto3" json:"security_config,omitempty"`
	// Definition of all known permissions and realms in a LUCI deployment.
	//
	// It is ultimately used by LUCI services for authorizing access to resources.
	// See realms.proto for more details.
	Realms *Realms `protobuf:"bytes,11,opt,name=realms,proto3" json:"realms,omitempty"`
}

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

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

func (*AuthDB) ProtoMessage() {}

func (x *AuthDB) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 AuthDB.ProtoReflect.Descriptor instead.
func (*AuthDB) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{6}
}

func (x *AuthDB) GetOauthClientId() string {
	if x != nil {
		return x.OauthClientId
	}
	return ""
}

func (x *AuthDB) GetOauthClientSecret() string {
	if x != nil {
		return x.OauthClientSecret
	}
	return ""
}

func (x *AuthDB) GetOauthAdditionalClientIds() []string {
	if x != nil {
		return x.OauthAdditionalClientIds
	}
	return nil
}

func (x *AuthDB) GetGroups() []*AuthGroup {
	if x != nil {
		return x.Groups
	}
	return nil
}

func (x *AuthDB) GetIpWhitelists() []*AuthIPWhitelist {
	if x != nil {
		return x.IpWhitelists
	}
	return nil
}

func (x *AuthDB) GetIpWhitelistAssignments() []*AuthIPWhitelistAssignment {
	if x != nil {
		return x.IpWhitelistAssignments
	}
	return nil
}

func (x *AuthDB) GetTokenServerUrl() string {
	if x != nil {
		return x.TokenServerUrl
	}
	return ""
}

func (x *AuthDB) GetSecurityConfig() []byte {
	if x != nil {
		return x.SecurityConfig
	}
	return nil
}

func (x *AuthDB) GetRealms() *Realms {
	if x != nil {
		return x.Realms
	}
	return nil
}

// Information about some particular revision of auth DB.
type AuthDBRevision struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// GAE App ID of a service holding primary copy of Auth DB.
	PrimaryId string `protobuf:"bytes,1,opt,name=primary_id,json=primaryId,proto3" json:"primary_id,omitempty"`
	// Revision of Auth DB being pushed.
	AuthDbRev int64 `protobuf:"varint,2,opt,name=auth_db_rev,json=authDbRev,proto3" json:"auth_db_rev,omitempty"`
	// Timestamp of that revision by Primary's clock, microseconds since epoch.
	ModifiedTs int64 `protobuf:"varint,3,opt,name=modified_ts,json=modifiedTs,proto3" json:"modified_ts,omitempty"`
}

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

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

func (*AuthDBRevision) ProtoMessage() {}

func (x *AuthDBRevision) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 AuthDBRevision.ProtoReflect.Descriptor instead.
func (*AuthDBRevision) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{7}
}

func (x *AuthDBRevision) GetPrimaryId() string {
	if x != nil {
		return x.PrimaryId
	}
	return ""
}

func (x *AuthDBRevision) GetAuthDbRev() int64 {
	if x != nil {
		return x.AuthDbRev
	}
	return 0
}

func (x *AuthDBRevision) GetModifiedTs() int64 {
	if x != nil {
		return x.ModifiedTs
	}
	return 0
}

// SignedAuthDB contains serialized and signed AuthDB proto.
//
// It is used to store AuthDB snapshots in Google Storage. Signing is used as
// a defense against unauthorized writes to the storage bucket.
type SignedAuthDB struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Serialized ReplicationPushRequest message with actual data.
	//
	// Contains revision information and AuthDB itself.
	AuthDbBlob []byte `protobuf:"bytes,1,opt,name=auth_db_blob,json=authDbBlob,proto3" json:"auth_db_blob,omitempty"`
	// Service account name whose key was used to sign the AuthDB blob.
	SignerId string `protobuf:"bytes,2,opt,name=signer_id,json=signerId,proto3" json:"signer_id,omitempty"`
	// ID of the signing key.
	SigningKeyId string `protobuf:"bytes,3,opt,name=signing_key_id,json=signingKeyId,proto3" json:"signing_key_id,omitempty"`
	// The signature of auth_db_blob field.
	//
	// It is RS256(SHA512(auth_db_blob)).
	//
	// Where:
	//   * RS256 is RSASSA-PKCS1-v1_5 using SHA-256, see RS256 algo in RFC7518.
	//   * SHA512 is a byte string (64 bytes) with SHA-512 digest of its input.
	//
	// Such peculiar structure is due to limitations of GAE signing infrastructure
	// (RS256 function can accept at most 8KB of input).
	//
	// Consumers of SignedAuthDB are expected to do the following:
	//   1. Check 'signer_id' is what they expect.
	//   2. Use https://www.googleapis.com/service_accounts/v1/metadata/x509/...
	//      endpoint to get the signer's public key with ID 'signing_key_id'.
	//   3. Construct to-be-signed string as SHA512(auth_db_blob).
	//   4. Verify 'signature' matches to-be-signed string using the public key
	//      from step 2.
	Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"`
}

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

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

func (*SignedAuthDB) ProtoMessage() {}

func (x *SignedAuthDB) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 SignedAuthDB.ProtoReflect.Descriptor instead.
func (*SignedAuthDB) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{8}
}

func (x *SignedAuthDB) GetAuthDbBlob() []byte {
	if x != nil {
		return x.AuthDbBlob
	}
	return nil
}

func (x *SignedAuthDB) GetSignerId() string {
	if x != nil {
		return x.SignerId
	}
	return ""
}

func (x *SignedAuthDB) GetSigningKeyId() string {
	if x != nil {
		return x.SigningKeyId
	}
	return ""
}

func (x *SignedAuthDB) GetSignature() []byte {
	if x != nil {
		return x.Signature
	}
	return nil
}

// Published by Primary into 'auth-db-changed' PubSub topic. The body of the
// message is base64 encoded serialized ChangeNotification. Additional
// attributes are:
//  X-AuthDB-SigKey-v1: <id of a public key>
//  X-AuthDB-SigVal-v1: <base64 encoded RSA-SHA256(blob) signature>
type ChangeNotification struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// New revision of the AuthDB.
	Revision *AuthDBRevision `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"`
}

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

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

func (*ChangeNotification) ProtoMessage() {}

func (x *ChangeNotification) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 ChangeNotification.ProtoReflect.Descriptor instead.
func (*ChangeNotification) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{9}
}

func (x *ChangeNotification) GetRevision() *AuthDBRevision {
	if x != nil {
		return x.Revision
	}
	return nil
}

// Sent from Primary to Replica to update Replica's AuthDB.
//
// Primary signs the entire serialized message with its private key and appends
// two headers to HTTP request that carries the blob:
//  X-AuthDB-SigKey-v1: <id of a public key>
//  X-AuthDB-SigVal-v1: <base64 encoded RSA-SHA256(SHA512(blob)) signature>
//
// Binary serialization of ReplicationPushRequest is sometimes misleadingly
// called "AuthDB blob". It is stored in Datastore (as is) and in Google Storage
// (as serialized SignedAuthDB) for consumers that do not use Primary -> Replica
// protocol.
type ReplicationPushRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Revision that is being pushed.
	Revision *AuthDBRevision `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"`
	// An entire database of auth configuration for specific revision.
	AuthDb *AuthDB `protobuf:"bytes,2,opt,name=auth_db,json=authDb,proto3" json:"auth_db,omitempty"`
	// Version of 'auth' component on Primary, see components/auth/version.py.
	AuthCodeVersion string `protobuf:"bytes,3,opt,name=auth_code_version,json=authCodeVersion,proto3" json:"auth_code_version,omitempty"`
}

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

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

func (*ReplicationPushRequest) ProtoMessage() {}

func (x *ReplicationPushRequest) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 ReplicationPushRequest.ProtoReflect.Descriptor instead.
func (*ReplicationPushRequest) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{10}
}

func (x *ReplicationPushRequest) GetRevision() *AuthDBRevision {
	if x != nil {
		return x.Revision
	}
	return nil
}

func (x *ReplicationPushRequest) GetAuthDb() *AuthDB {
	if x != nil {
		return x.AuthDb
	}
	return nil
}

func (x *ReplicationPushRequest) GetAuthCodeVersion() string {
	if x != nil {
		return x.AuthCodeVersion
	}
	return ""
}

// Replica's response to ReplicationPushRequest.
type ReplicationPushResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Overall status of the operation.
	Status ReplicationPushResponse_Status `protobuf:"varint,1,opt,name=status,proto3,enum=components.auth.ReplicationPushResponse_Status" json:"status,omitempty"`
	// Revision known by Replica (set for APPLIED and SKIPPED statuses).
	CurrentRevision *AuthDBRevision `protobuf:"bytes,2,opt,name=current_revision,json=currentRevision,proto3" json:"current_revision,omitempty"`
	// Present for TRANSIENT_ERROR and FATAL_ERROR statuses.
	ErrorCode ReplicationPushResponse_ErrorCode `protobuf:"varint,3,opt,name=error_code,json=errorCode,proto3,enum=components.auth.ReplicationPushResponse_ErrorCode" json:"error_code,omitempty"`
	// Version of 'auth' component on Replica, see components/auth/version.py.
	AuthCodeVersion string `protobuf:"bytes,4,opt,name=auth_code_version,json=authCodeVersion,proto3" json:"auth_code_version,omitempty"`
}

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

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

func (*ReplicationPushResponse) ProtoMessage() {}

func (x *ReplicationPushResponse) ProtoReflect() protoreflect.Message {
	mi := &file_components_auth_proto_replication_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 ReplicationPushResponse.ProtoReflect.Descriptor instead.
func (*ReplicationPushResponse) Descriptor() ([]byte, []int) {
	return file_components_auth_proto_replication_proto_rawDescGZIP(), []int{11}
}

func (x *ReplicationPushResponse) GetStatus() ReplicationPushResponse_Status {
	if x != nil {
		return x.Status
	}
	return ReplicationPushResponse_APPLIED
}

func (x *ReplicationPushResponse) GetCurrentRevision() *AuthDBRevision {
	if x != nil {
		return x.CurrentRevision
	}
	return nil
}

func (x *ReplicationPushResponse) GetErrorCode() ReplicationPushResponse_ErrorCode {
	if x != nil {
		return x.ErrorCode
	}
	return ReplicationPushResponse_ERROR_UNKNOWN
}

func (x *ReplicationPushResponse) GetAuthCodeVersion() string {
	if x != nil {
		return x.AuthCodeVersion
	}
	return ""
}

var File_components_auth_proto_replication_proto protoreflect.FileDescriptor

var file_components_auth_proto_replication_proto_rawDesc = []byte{
	0x0a, 0x27, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x74,
	0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6f,
	0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x1a, 0x22, 0x63, 0x6f, 0x6d, 0x70,
	0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8e,
	0x01, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x54, 0x69,
	0x63, 0x6b, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f,
	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72,
	0x79, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x75,
	0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72,
	0x79, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
	0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x65, 0x6e, 0x65,
	0x72, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65,
	0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x22,
	0x70, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1f, 0x0a,
	0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x55, 0x72, 0x6c, 0x12, 0x21,
	0x0a, 0x0c, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x42,
	0x79, 0x22, 0xa6, 0x01, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e,
	0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x73, 0x74, 0x61,
	0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x63, 0x6f, 0x6d, 0x70,
	0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x53, 0x65, 0x72, 0x76,
	0x69, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4a,
	0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43,
	0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x50, 0x4f,
	0x52, 0x54, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x41,
	0x44, 0x5f, 0x54, 0x49, 0x43, 0x4b, 0x45, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x55,
	0x54, 0x48, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0xa1, 0x02, 0x0a, 0x09, 0x41,
	0x75, 0x74, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07,
	0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d,
	0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x6c, 0x6f, 0x62, 0x73, 0x18,
	0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x67, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x16, 0x0a, 0x06,
	0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x65,
	0x73, 0x74, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
	0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
	0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
	0x64, 0x5f, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61,
	0x74, 0x65, 0x64, 0x54, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
	0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74,
	0x65, 0x64, 0x42, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64,
	0x5f, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66,
	0x69, 0x65, 0x64, 0x54, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65,
	0x64, 0x5f, 0x62, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69,
	0x66, 0x69, 0x65, 0x64, 0x42, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73,
	0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x22, 0xe1,
	0x01, 0x0a, 0x0f, 0x41, 0x75, 0x74, 0x68, 0x49, 0x50, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69,
	0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74,
	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73,
	0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
	0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x73,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54,
	0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18,
	0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79,
	0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x73, 0x18,
	0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54,
	0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x62, 0x79,
	0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64,
	0x42, 0x79, 0x22, 0xb2, 0x01, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x68, 0x49, 0x50, 0x57, 0x68, 0x69,
	0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
	0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x21, 0x0a, 0x0c,
	0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0b, 0x69, 0x70, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x12,
	0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65,
	0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63,
	0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61,
	0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72,
	0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x22, 0x97, 0x04, 0x0a, 0x06, 0x41, 0x75, 0x74, 0x68,
	0x44, 0x42, 0x12, 0x26, 0x0a, 0x0f, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6c, 0x69, 0x65,
	0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x61, 0x75,
	0x74, 0x68, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x61,
	0x75, 0x74, 0x68, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65,
	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x43, 0x6c,
	0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x6f, 0x61,
	0x75, 0x74, 0x68, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x63,
	0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52,
	0x18, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
	0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x67, 0x72, 0x6f,
	0x75, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x70,
	0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x41, 0x75, 0x74, 0x68,
	0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x45, 0x0a,
	0x0d, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x18, 0x06,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74,
	0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x49, 0x50, 0x57, 0x68, 0x69,
	0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x0c, 0x69, 0x70, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c,
	0x69, 0x73, 0x74, 0x73, 0x12, 0x64, 0x0a, 0x18, 0x69, 0x70, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65,
	0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
	0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65,
	0x6e, 0x74, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x49, 0x50, 0x57,
	0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65,
	0x6e, 0x74, 0x52, 0x16, 0x69, 0x70, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x41,
	0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x6f,
	0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65,
	0x72, 0x55, 0x72, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79,
	0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x73,
	0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x0a,
	0x06, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e,
	0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e,
	0x72, 0x65, 0x61, 0x6c, 0x6d, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6d, 0x73, 0x52, 0x06, 0x72,
	0x65, 0x61, 0x6c, 0x6d, 0x73, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x0a, 0x10,
	0x0b, 0x22, 0x70, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x44, 0x42, 0x52, 0x65, 0x76, 0x69, 0x73,
	0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x69,
	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79,
	0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x64, 0x62, 0x5f, 0x72, 0x65,
	0x76, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x44, 0x62, 0x52,
	0x65, 0x76, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x74,
	0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65,
	0x64, 0x54, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x41, 0x75,
	0x74, 0x68, 0x44, 0x42, 0x12, 0x20, 0x0a, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x64, 0x62, 0x5f,
	0x62, 0x6c, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68,
	0x44, 0x62, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72,
	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x67, 0x6e, 0x65,
	0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b,
	0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x69, 0x67,
	0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67,
	0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69,
	0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x51, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67,
	0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a,
	0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x1f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x75, 0x74,
	0x68, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x44, 0x42, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
	0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb3, 0x01, 0x0a, 0x16, 0x52,
	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
	0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e,
	0x65, 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x44, 0x42,
	0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69,
	0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x64, 0x62, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73,
	0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x44, 0x42, 0x52, 0x06, 0x61, 0x75,
	0x74, 0x68, 0x44, 0x62, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x64,
	0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0f, 0x61, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
	0x22, 0xf4, 0x03, 0x0a, 0x17, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x06,
	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x63,
	0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52,
	0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73,
	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74,
	0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x1f, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x61, 0x75, 0x74,
	0x68, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x44, 0x42, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
	0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
	0x6e, 0x12, 0x51, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e,
	0x74, 0x73, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e,
	0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72,
	0x43, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x64,
	0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0f, 0x61, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
	0x22, 0x48, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50,
	0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x50,
	0x45, 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x49, 0x45, 0x4e,
	0x54, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x41, 0x54,
	0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0x7b, 0x0a, 0x09, 0x45, 0x72,
	0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x52, 0x52, 0x4f, 0x52,
	0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f,
	0x54, 0x5f, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x10, 0x01, 0x12, 0x0d, 0x0a,
	0x09, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11,
	0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52,
	0x45, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x41, 0x44, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41,
	0x54, 0x55, 0x52, 0x45, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x42, 0x41, 0x44, 0x5f, 0x52, 0x45,
	0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x05, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x6f, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f,
	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x73, 0x65, 0x72, 0x76,
	0x69, 0x63, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x3b, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_components_auth_proto_replication_proto_rawDescOnce sync.Once
	file_components_auth_proto_replication_proto_rawDescData = file_components_auth_proto_replication_proto_rawDesc
)

func file_components_auth_proto_replication_proto_rawDescGZIP() []byte {
	file_components_auth_proto_replication_proto_rawDescOnce.Do(func() {
		file_components_auth_proto_replication_proto_rawDescData = protoimpl.X.CompressGZIP(file_components_auth_proto_replication_proto_rawDescData)
	})
	return file_components_auth_proto_replication_proto_rawDescData
}

var file_components_auth_proto_replication_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_components_auth_proto_replication_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
var file_components_auth_proto_replication_proto_goTypes = []interface{}{
	(ServiceLinkResponse_Status)(0),        // 0: components.auth.ServiceLinkResponse.Status
	(ReplicationPushResponse_Status)(0),    // 1: components.auth.ReplicationPushResponse.Status
	(ReplicationPushResponse_ErrorCode)(0), // 2: components.auth.ReplicationPushResponse.ErrorCode
	(*ServiceLinkTicket)(nil),              // 3: components.auth.ServiceLinkTicket
	(*ServiceLinkRequest)(nil),             // 4: components.auth.ServiceLinkRequest
	(*ServiceLinkResponse)(nil),            // 5: components.auth.ServiceLinkResponse
	(*AuthGroup)(nil),                      // 6: components.auth.AuthGroup
	(*AuthIPWhitelist)(nil),                // 7: components.auth.AuthIPWhitelist
	(*AuthIPWhitelistAssignment)(nil),      // 8: components.auth.AuthIPWhitelistAssignment
	(*AuthDB)(nil),                         // 9: components.auth.AuthDB
	(*AuthDBRevision)(nil),                 // 10: components.auth.AuthDBRevision
	(*SignedAuthDB)(nil),                   // 11: components.auth.SignedAuthDB
	(*ChangeNotification)(nil),             // 12: components.auth.ChangeNotification
	(*ReplicationPushRequest)(nil),         // 13: components.auth.ReplicationPushRequest
	(*ReplicationPushResponse)(nil),        // 14: components.auth.ReplicationPushResponse
	(*Realms)(nil),                         // 15: components.auth.realms.Realms
}
var file_components_auth_proto_replication_proto_depIdxs = []int32{
	0,  // 0: components.auth.ServiceLinkResponse.status:type_name -> components.auth.ServiceLinkResponse.Status
	6,  // 1: components.auth.AuthDB.groups:type_name -> components.auth.AuthGroup
	7,  // 2: components.auth.AuthDB.ip_whitelists:type_name -> components.auth.AuthIPWhitelist
	8,  // 3: components.auth.AuthDB.ip_whitelist_assignments:type_name -> components.auth.AuthIPWhitelistAssignment
	15, // 4: components.auth.AuthDB.realms:type_name -> components.auth.realms.Realms
	10, // 5: components.auth.ChangeNotification.revision:type_name -> components.auth.AuthDBRevision
	10, // 6: components.auth.ReplicationPushRequest.revision:type_name -> components.auth.AuthDBRevision
	9,  // 7: components.auth.ReplicationPushRequest.auth_db:type_name -> components.auth.AuthDB
	1,  // 8: components.auth.ReplicationPushResponse.status:type_name -> components.auth.ReplicationPushResponse.Status
	10, // 9: components.auth.ReplicationPushResponse.current_revision:type_name -> components.auth.AuthDBRevision
	2,  // 10: components.auth.ReplicationPushResponse.error_code:type_name -> components.auth.ReplicationPushResponse.ErrorCode
	11, // [11:11] is the sub-list for method output_type
	11, // [11:11] is the sub-list for method input_type
	11, // [11:11] is the sub-list for extension type_name
	11, // [11:11] is the sub-list for extension extendee
	0,  // [0:11] is the sub-list for field type_name
}

func init() { file_components_auth_proto_replication_proto_init() }
func file_components_auth_proto_replication_proto_init() {
	if File_components_auth_proto_replication_proto != nil {
		return
	}
	file_components_auth_proto_realms_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_components_auth_proto_replication_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ServiceLinkTicket); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ServiceLinkRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ServiceLinkResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AuthGroup); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AuthIPWhitelist); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AuthIPWhitelistAssignment); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AuthDB); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AuthDBRevision); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SignedAuthDB); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChangeNotification); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ReplicationPushRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_components_auth_proto_replication_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ReplicationPushResponse); 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_components_auth_proto_replication_proto_rawDesc,
			NumEnums:      3,
			NumMessages:   12,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_components_auth_proto_replication_proto_goTypes,
		DependencyIndexes: file_components_auth_proto_replication_proto_depIdxs,
		EnumInfos:         file_components_auth_proto_replication_proto_enumTypes,
		MessageInfos:      file_components_auth_proto_replication_proto_msgTypes,
	}.Build()
	File_components_auth_proto_replication_proto = out.File
	file_components_auth_proto_replication_proto_rawDesc = nil
	file_components_auth_proto_replication_proto_goTypes = nil
	file_components_auth_proto_replication_proto_depIdxs = nil
}
