// Code generated by protoc-gen-go. DO NOT EDIT.
// source: feeds.proto

package maps_booking_feeds

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	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

// Defines how a total price is determined from an availability.
type PriceType int32

const (
	// The price is for a fixed amount. This is the default value if the field is
	// not set.
	PriceType_FIXED_RATE_DEFAULT PriceType = 0
	// The price specified is per person, and the total price is calculated
	// according to the party size specified in Resources as
	// price_micros * party_size. A PER_PERSON price must be accompanied by a
	// party size in the availability resources. If it is not, a party size of one
	// is used.
	PriceType_PER_PERSON PriceType = 1
)

var PriceType_name = map[int32]string{
	0: "FIXED_RATE_DEFAULT",
	1: "PER_PERSON",
}

var PriceType_value = map[string]int32{
	"FIXED_RATE_DEFAULT": 0,
	"PER_PERSON":         1,
}

func (x PriceType) String() string {
	return proto.EnumName(PriceType_name, int32(x))
}

func (PriceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{0}
}

// Defines whether a credit card is required in order to book an appointment.
type RequireCreditCard int32

const (
	// The credit card requirement is not explicitly specified and the
	// behaviour is identical to the one specified for CONDITIONAL.
	RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED RequireCreditCard = 0
	// Google will require a credit card for the booking if any of the following
	// conditions are met:
	// * the availability has a price and the prepayment_type is REQUIRED
	// * the no_show_fee is set
	// * the deposit field is set.
	RequireCreditCard_REQUIRE_CREDIT_CARD_CONDITIONAL RequireCreditCard = 1
	// A credit card is always required in order to book this availability
	// regardless of other field values.
	RequireCreditCard_REQUIRE_CREDIT_CARD_ALWAYS RequireCreditCard = 2
)

var RequireCreditCard_name = map[int32]string{
	0: "REQUIRE_CREDIT_CARD_UNSPECIFIED",
	1: "REQUIRE_CREDIT_CARD_CONDITIONAL",
	2: "REQUIRE_CREDIT_CARD_ALWAYS",
}

var RequireCreditCard_value = map[string]int32{
	"REQUIRE_CREDIT_CARD_UNSPECIFIED": 0,
	"REQUIRE_CREDIT_CARD_CONDITIONAL": 1,
	"REQUIRE_CREDIT_CARD_ALWAYS":      2,
}

func (x RequireCreditCard) String() string {
	return proto.EnumName(RequireCreditCard_name, int32(x))
}

func (RequireCreditCard) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
}

// The platform that the action is performed on. Web application is the general
// fallback. It is recommended to have at least one ActionLink with
// ACTION_PLATFORM_WEB_APPLICATION. Links with Android and iOS as platform are
// only used on the respective system.
type ActionPlatform int32

const (
	// The platform is unspecified.
	ActionPlatform_ACTION_PLATFORM_UNSPECIFIED ActionPlatform = 0
	// The action platform is web in general.
	ActionPlatform_ACTION_PLATFORM_WEB_APPLICATION ActionPlatform = 1
	// The action platform is web on mobile devices.
	ActionPlatform_ACTION_PLATFORM_MOBILE_WEB ActionPlatform = 2
	// The action platform is Android OS.
	ActionPlatform_ACTION_PLATFORM_ANDROID ActionPlatform = 3
	// The action platform is iOS.
	ActionPlatform_ACTION_PLATFORM_IOS ActionPlatform = 4
)

var ActionPlatform_name = map[int32]string{
	0: "ACTION_PLATFORM_UNSPECIFIED",
	1: "ACTION_PLATFORM_WEB_APPLICATION",
	2: "ACTION_PLATFORM_MOBILE_WEB",
	3: "ACTION_PLATFORM_ANDROID",
	4: "ACTION_PLATFORM_IOS",
}

var ActionPlatform_value = map[string]int32{
	"ACTION_PLATFORM_UNSPECIFIED":     0,
	"ACTION_PLATFORM_WEB_APPLICATION": 1,
	"ACTION_PLATFORM_MOBILE_WEB":      2,
	"ACTION_PLATFORM_ANDROID":         3,
	"ACTION_PLATFORM_IOS":             4,
}

func (x ActionPlatform) String() string {
	return proto.EnumName(ActionPlatform_name, int32(x))
}

func (ActionPlatform) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
}

type FeedMetadata_ProcessingInstruction int32

const (
	// By default we will assume that this feed is an incremental feed.
	FeedMetadata_PROCESS_UNKNOWN FeedMetadata_ProcessingInstruction = 0
	// This Feed message is one shard of a complete feed. Anything previously
	// supplied by this partner will be deleted; the contents of this feed
	// represent the entire state of the world.
	FeedMetadata_PROCESS_AS_COMPLETE FeedMetadata_ProcessingInstruction = 1
	// This Feed message is one shard of an incremental feed. Existing entities
	// will be left untouched except as modified in this feed.
	FeedMetadata_PROCESS_AS_INCREMENTAL FeedMetadata_ProcessingInstruction = 2
)

var FeedMetadata_ProcessingInstruction_name = map[int32]string{
	0: "PROCESS_UNKNOWN",
	1: "PROCESS_AS_COMPLETE",
	2: "PROCESS_AS_INCREMENTAL",
}

var FeedMetadata_ProcessingInstruction_value = map[string]int32{
	"PROCESS_UNKNOWN":        0,
	"PROCESS_AS_COMPLETE":    1,
	"PROCESS_AS_INCREMENTAL": 2,
}

func (x FeedMetadata_ProcessingInstruction) String() string {
	return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x))
}

func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{0, 0}
}

// The confirmation modes used when booking availabilities.
type Availability_ConfirmationMode int32

const (
	// The confirmation mode was not specified.
	// Synchronous confirmation will be assumed.
	Availability_CONFIRMATION_MODE_UNSPECIFIED Availability_ConfirmationMode = 0
	// Bookings for this availability will be confirmed synchronously.
	Availability_CONFIRMATION_MODE_SYNCHRONOUS Availability_ConfirmationMode = 1
	// Bookings for this availability will be confirmed asynchronously.
	Availability_CONFIRMATION_MODE_ASYNCHRONOUS Availability_ConfirmationMode = 2
)

var Availability_ConfirmationMode_name = map[int32]string{
	0: "CONFIRMATION_MODE_UNSPECIFIED",
	1: "CONFIRMATION_MODE_SYNCHRONOUS",
	2: "CONFIRMATION_MODE_ASYNCHRONOUS",
}

var Availability_ConfirmationMode_value = map[string]int32{
	"CONFIRMATION_MODE_UNSPECIFIED":  0,
	"CONFIRMATION_MODE_SYNCHRONOUS":  1,
	"CONFIRMATION_MODE_ASYNCHRONOUS": 2,
}

func (x Availability_ConfirmationMode) String() string {
	return proto.EnumName(Availability_ConfirmationMode_name, int32(x))
}

func (Availability_ConfirmationMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 0}
}

// Enum to indicate the prepayment type.
type Service_PrepaymentType int32

const (
	// By default we will assume that the prepayment is NOT_SUPPORTED.
	Service_PREPAYMENT_TYPE_UNSPECIFIED Service_PrepaymentType = 0
	// The user has to pay this service at the booking time.
	Service_REQUIRED Service_PrepaymentType = 1
	// The user can choose to pre-pay this service at the booking time or later,
	// but it is not required in order to book.
	Service_OPTIONAL Service_PrepaymentType = 2
	// The prepayment is not supported for this service.
	Service_NOT_SUPPORTED Service_PrepaymentType = 3
)

var Service_PrepaymentType_name = map[int32]string{
	0: "PREPAYMENT_TYPE_UNSPECIFIED",
	1: "REQUIRED",
	2: "OPTIONAL",
	3: "NOT_SUPPORTED",
}

var Service_PrepaymentType_value = map[string]int32{
	"PREPAYMENT_TYPE_UNSPECIFIED": 0,
	"REQUIRED":                    1,
	"OPTIONAL":                    2,
	"NOT_SUPPORTED":               3,
}

func (x Service_PrepaymentType) String() string {
	return proto.EnumName(Service_PrepaymentType_name, int32(x))
}

func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 0}
}

type Service_ServiceType int32

const (
	Service_SERVICE_TYPE_UNSPECIFIED        Service_ServiceType = 0
	Service_SERVICE_TYPE_DINING_RESERVATION Service_ServiceType = 1
	Service_SERVICE_TYPE_FOOD_ORDERING      Service_ServiceType = 2
	Service_SERVICE_TYPE_EVENT_TICKET       Service_ServiceType = 3
	Service_SERVICE_TYPE_TRIP_TOUR          Service_ServiceType = 4
)

