// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v2/common/ad_type_infos.proto

package common

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	enums "google.golang.org/genproto/googleapis/ads/googleads/v2/enums"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	math "math"
)

// 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 text ad.
type TextAdInfo struct {
	// The headline of the ad.
	Headline *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline,proto3" json:"headline,omitempty"`
	// The first line of the ad's description.
	Description1 *wrappers.StringValue `protobuf:"bytes,2,opt,name=description1,proto3" json:"description1,omitempty"`
	// The second line of the ad's description.
	Description2         *wrappers.StringValue `protobuf:"bytes,3,opt,name=description2,proto3" json:"description2,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_TextAdInfo proto.InternalMessageInfo

func (m *TextAdInfo) GetHeadline() *wrappers.StringValue {
	if m != nil {
		return m.Headline
	}
	return nil
}

func (m *TextAdInfo) GetDescription1() *wrappers.StringValue {
	if m != nil {
		return m.Description1
	}
	return nil
}

func (m *TextAdInfo) GetDescription2() *wrappers.StringValue {
	if m != nil {
		return m.Description2
	}
	return nil
}

// An expanded text ad.
type ExpandedTextAdInfo struct {
	// The first part of the ad's headline.
	HeadlinePart1 *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline_part1,json=headlinePart1,proto3" json:"headline_part1,omitempty"`
	// The second part of the ad's headline.
	HeadlinePart2 *wrappers.StringValue `protobuf:"bytes,2,opt,name=headline_part2,json=headlinePart2,proto3" json:"headline_part2,omitempty"`
	// The third part of the ad's headline.
	HeadlinePart3 *wrappers.StringValue `protobuf:"bytes,6,opt,name=headline_part3,json=headlinePart3,proto3" json:"headline_part3,omitempty"`
	// The description of the ad.
	Description *wrappers.StringValue `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The second description of the ad.
	Description2 *wrappers.StringValue `protobuf:"bytes,7,opt,name=description2,proto3" json:"description2,omitempty"`
	// The text that can appear alongside the ad's displayed URL.
	Path1 *wrappers.StringValue `protobuf:"bytes,4,opt,name=path1,proto3" json:"path1,omitempty"`
	// Additional text that can appear alongside the ad's displayed URL.
	Path2                *wrappers.StringValue `protobuf:"bytes,5,opt,name=path2,proto3" json:"path2,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *ExpandedTextAdInfo) Reset()         { *m = ExpandedTextAdInfo{} }
func (m *ExpandedTextAdInfo) String() string { return proto.CompactTextString(m) }
func (*ExpandedTextAdInfo) ProtoMessage()    {}
func (*ExpandedTextAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{1}
}

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

var xxx_messageInfo_ExpandedTextAdInfo proto.InternalMessageInfo

func (m *ExpandedTextAdInfo) GetHeadlinePart1() *wrappers.StringValue {
	if m != nil {
		return m.HeadlinePart1
	}
	return nil
}

func (m *ExpandedTextAdInfo) GetHeadlinePart2() *wrappers.StringValue {
	if m != nil {
		return m.HeadlinePart2
	}
	return nil
}

func (m *ExpandedTextAdInfo) GetHeadlinePart3() *wrappers.StringValue {
	if m != nil {
		return m.HeadlinePart3
	}
	return nil
}

func (m *ExpandedTextAdInfo) GetDescription() *wrappers.StringValue {
	if m != nil {
		return m.Description
	}
	return nil
}

func (m *ExpandedTextAdInfo) GetDescription2() *wrappers.StringValue {
	if m != nil {
		return m.Description2
	}
	return nil
}

func (m *ExpandedTextAdInfo) GetPath1() *wrappers.StringValue {
	if m != nil {
		return m.Path1
	}
	return nil
}

func (m *ExpandedTextAdInfo) GetPath2() *wrappers.StringValue {
	if m != nil {
		return m.Path2
	}
	return nil
}

// A call-only ad.
type CallOnlyAdInfo struct {
	// The country code in the ad.
	CountryCode *wrappers.StringValue `protobuf:"bytes,1,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
	// The phone number in the ad.
	PhoneNumber *wrappers.StringValue `protobuf:"bytes,2,opt,name=phone_number,json=phoneNumber,proto3" json:"phone_number,omitempty"`
	// The business name in the ad.
	BusinessName *wrappers.StringValue `protobuf:"bytes,3,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
	// First headline in the ad.
	Headline1 *wrappers.StringValue `protobuf:"bytes,11,opt,name=headline1,proto3" json:"headline1,omitempty"`
	// Second headline in the ad.
	Headline2 *wrappers.StringValue `protobuf:"bytes,12,opt,name=headline2,proto3" json:"headline2,omitempty"`
	// The first line of the ad's description.
	Description1 *wrappers.StringValue `protobuf:"bytes,4,opt,name=description1,proto3" json:"description1,omitempty"`
	// The second line of the ad's description.
	Description2 *wrappers.StringValue `protobuf:"bytes,5,opt,name=description2,proto3" json:"description2,omitempty"`
	// Whether to enable call tracking for the creative. Enabling call
	// tracking also enables call conversions.
	CallTracked *wrappers.BoolValue `protobuf:"bytes,6,opt,name=call_tracked,json=callTracked,proto3" json:"call_tracked,omitempty"`
	// Whether to disable call conversion for the creative.
	// If set to `true`, disables call conversions even when `call_tracked` is
	// `true`.
	// If `call_tracked` is `false`, this field is ignored.
	DisableCallConversion *wrappers.BoolValue `protobuf:"bytes,7,opt,name=disable_call_conversion,json=disableCallConversion,proto3" json:"disable_call_conversion,omitempty"`
	// The URL to be used for phone number verification.
	PhoneNumberVerificationUrl *wrappers.StringValue `protobuf:"bytes,8,opt,name=phone_number_verification_url,json=phoneNumberVerificationUrl,proto3" json:"phone_number_verification_url,omitempty"`
	// The conversion action to attribute a call conversion to. If not set a
	// default conversion action is used. This field only has effect if
	// call_tracked is set to true. Otherwise this field is ignored.
	ConversionAction *wrappers.StringValue `protobuf:"bytes,9,opt,name=conversion_action,json=conversionAction,proto3" json:"conversion_action,omitempty"`
	// The call conversion behavior of this call only ad. It can use its own call
	// conversion setting, inherit the account level setting, or be disabled.
	ConversionReportingState enums.CallConversionReportingStateEnum_CallConversionReportingState `protobuf:"varint,10,opt,name=conversion_reporting_state,json=conversionReportingState,proto3,enum=google.ads.googleads.v2.enums.CallConversionReportingStateEnum_CallConversionReportingState" json:"conversion_reporting_state,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}                                                            `json:"-"`
	XXX_unrecognized         []byte                                                              `json:"-"`
	XXX_sizecache            int32                                                               `json:"-"`
}

func (m *CallOnlyAdInfo) Reset()         { *m = CallOnlyAdInfo{} }
func (m *CallOnlyAdInfo) String() string { return proto.CompactTextString(m) }
func (*CallOnlyAdInfo) ProtoMessage()    {}
func (*CallOnlyAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{2}
}

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

var xxx_messageInfo_CallOnlyAdInfo proto.InternalMessageInfo

func (m *CallOnlyAdInfo) GetCountryCode() *wrappers.StringValue {
	if m != nil {
		return m.CountryCode
	}
	return nil
}

func (m *CallOnlyAdInfo) GetPhoneNumber() *wrappers.StringValue {
	if m != nil {
		return m.PhoneNumber
	}
	return nil
}

func (m *CallOnlyAdInfo) GetBusinessName() *wrappers.StringValue {
	if m != nil {
		return m.BusinessName
	}
	return nil
}

func (m *CallOnlyAdInfo) GetHeadline1() *wrappers.StringValue {
	if m != nil {
		return m.Headline1
	}
	return nil
}

func (m *CallOnlyAdInfo) GetHeadline2() *wrappers.StringValue {
	if m != nil {
		return m.Headline2
	}
	return nil
}

func (m *CallOnlyAdInfo) GetDescription1() *wrappers.StringValue {
	if m != nil {
		return m.Description1
	}
	return nil
}

func (m *CallOnlyAdInfo) GetDescription2() *wrappers.StringValue {
	if m != nil {
		return m.Description2
	}
	return nil
}

func (m *CallOnlyAdInfo) GetCallTracked() *wrappers.BoolValue {
	if m != nil {
		return m.CallTracked
	}
	return nil
}

func (m *CallOnlyAdInfo) GetDisableCallConversion() *wrappers.BoolValue {
	if m != nil {
		return m.DisableCallConversion
	}
	return nil
}

func (m *CallOnlyAdInfo) GetPhoneNumberVerificationUrl() *wrappers.StringValue {
	if m != nil {
		return m.PhoneNumberVerificationUrl
	}
	return nil
}

func (m *CallOnlyAdInfo) GetConversionAction() *wrappers.StringValue {
	if m != nil {
		return m.ConversionAction
	}
	return nil
}

func (m *CallOnlyAdInfo) GetConversionReportingState() enums.CallConversionReportingStateEnum_CallConversionReportingState {
	if m != nil {
		return m.ConversionReportingState
	}
	return enums.CallConversionReportingStateEnum_UNSPECIFIED
}

// An expanded dynamic search ad.
type ExpandedDynamicSearchAdInfo struct {
	// The description of the ad.
	Description *wrappers.StringValue `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
	// The second description of the ad.
	Description2         *wrappers.StringValue `protobuf:"bytes,2,opt,name=description2,proto3" json:"description2,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *ExpandedDynamicSearchAdInfo) Reset()         { *m = ExpandedDynamicSearchAdInfo{} }
func (m *ExpandedDynamicSearchAdInfo) String() string { return proto.CompactTextString(m) }
func (*ExpandedDynamicSearchAdInfo) ProtoMessage()    {}
func (*ExpandedDynamicSearchAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{3}
}

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

var xxx_messageInfo_ExpandedDynamicSearchAdInfo proto.InternalMessageInfo

func (m *ExpandedDynamicSearchAdInfo) GetDescription() *wrappers.StringValue {
	if m != nil {
		return m.Description
	}
	return nil
}

func (m *ExpandedDynamicSearchAdInfo) GetDescription2() *wrappers.StringValue {
	if m != nil {
		return m.Description2
	}
	return nil
}

// A hotel ad.
type HotelAdInfo struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *HotelAdInfo) Reset()         { *m = HotelAdInfo{} }
func (m *HotelAdInfo) String() string { return proto.CompactTextString(m) }
func (*HotelAdInfo) ProtoMessage()    {}
func (*HotelAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{4}
}

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

var xxx_messageInfo_HotelAdInfo proto.InternalMessageInfo

// A Smart Shopping ad.
type ShoppingSmartAdInfo struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ShoppingSmartAdInfo) Reset()         { *m = ShoppingSmartAdInfo{} }
func (m *ShoppingSmartAdInfo) String() string { return proto.CompactTextString(m) }
func (*ShoppingSmartAdInfo) ProtoMessage()    {}
func (*ShoppingSmartAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{5}
}

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

var xxx_messageInfo_ShoppingSmartAdInfo proto.InternalMessageInfo

// A standard Shopping ad.
type ShoppingProductAdInfo struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ShoppingProductAdInfo) Reset()         { *m = ShoppingProductAdInfo{} }
func (m *ShoppingProductAdInfo) String() string { return proto.CompactTextString(m) }
func (*ShoppingProductAdInfo) ProtoMessage()    {}
func (*ShoppingProductAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{6}
}

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

var xxx_messageInfo_ShoppingProductAdInfo proto.InternalMessageInfo

// A Shopping Comparison Listing ad.
type ShoppingComparisonListingAdInfo struct {
	// Headline of the ad. This field is required. Allowed length is between 25
	// and 45 characters.
	Headline             *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline,proto3" json:"headline,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *ShoppingComparisonListingAdInfo) Reset()         { *m = ShoppingComparisonListingAdInfo{} }
func (m *ShoppingComparisonListingAdInfo) String() string { return proto.CompactTextString(m) }
func (*ShoppingComparisonListingAdInfo) ProtoMessage()    {}
func (*ShoppingComparisonListingAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{7}
}

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

var xxx_messageInfo_ShoppingComparisonListingAdInfo proto.InternalMessageInfo

func (m *ShoppingComparisonListingAdInfo) GetHeadline() *wrappers.StringValue {
	if m != nil {
		return m.Headline
	}
	return nil
}

// A Gmail ad.
type GmailAdInfo struct {
	// The Gmail teaser.
	Teaser *GmailTeaser `protobuf:"bytes,1,opt,name=teaser,proto3" json:"teaser,omitempty"`
	// The MediaFile resource name of the header image. Valid image types are GIF,
	// JPEG and PNG. The minimum size is 300x100 pixels and the aspect ratio must
	// be between 3:1 and 5:1 (+-1%).
	HeaderImage *wrappers.StringValue `protobuf:"bytes,2,opt,name=header_image,json=headerImage,proto3" json:"header_image,omitempty"`
	// The MediaFile resource name of the marketing image. Valid image types are
	// GIF, JPEG and PNG. The image must either be landscape with a minimum size
	// of 600x314 pixels and aspect ratio of 600:314 (+-1%) or square with a
	// minimum size of 300x300 pixels and aspect ratio of 1:1 (+-1%)
	MarketingImage *wrappers.StringValue `protobuf:"bytes,3,opt,name=marketing_image,json=marketingImage,proto3" json:"marketing_image,omitempty"`
	// Headline of the marketing image.
	MarketingImageHeadline *wrappers.StringValue `protobuf:"bytes,4,opt,name=marketing_image_headline,json=marketingImageHeadline,proto3" json:"marketing_image_headline,omitempty"`
	// Description of the marketing image.
	MarketingImageDescription *wrappers.StringValue `protobuf:"bytes,5,opt,name=marketing_image_description,json=marketingImageDescription,proto3" json:"marketing_image_description,omitempty"`
	// Display-call-to-action of the marketing image.
	MarketingImageDisplayCallToAction *DisplayCallToAction `protobuf:"bytes,6,opt,name=marketing_image_display_call_to_action,json=marketingImageDisplayCallToAction,proto3" json:"marketing_image_display_call_to_action,omitempty"`
	// Product images. Up to 15 images are supported.
	ProductImages []*ProductImage `protobuf:"bytes,7,rep,name=product_images,json=productImages,proto3" json:"product_images,omitempty"`
	// Product videos. Up to 7 videos are supported. At least one product video
	// or a marketing image must be specified.
	ProductVideos        []*ProductVideo `protobuf:"bytes,8,rep,name=product_videos,json=productVideos,proto3" json:"product_videos,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *GmailAdInfo) Reset()         { *m = GmailAdInfo{} }
func (m *GmailAdInfo) String() string { return proto.CompactTextString(m) }
func (*GmailAdInfo) ProtoMessage()    {}
func (*GmailAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{8}
}

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

var xxx_messageInfo_GmailAdInfo proto.InternalMessageInfo

func (m *GmailAdInfo) GetTeaser() *GmailTeaser {
	if m != nil {
		return m.Teaser
	}
	return nil
}

func (m *GmailAdInfo) GetHeaderImage() *wrappers.StringValue {
	if m != nil {
		return m.HeaderImage
	}
	return nil
}

func (m *GmailAdInfo) GetMarketingImage() *wrappers.StringValue {
	if m != nil {
		return m.MarketingImage
	}
	return nil
}

func (m *GmailAdInfo) GetMarketingImageHeadline() *wrappers.StringValue {
	if m != nil {
		return m.MarketingImageHeadline
	}
	return nil
}

func (m *GmailAdInfo) GetMarketingImageDescription() *wrappers.StringValue {
	if m != nil {
		return m.MarketingImageDescription
	}
	return nil
}

func (m *GmailAdInfo) GetMarketingImageDisplayCallToAction() *DisplayCallToAction {
	if m != nil {
		return m.MarketingImageDisplayCallToAction
	}
	return nil
}

func (m *GmailAdInfo) GetProductImages() []*ProductImage {
	if m != nil {
		return m.ProductImages
	}
	return nil
}

func (m *GmailAdInfo) GetProductVideos() []*ProductVideo {
	if m != nil {
		return m.ProductVideos
	}
	return nil
}

// Gmail teaser data. The teaser is a small header that acts as an invitation
// to view the rest of the ad (the body).
type GmailTeaser struct {
	// Headline of the teaser.
	Headline *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline,proto3" json:"headline,omitempty"`
	// Description of the teaser.
	Description *wrappers.StringValue `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	// Business name of the advertiser.
	BusinessName *wrappers.StringValue `protobuf:"bytes,3,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
	// The MediaFile resource name of the logo image. Valid image types are GIF,
	// JPEG and PNG. The minimum size is 144x144 pixels and the aspect ratio must
	// be 1:1 (+-1%).
	LogoImage            *wrappers.StringValue `protobuf:"bytes,4,opt,name=logo_image,json=logoImage,proto3" json:"logo_image,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *GmailTeaser) Reset()         { *m = GmailTeaser{} }
func (m *GmailTeaser) String() string { return proto.CompactTextString(m) }
func (*GmailTeaser) ProtoMessage()    {}
func (*GmailTeaser) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{9}
}

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

var xxx_messageInfo_GmailTeaser proto.InternalMessageInfo

func (m *GmailTeaser) GetHeadline() *wrappers.StringValue {
	if m != nil {
		return m.Headline
	}
	return nil
}

func (m *GmailTeaser) GetDescription() *wrappers.StringValue {
	if m != nil {
		return m.Description
	}
	return nil
}

func (m *GmailTeaser) GetBusinessName() *wrappers.StringValue {
	if m != nil {
		return m.BusinessName
	}
	return nil
}

func (m *GmailTeaser) GetLogoImage() *wrappers.StringValue {
	if m != nil {
		return m.LogoImage
	}
	return nil
}

// Data for display call to action. The call to action is a piece of the ad
// that prompts the user to do something. Like clicking a link or making a phone
// call.
type DisplayCallToAction struct {
	// Text for the display-call-to-action.
	Text *wrappers.StringValue `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	// Text color for the display-call-to-action in hexadecimal, e.g. #ffffff for
	// white.
	TextColor *wrappers.StringValue `protobuf:"bytes,2,opt,name=text_color,json=textColor,proto3" json:"text_color,omitempty"`
	// Identifies the url collection in the ad.url_collections field. If not set
	// the url defaults to final_url.
	UrlCollectionId      *wrappers.StringValue `protobuf:"bytes,3,opt,name=url_collection_id,json=urlCollectionId,proto3" json:"url_collection_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *DisplayCallToAction) Reset()         { *m = DisplayCallToAction{} }
func (m *DisplayCallToAction) String() string { return proto.CompactTextString(m) }
func (*DisplayCallToAction) ProtoMessage()    {}
func (*DisplayCallToAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{10}
}

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

var xxx_messageInfo_DisplayCallToAction proto.InternalMessageInfo

func (m *DisplayCallToAction) GetText() *wrappers.StringValue {
	if m != nil {
		return m.Text
	}
	return nil
}

func (m *DisplayCallToAction) GetTextColor() *wrappers.StringValue {
	if m != nil {
		return m.TextColor
	}
	return nil
}

func (m *DisplayCallToAction) GetUrlCollectionId() *wrappers.StringValue {
	if m != nil {
		return m.UrlCollectionId
	}
	return nil
}

// Product image specific data.
type ProductImage struct {
	// The MediaFile resource name of the product image. Valid image types are
	// GIF, JPEG and PNG. The minimum size is 300x300 pixels and the aspect ratio
	// must be 1:1 (+-1%).
	ProductImage *wrappers.StringValue `protobuf:"bytes,1,opt,name=product_image,json=productImage,proto3" json:"product_image,omitempty"`
	// Description of the product.
	Description *wrappers.StringValue `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	// Display-call-to-action of the product image.
	DisplayCallToAction  *DisplayCallToAction `protobuf:"bytes,3,opt,name=display_call_to_action,json=displayCallToAction,proto3" json:"display_call_to_action,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *ProductImage) Reset()         { *m = ProductImage{} }
func (m *ProductImage) String() string { return proto.CompactTextString(m) }
func (*ProductImage) ProtoMessage()    {}
func (*ProductImage) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{11}
}

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

var xxx_messageInfo_ProductImage proto.InternalMessageInfo

func (m *ProductImage) GetProductImage() *wrappers.StringValue {
	if m != nil {
		return m.ProductImage
	}
	return nil
}

func (m *ProductImage) GetDescription() *wrappers.StringValue {
	if m != nil {
		return m.Description
	}
	return nil
}

func (m *ProductImage) GetDisplayCallToAction() *DisplayCallToAction {
	if m != nil {
		return m.DisplayCallToAction
	}
	return nil
}

// Product video specific data.
type ProductVideo struct {
	// The MediaFile resource name of a video which must be hosted on YouTube.
	ProductVideo         *wrappers.StringValue `protobuf:"bytes,1,opt,name=product_video,json=productVideo,proto3" json:"product_video,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *ProductVideo) Reset()         { *m = ProductVideo{} }
func (m *ProductVideo) String() string { return proto.CompactTextString(m) }
func (*ProductVideo) ProtoMessage()    {}
func (*ProductVideo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{12}
}

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

var xxx_messageInfo_ProductVideo proto.InternalMessageInfo

func (m *ProductVideo) GetProductVideo() *wrappers.StringValue {
	if m != nil {
		return m.ProductVideo
	}
	return nil
}

// An image ad.
type ImageAdInfo struct {
	// Width in pixels of the full size image.
	PixelWidth *wrappers.Int64Value `protobuf:"bytes,4,opt,name=pixel_width,json=pixelWidth,proto3" json:"pixel_width,omitempty"`
	// Height in pixels of the full size image.
	PixelHeight *wrappers.Int64Value `protobuf:"bytes,5,opt,name=pixel_height,json=pixelHeight,proto3" json:"pixel_height,omitempty"`
	// URL of the full size image.
	ImageUrl *wrappers.StringValue `protobuf:"bytes,6,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"`
	// Width in pixels of the preview size image.
	PreviewPixelWidth *wrappers.Int64Value `protobuf:"bytes,7,opt,name=preview_pixel_width,json=previewPixelWidth,proto3" json:"preview_pixel_width,omitempty"`
	// Height in pixels of the preview size image.
	PreviewPixelHeight *wrappers.Int64Value `protobuf:"bytes,8,opt,name=preview_pixel_height,json=previewPixelHeight,proto3" json:"preview_pixel_height,omitempty"`
	// URL of the preview size image.
	PreviewImageUrl *wrappers.StringValue `protobuf:"bytes,9,opt,name=preview_image_url,json=previewImageUrl,proto3" json:"preview_image_url,omitempty"`
	// The mime type of the image.
	MimeType enums.MimeTypeEnum_MimeType `protobuf:"varint,10,opt,name=mime_type,json=mimeType,proto3,enum=google.ads.googleads.v2.enums.MimeTypeEnum_MimeType" json:"mime_type,omitempty"`
	// The name of the image. If the image was created from a MediaFile, this is
	// the MediaFile's name. If the image was created from bytes, this is empty.
	Name *wrappers.StringValue `protobuf:"bytes,11,opt,name=name,proto3" json:"name,omitempty"`
	// The image to create the ImageAd from. This can be specified in one of
	// two ways.
	// 1. An existing MediaFile resource.
	// 2. The raw image data as bytes.
	//
	// Types that are valid to be assigned to Image:
	//	*ImageAdInfo_MediaFile
	//	*ImageAdInfo_Data
	//	*ImageAdInfo_AdIdToCopyImageFrom
	Image                isImageAdInfo_Image `protobuf_oneof:"image"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *ImageAdInfo) Reset()         { *m = ImageAdInfo{} }
func (m *ImageAdInfo) String() string { return proto.CompactTextString(m) }
func (*ImageAdInfo) ProtoMessage()    {}
func (*ImageAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{13}
}

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

var xxx_messageInfo_ImageAdInfo proto.InternalMessageInfo

func (m *ImageAdInfo) GetPixelWidth() *wrappers.Int64Value {
	if m != nil {
		return m.PixelWidth
	}
	return nil
}

func (m *ImageAdInfo) GetPixelHeight() *wrappers.Int64Value {
	if m != nil {
		return m.PixelHeight
	}
	return nil
}

func (m *ImageAdInfo) GetImageUrl() *wrappers.StringValue {
	if m != nil {
		return m.ImageUrl
	}
	return nil
}

func (m *ImageAdInfo) GetPreviewPixelWidth() *wrappers.Int64Value {
	if m != nil {
		return m.PreviewPixelWidth
	}
	return nil
}

func (m *ImageAdInfo) GetPreviewPixelHeight() *wrappers.Int64Value {
	if m != nil {
		return m.PreviewPixelHeight
	}
	return nil
}

func (m *ImageAdInfo) GetPreviewImageUrl() *wrappers.StringValue {
	if m != nil {
		return m.PreviewImageUrl
	}
	return nil
}

func (m *ImageAdInfo) GetMimeType() enums.MimeTypeEnum_MimeType {
	if m != nil {
		return m.MimeType
	}
	return enums.MimeTypeEnum_UNSPECIFIED
}

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

type isImageAdInfo_Image interface {
	isImageAdInfo_Image()
}

type ImageAdInfo_MediaFile struct {
	MediaFile *wrappers.StringValue `protobuf:"bytes,1,opt,name=media_file,json=mediaFile,proto3,oneof"`
}

type ImageAdInfo_Data struct {
	Data *wrappers.BytesValue `protobuf:"bytes,2,opt,name=data,proto3,oneof"`
}

type ImageAdInfo_AdIdToCopyImageFrom struct {
	AdIdToCopyImageFrom *wrappers.Int64Value `protobuf:"bytes,3,opt,name=ad_id_to_copy_image_from,json=adIdToCopyImageFrom,proto3,oneof"`
}

func (*ImageAdInfo_MediaFile) isImageAdInfo_Image() {}

func (*ImageAdInfo_Data) isImageAdInfo_Image() {}

func (*ImageAdInfo_AdIdToCopyImageFrom) isImageAdInfo_Image() {}

func (m *ImageAdInfo) GetImage() isImageAdInfo_Image {
	if m != nil {
		return m.Image
	}
	return nil
}

func (m *ImageAdInfo) GetMediaFile() *wrappers.StringValue {
	if x, ok := m.GetImage().(*ImageAdInfo_MediaFile); ok {
		return x.MediaFile
	}
	return nil
}

func (m *ImageAdInfo) GetData() *wrappers.BytesValue {
	if x, ok := m.GetImage().(*ImageAdInfo_Data); ok {
		return x.Data
	}
	return nil
}

func (m *ImageAdInfo) GetAdIdToCopyImageFrom() *wrappers.Int64Value {
	if x, ok := m.GetImage().(*ImageAdInfo_AdIdToCopyImageFrom); ok {
		return x.AdIdToCopyImageFrom
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ImageAdInfo) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ImageAdInfo_MediaFile)(nil),
		(*ImageAdInfo_Data)(nil),
		(*ImageAdInfo_AdIdToCopyImageFrom)(nil),
	}
}

// Representation of video bumper in-stream ad format (very short in-stream
// non-skippable video ad).
type VideoBumperInStreamAdInfo struct {
	// The MediaFile resource name of the companion banner used with the ad.
	CompanionBanner      *wrappers.StringValue `protobuf:"bytes,1,opt,name=companion_banner,json=companionBanner,proto3" json:"companion_banner,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *VideoBumperInStreamAdInfo) Reset()         { *m = VideoBumperInStreamAdInfo{} }
func (m *VideoBumperInStreamAdInfo) String() string { return proto.CompactTextString(m) }
func (*VideoBumperInStreamAdInfo) ProtoMessage()    {}
func (*VideoBumperInStreamAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{14}
}

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

var xxx_messageInfo_VideoBumperInStreamAdInfo proto.InternalMessageInfo

func (m *VideoBumperInStreamAdInfo) GetCompanionBanner() *wrappers.StringValue {
	if m != nil {
		return m.CompanionBanner
	}
	return nil
}

// Representation of video non-skippable in-stream ad format (15 second
// in-stream non-skippable video ad).
type VideoNonSkippableInStreamAdInfo struct {
	// The MediaFile resource name of the companion banner used with the ad.
	CompanionBanner      *wrappers.StringValue `protobuf:"bytes,1,opt,name=companion_banner,json=companionBanner,proto3" json:"companion_banner,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *VideoNonSkippableInStreamAdInfo) Reset()         { *m = VideoNonSkippableInStreamAdInfo{} }
func (m *VideoNonSkippableInStreamAdInfo) String() string { return proto.CompactTextString(m) }
func (*VideoNonSkippableInStreamAdInfo) ProtoMessage()    {}
func (*VideoNonSkippableInStreamAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{15}
}

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

var xxx_messageInfo_VideoNonSkippableInStreamAdInfo proto.InternalMessageInfo

func (m *VideoNonSkippableInStreamAdInfo) GetCompanionBanner() *wrappers.StringValue {
	if m != nil {
		return m.CompanionBanner
	}
	return nil
}

// Representation of video TrueView in-stream ad format (ad shown during video
// playback, often at beginning, which displays a skip button a few seconds into
// the video).
type VideoTrueViewInStreamAdInfo struct {
	// Label on the CTA (call-to-action) button taking the user to the video ad's
	// final URL.
	// Required for TrueView for action campaigns, optional otherwise.
	ActionButtonLabel *wrappers.StringValue `protobuf:"bytes,1,opt,name=action_button_label,json=actionButtonLabel,proto3" json:"action_button_label,omitempty"`
	// Additional text displayed with the CTA (call-to-action) button to give
	// context and encourage clicking on the button.
	ActionHeadline *wrappers.StringValue `protobuf:"bytes,2,opt,name=action_headline,json=actionHeadline,proto3" json:"action_headline,omitempty"`
	// The MediaFile resource name of the companion banner used with the ad.
	CompanionBanner      *wrappers.StringValue `protobuf:"bytes,3,opt,name=companion_banner,json=companionBanner,proto3" json:"companion_banner,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *VideoTrueViewInStreamAdInfo) Reset()         { *m = VideoTrueViewInStreamAdInfo{} }
func (m *VideoTrueViewInStreamAdInfo) String() string { return proto.CompactTextString(m) }
func (*VideoTrueViewInStreamAdInfo) ProtoMessage()    {}
func (*VideoTrueViewInStreamAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{16}
}

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

var xxx_messageInfo_VideoTrueViewInStreamAdInfo proto.InternalMessageInfo

func (m *VideoTrueViewInStreamAdInfo) GetActionButtonLabel() *wrappers.StringValue {
	if m != nil {
		return m.ActionButtonLabel
	}
	return nil
}

func (m *VideoTrueViewInStreamAdInfo) GetActionHeadline() *wrappers.StringValue {
	if m != nil {
		return m.ActionHeadline
	}
	return nil
}

func (m *VideoTrueViewInStreamAdInfo) GetCompanionBanner() *wrappers.StringValue {
	if m != nil {
		return m.CompanionBanner
	}
	return nil
}

// Representation of video out-stream ad format (ad shown alongside a feed
// with automatic playback, without sound).
type VideoOutstreamAdInfo struct {
	// The headline of the ad.
	Headline *wrappers.StringValue `protobuf:"bytes,1,opt,name=headline,proto3" json:"headline,omitempty"`
	// The description line.
	Description          *wrappers.StringValue `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *VideoOutstreamAdInfo) Reset()         { *m = VideoOutstreamAdInfo{} }
func (m *VideoOutstreamAdInfo) String() string { return proto.CompactTextString(m) }
func (*VideoOutstreamAdInfo) ProtoMessage()    {}
func (*VideoOutstreamAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{17}
}

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

var xxx_messageInfo_VideoOutstreamAdInfo proto.InternalMessageInfo

func (m *VideoOutstreamAdInfo) GetHeadline() *wrappers.StringValue {
	if m != nil {
		return m.Headline
	}
	return nil
}

func (m *VideoOutstreamAdInfo) GetDescription() *wrappers.StringValue {
	if m != nil {
		return m.Description
	}
	return nil
}

// A video ad.
type VideoAdInfo struct {
	// The MediaFile resource to use for the video.
	MediaFile *wrappers.StringValue `protobuf:"bytes,1,opt,name=media_file,json=mediaFile,proto3" json:"media_file,omitempty"`
	// Format-specific schema for the different video formats.
	//
	// Types that are valid to be assigned to Format:
	//	*VideoAdInfo_InStream
	//	*VideoAdInfo_Bumper
	//	*VideoAdInfo_OutStream
	//	*VideoAdInfo_NonSkippable
	Format               isVideoAdInfo_Format `protobuf_oneof:"format"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *VideoAdInfo) Reset()         { *m = VideoAdInfo{} }
func (m *VideoAdInfo) String() string { return proto.CompactTextString(m) }
func (*VideoAdInfo) ProtoMessage()    {}
func (*VideoAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{18}
}

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

var xxx_messageInfo_VideoAdInfo proto.InternalMessageInfo

func (m *VideoAdInfo) GetMediaFile() *wrappers.StringValue {
	if m != nil {
		return m.MediaFile
	}
	return nil
}

type isVideoAdInfo_Format interface {
	isVideoAdInfo_Format()
}

type VideoAdInfo_InStream struct {
	InStream *VideoTrueViewInStreamAdInfo `protobuf:"bytes,2,opt,name=in_stream,json=inStream,proto3,oneof"`
}

type VideoAdInfo_Bumper struct {
	Bumper *VideoBumperInStreamAdInfo `protobuf:"bytes,3,opt,name=bumper,proto3,oneof"`
}

type VideoAdInfo_OutStream struct {
	OutStream *VideoOutstreamAdInfo `protobuf:"bytes,4,opt,name=out_stream,json=outStream,proto3,oneof"`
}

type VideoAdInfo_NonSkippable struct {
	NonSkippable *VideoNonSkippableInStreamAdInfo `protobuf:"bytes,5,opt,name=non_skippable,json=nonSkippable,proto3,oneof"`
}

func (*VideoAdInfo_InStream) isVideoAdInfo_Format() {}

func (*VideoAdInfo_Bumper) isVideoAdInfo_Format() {}

func (*VideoAdInfo_OutStream) isVideoAdInfo_Format() {}

func (*VideoAdInfo_NonSkippable) isVideoAdInfo_Format() {}

func (m *VideoAdInfo) GetFormat() isVideoAdInfo_Format {
	if m != nil {
		return m.Format
	}
	return nil
}

func (m *VideoAdInfo) GetInStream() *VideoTrueViewInStreamAdInfo {
	if x, ok := m.GetFormat().(*VideoAdInfo_InStream); ok {
		return x.InStream
	}
	return nil
}

func (m *VideoAdInfo) GetBumper() *VideoBumperInStreamAdInfo {
	if x, ok := m.GetFormat().(*VideoAdInfo_Bumper); ok {
		return x.Bumper
	}
	return nil
}

func (m *VideoAdInfo) GetOutStream() *VideoOutstreamAdInfo {
	if x, ok := m.GetFormat().(*VideoAdInfo_OutStream); ok {
		return x.OutStream
	}
	return nil
}

func (m *VideoAdInfo) GetNonSkippable() *VideoNonSkippableInStreamAdInfo {
	if x, ok := m.GetFormat().(*VideoAdInfo_NonSkippable); ok {
		return x.NonSkippable
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*VideoAdInfo) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*VideoAdInfo_InStream)(nil),
		(*VideoAdInfo_Bumper)(nil),
		(*VideoAdInfo_OutStream)(nil),
		(*VideoAdInfo_NonSkippable)(nil),
	}
}

// A responsive search ad.
//
// Responsive search ads let you create an ad that adapts to show more text, and
// more relevant messages, to your customers. Enter multiple headlines and
// descriptions when creating a responsive search ad, and over time, Google Ads
// will automatically test different combinations and learn which combinations
// perform best. By adapting your ad's content to more closely match potential
// customers' search terms, responsive search ads may improve your campaign's
// performance.
//
// More information at https://support.google.com/google-ads/answer/7684791
type ResponsiveSearchAdInfo struct {
	// List of text assets for headlines. When the ad serves the headlines will
	// be selected from this list.
	Headlines []*AdTextAsset `protobuf:"bytes,1,rep,name=headlines,proto3" json:"headlines,omitempty"`
	// List of text assets for descriptions. When the ad serves the descriptions
	// will be selected from this list.
	Descriptions []*AdTextAsset `protobuf:"bytes,2,rep,name=descriptions,proto3" json:"descriptions,omitempty"`
	// First part of text that may appear appended to the url displayed in the ad.
	Path1 *wrappers.StringValue `protobuf:"bytes,3,opt,name=path1,proto3" json:"path1,omitempty"`
	// Second part of text that may appear appended to the url displayed in the
	// ad. This field can only be set when path1 is also set.
	Path2                *wrappers.StringValue `protobuf:"bytes,4,opt,name=path2,proto3" json:"path2,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *ResponsiveSearchAdInfo) Reset()         { *m = ResponsiveSearchAdInfo{} }
func (m *ResponsiveSearchAdInfo) String() string { return proto.CompactTextString(m) }
func (*ResponsiveSearchAdInfo) ProtoMessage()    {}
func (*ResponsiveSearchAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{19}
}

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

var xxx_messageInfo_ResponsiveSearchAdInfo proto.InternalMessageInfo

func (m *ResponsiveSearchAdInfo) GetHeadlines() []*AdTextAsset {
	if m != nil {
		return m.Headlines
	}
	return nil
}

func (m *ResponsiveSearchAdInfo) GetDescriptions() []*AdTextAsset {
	if m != nil {
		return m.Descriptions
	}
	return nil
}

func (m *ResponsiveSearchAdInfo) GetPath1() *wrappers.StringValue {
	if m != nil {
		return m.Path1
	}
	return nil
}

func (m *ResponsiveSearchAdInfo) GetPath2() *wrappers.StringValue {
	if m != nil {
		return m.Path2
	}
	return nil
}

// A legacy responsive display ad. Ads of this type are labeled 'Responsive ads'
// in the Google Ads UI.
type LegacyResponsiveDisplayAdInfo struct {
	// The short version of the ad's headline.
	ShortHeadline *wrappers.StringValue `protobuf:"bytes,1,opt,name=short_headline,json=shortHeadline,proto3" json:"short_headline,omitempty"`
	// The long version of the ad's headline.
	LongHeadline *wrappers.StringValue `protobuf:"bytes,2,opt,name=long_headline,json=longHeadline,proto3" json:"long_headline,omitempty"`
	// The description of the ad.
	Description *wrappers.StringValue `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The business name in the ad.
	BusinessName *wrappers.StringValue `protobuf:"bytes,4,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
	// Advertiser's consent to allow flexible color. When true, the ad may be
	// served with different color if necessary. When false, the ad will be served
	// with the specified colors or a neutral color.
	// The default value is true.
	// Must be true if main_color and accent_color are not set.
	AllowFlexibleColor *wrappers.BoolValue `protobuf:"bytes,5,opt,name=allow_flexible_color,json=allowFlexibleColor,proto3" json:"allow_flexible_color,omitempty"`
	// The accent color of the ad in hexadecimal, e.g. #ffffff for white.
	// If one of main_color and accent_color is set, the other is required as
	// well.
	AccentColor *wrappers.StringValue `protobuf:"bytes,6,opt,name=accent_color,json=accentColor,proto3" json:"accent_color,omitempty"`
	// The main color of the ad in hexadecimal, e.g. #ffffff for white.
	// If one of main_color and accent_color is set, the other is required as
	// well.
	MainColor *wrappers.StringValue `protobuf:"bytes,7,opt,name=main_color,json=mainColor,proto3" json:"main_color,omitempty"`
	// The call-to-action text for the ad.
	CallToActionText *wrappers.StringValue `protobuf:"bytes,8,opt,name=call_to_action_text,json=callToActionText,proto3" json:"call_to_action_text,omitempty"`
	// The MediaFile resource name of the logo image used in the ad.
	LogoImage *wrappers.StringValue `protobuf:"bytes,9,opt,name=logo_image,json=logoImage,proto3" json:"logo_image,omitempty"`
	// The MediaFile resource name of the square logo image used in the ad.
	SquareLogoImage *wrappers.StringValue `protobuf:"bytes,10,opt,name=square_logo_image,json=squareLogoImage,proto3" json:"square_logo_image,omitempty"`
	// The MediaFile resource name of the marketing image used in the ad.
	MarketingImage *wrappers.StringValue `protobuf:"bytes,11,opt,name=marketing_image,json=marketingImage,proto3" json:"marketing_image,omitempty"`
	// The MediaFile resource name of the square marketing image used in the ad.
	SquareMarketingImage *wrappers.StringValue `protobuf:"bytes,12,opt,name=square_marketing_image,json=squareMarketingImage,proto3" json:"square_marketing_image,omitempty"`
	// Specifies which format the ad will be served in. Default is ALL_FORMATS.
	FormatSetting enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting `protobuf:"varint,13,opt,name=format_setting,json=formatSetting,proto3,enum=google.ads.googleads.v2.enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting" json:"format_setting,omitempty"`
	// Prefix before price. E.g. 'as low as'.
	PricePrefix *wrappers.StringValue `protobuf:"bytes,14,opt,name=price_prefix,json=pricePrefix,proto3" json:"price_prefix,omitempty"`
	// Promotion text used for dyanmic formats of responsive ads. For example
	// 'Free two-day shipping'.
	PromoText            *wrappers.StringValue `protobuf:"bytes,15,opt,name=promo_text,json=promoText,proto3" json:"promo_text,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *LegacyResponsiveDisplayAdInfo) Reset()         { *m = LegacyResponsiveDisplayAdInfo{} }
func (m *LegacyResponsiveDisplayAdInfo) String() string { return proto.CompactTextString(m) }
func (*LegacyResponsiveDisplayAdInfo) ProtoMessage()    {}
func (*LegacyResponsiveDisplayAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{20}
}

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

var xxx_messageInfo_LegacyResponsiveDisplayAdInfo proto.InternalMessageInfo

func (m *LegacyResponsiveDisplayAdInfo) GetShortHeadline() *wrappers.StringValue {
	if m != nil {
		return m.ShortHeadline
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetLongHeadline() *wrappers.StringValue {
	if m != nil {
		return m.LongHeadline
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetDescription() *wrappers.StringValue {
	if m != nil {
		return m.Description
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetBusinessName() *wrappers.StringValue {
	if m != nil {
		return m.BusinessName
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetAllowFlexibleColor() *wrappers.BoolValue {
	if m != nil {
		return m.AllowFlexibleColor
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetAccentColor() *wrappers.StringValue {
	if m != nil {
		return m.AccentColor
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetMainColor() *wrappers.StringValue {
	if m != nil {
		return m.MainColor
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetCallToActionText() *wrappers.StringValue {
	if m != nil {
		return m.CallToActionText
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetLogoImage() *wrappers.StringValue {
	if m != nil {
		return m.LogoImage
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetSquareLogoImage() *wrappers.StringValue {
	if m != nil {
		return m.SquareLogoImage
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetMarketingImage() *wrappers.StringValue {
	if m != nil {
		return m.MarketingImage
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetSquareMarketingImage() *wrappers.StringValue {
	if m != nil {
		return m.SquareMarketingImage
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetFormatSetting() enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting {
	if m != nil {
		return m.FormatSetting
	}
	return enums.DisplayAdFormatSettingEnum_UNSPECIFIED
}

func (m *LegacyResponsiveDisplayAdInfo) GetPricePrefix() *wrappers.StringValue {
	if m != nil {
		return m.PricePrefix
	}
	return nil
}

func (m *LegacyResponsiveDisplayAdInfo) GetPromoText() *wrappers.StringValue {
	if m != nil {
		return m.PromoText
	}
	return nil
}

// An app ad.
type AppAdInfo struct {
	// An optional text asset that, if specified, must always be displayed when
	// the ad is served.
	MandatoryAdText *AdTextAsset `protobuf:"bytes,1,opt,name=mandatory_ad_text,json=mandatoryAdText,proto3" json:"mandatory_ad_text,omitempty"`
	// List of text assets for headlines. When the ad serves the headlines will
	// be selected from this list.
	Headlines []*AdTextAsset `protobuf:"bytes,2,rep,name=headlines,proto3" json:"headlines,omitempty"`
	// List of text assets for descriptions. When the ad serves the descriptions
	// will be selected from this list.
	Descriptions []*AdTextAsset `protobuf:"bytes,3,rep,name=descriptions,proto3" json:"descriptions,omitempty"`
	// List of image assets that may be displayed with the ad.
	Images []*AdImageAsset `protobuf:"bytes,4,rep,name=images,proto3" json:"images,omitempty"`
	// List of YouTube video assets that may be displayed with the ad.
	YoutubeVideos []*AdVideoAsset `protobuf:"bytes,5,rep,name=youtube_videos,json=youtubeVideos,proto3" json:"youtube_videos,omitempty"`
	// List of media bundle assets that may be used with the ad.
	Html5MediaBundles    []*AdMediaBundleAsset `protobuf:"bytes,6,rep,name=html5_media_bundles,json=html5MediaBundles,proto3" json:"html5_media_bundles,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *AppAdInfo) Reset()         { *m = AppAdInfo{} }
func (m *AppAdInfo) String() string { return proto.CompactTextString(m) }
func (*AppAdInfo) ProtoMessage()    {}
func (*AppAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{21}
}

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

var xxx_messageInfo_AppAdInfo proto.InternalMessageInfo

func (m *AppAdInfo) GetMandatoryAdText() *AdTextAsset {
	if m != nil {
		return m.MandatoryAdText
	}
	return nil
}

func (m *AppAdInfo) GetHeadlines() []*AdTextAsset {
	if m != nil {
		return m.Headlines
	}
	return nil
}

func (m *AppAdInfo) GetDescriptions() []*AdTextAsset {
	if m != nil {
		return m.Descriptions
	}
	return nil
}

func (m *AppAdInfo) GetImages() []*AdImageAsset {
	if m != nil {
		return m.Images
	}
	return nil
}

func (m *AppAdInfo) GetYoutubeVideos() []*AdVideoAsset {
	if m != nil {
		return m.YoutubeVideos
	}
	return nil
}

func (m *AppAdInfo) GetHtml5MediaBundles() []*AdMediaBundleAsset {
	if m != nil {
		return m.Html5MediaBundles
	}
	return nil
}

// App engagement ads allow you to write text encouraging a specific action in
// the app, like checking in, making a purchase, or booking a flight.
// They allow you to send users to a specific part of your app where they can
// find what they're looking for easier and faster.
type AppEngagementAdInfo struct {
	// List of text assets for headlines. When the ad serves the headlines will
	// be selected from this list.
	Headlines []*AdTextAsset `protobuf:"bytes,1,rep,name=headlines,proto3" json:"headlines,omitempty"`
	// List of text assets for descriptions. When the ad serves the descriptions
	// will be selected from this list.
	Descriptions []*AdTextAsset `protobuf:"bytes,2,rep,name=descriptions,proto3" json:"descriptions,omitempty"`
	// List of image assets that may be displayed with the ad.
	Images []*AdImageAsset `protobuf:"bytes,3,rep,name=images,proto3" json:"images,omitempty"`
	// List of video assets that may be displayed with the ad.
	Videos               []*AdVideoAsset `protobuf:"bytes,4,rep,name=videos,proto3" json:"videos,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *AppEngagementAdInfo) Reset()         { *m = AppEngagementAdInfo{} }
func (m *AppEngagementAdInfo) String() string { return proto.CompactTextString(m) }
func (*AppEngagementAdInfo) ProtoMessage()    {}
func (*AppEngagementAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{22}
}

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

var xxx_messageInfo_AppEngagementAdInfo proto.InternalMessageInfo

func (m *AppEngagementAdInfo) GetHeadlines() []*AdTextAsset {
	if m != nil {
		return m.Headlines
	}
	return nil
}

func (m *AppEngagementAdInfo) GetDescriptions() []*AdTextAsset {
	if m != nil {
		return m.Descriptions
	}
	return nil
}

func (m *AppEngagementAdInfo) GetImages() []*AdImageAsset {
	if m != nil {
		return m.Images
	}
	return nil
}

func (m *AppEngagementAdInfo) GetVideos() []*AdVideoAsset {
	if m != nil {
		return m.Videos
	}
	return nil
}

// A legacy app install ad that only can be used by a few select customers.
type LegacyAppInstallAdInfo struct {
	// The id of the mobile app.
	AppId *wrappers.StringValue `protobuf:"bytes,1,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"`
	// The app store the mobile app is available in.
	AppStore enums.LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore `protobuf:"varint,2,opt,name=app_store,json=appStore,proto3,enum=google.ads.googleads.v2.enums.LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore" json:"app_store,omitempty"`
	// The headline of the ad.
	Headline *wrappers.StringValue `protobuf:"bytes,3,opt,name=headline,proto3" json:"headline,omitempty"`
	// The first description line of the ad.
	Description1 *wrappers.StringValue `protobuf:"bytes,4,opt,name=description1,proto3" json:"description1,omitempty"`
	// The second description line of the ad.
	Description2         *wrappers.StringValue `protobuf:"bytes,5,opt,name=description2,proto3" json:"description2,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *LegacyAppInstallAdInfo) Reset()         { *m = LegacyAppInstallAdInfo{} }
func (m *LegacyAppInstallAdInfo) String() string { return proto.CompactTextString(m) }
func (*LegacyAppInstallAdInfo) ProtoMessage()    {}
func (*LegacyAppInstallAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{23}
}

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

var xxx_messageInfo_LegacyAppInstallAdInfo proto.InternalMessageInfo

func (m *LegacyAppInstallAdInfo) GetAppId() *wrappers.StringValue {
	if m != nil {
		return m.AppId
	}
	return nil
}

func (m *LegacyAppInstallAdInfo) GetAppStore() enums.LegacyAppInstallAdAppStoreEnum_LegacyAppInstallAdAppStore {
	if m != nil {
		return m.AppStore
	}
	return enums.LegacyAppInstallAdAppStoreEnum_UNSPECIFIED
}

func (m *LegacyAppInstallAdInfo) GetHeadline() *wrappers.StringValue {
	if m != nil {
		return m.Headline
	}
	return nil
}

func (m *LegacyAppInstallAdInfo) GetDescription1() *wrappers.StringValue {
	if m != nil {
		return m.Description1
	}
	return nil
}

func (m *LegacyAppInstallAdInfo) GetDescription2() *wrappers.StringValue {
	if m != nil {
		return m.Description2
	}
	return nil
}

// A responsive display ad.
type ResponsiveDisplayAdInfo struct {
	// Marketing images to be used in the ad. Valid image types are GIF,
	// JPEG, and PNG. The minimum size is 600x314 and the aspect ratio must
	// be 1.91:1 (+-1%). At least one marketing_image is required. Combined with
	// square_marketing_images the maximum is 15.
	MarketingImages []*AdImageAsset `protobuf:"bytes,1,rep,name=marketing_images,json=marketingImages,proto3" json:"marketing_images,omitempty"`
	// Square marketing images to be used in the ad. Valid image types are GIF,
	// JPEG, and PNG. The minimum size is 300x300 and the aspect ratio must
	// be 1:1 (+-1%). At least one square marketing_image is required. Combined
	// with marketing_images the maximum is 15.
	SquareMarketingImages []*AdImageAsset `protobuf:"bytes,2,rep,name=square_marketing_images,json=squareMarketingImages,proto3" json:"square_marketing_images,omitempty"`
	// Logo images to be used in the ad. Valid image types are GIF,
	// JPEG, and PNG. The minimum size is 512x128 and the aspect ratio must
	// be 4:1 (+-1%). Combined with square_logo_images the maximum is 5.
	LogoImages []*AdImageAsset `protobuf:"bytes,3,rep,name=logo_images,json=logoImages,proto3" json:"logo_images,omitempty"`
	// Square logo images to be used in the ad. Valid image types are GIF,
	// JPEG, and PNG. The minimum size is 128x128 and the aspect ratio must
	// be 1:1 (+-1%). Combined with square_logo_images the maximum is 5.
	SquareLogoImages []*AdImageAsset `protobuf:"bytes,4,rep,name=square_logo_images,json=squareLogoImages,proto3" json:"square_logo_images,omitempty"`
	// Short format headlines for the ad. The maximum length is 30 characters.
	// At least 1 and max 5 headlines can be specified.
	Headlines []*AdTextAsset `protobuf:"bytes,5,rep,name=headlines,proto3" json:"headlines,omitempty"`
	// A required long format headline. The maximum length is 90 characters.
	LongHeadline *AdTextAsset `protobuf:"bytes,6,opt,name=long_headline,json=longHeadline,proto3" json:"long_headline,omitempty"`
	// Descriptive texts for the ad. The maximum length is 90 characters. At
	// least 1 and max 5 headlines can be specified.
	Descriptions []*AdTextAsset `protobuf:"bytes,7,rep,name=descriptions,proto3" json:"descriptions,omitempty"`
	// Optional YouTube vidoes for the ad. A maximum of 5 videos can be specified.
	YoutubeVideos []*AdVideoAsset `protobuf:"bytes,8,rep,name=youtube_videos,json=youtubeVideos,proto3" json:"youtube_videos,omitempty"`
	// The advertiser/brand name. Maximum display width is 25.
	BusinessName *wrappers.StringValue `protobuf:"bytes,9,opt,name=business_name,json=businessName,proto3" json:"business_name,omitempty"`
	// The main color of the ad in hexadecimal, e.g. #ffffff for white.
	// If one of main_color and accent_color is set, the other is required as
	// well.
	MainColor *wrappers.StringValue `protobuf:"bytes,10,opt,name=main_color,json=mainColor,proto3" json:"main_color,omitempty"`
	// The accent color of the ad in hexadecimal, e.g. #ffffff for white.
	// If one of main_color and accent_color is set, the other is required as
	// well.
	AccentColor *wrappers.StringValue `protobuf:"bytes,11,opt,name=accent_color,json=accentColor,proto3" json:"accent_color,omitempty"`
	// Advertiser's consent to allow flexible color. When true, the ad may be
	// served with different color if necessary. When false, the ad will be served
	// with the specified colors or a neutral color.
	// The default value is true.
	// Must be true if main_color and accent_color are not set.
	AllowFlexibleColor *wrappers.BoolValue `protobuf:"bytes,12,opt,name=allow_flexible_color,json=allowFlexibleColor,proto3" json:"allow_flexible_color,omitempty"`
	// The call-to-action text for the ad. Maximum display width is 30.
	CallToActionText *wrappers.StringValue `protobuf:"bytes,13,opt,name=call_to_action_text,json=callToActionText,proto3" json:"call_to_action_text,omitempty"`
	// Prefix before price. E.g. 'as low as'.
	PricePrefix *wrappers.StringValue `protobuf:"bytes,14,opt,name=price_prefix,json=pricePrefix,proto3" json:"price_prefix,omitempty"`
	// Promotion text used for dyanmic formats of responsive ads. For example
	// 'Free two-day shipping'.
	PromoText *wrappers.StringValue `protobuf:"bytes,15,opt,name=promo_text,json=promoText,proto3" json:"promo_text,omitempty"`
	// Specifies which format the ad will be served in. Default is ALL_FORMATS.
	FormatSetting        enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting `protobuf:"varint,16,opt,name=format_setting,json=formatSetting,proto3,enum=google.ads.googleads.v2.enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting" json:"format_setting,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                                `json:"-"`
	XXX_unrecognized     []byte                                                  `json:"-"`
	XXX_sizecache        int32                                                   `json:"-"`
}

func (m *ResponsiveDisplayAdInfo) Reset()         { *m = ResponsiveDisplayAdInfo{} }
func (m *ResponsiveDisplayAdInfo) String() string { return proto.CompactTextString(m) }
func (*ResponsiveDisplayAdInfo) ProtoMessage()    {}
func (*ResponsiveDisplayAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{24}
}

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

var xxx_messageInfo_ResponsiveDisplayAdInfo proto.InternalMessageInfo

func (m *ResponsiveDisplayAdInfo) GetMarketingImages() []*AdImageAsset {
	if m != nil {
		return m.MarketingImages
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetSquareMarketingImages() []*AdImageAsset {
	if m != nil {
		return m.SquareMarketingImages
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetLogoImages() []*AdImageAsset {
	if m != nil {
		return m.LogoImages
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetSquareLogoImages() []*AdImageAsset {
	if m != nil {
		return m.SquareLogoImages
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetHeadlines() []*AdTextAsset {
	if m != nil {
		return m.Headlines
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetLongHeadline() *AdTextAsset {
	if m != nil {
		return m.LongHeadline
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetDescriptions() []*AdTextAsset {
	if m != nil {
		return m.Descriptions
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetYoutubeVideos() []*AdVideoAsset {
	if m != nil {
		return m.YoutubeVideos
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetBusinessName() *wrappers.StringValue {
	if m != nil {
		return m.BusinessName
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetMainColor() *wrappers.StringValue {
	if m != nil {
		return m.MainColor
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetAccentColor() *wrappers.StringValue {
	if m != nil {
		return m.AccentColor
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetAllowFlexibleColor() *wrappers.BoolValue {
	if m != nil {
		return m.AllowFlexibleColor
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetCallToActionText() *wrappers.StringValue {
	if m != nil {
		return m.CallToActionText
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetPricePrefix() *wrappers.StringValue {
	if m != nil {
		return m.PricePrefix
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetPromoText() *wrappers.StringValue {
	if m != nil {
		return m.PromoText
	}
	return nil
}

func (m *ResponsiveDisplayAdInfo) GetFormatSetting() enums.DisplayAdFormatSettingEnum_DisplayAdFormatSetting {
	if m != nil {
		return m.FormatSetting
	}
	return enums.DisplayAdFormatSettingEnum_UNSPECIFIED
}

// A generic type of display ad. The exact ad format is controlled by the
// display_upload_product_type field, which determines what kinds of data
// need to be included with the ad.
type DisplayUploadAdInfo struct {
	// The product type of this ad. See comments on the enum for details.
	DisplayUploadProductType enums.DisplayUploadProductTypeEnum_DisplayUploadProductType `protobuf:"varint,1,opt,name=display_upload_product_type,json=displayUploadProductType,proto3,enum=google.ads.googleads.v2.enums.DisplayUploadProductTypeEnum_DisplayUploadProductType" json:"display_upload_product_type,omitempty"`
	// The asset data that makes up the ad.
	//
	// Types that are valid to be assigned to MediaAsset:
	//	*DisplayUploadAdInfo_MediaBundle
	MediaAsset           isDisplayUploadAdInfo_MediaAsset `protobuf_oneof:"media_asset"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

func (m *DisplayUploadAdInfo) Reset()         { *m = DisplayUploadAdInfo{} }
func (m *DisplayUploadAdInfo) String() string { return proto.CompactTextString(m) }
func (*DisplayUploadAdInfo) ProtoMessage()    {}
func (*DisplayUploadAdInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_7b1cab7fbeab5508, []int{25}
}

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

var xxx_messageInfo_DisplayUploadAdInfo proto.InternalMessageInfo

func (m *DisplayUploadAdInfo) GetDisplayUploadProductType() enums.DisplayUploadProductTypeEnum_DisplayUploadProductType {
	if m != nil {
		return m.DisplayUploadProductType
	}
	return enums.DisplayUploadProductTypeEnum_UNSPECIFIED
}

type isDisplayUploadAdInfo_MediaAsset interface {
	isDisplayUploadAdInfo_MediaAsset()
}

type DisplayUploadAdInfo_MediaBundle struct {
	MediaBundle *AdMediaBundleAsset `protobuf:"bytes,2,opt,name=media_bundle,json=mediaBundle,proto3,oneof"`
}

func (*DisplayUploadAdInfo_MediaBundle) isDisplayUploadAdInfo_MediaAsset() {}

func (m *DisplayUploadAdInfo) GetMediaAsset() isDisplayUploadAdInfo_MediaAsset {
	if m != nil {
		return m.MediaAsset
	}
	return nil
}

func (m *DisplayUploadAdInfo) GetMediaBundle() *AdMediaBundleAsset {
	if x, ok := m.GetMediaAsset().(*DisplayUploadAdInfo_MediaBundle); ok {
		return x.MediaBundle
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*DisplayUploadAdInfo) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*DisplayUploadAdInfo_MediaBundle)(nil),
	}
}

func init() {
	proto.RegisterType((*TextAdInfo)(nil), "google.ads.googleads.v2.common.TextAdInfo")
	proto.RegisterType((*ExpandedTextAdInfo)(nil), "google.ads.googleads.v2.common.ExpandedTextAdInfo")
	proto.RegisterType((*CallOnlyAdInfo)(nil), "google.ads.googleads.v2.common.CallOnlyAdInfo")
	proto.RegisterType((*ExpandedDynamicSearchAdInfo)(nil), "google.ads.googleads.v2.common.ExpandedDynamicSearchAdInfo")
	proto.RegisterType((*HotelAdInfo)(nil), "google.ads.googleads.v2.common.HotelAdInfo")
	proto.RegisterType((*ShoppingSmartAdInfo)(nil), "google.ads.googleads.v2.common.ShoppingSmartAdInfo")
	proto.RegisterType((*ShoppingProductAdInfo)(nil), "google.ads.googleads.v2.common.ShoppingProductAdInfo")
	proto.RegisterType((*ShoppingComparisonListingAdInfo)(nil), "google.ads.googleads.v2.common.ShoppingComparisonListingAdInfo")
	proto.RegisterType((*GmailAdInfo)(nil), "google.ads.googleads.v2.common.GmailAdInfo")
	proto.RegisterType((*GmailTeaser)(nil), "google.ads.googleads.v2.common.GmailTeaser")
	proto.RegisterType((*DisplayCallToAction)(nil), "google.ads.googleads.v2.common.DisplayCallToAction")
	proto.RegisterType((*ProductImage)(nil), "google.ads.googleads.v2.common.ProductImage")
	proto.RegisterType((*ProductVideo)(nil), "google.ads.googleads.v2.common.ProductVideo")
	proto.RegisterType((*ImageAdInfo)(nil), "google.ads.googleads.v2.common.ImageAdInfo")
	proto.RegisterType((*VideoBumperInStreamAdInfo)(nil), "google.ads.googleads.v2.common.VideoBumperInStreamAdInfo")
	proto.RegisterType((*VideoNonSkippableInStreamAdInfo)(nil), "google.ads.googleads.v2.common.VideoNonSkippableInStreamAdInfo")
	proto.RegisterType((*VideoTrueViewInStreamAdInfo)(nil), "google.ads.googleads.v2.common.VideoTrueViewInStreamAdInfo")
	proto.RegisterType((*VideoOutstreamAdInfo)(nil), "google.ads.googleads.v2.common.VideoOutstreamAdInfo")
	proto.RegisterType((*VideoAdInfo)(nil), "google.ads.googleads.v2.common.VideoAdInfo")
	proto.RegisterType((*ResponsiveSearchAdInfo)(nil), "google.ads.googleads.v2.common.ResponsiveSearchAdInfo")
	proto.RegisterType((*LegacyResponsiveDisplayAdInfo)(nil), "google.ads.googleads.v2.common.LegacyResponsiveDisplayAdInfo")
	proto.RegisterType((*AppAdInfo)(nil), "google.ads.googleads.v2.common.AppAdInfo")
	proto.RegisterType((*AppEngagementAdInfo)(nil), "google.ads.googleads.v2.common.AppEngagementAdInfo")
	proto.RegisterType((*LegacyAppInstallAdInfo)(nil), "google.ads.googleads.v2.common.LegacyAppInstallAdInfo")
	proto.RegisterType((*ResponsiveDisplayAdInfo)(nil), "google.ads.googleads.v2.common.ResponsiveDisplayAdInfo")
	proto.RegisterType((*DisplayUploadAdInfo)(nil), "google.ads.googleads.v2.common.DisplayUploadAdInfo")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v2/common/ad_type_infos.proto", fileDescriptor_7b1cab7fbeab5508)
}

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