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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	_ "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

// A Keyword Planner ad group.
// Max number of keyword plan ad groups per plan: 200.
type KeywordPlanAdGroup struct {
	// The resource name of the Keyword Planner ad group.
	// KeywordPlanAdGroup resource names have the form:
	//
	// `customers/{customer_id}/keywordPlanAdGroups/{kp_ad_group_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The keyword plan campaign to which this ad group belongs.
	KeywordPlanCampaign *wrappers.StringValue `protobuf:"bytes,2,opt,name=keyword_plan_campaign,json=keywordPlanCampaign,proto3" json:"keyword_plan_campaign,omitempty"`
	// The ID of the keyword plan ad group.
	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	// The name of the keyword plan ad group.
	//
	// This field is required and should not be empty when creating keyword plan
	// ad group.
	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	// A default ad group max cpc bid in micros in account currency for all
	// biddable keywords under the keyword plan ad group.
	// If not set, will inherit from parent campaign.
	CpcBidMicros         *wrappers.Int64Value `protobuf:"bytes,5,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_KeywordPlanAdGroup proto.InternalMessageInfo

func (m *KeywordPlanAdGroup) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func (m *KeywordPlanAdGroup) GetKeywordPlanCampaign() *wrappers.StringValue {
	if m != nil {
		return m.KeywordPlanCampaign
	}
	return nil
}

func (m *KeywordPlanAdGroup) GetId() *wrappers.Int64Value {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *KeywordPlanAdGroup) GetName() *wrappers.StringValue {
	if m != nil {
		return m.Name
	}
	return nil
}

func (m *KeywordPlanAdGroup) GetCpcBidMicros() *wrappers.Int64Value {
	if m != nil {
		return m.CpcBidMicros
	}
	return nil
}

func init() {
	proto.RegisterType((*KeywordPlanAdGroup)(nil), "google.ads.googleads.v3.resources.KeywordPlanAdGroup")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/resources/keyword_plan_ad_group.proto", fileDescriptor_8bbe0859e53aefdd)
}

var fileDescriptor_8bbe0859e53aefdd = []byte{
	// 444 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xdf, 0x6a, 0x14, 0x31,
	0x18, 0xc5, 0xd9, 0xd9, 0x2a, 0x18, 0xab, 0x17, 0x23, 0xe2, 0x5a, 0x8b, 0xb4, 0x4a, 0xa1, 0x50,
	0x48, 0xc4, 0x11, 0x2f, 0x22, 0x82, 0xb3, 0x5e, 0x2c, 0x2a, 0xca, 0xb2, 0xc2, 0x5e, 0xc8, 0xc2,
	0x90, 0x4d, 0x62, 0x08, 0x3b, 0x93, 0x2f, 0x24, 0x33, 0x2d, 0x52, 0x7a, 0xe7, 0x8b, 0xe8, 0xa5,
	0x8f, 0xe2, 0xa3, 0xf4, 0x29, 0x64, 0xfe, 0x65, 0x95, 0x2d, 0x6e, 0xef, 0xce, 0xcc, 0x77, 0x7e,
	0x39, 0xdf, 0x99, 0x09, 0x7a, 0xad, 0x00, 0x54, 0x2e, 0x09, 0x13, 0x9e, 0xb4, 0xb2, 0x56, 0xa7,
	0x09, 0x71, 0xd2, 0x43, 0xe5, 0xb8, 0xf4, 0x64, 0x25, 0xbf, 0x9d, 0x81, 0x13, 0x99, 0xcd, 0x99,
	0xc9, 0x98, 0xc8, 0x94, 0x83, 0xca, 0x62, 0xeb, 0xa0, 0x84, 0xf8, 0xb0, 0x65, 0x30, 0x13, 0x1e,
	0x07, 0x1c, 0x9f, 0x26, 0x38, 0xe0, 0x7b, 0x0f, 0xfb, 0x04, 0xab, 0xc3, 0xa1, 0x2d, 0xbd, 0xf7,
	0xb8, 0x1b, 0x35, 0x4f, 0xcb, 0xea, 0x2b, 0x39, 0x73, 0xcc, 0x5a, 0xe9, 0x7c, 0x37, 0xdf, 0xff,
	0x0b, 0x65, 0xc6, 0x40, 0xc9, 0x4a, 0x0d, 0xa6, 0x9b, 0x3e, 0xf9, 0x31, 0x44, 0xf1, 0x87, 0x76,
	0xb7, 0x69, 0xce, 0x4c, 0x2a, 0x26, 0xf5, 0x62, 0xf1, 0x53, 0x74, 0xa7, 0x8f, 0xc9, 0x0c, 0x2b,
	0xe4, 0x68, 0x70, 0x30, 0x38, 0xbe, 0x35, 0xdb, 0xed, 0x5f, 0x7e, 0x62, 0x85, 0x8c, 0xa7, 0xe8,
	0xfe, 0x3f, 0xb5, 0x38, 0x2b, 0x2c, 0xd3, 0xca, 0x8c, 0xa2, 0x83, 0xc1, 0xf1, 0xed, 0xe7, 0xfb,
	0x5d, 0x19, 0xdc, 0x6f, 0x86, 0x3f, 0x97, 0x4e, 0x1b, 0x35, 0x67, 0x79, 0x25, 0x67, 0xf7, 0x56,
	0xeb, 0xd4, 0xb7, 0x1d, 0x18, 0x9f, 0xa0, 0x48, 0x8b, 0xd1, 0xb0, 0xc1, 0x1f, 0x6d, 0xe0, 0xef,
	0x4c, 0xf9, 0xf2, 0x45, 0x4b, 0x47, 0x5a, 0xc4, 0xcf, 0xd0, 0x4e, 0xb3, 0xda, 0xce, 0x35, 0xd2,
	0x1a, 0x67, 0x9c, 0xa2, 0xbb, 0xdc, 0xf2, 0x6c, 0xa9, 0x45, 0x56, 0x68, 0xee, 0xc0, 0x8f, 0x6e,
	0x6c, 0x8f, 0xda, 0xe5, 0x96, 0x8f, 0xb5, 0xf8, 0xd8, 0x00, 0xd4, 0x5d, 0xa6, 0x80, 0x4e, 0xd6,
	0x7f, 0xa9, 0x53, 0x56, 0x7b, 0xcc, 0xa1, 0x20, 0x57, 0x7c, 0xca, 0x37, 0xbc, 0xf2, 0x25, 0x14,
	0xd2, 0x79, 0x72, 0xde, 0xcb, 0x0b, 0xb2, 0xda, 0x30, 0x7a, 0x72, 0x7e, 0xe5, 0x25, 0xb9, 0x18,
	0x7f, 0x8f, 0xd0, 0x11, 0x87, 0x02, 0x6f, 0xbd, 0x26, 0xe3, 0x07, 0x9b, 0xf9, 0xd3, 0xba, 0xd2,
	0x74, 0xf0, 0xe5, 0x7d, 0x47, 0x2b, 0xc8, 0x99, 0x51, 0x18, 0x9c, 0x22, 0x4a, 0x9a, 0xa6, 0x30,
	0x59, 0x97, 0xf8, 0xcf, 0x15, 0x7e, 0x15, 0xd4, 0xcf, 0x68, 0x38, 0x49, 0xd3, 0x5f, 0xd1, 0xe1,
	0xa4, 0x3d, 0x32, 0x15, 0x1e, 0xb7, 0xb2, 0x56, 0xf3, 0x04, 0xcf, 0x7a, 0xe7, 0xef, 0xde, 0xb3,
	0x48, 0x85, 0x5f, 0x04, 0xcf, 0x62, 0x9e, 0x2c, 0x82, 0xe7, 0x32, 0x3a, 0x6a, 0x07, 0x94, 0xa6,
	0xc2, 0x53, 0x1a, 0x5c, 0x94, 0xce, 0x13, 0x4a, 0x83, 0x6f, 0x79, 0xb3, 0x59, 0x36, 0xf9, 0x13,
	0x00, 0x00, 0xff, 0xff, 0xc6, 0xc1, 0xce, 0xdf, 0x6e, 0x03, 0x00, 0x00,
}