var Service_ServiceType_name = map[int32]string{
	0: "SERVICE_TYPE_UNSPECIFIED",
	1: "SERVICE_TYPE_DINING_RESERVATION",
	2: "SERVICE_TYPE_FOOD_ORDERING",
	3: "SERVICE_TYPE_EVENT_TICKET",
	4: "SERVICE_TYPE_TRIP_TOUR",
}

var Service_ServiceType_value = map[string]int32{
	"SERVICE_TYPE_UNSPECIFIED":        0,
	"SERVICE_TYPE_DINING_RESERVATION": 1,
	"SERVICE_TYPE_FOOD_ORDERING":      2,
	"SERVICE_TYPE_EVENT_TICKET":       3,
	"SERVICE_TYPE_TRIP_TOUR":          4,
}

func (x Service_ServiceType) String() string {
	return proto.EnumName(Service_ServiceType_name, int32(x))
}

func (Service_ServiceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 1}
}

// The admission policy of this service.
type SchedulingRules_AdmissionPolicy int32

const (
	// Unused.
	SchedulingRules_ADMISSION_POLICY_UNSPECIFIED SchedulingRules_AdmissionPolicy = 0
	// Customers are required to be present at the start time of the
	// availability slot, and the service is expected to finish at the
	// end time of the slot.
	// Examples of TIME_STRICT use cases:
	//   * A tour that starts at 9am that requires all attendees to arrive
	//     at the start time, and returns at around 12pm.
	//   * A haircut reservation at 3pm on Saturday that will take approximately
	//   30 minutes.
	//   * A fitness class from 6pm to 8pm.
	SchedulingRules_TIME_STRICT SchedulingRules_AdmissionPolicy = 1
	// Customers can arrive at any time between the start and end time of the
	// availability slot to use this booking.
	//
	// Examples of TIME_FLEXIBLE use cases:
	//   * A museum ticket that can be used during any time on the purchase
	//     date.
	//   * An afternoon admission to an amusement park that can be used from
	//     12pm to 9pm.
	SchedulingRules_TIME_FLEXIBLE SchedulingRules_AdmissionPolicy = 2
	// Customers need to arrive at the merchant at the start time of the
	// availability slot but can leave any time they want.
	//
	// For example, in the museum admission scenario, a timed entry ticket
	// for 10am requires the user to be at the museum at 10am. The start time of
	// availability slots for this service represents the designated entry
	// time. The end time, however, is used solely as a key to identify the
	// availability slot for booking.
	SchedulingRules_TIMED_ENTRY_WITH_FLEXIBLE_DURATION SchedulingRules_AdmissionPolicy = 3
)

var SchedulingRules_AdmissionPolicy_name = map[int32]string{
	0: "ADMISSION_POLICY_UNSPECIFIED",
	1: "TIME_STRICT",
	2: "TIME_FLEXIBLE",
	3: "TIMED_ENTRY_WITH_FLEXIBLE_DURATION",
}

var SchedulingRules_AdmissionPolicy_value = map[string]int32{
	"ADMISSION_POLICY_UNSPECIFIED":       0,
	"TIME_STRICT":                        1,
	"TIME_FLEXIBLE":                      2,
	"TIMED_ENTRY_WITH_FLEXIBLE_DURATION": 3,
}

func (x SchedulingRules_AdmissionPolicy) String() string {
	return proto.EnumName(SchedulingRules_AdmissionPolicy_name, int32(x))
}

func (SchedulingRules_AdmissionPolicy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{9, 0}
}

// Enum to indicate the type of field.
type ServiceIntakeFormField_FieldType int32

const (
	// Fields of unspecified or unknown type will be ignored.
	ServiceIntakeFormField_FIELD_TYPE_UNSPECIFIED ServiceIntakeFormField_FieldType = 0
	// A one-line input field for text.
	ServiceIntakeFormField_SHORT_ANSWER ServiceIntakeFormField_FieldType = 1
	// A multi-line input field for text.
	ServiceIntakeFormField_PARAGRAPH ServiceIntakeFormField_FieldType = 2
	// A set of radio buttons that requires one choice from many options.
	ServiceIntakeFormField_MULTIPLE_CHOICE ServiceIntakeFormField_FieldType = 3
	// One or more enumerated items with checkboxes.
	ServiceIntakeFormField_CHECKBOXES ServiceIntakeFormField_FieldType = 4
	// A selection from a dropdown.
	ServiceIntakeFormField_DROPDOWN ServiceIntakeFormField_FieldType = 5
	// A yes/no button.
	ServiceIntakeFormField_BOOLEAN ServiceIntakeFormField_FieldType = 6
)

var ServiceIntakeFormField_FieldType_name = map[int32]string{
	0: "FIELD_TYPE_UNSPECIFIED",
	1: "SHORT_ANSWER",
	2: "PARAGRAPH",
	3: "MULTIPLE_CHOICE",
	4: "CHECKBOXES",
	5: "DROPDOWN",
	6: "BOOLEAN",
}

var ServiceIntakeFormField_FieldType_value = map[string]int32{
	"FIELD_TYPE_UNSPECIFIED": 0,
	"SHORT_ANSWER":           1,
	"PARAGRAPH":              2,
	"MULTIPLE_CHOICE":        3,
	"CHECKBOXES":             4,
	"DROPDOWN":               5,
	"BOOLEAN":                6,
}

func (x ServiceIntakeFormField_FieldType) String() string {
	return proto.EnumName(ServiceIntakeFormField_FieldType_name, int32(x))
}

func (ServiceIntakeFormField_FieldType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{11, 0}
}

// Enum to indicate the type of this media source. Only photos are supported.
// Please reach out to the Reserve with Google team if other media beyond
// photos need to be supported.
type RelatedMedia_MediaType int32

const (
	// Unused.
	RelatedMedia_TYPE_UNSPECIFIED RelatedMedia_MediaType = 0
	// Indicates the media provided by the url is a photo.
	RelatedMedia_PHOTO RelatedMedia_MediaType = 1
)

var RelatedMedia_MediaType_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "PHOTO",
}

var RelatedMedia_MediaType_value = map[string]int32{
	"TYPE_UNSPECIFIED": 0,
	"PHOTO":            1,
}

func (x RelatedMedia_MediaType) String() string {
	return proto.EnumName(RelatedMedia_MediaType_name, int32(x))
}

func (RelatedMedia_MediaType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{17, 0}
}

type FeedMetadata struct {
	// Instructs us how to process the feed: either as a shard of a complete feed,
	// or as a shard of an incremental update.
	ProcessingInstruction FeedMetadata_ProcessingInstruction `protobuf:"varint,1,opt,name=processing_instruction,json=processingInstruction,proto3,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"`
	// The current shard and total number of shards for this feed.
	//
	// Shard number is assumed to be zero-based.
	//
	// There does not need to be any relationship to the file name.
	//
	// Shards do not need to be transferred in order, and they may not be
	// processed in order.
	ShardNumber int32 `protobuf:"varint,2,opt,name=shard_number,json=shardNumber,proto3" json:"shard_number,omitempty"`
	TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards,proto3" json:"total_shards,omitempty"`
	// An identifier that must be consistent across all shards in a feed.
	// This value must be globally unique across each feed type.
	//
	// This value ensures that complete feeds spanning multiple shards are
	// processed together correctly.
	//
	// Clients only need to set this value when the processing_instruction is set
	// to PROCESS_AS_COMPLETE and the feed spans multiple shards (defined by
	// total_shards).
	//
	// Feeds that span multiple shards must set this nonce to the same value.
	Nonce uint64 `protobuf:"varint,5,opt,name=nonce,proto3" json:"nonce,omitempty"`
	// The timestamp at which this feed shard was generated.
	//
	// In Unix time format (seconds since the epoch).
	GenerationTimestamp  int64    `protobuf:"varint,4,opt,name=generation_timestamp,json=generationTimestamp,proto3" json:"generation_timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_FeedMetadata proto.InternalMessageInfo

func (m *FeedMetadata) GetProcessingInstruction() FeedMetadata_ProcessingInstruction {
	if m != nil {
		return m.ProcessingInstruction
	}
	return FeedMetadata_PROCESS_UNKNOWN
}

func (m *FeedMetadata) GetShardNumber() int32 {
	if m != nil {
		return m.ShardNumber
	}
	return 0
}

func (m *FeedMetadata) GetTotalShards() int32 {
	if m != nil {
		return m.TotalShards
	}
	return 0
}

func (m *FeedMetadata) GetNonce() uint64 {
	if m != nil {
		return m.Nonce
	}
	return 0
}

func (m *FeedMetadata) GetGenerationTimestamp() int64 {
	if m != nil {
		return m.GenerationTimestamp
	}
	return 0
}

type AvailabilityFeed struct {
	Metadata             *FeedMetadata          `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	ServiceAvailability  []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability,proto3" json:"service_availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_AvailabilityFeed proto.InternalMessageInfo

func (m *AvailabilityFeed) GetMetadata() *FeedMetadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *AvailabilityFeed) GetServiceAvailability() []*ServiceAvailability {
	if m != nil {
		return m.ServiceAvailability
	}
	return nil
}

