// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/age_range_type.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

// The type of demographic age ranges (e.g. between 18 and 24 years old).
type AgeRangeTypeEnum_AgeRangeType int32

const (
	// Not specified.
	AgeRangeTypeEnum_UNSPECIFIED AgeRangeTypeEnum_AgeRangeType = 0
	// Used for return value only. Represents value unknown in this version.
	AgeRangeTypeEnum_UNKNOWN AgeRangeTypeEnum_AgeRangeType = 1
	// Between 18 and 24 years old.
	AgeRangeTypeEnum_AGE_RANGE_18_24 AgeRangeTypeEnum_AgeRangeType = 503001
	// Between 25 and 34 years old.
	AgeRangeTypeEnum_AGE_RANGE_25_34 AgeRangeTypeEnum_AgeRangeType = 503002
	// Between 35 and 44 years old.
	AgeRangeTypeEnum_AGE_RANGE_35_44 AgeRangeTypeEnum_AgeRangeType = 503003
	// Between 45 and 54 years old.
	AgeRangeTypeEnum_AGE_RANGE_45_54 AgeRangeTypeEnum_AgeRangeType = 503004
	// Between 55 and 64 years old.
	AgeRangeTypeEnum_AGE_RANGE_55_64 AgeRangeTypeEnum_AgeRangeType = 503005
	// 65 years old and beyond.
	AgeRangeTypeEnum_AGE_RANGE_65_UP AgeRangeTypeEnum_AgeRangeType = 503006
	// Undetermined age range.
	AgeRangeTypeEnum_AGE_RANGE_UNDETERMINED AgeRangeTypeEnum_AgeRangeType = 503999
)

var AgeRangeTypeEnum_AgeRangeType_name = map[int32]string{
	0:      "UNSPECIFIED",
	1:      "UNKNOWN",
	503001: "AGE_RANGE_18_24",
	503002: "AGE_RANGE_25_34",
	503003: "AGE_RANGE_35_44",
	503004: "AGE_RANGE_45_54",
	503005: "AGE_RANGE_55_64",
	503006: "AGE_RANGE_65_UP",
	503999: "AGE_RANGE_UNDETERMINED",
}

var AgeRangeTypeEnum_AgeRangeType_value = map[string]int32{
	"UNSPECIFIED":            0,
	"UNKNOWN":                1,
	"AGE_RANGE_18_24":        503001,
	"AGE_RANGE_25_34":        503002,
	"AGE_RANGE_35_44":        503003,
	"AGE_RANGE_45_54":        503004,
	"AGE_RANGE_55_64":        503005,
	"AGE_RANGE_65_UP":        503006,
	"AGE_RANGE_UNDETERMINED": 503999,
}

func (x AgeRangeTypeEnum_AgeRangeType) String() string {
	return proto.EnumName(AgeRangeTypeEnum_AgeRangeType_name, int32(x))
}

func (AgeRangeTypeEnum_AgeRangeType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c79df600b719b617, []int{0, 0}
}

// Container for enum describing the type of demographic age ranges.
type AgeRangeTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AgeRangeTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AgeRangeTypeEnum_AgeRangeType", AgeRangeTypeEnum_AgeRangeType_name, AgeRangeTypeEnum_AgeRangeType_value)
	proto.RegisterType((*AgeRangeTypeEnum)(nil), "google.ads.googleads.v3.enums.AgeRangeTypeEnum")
}

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

