// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/user_list_prepopulation_status.proto

package enums

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Enum describing possible user list prepopulation status.
type UserListPrepopulationStatusEnum_UserListPrepopulationStatus int32

const (
	// Not specified.
	UserListPrepopulationStatusEnum_UNSPECIFIED UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 0
	// Used for return value only. Represents value unknown in this version.
	UserListPrepopulationStatusEnum_UNKNOWN UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 1
	// Prepopoulation is being requested.
	UserListPrepopulationStatusEnum_REQUESTED UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 2
	// Prepopulation is finished.
	UserListPrepopulationStatusEnum_FINISHED UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 3
	// Prepopulation failed.
	UserListPrepopulationStatusEnum_FAILED UserListPrepopulationStatusEnum_UserListPrepopulationStatus = 4
)

var UserListPrepopulationStatusEnum_UserListPrepopulationStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "REQUESTED",
	3: "FINISHED",
	4: "FAILED",
}

var UserListPrepopulationStatusEnum_UserListPrepopulationStatus_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"REQUESTED":   2,
	"FINISHED":    3,
	"FAILED":      4,
}

func (x UserListPrepopulationStatusEnum_UserListPrepopulationStatus) String() string {
	return proto.EnumName(UserListPrepopulationStatusEnum_UserListPrepopulationStatus_name, int32(x))
}

func (UserListPrepopulationStatusEnum_UserListPrepopulationStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e9b6e6af973a186e, []int{0, 0}
}

// Indicates status of prepopulation based on the rule.
type UserListPrepopulationStatusEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UserListPrepopulationStatusEnum) Reset()         { *m = UserListPrepopulationStatusEnum{} }
func (m *UserListPrepopulationStatusEnum) String() string { return proto.CompactTextString(m) }
func (*UserListPrepopulationStatusEnum) ProtoMessage()    {}
func (*UserListPrepopulationStatusEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_e9b6e6af973a186e, []int{0}
}

func (m *UserListPrepopulationStatusEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UserListPrepopulationStatusEnum.Unmarshal(m, b)
}
func (m *UserListPrepopulationStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UserListPrepopulationStatusEnum.Marshal(b, m, deterministic)
}
func (m *UserListPrepopulationStatusEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UserListPrepopulationStatusEnum.Merge(m, src)
}
func (m *UserListPrepopulationStatusEnum) XXX_Size() int {
	return xxx_messageInfo_UserListPrepopulationStatusEnum.Size(m)
}
func (m *UserListPrepopulationStatusEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_UserListPrepopulationStatusEnum.DiscardUnknown(m)
}

var xxx_messageInfo_UserListPrepopulationStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListPrepopulationStatusEnum_UserListPrepopulationStatus", UserListPrepopulationStatusEnum_UserListPrepopulationStatus_name, UserListPrepopulationStatusEnum_UserListPrepopulationStatus_value)
	proto.RegisterType((*UserListPrepopulationStatusEnum)(nil), "google.ads.googleads.v3.enums.UserListPrepopulationStatusEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/user_list_prepopulation_status.proto", fileDescriptor_e9b6e6af973a186e)
}

var fileDescriptor_e9b6e6af973a186e = []byte{
	// 331 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4e, 0x83, 0x40,
	0x14, 0x14, 0x6a, 0xaa, 0x6e, 0x35, 0x12, 0x8e, 0x6a, 0xa3, 0xed, 0x07, 0x2c, 0x07, 0x6e, 0xeb,
	0x89, 0xca, 0xb6, 0x12, 0x1b, 0x44, 0x91, 0x9a, 0x18, 0x92, 0x06, 0x85, 0x10, 0x12, 0xba, 0xbb,
	0xe1, 0x2d, 0xfd, 0x05, 0xff, 0xc3, 0xa3, 0x9f, 0xe2, 0xa7, 0x78, 0xf7, 0x6e, 0x58, 0xda, 0xc6,
	0x8b, 0x5c, 0x36, 0x93, 0x7d, 0xf3, 0x66, 0xde, 0x0c, 0x9a, 0xe4, 0x9c, 0xe7, 0x65, 0x66, 0x25,
	0x29, 0x58, 0x2d, 0x6c, 0xd0, 0xda, 0xb6, 0x32, 0x56, 0xaf, 0xc0, 0xaa, 0x21, 0xab, 0x96, 0x65,
	0x01, 0x72, 0x29, 0xaa, 0x4c, 0x70, 0x51, 0x97, 0x89, 0x2c, 0x38, 0x5b, 0x82, 0x4c, 0x64, 0x0d,
	0x58, 0x54, 0x5c, 0x72, 0x73, 0xd8, 0x2e, 0xe2, 0x24, 0x05, 0xbc, 0xd3, 0xc0, 0x6b, 0x1b, 0x2b,
	0x8d, 0xb3, 0x8b, 0xad, 0x85, 0x28, 0xac, 0x84, 0x31, 0x2e, 0x95, 0xc4, 0x66, 0x79, 0xfc, 0xae,
	0xa1, 0xcb, 0x08, 0xb2, 0x6a, 0x5e, 0x80, 0x0c, 0xfe, 0x7a, 0x84, 0xca, 0x82, 0xb2, 0x7a, 0x35,
	0x4e, 0xd1, 0x79, 0x07, 0xc5, 0x3c, 0x45, 0x83, 0xc8, 0x0f, 0x03, 0x7a, 0xe3, 0x4d, 0x3d, 0xea,
	0x1a, 0x7b, 0xe6, 0x00, 0x1d, 0x44, 0xfe, 0x9d, 0x7f, 0xff, 0xec, 0x1b, 0x9a, 0x79, 0x82, 0x8e,
	0x1e, 0xe9, 0x43, 0x44, 0xc3, 0x27, 0xea, 0x1a, 0xba, 0x79, 0x8c, 0x0e, 0xa7, 0x9e, 0xef, 0x85,
	0xb7, 0xd4, 0x35, 0x7a, 0x26, 0x42, 0xfd, 0xa9, 0xe3, 0xcd, 0xa9, 0x6b, 0xec, 0x4f, 0x7e, 0x34,
	0x34, 0x7a, 0xe3, 0x2b, 0xdc, 0x99, 0x66, 0x72, 0xd5, 0x71, 0x49, 0xd0, 0x24, 0x0a, 0xb4, 0x97,
	0x4d, 0xa9, 0x38, 0xe7, 0x65, 0xc2, 0x72, 0xcc, 0xab, 0xdc, 0xca, 0x33, 0xa6, 0xf2, 0x6e, 0x4b,
	0x16, 0x05, 0xfc, 0xd3, 0xf9, 0xb5, 0x7a, 0x3f, 0xf4, 0xde, 0xcc, 0x71, 0x3e, 0xf5, 0xe1, 0xac,
	0x95, 0x72, 0x52, 0xc0, 0x2d, 0x6c, 0xd0, 0xc2, 0xc6, 0x4d, 0x31, 0xf0, 0xb5, 0x9d, 0xc7, 0x4e,
	0x0a, 0xf1, 0x6e, 0x1e, 0x2f, 0xec, 0x58, 0xcd, 0xbf, 0xf5, 0x51, 0xfb, 0x49, 0x88, 0x93, 0x02,
	0x21, 0x3b, 0x06, 0x21, 0x0b, 0x9b, 0x10, 0xc5, 0x79, 0xed, 0xab, 0xc3, 0xec, 0xdf, 0x00, 0x00,
	0x00, 0xff, 0xff, 0xae, 0x3e, 0xc9, 0xbe, 0x0b, 0x02, 0x00, 0x00,
}