type ServiceAvailability struct {
	// If provided, we will consider the Availability entities provided to be a
	// complete snapshot from [start_timestamp_restrict, end_timestamp_restrict).
	// That is, all existing availability will be deleted if the following
	// condition holds true:
	//
	//    start_timestamp_restrict <= Availability.start_sec &&
	//    Availability.start_sec < end_timestamp_restrict
	//
	// If a resource_restrict message is set, the condition is further restricted:
	//
	//    Availability.resource.staff_id == resource_restrict.staff_id &&
	//    Availability.resource.room_id == resource_restrict.room_id
	//
	// These fields are typically used to provide a complete update of
	// availability in a given time range.
	//
	// Setting start_timestamp_restrict while leaving end_timestamp_restrict unset
	// is interpreted to mean all time beginning at start_timestamp_restrict.
	//
	// Setting end_timestamp_restrict while leaving start_timestamp_restrict unset
	// is interpreted to mean all time up to the end_timestamp_restrict.
	//
	// In Unix time format (seconds since the epoch).
	StartTimestampRestrict int64 `protobuf:"varint,1,opt,name=start_timestamp_restrict,json=startTimestampRestrict,proto3" json:"start_timestamp_restrict,omitempty"`
	EndTimestampRestrict   int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict,proto3" json:"end_timestamp_restrict,omitempty"`
	// If provided, the timestamp restricts will be applied only to the given
	// merchant or service.
	//
	// These fields are typically used to provide complete snapshot of
	// availability in a given range (defined above) for a specific merchant or
	// service.
	//
	// Leaving these fields unset, or setting these to the empty string or null,
	// is interpreted to mean that no restrict is intended.
	MerchantIdRestrict string `protobuf:"bytes,3,opt,name=merchant_id_restrict,json=merchantIdRestrict,proto3" json:"merchant_id_restrict,omitempty"`
	ServiceIdRestrict  string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict,proto3" json:"service_id_restrict,omitempty"`
	// Setting resources_restrict further restricts the scope of the update to
	// just this set of resources. All id fields of the resources must match
	// exactly.
	ResourcesRestrict    *Resources      `protobuf:"bytes,6,opt,name=resources_restrict,json=resourcesRestrict,proto3" json:"resources_restrict,omitempty"`
	Availability         []*Availability `protobuf:"bytes,5,rep,name=availability,proto3" json:"availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_ServiceAvailability proto.InternalMessageInfo

func (m *ServiceAvailability) GetStartTimestampRestrict() int64 {
	if m != nil {
		return m.StartTimestampRestrict
	}
	return 0
}

func (m *ServiceAvailability) GetEndTimestampRestrict() int64 {
	if m != nil {
		return m.EndTimestampRestrict
	}
	return 0
}

func (m *ServiceAvailability) GetMerchantIdRestrict() string {
	if m != nil {
		return m.MerchantIdRestrict
	}
	return ""
}

func (m *ServiceAvailability) GetServiceIdRestrict() string {
	if m != nil {
		return m.ServiceIdRestrict
	}
	return ""
}

func (m *ServiceAvailability) GetResourcesRestrict() *Resources {
	if m != nil {
		return m.ResourcesRestrict
	}
	return nil
}

func (m *ServiceAvailability) GetAvailability() []*Availability {
	if m != nil {
		return m.Availability
	}
	return nil
}

// An availability of the merchant's service, indicating time and number
// of spots.
// The availability feed should be a list of this message.
// Please note that it's up to the partner to call out all the possible
// availabilities.
// If a massage therapist is available 9am-12pm, and they provide
// one-hour massage sessions, the aggregator should provide the feed as
//   availability {start_sec: 9am, duration: 60 minutes, ...}
//   availability {start_sec: 10am, duration: 60 minutes, ...}
//   availability {start_sec: 11am, duration: 60 minutes, ...}
// instead of
//   availability {start_sec: 9am, duration: 180 minutes, ...}
//
type Availability struct {
	// An opaque string from an aggregator to identify a merchant. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// An opaque string from aggregator to identify a service of the
	// merchant. (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of this availability, using epoch time in seconds in UTC.
	//(required)
	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the service in seconds, e.g. 30 minutes for a chair massage.
	// (required)
	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Number of total spots and open spots of this availability.
	// E.g. a Yoga class of 10 spots with 3 booked.
	//   availability {spots_total: 10, spots_open: 7 ...}
	// E.g. a chair massage session which was already booked.
	//   availability {spots_total: 1, spots_open: 0 ...}
	//
	// Note: If sending requests using the availability compression format defined
	//       below, these two fields will be inferred. A Recurrence
	//       implies spots_total=1 and spots_open=1. A ScheduleException implies
	//       spots_total=1 and spots_open=0.
	// (both required if recurrence not set)
	SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal,proto3" json:"spots_total,omitempty"`
	SpotsOpen  int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen,proto3" json:"spots_open,omitempty"`
	// An optional opaque string to identify this availability slot. If set, it
	// will be included in the requests that book/update/cancel appointments.
	// (optional)
	AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"`
	// Optional resources used to disambiguate this availability slot from
	// others when different staff, room, or party_size values are part
	// of the service.
	//
	// E.g. the same Yoga class with two 2 instructors.
	//  availability { resources { staff_id: "1" staff_name: "Amy" }
	//                 spots_total: 10 spots_open: 7 }
	//  availability { resources { staff_id: "2" staff_name: "John" }
	//                 spots_total: 5 spots_open: 2 }
	// (optional)
	Resources *Resources `protobuf:"bytes,8,opt,name=resources,proto3" json:"resources,omitempty"`
	// A list of IDs referencing the payment options which can be used to pay
	// for this slot. The actual payment options are defined at the Merchant
	// level, and can also be shared among multiple Merchants.
	//
	// This field overrides any payment_option_ids specified in the service
	// message. Similarly payment_option_ids specified here do NOT have to be
	// present in the service message, though must be defined at the
	// Merchant level.
	// Our current implementation limits the number of entries in this array to
	// one element. Multiple payment_option_id are still allowed at the Service
	// level, but an override at the availability slot level, is limited to a
	// single payment_option_id. (optional)
	PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	// The recurrence information for the availability, representing more than one
	// start time. A recurrence should contain appointments for one working day.
	// (optional)
	Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence,proto3" json:"recurrence,omitempty"`
	// Times when this service cannot be scheduled. To limit the number of
	// schedule_exception messages, consider joining adjacent exceptions.
	// (optional)
	ScheduleException []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException,proto3" json:"schedule_exception,omitempty"`
	// Defines how a deposit may be charged to the user. Overrides the service
	// deposit if one was specified. Setting this to an empty Deposit message
	// removes any service-level deposit. (optional)
	Deposit *Deposit `protobuf:"bytes,12,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. Overrides the
	// service no show fee if one was specified. Setting this to an empty
	// NoShowFee message removes any service-level no show fee. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,13,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Indicates whether the user must provide a credit card in order to book this
	// availability slot.
	// If the value is not set, it is inherited from the service level if it's set
	// there. (optional)
	RequireCreditCard RequireCreditCard `protobuf:"varint,14,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
	// Indicates a list of supported ticket types for this availability slot. If
	// unset, all ticket types in the parent service are available for this slot.
	// Note that the values of this field must be defined in the parent service.
	// Examples:
	//
	// * Service with four ticket types:
	// TicketType {ticket_type_id: "adult_1" short_description: "Adult weekdays"}
	// TicketType {ticket_type_id: "adult_2" short_description: "Adult weekends"}
	// TicketType {ticket_type_id: "youth_1" short_description: "Youth weekdays"}
	// TicketType {ticket_type_id: "youth_2" short_description: "Youth weekends"}
	//
	// To represent the inventory during the weekdays:
	//   `availability {ticket_type_id: "adult_1" ticket_type_id: "youth_1"...}`.
	// To represent the inventory during the holidays:
	//   `availability {ticket_type_id: "adult_2" ticket_type_id: "youth_2"...}`.
	//
	// * Service with three ticket types:
	// TicketType {ticket_type_id: "adult" short_description: "Adult"}
	// TicketType {ticket_type_id: "youth" short_description: "Youth"}
	// TicketType {ticket_type_id: "senior" short_description: "Senior"}
	//
	// To indicate that all three ticket types are available for this time
	// slot, use either
	//   `availability {ticket_type_id: "adult" ticket_type_id: "youth"
	//   ticket_type_id: "senior" ...}`
	// or
	//   `availability {...}' (do not set ticket_type_id in this slot).
	//
	//  (optional)
	TicketTypeId []string `protobuf:"bytes,15,rep,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	// Availability scheduling rules. If fields are populated, they will override
	// any corresponding scheduling rules on the service-level SchedulingRules.
	SchedulingRuleOverrides *Availability_SchedulingRuleOverrides `protobuf:"bytes,16,opt,name=scheduling_rule_overrides,json=schedulingRuleOverrides,proto3" json:"scheduling_rule_overrides,omitempty"`
	// The confirmation mode that will be used when booking this availability.
	// Attempts to create bookings for availabilities with a confirmation mode
	// of CONFIRMATION_MODE_SYNCHRONOUS must be immediatlely confirmed or denied.
	// Attempts to create bookings for availabilities with confirmation mode
	// of CONFIRMATION_MODE_ASYNCHRONOUS must be either immediately denied
	// or created with status PENDING.
	ConfirmationMode     Availability_ConfirmationMode `protobuf:"varint,17,opt,name=confirmation_mode,json=confirmationMode,proto3,enum=maps.booking.feeds.Availability_ConfirmationMode" json:"confirmation_mode,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_Availability proto.InternalMessageInfo

func (m *Availability) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

func (m *Availability) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *Availability) GetStartSec() int64 {
	if m != nil {
		return m.StartSec
	}
	return 0
}