var fileDescriptor_c79df600b719b617 = []byte{
	// 378 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x4f, 0x8b, 0xd3, 0x40,
	0x18, 0xc6, 0x4d, 0x05, 0x85, 0xa9, 0xd0, 0x31, 0xa0, 0x07, 0x69, 0x0b, 0xed, 0x07, 0x98, 0x60,
	0x27, 0x29, 0x32, 0x9e, 0xa6, 0x76, 0x0c, 0x45, 0x8c, 0xa1, 0x36, 0x15, 0x24, 0x30, 0x44, 0x33,
	0x0c, 0x85, 0x76, 0x26, 0x74, 0xd2, 0x42, 0xbf, 0x8e, 0x47, 0xbf, 0x84, 0x77, 0xcf, 0x5e, 0xea,
	0x3f, 0xd8, 0xcb, 0xc2, 0xee, 0xa7, 0x58, 0x92, 0x6c, 0xbb, 0xdd, 0xc0, 0xee, 0x25, 0x3c, 0xfc,
	0xde, 0xf7, 0x79, 0xc8, 0x3c, 0x2f, 0x18, 0x48, 0xad, 0xe5, 0x52, 0x38, 0x49, 0x6a, 0x9c, 0x4a,
	0x16, 0x6a, 0x8b, 0x1d, 0xa1, 0x36, 0x2b, 0xe3, 0x24, 0x52, 0xf0, 0x75, 0xa2, 0xa4, 0xe0, 0xf9,
	0x2e, 0x13, 0x28, 0x5b, 0xeb, 0x5c, 0xdb, 0x9d, 0x6a, 0x11, 0x25, 0xa9, 0x41, 0x47, 0x0f, 0xda,
	0x62, 0x54, 0x7a, 0x5e, 0xb4, 0x0f, 0x91, 0xd9, 0xc2, 0x49, 0x94, 0xd2, 0x79, 0x92, 0x2f, 0xb4,
	0x32, 0x95, 0xb9, 0x7f, 0x61, 0x01, 0x48, 0xa5, 0x98, 0x16, 0xa1, 0xb3, 0x5d, 0x26, 0x98, 0xda,
	0xac, 0xfa, 0xbf, 0x2c, 0xf0, 0xe4, 0x14, 0xda, 0x2d, 0xd0, 0x8c, 0x82, 0x8f, 0x21, 0x7b, 0x33,
	0x79, 0x3b, 0x61, 0x63, 0xf8, 0xc0, 0x6e, 0x82, 0xc7, 0x51, 0xf0, 0x2e, 0xf8, 0xf0, 0x29, 0x80,
	0x96, 0xfd, 0x0c, 0xb4, 0xa8, 0xcf, 0xf8, 0x94, 0x06, 0x3e, 0xe3, 0x2f, 0x5f, 0xf1, 0x81, 0x0b,
	0xf7, 0xfb, 0xee, 0x6d, 0x3c, 0xf0, 0x38, 0x76, 0xe1, 0xef, 0x3a, 0xc6, 0x1e, 0x77, 0x5d, 0xf8,
	0xa7, 0x8e, 0x5d, 0x8f, 0x7b, 0x2e, 0xfc, 0x5b, 0xc7, 0x9e, 0xc7, 0x87, 0x2e, 0xfc, 0x57, 0xc7,
	0x43, 0x8f, 0x47, 0x21, 0xfc, 0xbf, 0xef, 0xda, 0x6d, 0xf0, 0xfc, 0x06, 0x47, 0xc1, 0x98, 0xcd,
	0xd8, 0xf4, 0xfd, 0x24, 0x60, 0x63, 0xf8, 0xe3, 0xac, 0x3b, 0x3a, 0xb7, 0x40, 0xef, 0xab, 0x5e,
	0xa1, 0x7b, 0xfb, 0x1a, 0x3d, 0x3d, 0x7d, 0x79, 0x58, 0x94, 0x14, 0x5a, 0x9f, 0x47, 0xd7, 0x1e,
	0xa9, 0x97, 0x89, 0x92, 0x48, 0xaf, 0xa5, 0x23, 0x85, 0x2a, 0x2b, 0x3c, 0xdc, 0x29, 0x5b, 0x98,
	0x3b, 0xce, 0xf6, 0xba, 0xfc, 0x7e, 0x6b, 0x3c, 0xf4, 0x29, 0xfd, 0xde, 0xe8, 0xf8, 0x55, 0x14,
	0x4d, 0x0d, 0xaa, 0x64, 0xa1, 0xe6, 0x18, 0x15, 0xd5, 0x9b, 0x9f, 0x87, 0x79, 0x4c, 0x53, 0x13,
	0x1f, 0xe7, 0xf1, 0x1c, 0xc7, 0xe5, 0xfc, 0xb2, 0xd1, 0xab, 0x20, 0x21, 0x34, 0x35, 0x84, 0x1c,
	0x37, 0x08, 0x99, 0x63, 0x42, 0xca, 0x9d, 0x2f, 0x8f, 0xca, 0x1f, 0xc3, 0x57, 0x01, 0x00, 0x00,
	0xff, 0xff, 0x32, 0x0c, 0x38, 0x0c, 0x4e, 0x02, 0x00, 0x00,
}
