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

package resources

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

// A managed placement view.
type ManagedPlacementView struct {
	// The resource name of the Managed Placement view.
	// Managed placement view resource names have the form:
	//
	// `customers/{customer_id}/managedPlacementViews/{ad_group_id}~{criterion_id}`
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ManagedPlacementView proto.InternalMessageInfo

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

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

func init() {
	proto.RegisterFile("google/ads/googleads/v1/resources/managed_placement_view.proto", fileDescriptor_6953f60267bddfaf)
}

var fileDescriptor_6953f60267bddfaf = []byte{
	// 275 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x4f, 0x4a, 0xc4, 0x30,
	0x14, 0xc6, 0x99, 0x0a, 0x82, 0x45, 0x37, 0x83, 0x0b, 0x15, 0x17, 0x8e, 0x32, 0xe0, 0x2a, 0xa1,
	0xb8, 0xcb, 0x80, 0xd0, 0xd9, 0x0c, 0x08, 0x4a, 0x99, 0x45, 0x17, 0x52, 0x28, 0xcf, 0xe6, 0x11,
	0x02, 0x4d, 0x5e, 0x69, 0x6a, 0xe7, 0x06, 0x1e, 0xc4, 0xa5, 0x47, 0xf1, 0x28, 0x9e, 0x42, 0x3a,
	0x31, 0x59, 0x89, 0xee, 0x3e, 0x92, 0xdf, 0xf7, 0x87, 0x97, 0xde, 0x2b, 0x22, 0xd5, 0x22, 0x07,
	0xe9, 0xb8, 0x97, 0x93, 0x1a, 0x33, 0xde, 0xa3, 0xa3, 0xd7, 0xbe, 0x41, 0xc7, 0x0d, 0x58, 0x50,
	0x28, 0xeb, 0xae, 0x85, 0x06, 0x0d, 0xda, 0xa1, 0x1e, 0x35, 0xee, 0x58, 0xd7, 0xd3, 0x40, 0xf3,
	0x85, 0x37, 0x31, 0x90, 0x8e, 0x45, 0x3f, 0x1b, 0x33, 0x16, 0xfd, 0x17, 0x97, 0xa1, 0xa2, 0xd3,
	0x1c, 0xac, 0xa5, 0x01, 0x06, 0x4d, 0xd6, 0xf9, 0x80, 0xeb, 0x55, 0x7a, 0xfa, 0xe8, 0x0b, 0x8a,
	0x90, 0x5f, 0x6a, 0xdc, 0xcd, 0x6f, 0xd2, 0x93, 0x10, 0x51, 0x5b, 0x30, 0x78, 0x36, 0xbb, 0x9a,
	0xdd, 0x1e, 0x6d, 0x8f, 0xc3, 0xe3, 0x13, 0x18, 0x5c, 0xbf, 0x25, 0xe9, 0xb2, 0x21, 0xc3, 0xfe,
	0x1d, 0xb1, 0x3e, 0xff, 0xad, 0xa4, 0x98, 0x16, 0x14, 0xb3, 0xe7, 0x87, 0x1f, 0xbf, 0xa2, 0x16,
	0xac, 0x62, 0xd4, 0x2b, 0xae, 0xd0, 0xee, 0xf7, 0x85, 0xa3, 0x74, 0xda, 0xfd, 0x71, 0xa3, 0x55,
	0x54, 0xef, 0xc9, 0xc1, 0x26, 0xcf, 0x3f, 0x92, 0xc5, 0xc6, 0x47, 0xe6, 0xd2, 0x31, 0x2f, 0x27,
	0x55, 0x66, 0x6c, 0x1b, 0xc8, 0xcf, 0xc0, 0x54, 0xb9, 0x74, 0x55, 0x64, 0xaa, 0x32, 0xab, 0x22,
	0xf3, 0x95, 0x2c, 0xfd, 0x87, 0x10, 0xb9, 0x74, 0x42, 0x44, 0x4a, 0x88, 0x32, 0x13, 0x22, 0x72,
	0x2f, 0x87, 0xfb, 0xb1, 0x77, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x9c, 0xab, 0x80, 0xb1, 0xcf,
	0x01, 0x00, 0x00,
}