func (m *Availability) GetDurationSec() int64 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *Availability) GetSpotsTotal() int64 {
	if m != nil {
		return m.SpotsTotal
	}
	return 0
}

func (m *Availability) GetSpotsOpen() int64 {
	if m != nil {
		return m.SpotsOpen
	}
	return 0
}

func (m *Availability) GetAvailabilityTag() string {
	if m != nil {
		return m.AvailabilityTag
	}
	return ""
}

func (m *Availability) GetResources() *Resources {
	if m != nil {
		return m.Resources
	}
	return nil
}

func (m *Availability) GetPaymentOptionId() []string {
	if m != nil {
		return m.PaymentOptionId
	}
	return nil
}

func (m *Availability) GetRecurrence() *Availability_Recurrence {
	if m != nil {
		return m.Recurrence
	}
	return nil
}

func (m *Availability) GetScheduleException() []*Availability_ScheduleException {
	if m != nil {
		return m.ScheduleException
	}
	return nil
}

func (m *Availability) GetDeposit() *Deposit {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Availability) GetNoShowFee() *NoShowFee {
	if m != nil {
		return m.NoShowFee
	}
	return nil
}

func (m *Availability) GetRequireCreditCard() RequireCreditCard {
	if m != nil {
		return m.RequireCreditCard
	}
	return RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED
}

func (m *Availability) GetTicketTypeId() []string {
	if m != nil {
		return m.TicketTypeId
	}
	return nil
}

func (m *Availability) GetSchedulingRuleOverrides() *Availability_SchedulingRuleOverrides {
	if m != nil {
		return m.SchedulingRuleOverrides
	}
	return nil
}

func (m *Availability) GetConfirmationMode() Availability_ConfirmationMode {
	if m != nil {
		return m.ConfirmationMode
	}
	return Availability_CONFIRMATION_MODE_UNSPECIFIED
}

// Recurrence messages are optional, but allow for a more compact
// representation of consistently repeating availability slots. They typically
// represent a day's working schedule.
// ScheduleException messages are then used to represent booked/unavailable
// time ranges within the work day.
//
// Requirements:
//   1. The expansion of availability slots or recurrences must NOT create
//      identical slots. If the ids, start_sec, duration_sec, and resources
//      match, slots are considered identical.
//   2. Do NOT mix the standard availability format and recurrence within the
//      slots of a single service. Recurrence benefits merchants/services that
//      offer appointments. The standard format is geared towards
//      merchants/services with regularly scheduled classes.
//   3. Recurrences should not last for more than 24 hours.
type Availability_Recurrence struct {
	// The inclusive maximum UTC timestamp the availability repeats until.
	// (required)
	RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec,proto3" json:"repeat_until_sec,omitempty"`
	// Defines the time between successive availability slots.
	//
	// Example: An availability with a duration of 20 min, a repeat_every_sec of
	// 30 min, a start_sec of 9:00am, and a repeat_until_sec of 11:00am will
	// yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am,
	// 11-11:20am. (required)
	RepeatEverySec       int32    `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec,proto3" json:"repeat_every_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Availability_Recurrence proto.InternalMessageInfo

func (m *Availability_Recurrence) GetRepeatUntilSec() int64 {
	if m != nil {
		return m.RepeatUntilSec
	}
	return 0
}

func (m *Availability_Recurrence) GetRepeatEverySec() int32 {
	if m != nil {
		return m.RepeatEverySec
	}
	return 0
}

// ScheduleException messages represent booked/unavailable time ranges within
// the workday, which are exceptions to the recurrence described above. As
// time slots are booked, the list of exceptions should be updated to reflect
// the newly unavailable time ranges. The recurrence itself shouldn't be
// modified.
type Availability_ScheduleException struct {
	// The time range of the exception. Any slots described by the recurrence
	// which overlap this closed-open time range will be considered unavailable.
	//
	// Example: If the recurrence specifies a duration of 20 min, a
	// repeat_every_sec of 30 min, a start_time of 9:00am, and a
	// repeat_until_sec of 11:00am, then a ScheduleException with a time_range
	// of 9:45am-11:00am would make unavailable the slots at 9:30-9:50am,
	// 10-10:20am, and 10:30-10:50am.
	//
	// Note that because the time range is closed-open, the slot beginning at
	// 11am slot would not be impacted.
	TimeRange            *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Availability_ScheduleException proto.InternalMessageInfo

func (m *Availability_ScheduleException) GetTimeRange() *TimeRange {
	if m != nil {
		return m.TimeRange
	}
	return nil
}

// Availability level scheduling rules.
type Availability_SchedulingRuleOverrides struct {
	// The last time (in seconds) that this slot is able to be booked. This
	// timestamp must be before the start_sec of the slot to be respected
	// (if users should be able to book after the start time, use service level
	// SchedulingRules.min_booking_before_end_time). If present, will override
	// anything specified in the min_booking_buffer of the corresponding
	// Service's SchedulingRules.
	LastBookableSec int64 `protobuf:"varint,1,opt,name=last_bookable_sec,json=lastBookableSec,proto3" json:"last_bookable_sec,omitempty"`
	// The first time (in seconds) that this slot is able to be booked.
	FirstBookableSec     int64    `protobuf:"varint,2,opt,name=first_bookable_sec,json=firstBookableSec,proto3" json:"first_bookable_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Availability_SchedulingRuleOverrides proto.InternalMessageInfo

func (m *Availability_SchedulingRuleOverrides) GetLastBookableSec() int64 {
	if m != nil {
		return m.LastBookableSec
	}
	return 0
}

func (m *Availability_SchedulingRuleOverrides) GetFirstBookableSec() int64 {
	if m != nil {
		return m.FirstBookableSec
	}
	return 0
}

// A resource is used to disambiguate availability slots from one another when
// different staff, room or party_size values are part of the service.
// Multiple slots for the same service and time interval can co-exist when they
// have different resources.
type Resources struct {
	// Optional id for a staff member providing the service. This field identifies
	// the staff member across all merchants, services, and availability records.
	// It also needs to be stable over time to allow correlation with past
	// bookings.
	// This field must be present if staff_name is present.
	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId,proto3" json:"staff_id,omitempty"`
	// Optional name of a staff member providing the service. This field will be
	// displayed to users making a booking, and should be human readable, as
	// opposed to an opaque identifier.
	// This field must be present if staff_id is present.
	StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName,proto3" json:"staff_name,omitempty"`
	// An optional id for the room the service is located in. This field
	// identifies the room across all merchants, services, and availability
	// records. It also needs to be stable over time to allow correlation with
	// past bookings.
	// This field must be present if room_name is present.
	RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
	// An optional name for the room the service is located in. This
	// field will be displayed to users making a booking, and should be human
	// readable, as opposed to an opaque identifier.
	// This field must be present if room_id is present.
	RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"`
	// Applicable only for Dining: The party size which can be accommodated
	// during this time slot. A restaurant can be associated with multiple Slots
	// for the same time, each specifying a different party_size, if for instance
	// 2, 3, or 4 people can be seated with a reservation.
	PartySize            int32    `protobuf:"varint,5,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Resources proto.InternalMessageInfo

func (m *Resources) GetStaffId() string {
	if m != nil {
		return m.StaffId
	}
	return ""
}

func (m *Resources) GetStaffName() string {
	if m != nil {
		return m.StaffName
	}
	return ""
}

func (m *Resources) GetRoomId() string {
	if m != nil {
		return m.RoomId
	}
	return ""
}

func (m *Resources) GetRoomName() string {
	if m != nil {
		return m.RoomName
	}
	return ""
}

func (m *Resources) GetPartySize() int32 {
	if m != nil {
		return m.PartySize
	}
	return 0
}

type TimeRange struct {
	BeginSec             int64    `protobuf:"varint,1,opt,name=begin_sec,json=beginSec,proto3" json:"begin_sec,omitempty"`
	EndSec               int64    `protobuf:"varint,2,opt,name=end_sec,json=endSec,proto3" json:"end_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TimeRange proto.InternalMessageInfo

func (m *TimeRange) GetBeginSec() int64 {
	if m != nil {
		return m.BeginSec
	}
	return 0
}

func (m *TimeRange) GetEndSec() int64 {
	if m != nil {
		return m.EndSec
	}
	return 0
}

type ServiceFeed struct {
	Metadata             *FeedMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	Service              []*Service    `protobuf:"bytes,2,rep,name=service,proto3" json:"service,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_ServiceFeed proto.InternalMessageInfo

func (m *ServiceFeed) GetMetadata() *FeedMetadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *ServiceFeed) GetService() []*Service {
	if m != nil {
		return m.Service
	}
	return nil
}

// The definition of a service provided by a merchant.
type Service struct {
	// An opaque string from an aggregator partner which uniquely identifies a
	// merchant. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// An opaque string from an aggregator partner which uniquely identifies the
	// service. (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// The name of the service, suitable for display to users, e.g. "Men's
	// haircut". (required)
	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
	// The description of the service, suitable for display to users.
	//
	// This field now supports both plain text and HTML-like formatting rules to
	// display structural contents to end-users. Unlike plain text sections,
	// customized layouts can be created here using headings, paragraphs, lists
	// and some phrase tags. Please read the following instructions and notes
	// carefully to create better user-experience.
	//
	// Supported HTML-like formatting tags:
	//
	// Heading tags: <h1>, <h2>, <h3>, <h4>, <h5>, <h6>
	//   Heading tags can be used to display titles and sub-titles. For example,
	//   <h1>Itinerary</h1> will display the inline text as the most important
	//   heading of the section. Note that any inner HTML tags, styles or
	//   attributes will be ignored. For example, <h1 style=".."> will be treated
	//   the same as <h1>. Only pure text wil be preserved.
	//
	// Paragraph tag: <p>:
	//   Paragraph tag can be used to wrap detailed introduction or contents. Any
	//   inner tags, styles or attributes will be ignored with a few exceptions:
	//   <br>, <strong> and <em>. Please see the phrase tag section below for more
	//   details.
	//
	// List tags: <ul>, <ol>, <li>
	//   <ul> tag can be used with <li> tag to display unordered lists, and <ol>
	//   tag can be used with <li> to display ordered lists. This is a good tool
	//   to display checklists, highlights or any other lists that fit your
	//   use-cases.
	// Example: To show a list of features of a cruise trip:
	//  <ol>
	//    <li>Wonderful ocean view and chances to play with wildlife.</li>
	//    <li>Carefully designed travel arrangements and services.</li>
	//    <li>Gauranteed lowest price.</li>
	// </ol>
	// Note that only <li> children under <ul> or <ol> tags will be converted. All
	// other children will be dropped. Also any inner tags, attributes and styles
	// will be ignored, only pure text contents are preserved.
	//
	// Division tag: <div>
	//   All supported inner tags of the <div> tag will be parsed with the rules
	//   stated above. But <div> tag itself does not mean any grouping or
	//   indenting here. Also any inner attributes and styles will be ignored.
	//
	// Phrase tags: <br>, <strong>, <em>:
	//   Only the three tags mentioned above are supported. <br> can be used to
	//   break lines in paragraphs, and <strong>/<em> can be used to highlight
	//   important text. Any other phrase tags will be ignored.
	//
	// Unsupported tags:
	//   * <html>, <header> and <body> tags are not allowed.
	//   * Any URLs, anchors, links will be striped, and will never be displayed
	//   to end-users. If you want to use photos to create a rich user experience,
	//   please use the "related_media" field below to send your photo urls
	//   * Any other tags not mentioned above are not supported (for example
	//   <table>, <td> ...).
	//
	// Important notes:
	//   * Try not to use other tags except for the supported ones mentioned
	//   above, because contents within unsupported tags will be excluded from UI
	//   rendering and may lead to undesired user experience.
	//   * Try avoid deep nested structures like more than 3 different heading
	//   levels or nested lists. Keeping the structure flat, simple and
	//   straightforward helps to create a better user experience.
	//   * If the currently supported layouts are not enough for your use cases,
	//   please contact Google with your requests and we will find the best
	//   approach for you.
	//
	// (required)
	Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	// The price of the service. (optional, overridden when payment options or
	// ticket types present)
	Price *Price `protobuf:"bytes,5,opt,name=price,proto3" json:"price,omitempty"`
	// Rules to book/cancel an appointment. (optional)
	Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules,proto3" json:"rules,omitempty"`
	// Intake forms to customize the service. (optional)
	//
	// Deprecated. Please see intake_form and per_ticket_intake_form.
	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form,proto3" json:"form,omitempty"` // Deprecated: Do not use.
	// A form requesting additional information from the user when they book this
	// service. (optional)
	IntakeForm *ServiceIntakeForm `protobuf:"bytes,20,opt,name=intake_form,json=intakeForm,proto3" json:"intake_form,omitempty"`
	// A form requesting additional information from the user when they book this
	// service. This form must be filled out once for each ticket the user is
	// booking. (optional)
	PerTicketIntakeForm *ServiceIntakeForm `protobuf:"bytes,21,opt,name=per_ticket_intake_form,json=perTicketIntakeForm,proto3" json:"per_ticket_intake_form,omitempty"`
	// Whether a prepayment is required, optional or not supported. (optional)
	PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,proto3,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"`
	// The service's tax rate. If present this field overrides any tax_rate set at
	// the merchant level. An empty message (i.e. tax_rate { }) will reset the
	// applied tax rate to zero. (optional)
	TaxRate *TaxRate `protobuf:"bytes,9,opt,name=tax_rate,json=taxRate,proto3" json:"tax_rate,omitempty"`
	// A list of ids referencing the payment options which can be used to pay
	// for this service. The actual payment options are defined at the Merchant
	// level, and can also be shared among multiple Merchants. (optional)
	PaymentOptionId []string `protobuf:"bytes,10,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	// Defines how a deposit may be charged to the user. Can be overridden at the
	// availability level. (optional)
	Deposit *Deposit `protobuf:"bytes,11,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. Can be overridden
	// at the availability level. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,12,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Indicates whether the user must provide a credit card in order to book this
	// service.
	// This value can be overridden at the availability level. (optional)
	RequireCreditCard RequireCreditCard `protobuf:"varint,13,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
	// An action link related to this service.
	ActionLink []*ActionLink `protobuf:"bytes,14,rep,name=action_link,json=actionLink,proto3" json:"action_link,omitempty"`
	// The predefined type of this service. Currently, only used with action_link.
	Type Service_ServiceType `protobuf:"varint,15,opt,name=type,proto3,enum=maps.booking.feeds.Service_ServiceType" json:"type,omitempty"`
	// Types of tickets that can be booked/purchased for this service, if tickets
	// are supported. (optional)
	TicketType []*TicketType `protobuf:"bytes,16,rep,name=ticket_type,json=ticketType,proto3" json:"ticket_type,omitempty"`
	// Photos related to this service. Google will crawl these media to
	// ensure that they are displayed to end-users in the most efficient way.
	// (optional)
	RelatedMedia []*RelatedMedia `protobuf:"bytes,17,rep,name=related_media,json=relatedMedia,proto3" json:"related_media,omitempty"`
	// Service attribute values that apply to this service (optional).
	// Each Service may have zero or more values for each service attribute
	// defined in the corresponding Merchant.
	ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId,proto3" json:"service_attribute_value_id,omitempty"`
	// Rules related to joining the waitlist. Should be populated if the service
	// and merchant support waitlist functionality. Should not be populated
	// otherwise.
	WaitlistRules        *WaitlistRules `protobuf:"bytes,19,opt,name=waitlist_rules,json=waitlistRules,proto3" json:"waitlist_rules,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_Service proto.InternalMessageInfo

func (m *Service) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

func (m *Service) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *Service) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Service) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Service) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

func (m *Service) GetRules() *SchedulingRules {
	if m != nil {
		return m.Rules
	}
	return nil
}

// Deprecated: Do not use.
func (m *Service) GetForm() []*ServiceIntakeForm {
	if m != nil {
		return m.Form
	}
	return nil
}

func (m *Service) GetIntakeForm() *ServiceIntakeForm {
	if m != nil {
		return m.IntakeForm
	}
	return nil
}

func (m *Service) GetPerTicketIntakeForm() *ServiceIntakeForm {
	if m != nil {
		return m.PerTicketIntakeForm
	}
	return nil
}

func (m *Service) GetPrepaymentType() Service_PrepaymentType {
	if m != nil {
		return m.PrepaymentType
	}
	return Service_PREPAYMENT_TYPE_UNSPECIFIED
}

func (m *Service) GetTaxRate() *TaxRate {
	if m != nil {
		return m.TaxRate
	}
	return nil
}

func (m *Service) GetPaymentOptionId() []string {
	if m != nil {
		return m.PaymentOptionId
	}
	return nil
}

func (m *Service) GetDeposit() *Deposit {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Service) GetNoShowFee() *NoShowFee {
	if m != nil {
		return m.NoShowFee
	}
	return nil
}

func (m *Service) GetRequireCreditCard() RequireCreditCard {
	if m != nil {
		return m.RequireCreditCard
	}
	return RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED
}

func (m *Service) GetActionLink() []*ActionLink {
	if m != nil {
		return m.ActionLink
	}
	return nil
}

func (m *Service) GetType() Service_ServiceType {
	if m != nil {
		return m.Type
	}
	return Service_SERVICE_TYPE_UNSPECIFIED
}

func (m *Service) GetTicketType() []*TicketType {
	if m != nil {
		return m.TicketType
	}
	return nil
}

func (m *Service) GetRelatedMedia() []*RelatedMedia {
	if m != nil {
		return m.RelatedMedia
	}
	return nil
}

func (m *Service) GetServiceAttributeValueId() []*ServiceAttributeValueId {
	if m != nil {
		return m.ServiceAttributeValueId
	}
	return nil
}

func (m *Service) GetWaitlistRules() *WaitlistRules {
	if m != nil {
		return m.WaitlistRules
	}
	return nil
}

// The price of a service or a fee.
type Price struct {
	// The price in micro-units of the currency.
	// Fractions of smallest currency unit will be rounded using nearest even
	// rounding. (e.g. For USD 2.5 cents rounded to 2 cents, 3.5 cents rounded to
	// 4 cents, 0.5 cents rounded to 0 cents, 2.51 cents rounded to 3 cents).
	// (required)
	PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros,proto3" json:"price_micros,omitempty"`
	// The currency of the price that is defined in ISO 4217. (required)
	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
	// An optional and opaque string that identifies the pricing option that is
	// associated with the extended price. (optional)
	PricingOptionTag     string   `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag,proto3" json:"pricing_option_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Price proto.InternalMessageInfo

func (m *Price) GetPriceMicros() int64 {
	if m != nil {
		return m.PriceMicros
	}
	return 0
}

func (m *Price) GetCurrencyCode() string {
	if m != nil {
		return m.CurrencyCode
	}
	return ""
}

func (m *Price) GetPricingOptionTag() string {
	if m != nil {
		return m.PricingOptionTag
	}
	return ""
}

// The scheduling rules for a service.
type SchedulingRules struct {
	// The duration (in seconds) from when the last booking can be made to
	// when the availability slot starts or ends.
	//
	// If "min_advance_booking" is set, the last bookable time is calculated as
	// (<slot start time> - "min_advance_booking").
	// If "min_booking_buffer_before_end_time" is set, the last bookable time is
	// calculated as (<slot end time> - "min_booking_buffer_before_end_time").
	// Note that the value of "min_booking_buffer_before_end_time" must be
	// positive if set.
	// If both are unset, the slot is bookable until the slot begin time.
	//
	// Examples:
	//  * A haircut that needs to be booked at least 1 hour before the start time.
	//      'scheduling_rules{ min_advance_booking: 3600 ...}`
	//
	//  * A museum where the last ticket can be purchased 30 mins before closing:
	//     'scheduling_rules{ min_booking_buffer_before_end_time: 1800 ...}'
	//
	//  * A movie ticket that needs to be purchased before the start time.
	//        'scheduling_rules{ ...}' (leave this field empty)
	// (optional)
	//
	// Types that are valid to be assigned to MinBookingBuffer:
	//	*SchedulingRules_MinAdvanceBooking
	//	*SchedulingRules_MinBookingBufferBeforeEndTime
	MinBookingBuffer isSchedulingRules_MinBookingBuffer `protobuf_oneof:"min_booking_buffer"`
	// The minimum advance notice in seconds required to cancel a booked
	// appointment online. (optional)
	MinAdvanceOnlineCanceling int64 `protobuf:"varint,2,opt,name=min_advance_online_canceling,json=minAdvanceOnlineCanceling,proto3" json:"min_advance_online_canceling,omitempty"`
	// The fee for canceling within the minimum advance notice period.
	LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee,proto3" json:"late_cancellation_fee,omitempty"` // Deprecated: Do not use.
	// The fee for no-show without canceling.
	NoshowFee *Price `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee,proto3" json:"noshow_fee,omitempty"` // Deprecated: Do not use.
	// The admission policy that applied to this service. If unset, defaults to
	// TIME_STRICT. (optional)
	AdmissionPolicy      SchedulingRules_AdmissionPolicy `protobuf:"varint,5,opt,name=admission_policy,json=admissionPolicy,proto3,enum=maps.booking.feeds.SchedulingRules_AdmissionPolicy" json:"admission_policy,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

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

var xxx_messageInfo_SchedulingRules proto.InternalMessageInfo

type isSchedulingRules_MinBookingBuffer interface {
	isSchedulingRules_MinBookingBuffer()
}

type SchedulingRules_MinAdvanceBooking struct {
	MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking,proto3,oneof"`
}

type SchedulingRules_MinBookingBufferBeforeEndTime struct {
	MinBookingBufferBeforeEndTime int64 `protobuf:"varint,6,opt,name=min_booking_buffer_before_end_time,json=minBookingBufferBeforeEndTime,proto3,oneof"`
}

func (*SchedulingRules_MinAdvanceBooking) isSchedulingRules_MinBookingBuffer() {}

func (*SchedulingRules_MinBookingBufferBeforeEndTime) isSchedulingRules_MinBookingBuffer() {}

func (m *SchedulingRules) GetMinBookingBuffer() isSchedulingRules_MinBookingBuffer {
	if m != nil {
		return m.MinBookingBuffer
	}
	return nil
}

func (m *SchedulingRules) GetMinAdvanceBooking() int64 {
	if x, ok := m.GetMinBookingBuffer().(*SchedulingRules_MinAdvanceBooking); ok {
		return x.MinAdvanceBooking
	}
	return 0
}

func (m *SchedulingRules) GetMinBookingBufferBeforeEndTime() int64 {
	if x, ok := m.GetMinBookingBuffer().(*SchedulingRules_MinBookingBufferBeforeEndTime); ok {
		return x.MinBookingBufferBeforeEndTime
	}
	return 0
}

func (m *SchedulingRules) GetMinAdvanceOnlineCanceling() int64 {
	if m != nil {
		return m.MinAdvanceOnlineCanceling
	}
	return 0
}

// Deprecated: Do not use.
func (m *SchedulingRules) GetLateCancellationFee() *Price {
	if m != nil {
		return m.LateCancellationFee
	}
	return nil
}

// Deprecated: Do not use.
func (m *SchedulingRules) GetNoshowFee() *Price {
	if m != nil {
		return m.NoshowFee
	}
	return nil
}

func (m *SchedulingRules) GetAdmissionPolicy() SchedulingRules_AdmissionPolicy {
	if m != nil {
		return m.AdmissionPolicy
	}
	return SchedulingRules_ADMISSION_POLICY_UNSPECIFIED
}

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

// A tax rate applied when charging the user for a service, and which can be set
// on either a per merchant, or per service basis.
type TaxRate struct {
	// A tax rate in millionths of one percent, effectively giving 6 decimals of
	// precision. For example, if the tax rate is 7.253%, this field should be set
	// to 7253000.
	//
	// If this field is left unset or set to 0, the total price charged to a user
	// for any service provided by this merchant is the exact price specified by
	// Service.price. The service price is assumed to be exempt from or already
	// inclusive of applicable taxes. Taxes will not be shown to the user as a
	// separate line item.
	//
	// If this field is set to any nonzero value, the total price charged to a
	// user for any service provided by this merchant will include the service
	// price plus the tax assessed using the tax rate provided here. Fractions of
	// the smallest currency unit (for example, fractions of one cent) will be
	// rounded using nearest even rounding. Taxes will be shown to the user as a
	// separate line item. (required)
	MicroPercent         int32    `protobuf:"varint,1,opt,name=micro_percent,json=microPercent,proto3" json:"micro_percent,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TaxRate proto.InternalMessageInfo

func (m *TaxRate) GetMicroPercent() int32 {
	if m != nil {
		return m.MicroPercent
	}
	return 0
}

// Defines a field that is included in a ServiceIntakeForm.
type ServiceIntakeFormField struct {
	// A string from an aggregator partner which uniquely identifies a form field.
	// This id should be the same as the id in the corresponding form field
	// answer. (required)
	Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"`
	// The type of this field. (required)
	Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,proto3,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"`
	// The text shown to the user for this field. (required)
	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
	// For MULTIPLE_CHOICE, CHECKBOXES, or DROPDOWN, the values to enumerate.
	// (optional)
	Value []string `protobuf:"bytes,3,rep,name=value,proto3" json:"value,omitempty"`
	// Indicates whether an answer to this field is required by a user. (optional)
	IsRequired           bool     `protobuf:"varint,4,opt,name=is_required,json=isRequired,proto3" json:"is_required,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ServiceIntakeFormField proto.InternalMessageInfo

func (m *ServiceIntakeFormField) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *ServiceIntakeFormField) GetType() ServiceIntakeFormField_FieldType {
	if m != nil {
		return m.Type
	}
	return ServiceIntakeFormField_FIELD_TYPE_UNSPECIFIED
}

func (m *ServiceIntakeFormField) GetLabel() string {
	if m != nil {
		return m.Label
	}
	return ""
}

func (m *ServiceIntakeFormField) GetValue() []string {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *ServiceIntakeFormField) GetIsRequired() bool {
	if m != nil {
		return m.IsRequired
	}
	return false
}

// Defines an intake form that customizes the service provided by a merchant.
type ServiceIntakeForm struct {
	// Fields that will be displayed to the user. (required)
	Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field,proto3" json:"field,omitempty"`
	// If true, this form will be shown to first time customers.
	// Deprecated. This functionality is not supported for intake forms.
	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers,proto3" json:"first_time_customers,omitempty"` // Deprecated: Do not use.
	// If true, this form will be shown to repeat customers.
	// Deprecated. This functionality is not supported for intake forms.
	ReturningCustomers   bool     `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers,proto3" json:"returning_customers,omitempty"` // Deprecated: Do not use.
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ServiceIntakeForm proto.InternalMessageInfo

func (m *ServiceIntakeForm) GetField() []*ServiceIntakeFormField {
	if m != nil {
		return m.Field
	}
	return nil
}

// Deprecated: Do not use.
func (m *ServiceIntakeForm) GetFirstTimeCustomers() bool {
	if m != nil {
		return m.FirstTimeCustomers
	}
	return false
}

// Deprecated: Do not use.
func (m *ServiceIntakeForm) GetReturningCustomers() bool {
	if m != nil {
		return m.ReturningCustomers
	}
	return false
}

// A deposit that the user may be charged or have a hold on their credit card
// for.
type Deposit struct {
	// Deposit amount.
	Deposit *Price `protobuf:"bytes,1,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Minimum advance cancellation for the deposit.
	MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec,proto3" json:"min_advance_cancellation_sec,omitempty"`
	// Defines how the deposit is determined from the availability.
	DepositType          PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,proto3,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_Deposit proto.InternalMessageInfo

func (m *Deposit) GetDeposit() *Price {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Deposit) GetMinAdvanceCancellationSec() int64 {
	if m != nil {
		return m.MinAdvanceCancellationSec
	}
	return 0
}

func (m *Deposit) GetDepositType() PriceType {
	if m != nil {
		return m.DepositType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// A fee that a user may be charged if they have made a booking but do not
// show up.
type NoShowFee struct {
	// The amount the user may be charged if they do not show up for their
	// reservation.
	Fee *Price `protobuf:"bytes,1,opt,name=fee,proto3" json:"fee,omitempty"`
	// Defines how the fee is determined from the availability.
	FeeType              PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,proto3,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_NoShowFee proto.InternalMessageInfo

func (m *NoShowFee) GetFee() *Price {
	if m != nil {
		return m.Fee
	}
	return nil
}

func (m *NoShowFee) GetFeeType() PriceType {
	if m != nil {
		return m.FeeType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// An action URL with associated language, list of countries restricted to, and
// optional platform that indicates which platform this action should be
// performed on.
type ActionLink struct {
	// The entry point URL for this action link.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// The BCP-47 language tag identifying the language in which the content
	// from this URI is available.
	Language string `protobuf:"bytes,2,opt,name=language,proto3" json:"language,omitempty"`
	// ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility.
	RestrictedCountry []string `protobuf:"bytes,3,rep,name=restricted_country,json=restrictedCountry,proto3" json:"restricted_country,omitempty"`
	// The platform that this action should be performed on. If this field is
	// unset, ACTION_PLATFORM_WEB_APPLICATION will be used as fallback.
	Platform             ActionPlatform `protobuf:"varint,4,opt,name=platform,proto3,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_ActionLink proto.InternalMessageInfo

func (m *ActionLink) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *ActionLink) GetLanguage() string {
	if m != nil {
		return m.Language
	}
	return ""
}

func (m *ActionLink) GetRestrictedCountry() []string {
	if m != nil {
		return m.RestrictedCountry
	}
	return nil
}

func (m *ActionLink) GetPlatform() ActionPlatform {
	if m != nil {
		return m.Platform
	}
	return ActionPlatform_ACTION_PLATFORM_UNSPECIFIED
}

// TicketType is used to differentiate among tickets with different prices
// and/or availabilities due to different user types, different
// service attributes, or different options/add-ons.
//
// A ticket is the minimal bookable unit to a service, e.g. a spot on a rafting
// trip, an admission to a museum, a full day double kayak rental.
type TicketType struct {
	// The ticket id is used to differentiate among different ticket types of the
	// same service, and is only expected to be unique within a service.
	TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	// A short description to this TicketType.
	//
	// This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
	// Required, each ticket type should have a description to be user visible.
	ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription,proto3" json:"short_description,omitempty"`
	// The price of a single ticket of this type, exclusive of any taxes. The tax
	// rate of Service is applied to its tickets.
	Price *Price `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	// Description of any additional option which this ticket type represents, if
	// any.
	//
	// This is useful when the ticket type represents multiple dimensions.
	//
	// Example 1: an admission ticket with different types 'adult', 'child' and
	// language as an additional option, the expected TicketType list would be:
	//     - { ticket_type_id: "ticket_type_1" short_description: "adult"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_2" short_description: "adult"
	//         option_description: "spanish" }
	//     - { ticket_type_id: "ticket_type_3" short_description: "child"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_4" short_description: "child"
	//         option_description: "spanish" }
	//
	// Example 2: an multi-hour kayak rental with optional dry bag add-on, the
	// short_description could be "3 hours" and the option_description could be
	// either "with dry bag" or "without dry bag":
	//     - { ticket_type_id: "ticket_type_1" short_description: "2 hours"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_2" short_description: "3 hours"
	//         option_description: "spanish" }
	//     - { ticket_type_id: "ticket_type_3" short_description: "2 hours"
	//          option_description: "english" }
	//     - { ticket_type_id: "ticket_type_4" short_description: "3 hours"
	//          option_description: "spanish" }
	//
	// Optional, but if any ticket type within the service has this field set, we
	// expect all other ticket types to have this field set as well (a default
	// option_description could be used). E.g.
	// [{ticket_type_1, adult, english}, {ticket_type_1, adult, ''}] is not a
	// valid list.
	OptionDescription    string   `protobuf:"bytes,4,opt,name=option_description,json=optionDescription,proto3" json:"option_description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TicketType proto.InternalMessageInfo

func (m *TicketType) GetTicketTypeId() string {
	if m != nil {
		return m.TicketTypeId
	}
	return ""
}

func (m *TicketType) GetShortDescription() string {
	if m != nil {
		return m.ShortDescription
	}
	return ""
}

func (m *TicketType) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

func (m *TicketType) GetOptionDescription() string {
	if m != nil {
		return m.OptionDescription
	}
	return ""
}

// Defines a media source. This field only contains the URL of this media source
// (only photos are supported for now). Google will crawl the media data to
// ensure that they are displayed to end-users in the most efficient way.
type RelatedMedia struct {
	// URL of this media source. Google will crawl the media hosted at this URL.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// Type of this media source.
	Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,proto3,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"`
	// Caption of the media, only plain text is supported. Any HTML components
	// will be stripped. (optional)
	Caption string `protobuf:"bytes,3,opt,name=caption,proto3" json:"caption,omitempty"`
	// Attribution information about the source of the media. Note that if
	// the attribution is required to display with the media to give credit to
	// photographer or agency, this field must be set. (optional)
	Attribution          *RelatedMedia_Attribution `protobuf:"bytes,4,opt,name=attribution,proto3" json:"attribution,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_RelatedMedia proto.InternalMessageInfo

func (m *RelatedMedia) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *RelatedMedia) GetType() RelatedMedia_MediaType {
	if m != nil {
		return m.Type
	}
	return RelatedMedia_TYPE_UNSPECIFIED
}

func (m *RelatedMedia) GetCaption() string {
	if m != nil {
		return m.Caption
	}
	return ""
}

func (m *RelatedMedia) GetAttribution() *RelatedMedia_Attribution {
	if m != nil {
		return m.Attribution
	}
	return nil
}

// Attribution information for this media.
type RelatedMedia_Attribution struct {
	// The text to give credit to the photographer or agency. This text will be
	// displayed together with the source media. Note that only plain text is
	// supported for this field, any HTML components will be stripped (hyperlink
	// based attribution is not supported).
	Text                 string   `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RelatedMedia_Attribution proto.InternalMessageInfo

func (m *RelatedMedia_Attribution) GetText() string {
	if m != nil {
		return m.Text
	}
	return ""
}

// Identifies a particular value of a service attribute to be applied to a
// Service.
type ServiceAttributeValueId struct {
	// ID of an attribute as defined in Merchant.service_attribute, e.g.
	// "service-type".
	AttributeId string `protobuf:"bytes,1,opt,name=attribute_id,json=attributeId,proto3" json:"attribute_id,omitempty"`
	// ID of the value for this attribute, e.g. "haircut". Must match a value_id
	// in the service attribute definition.
	ValueId              string   `protobuf:"bytes,2,opt,name=value_id,json=valueId,proto3" json:"value_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ServiceAttributeValueId proto.InternalMessageInfo

func (m *ServiceAttributeValueId) GetAttributeId() string {
	if m != nil {
		return m.AttributeId
	}
	return ""
}

func (m *ServiceAttributeValueId) GetValueId() string {
	if m != nil {
		return m.ValueId
	}
	return ""
}

// Rules related to joining the waitlist.
type WaitlistRules struct {
	// Required. Must be a positive integer for services providing waitlist
	// functionality. If the service or merchant does not provide waitlist
	// functionality, this must not be populated.
	MinPartySize int32 `protobuf:"varint,1,opt,name=min_party_size,json=minPartySize,proto3" json:"min_party_size,omitempty"`
	// Required. Must be a positive integer for services providing waitlist
	// functionality. If the service or merchant does not provide waitlist
	// functionality, this must not be populated.
	MaxPartySize int32 `protobuf:"varint,2,opt,name=max_party_size,json=maxPartySize,proto3" json:"max_party_size,omitempty"`
	// If true, the user will be able to send a free-form additional text request
	// when joining the waitlist for this service.
	SupportsAdditionalRequest bool     `protobuf:"varint,3,opt,name=supports_additional_request,json=supportsAdditionalRequest,proto3" json:"supports_additional_request,omitempty"`
	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
	XXX_unrecognized          []byte   `json:"-"`
	XXX_sizecache             int32    `json:"-"`
}

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

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

var xxx_messageInfo_WaitlistRules proto.InternalMessageInfo

func (m *WaitlistRules) GetMinPartySize() int32 {
	if m != nil {
		return m.MinPartySize
	}
	return 0
}

func (m *WaitlistRules) GetMaxPartySize() int32 {
	if m != nil {
		return m.MaxPartySize
	}
	return 0
}

func (m *WaitlistRules) GetSupportsAdditionalRequest() bool {
	if m != nil {
		return m.SupportsAdditionalRequest
	}
	return false
}

func init() {
	proto.RegisterEnum("maps.booking.feeds.PriceType", PriceType_name, PriceType_value)
	proto.RegisterEnum("maps.booking.feeds.RequireCreditCard", RequireCreditCard_name, RequireCreditCard_value)
	proto.RegisterEnum("maps.booking.feeds.ActionPlatform", ActionPlatform_name, ActionPlatform_value)
	proto.RegisterEnum("maps.booking.feeds.FeedMetadata_ProcessingInstruction", FeedMetadata_ProcessingInstruction_name, FeedMetadata_ProcessingInstruction_value)
	proto.RegisterEnum("maps.booking.feeds.Availability_ConfirmationMode", Availability_ConfirmationMode_name, Availability_ConfirmationMode_value)
	proto.RegisterEnum("maps.booking.feeds.Service_PrepaymentType", Service_PrepaymentType_name, Service_PrepaymentType_value)
	proto.RegisterEnum("maps.booking.feeds.Service_ServiceType", Service_ServiceType_name, Service_ServiceType_value)
	proto.RegisterEnum("maps.booking.feeds.SchedulingRules_AdmissionPolicy", SchedulingRules_AdmissionPolicy_name, SchedulingRules_AdmissionPolicy_value)
	proto.RegisterEnum("maps.booking.feeds.ServiceIntakeFormField_FieldType", ServiceIntakeFormField_FieldType_name, ServiceIntakeFormField_FieldType_value)
	proto.RegisterEnum("maps.booking.feeds.RelatedMedia_MediaType", RelatedMedia_MediaType_name, RelatedMedia_MediaType_value)
	proto.RegisterType((*FeedMetadata)(nil), "maps.booking.feeds.FeedMetadata")
	proto.RegisterType((*AvailabilityFeed)(nil), "maps.booking.feeds.AvailabilityFeed")
	proto.RegisterType((*ServiceAvailability)(nil), "maps.booking.feeds.ServiceAvailability")
	proto.RegisterType((*Availability)(nil), "maps.booking.feeds.Availability")
	proto.RegisterType((*Availability_Recurrence)(nil), "maps.booking.feeds.Availability.Recurrence")
	proto.RegisterType((*Availability_ScheduleException)(nil), "maps.booking.feeds.Availability.ScheduleException")
	proto.RegisterType((*Availability_SchedulingRuleOverrides)(nil), "maps.booking.feeds.Availability.SchedulingRuleOverrides")
	proto.RegisterType((*Resources)(nil), "maps.booking.feeds.Resources")
	proto.RegisterType((*TimeRange)(nil), "maps.booking.feeds.TimeRange")
	proto.RegisterType((*ServiceFeed)(nil), "maps.booking.feeds.ServiceFeed")
	proto.RegisterType((*Service)(nil), "maps.booking.feeds.Service")
	proto.RegisterType((*Price)(nil), "maps.booking.feeds.Price")
	proto.RegisterType((*SchedulingRules)(nil), "maps.booking.feeds.SchedulingRules")
	proto.RegisterType((*TaxRate)(nil), "maps.booking.feeds.TaxRate")
	proto.RegisterType((*ServiceIntakeFormField)(nil), "maps.booking.feeds.ServiceIntakeFormField")
	proto.RegisterType((*ServiceIntakeForm)(nil), "maps.booking.feeds.ServiceIntakeForm")
	proto.RegisterType((*Deposit)(nil), "maps.booking.feeds.Deposit")
	proto.RegisterType((*NoShowFee)(nil), "maps.booking.feeds.NoShowFee")
	proto.RegisterType((*ActionLink)(nil), "maps.booking.feeds.ActionLink")
	proto.RegisterType((*TicketType)(nil), "maps.booking.feeds.TicketType")
	proto.RegisterType((*RelatedMedia)(nil), "maps.booking.feeds.RelatedMedia")
	proto.RegisterType((*RelatedMedia_Attribution)(nil), "maps.booking.feeds.RelatedMedia.Attribution")
	proto.RegisterType((*ServiceAttributeValueId)(nil), "maps.booking.feeds.ServiceAttributeValueId")
	proto.RegisterType((*WaitlistRules)(nil), "maps.booking.feeds.WaitlistRules")
}

func init() { proto.RegisterFile("feeds.proto", fileDescriptor_7aa923a38d4cd9d3) }

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