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

package ext_maps_booking_partner_v3

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

// Status of a booking.
//
// Updating booking status does not change the status of the associated payment.
// Prepayment status updates should be done using the PrepaymentStatus enum.
//
// nextID: 8
type BookingStatus int32

const (
	// Not specified.
	BookingStatus_BOOKING_STATUS_UNSPECIFIED BookingStatus = 0
	// Booking has been confirmed
	BookingStatus_CONFIRMED BookingStatus = 1
	// Booking is awaiting confirmation by the merchant before it can transition
	// into CONFIRMED status
	BookingStatus_PENDING_MERCHANT_CONFIRMATION BookingStatus = 2
	// Booking has been canceled on behalf of the user.
	// The merchant can still trigger a manual refund.
	BookingStatus_CANCELED BookingStatus = 3
	// User did not show for the appointment
	BookingStatus_NO_SHOW BookingStatus = 4
	// User did not show for the appointment in violation of the cancellation
	// policy.
	BookingStatus_NO_SHOW_PENALIZED BookingStatus = 5
	// Booking could not be completed by the backend due to a failure.
	BookingStatus_FAILED BookingStatus = 6
	// Booking was asynchronously declined by the merchant.
	BookingStatus_DECLINED_BY_MERCHANT BookingStatus = 7
)

var BookingStatus_name = map[int32]string{
	0: "BOOKING_STATUS_UNSPECIFIED",
	1: "CONFIRMED",
	2: "PENDING_MERCHANT_CONFIRMATION",
	3: "CANCELED",
	4: "NO_SHOW",
	5: "NO_SHOW_PENALIZED",
	6: "FAILED",
	7: "DECLINED_BY_MERCHANT",
}

var BookingStatus_value = map[string]int32{
	"BOOKING_STATUS_UNSPECIFIED":    0,
	"CONFIRMED":                     1,
	"PENDING_MERCHANT_CONFIRMATION": 2,
	"CANCELED":                      3,
	"NO_SHOW":                       4,
	"NO_SHOW_PENALIZED":             5,
	"FAILED":                        6,
	"DECLINED_BY_MERCHANT":          7,
}

func (x BookingStatus) String() string {
	return proto.EnumName(BookingStatus_name, int32(x))
}

func (BookingStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{0}
}

// Used when booking/order failure cause is PAYMENT_ERROR_CARD_TYPE_REJECTED to
// indicate the type of credit card that was rejected.
type CreditCardType int32

const (
	// Default value. Used if credit card type does not match to one below.
	CreditCardType_CREDIT_CARD_TYPE_UNSPECIFIED CreditCardType = 0
	CreditCardType_VISA                         CreditCardType = 1
	CreditCardType_MASTERCARD                   CreditCardType = 2
	CreditCardType_AMERICAN_EXPRESS             CreditCardType = 3
	CreditCardType_DISCOVER                     CreditCardType = 4
	CreditCardType_JCB                          CreditCardType = 5
)

var CreditCardType_name = map[int32]string{
	0: "CREDIT_CARD_TYPE_UNSPECIFIED",
	1: "VISA",
	2: "MASTERCARD",
	3: "AMERICAN_EXPRESS",
	4: "DISCOVER",
	5: "JCB",
}

var CreditCardType_value = map[string]int32{
	"CREDIT_CARD_TYPE_UNSPECIFIED": 0,
	"VISA":                         1,
	"MASTERCARD":                   2,
	"AMERICAN_EXPRESS":             3,
	"DISCOVER":                     4,
	"JCB":                          5,
}

func (x CreditCardType) String() string {
	return proto.EnumName(CreditCardType_name, int32(x))
}

func (CreditCardType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{1}
}

// Mode by which bookings for an availability slot are confirmed.
type ConfirmationMode int32

const (
	// The confirmation mode was not specified.
	// Synchronous confirmation will be assumed.
	ConfirmationMode_CONFIRMATION_MODE_UNSPECIFIED ConfirmationMode = 0
	// Bookings for this availability will be confirmed synchronously.
	ConfirmationMode_CONFIRMATION_MODE_SYNCHRONOUS ConfirmationMode = 1
	// Bookings for this availability will be confirmed asynchronously.
	ConfirmationMode_CONFIRMATION_MODE_ASYNCHRONOUS ConfirmationMode = 2
)

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

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

func (x ConfirmationMode) String() string {
	return proto.EnumName(ConfirmationMode_name, int32(x))
}

func (ConfirmationMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{2}
}

type PaymentOptionType int32

const (
	PaymentOptionType_PAYMENT_OPTION_TYPE_UNSPECIFIED PaymentOptionType = 0
	PaymentOptionType_PAYMENT_OPTION_SINGLE_USE       PaymentOptionType = 1
	PaymentOptionType_PAYMENT_OPTION_MULTI_USE        PaymentOptionType = 2
	PaymentOptionType_PAYMENT_OPTION_UNLIMITED_USE    PaymentOptionType = 3
)

var PaymentOptionType_name = map[int32]string{
	0: "PAYMENT_OPTION_TYPE_UNSPECIFIED",
	1: "PAYMENT_OPTION_SINGLE_USE",
	2: "PAYMENT_OPTION_MULTI_USE",
	3: "PAYMENT_OPTION_UNLIMITED_USE",
}

var PaymentOptionType_value = map[string]int32{
	"PAYMENT_OPTION_TYPE_UNSPECIFIED": 0,
	"PAYMENT_OPTION_SINGLE_USE":       1,
	"PAYMENT_OPTION_MULTI_USE":        2,
	"PAYMENT_OPTION_UNLIMITED_USE":    3,
}

func (x PaymentOptionType) String() string {
	return proto.EnumName(PaymentOptionType_name, int32(x))
}

func (PaymentOptionType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{3}
}

// Prepayment status of a booking.
// Updating payment status will trigger an update on the payment status of the
// associated booking (if applicable).
// Currently, the only supported transition is from PREPAYMENT_PROVIDED to
// PREPAYMENT_REFUNDED, which will initiate a non-reversible refund on the
// associated payment transaction.
type PrepaymentStatus int32

const (
	// Not specified, defaults to PREPAYMENT_NOT_PROVIDED.
	PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED PrepaymentStatus = 0
	// The fee for the booking has been paid in advance.
	PrepaymentStatus_PREPAYMENT_PROVIDED PrepaymentStatus = 1
	// The fee for the booking has not been paid in advance.
	PrepaymentStatus_PREPAYMENT_NOT_PROVIDED PrepaymentStatus = 2
	// The fee was previously PREPAYMENT_PROVIDED but has now been refunded.
	PrepaymentStatus_PREPAYMENT_REFUNDED PrepaymentStatus = 3
	// The fee was previously PREPAYMENT_PROVIDED but now has been credited
	// (user given a UserPaymentOption as a voucher for the booking).
	// If this is set, the response should also include the updated
	// UserPaymentOption.
	PrepaymentStatus_PREPAYMENT_CREDITED PrepaymentStatus = 4
)

var PrepaymentStatus_name = map[int32]string{
	0: "PREPAYMENT_STATUS_UNSPECIFIED",
	1: "PREPAYMENT_PROVIDED",
	2: "PREPAYMENT_NOT_PROVIDED",
	3: "PREPAYMENT_REFUNDED",
	4: "PREPAYMENT_CREDITED",
}

var PrepaymentStatus_value = map[string]int32{
	"PREPAYMENT_STATUS_UNSPECIFIED": 0,
	"PREPAYMENT_PROVIDED":           1,
	"PREPAYMENT_NOT_PROVIDED":       2,
	"PREPAYMENT_REFUNDED":           3,
	"PREPAYMENT_CREDITED":           4,
}

func (x PrepaymentStatus) String() string {
	return proto.EnumName(PrepaymentStatus_name, int32(x))
}

func (PrepaymentStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{4}
}

// 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_1820d8e1a9fad753, []int{5}
}

// This enum indicates what requirements exist for the user to acknowledge or
// view the requested slots duration/end time.
type CheckAvailabilityResponse_DurationRequirement int32

const (
	// The handling of the end time is not specified. This is the default.
	CheckAvailabilityResponse_DURATION_REQUIREMENT_UNSPECIFIED CheckAvailabilityResponse_DurationRequirement = 0
	// The end time is not shown to the user.
	CheckAvailabilityResponse_DO_NOT_SHOW_DURATION CheckAvailabilityResponse_DurationRequirement = 1
	// The end time has to be shown to the user before an appointment can be
	// made.
	CheckAvailabilityResponse_MUST_SHOW_DURATION CheckAvailabilityResponse_DurationRequirement = 2
)

var CheckAvailabilityResponse_DurationRequirement_name = map[int32]string{
	0: "DURATION_REQUIREMENT_UNSPECIFIED",
	1: "DO_NOT_SHOW_DURATION",
	2: "MUST_SHOW_DURATION",
}

var CheckAvailabilityResponse_DurationRequirement_value = map[string]int32{
	"DURATION_REQUIREMENT_UNSPECIFIED": 0,
	"DO_NOT_SHOW_DURATION":             1,
	"MUST_SHOW_DURATION":               2,
}

func (x CheckAvailabilityResponse_DurationRequirement) String() string {
	return proto.EnumName(CheckAvailabilityResponse_DurationRequirement_name, int32(x))
}

func (CheckAvailabilityResponse_DurationRequirement) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{1, 0}
}

type BookingFailure_Cause int32

const (
	// Default value: Don't use; amounts to an "unknown error"
	BookingFailure_CAUSE_UNSPECIFIED BookingFailure_Cause = 0
	// The referenced availability slot is not available any longer.
	BookingFailure_SLOT_UNAVAILABLE BookingFailure_Cause = 1
	// The user has already booked an appointment for the referenced
	// availability slot.
	BookingFailure_SLOT_ALREADY_BOOKED_BY_USER BookingFailure_Cause = 2
	// The lease (if provided) has expired and cannot be used any longer to
	// complete the requested booking.
	BookingFailure_LEASE_EXPIRED BookingFailure_Cause = 3
	// The requested cancellation cannot be performed at the current time due
	// to time restrictions in the merchant's cancellation policy.
	BookingFailure_OUTSIDE_CANCELLATION_WINDOW BookingFailure_Cause = 4
	// An error was encountered while processing the payment because the
	// provided credit card type was not accepted by the merchant. The credit
	// card type must be supplied in rejected_card_type.
	BookingFailure_PAYMENT_ERROR_CARD_TYPE_REJECTED BookingFailure_Cause = 5
	// An error was encountered while processing the payment because the
	// provided credit card was declined.
	BookingFailure_PAYMENT_ERROR_CARD_DECLINED BookingFailure_Cause = 6
	// An error was encountered with the pack/membership used to pay for the
	// booking. There could be no valid uses left, it could have expired, etc.
	BookingFailure_PAYMENT_OPTION_NOT_VALID BookingFailure_Cause = 7
	// An error was encountered while processing the payment for this booking.
	// Use this value to indicate a general payment related error, only if the
	// error does not match to a specific payment error above.
	BookingFailure_PAYMENT_ERROR BookingFailure_Cause = 8
	// User cannot use the given payment option (e.g. user trying to use a
	// first time price for the second time).
	BookingFailure_USER_CANNOT_USE_PAYMENT_OPTION BookingFailure_Cause = 9
	// A booking that the user tried to cancel has already been cancelled.
	BookingFailure_BOOKING_ALREADY_CANCELLED BookingFailure_Cause = 10
	// A booking that the user tried to cancel is not cancellable.
	BookingFailure_BOOKING_NOT_CANCELLABLE BookingFailure_Cause = 11
	// User has an existing reservation too close to this time.
	BookingFailure_OVERLAPPING_RESERVATION BookingFailure_Cause = 12
	// Set when payment is rejected payment because you are requesting that the
	// transaction be tried again, but this time after undergoing 3DS1
	// challenge/response.  Note that the current transaction's failure state
	// will stay failed.  The retry will be completely separate.
	//
	// When this is the failure reason, payment_failure.3DS1_parameters
	// MUST be set.  If it is not, then the current cause will be treated as
	// if it were AGGREGATOR_PAYMENT_ERROR.
	BookingFailure_PAYMENT_REQUIRES_3DS1 BookingFailure_Cause = 15
)

var BookingFailure_Cause_name = map[int32]string{
	0:  "CAUSE_UNSPECIFIED",
	1:  "SLOT_UNAVAILABLE",
	2:  "SLOT_ALREADY_BOOKED_BY_USER",
	3:  "LEASE_EXPIRED",
	4:  "OUTSIDE_CANCELLATION_WINDOW",
	5:  "PAYMENT_ERROR_CARD_TYPE_REJECTED",
	6:  "PAYMENT_ERROR_CARD_DECLINED",
	7:  "PAYMENT_OPTION_NOT_VALID",
	8:  "PAYMENT_ERROR",
	9:  "USER_CANNOT_USE_PAYMENT_OPTION",
	10: "BOOKING_ALREADY_CANCELLED",
	11: "BOOKING_NOT_CANCELLABLE",
	12: "OVERLAPPING_RESERVATION",
	15: "PAYMENT_REQUIRES_3DS1",
}

var BookingFailure_Cause_value = map[string]int32{
	"CAUSE_UNSPECIFIED":                0,
	"SLOT_UNAVAILABLE":                 1,
	"SLOT_ALREADY_BOOKED_BY_USER":      2,
	"LEASE_EXPIRED":                    3,
	"OUTSIDE_CANCELLATION_WINDOW":      4,
	"PAYMENT_ERROR_CARD_TYPE_REJECTED": 5,
	"PAYMENT_ERROR_CARD_DECLINED":      6,
	"PAYMENT_OPTION_NOT_VALID":         7,
	"PAYMENT_ERROR":                    8,
	"USER_CANNOT_USE_PAYMENT_OPTION":   9,
	"BOOKING_ALREADY_CANCELLED":        10,
	"BOOKING_NOT_CANCELLABLE":          11,
	"OVERLAPPING_RESERVATION":          12,
	"PAYMENT_REQUIRES_3DS1":            15,
}

func (x BookingFailure_Cause) String() string {
	return proto.EnumName(BookingFailure_Cause_name, int32(x))
}

func (BookingFailure_Cause) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{28, 0}
}

type OrderFailure_Cause int32

const (
	// Default value: Don't use; amounts to an "unknown error"
	OrderFailure_CAUSE_UNSPECIFIED OrderFailure_Cause = 0
	// The order is no longer fulfillable.
	OrderFailure_ORDER_UNFULFILLABLE OrderFailure_Cause = 1
	// An error was encountered while processing the payment because the
	// provided credit card type was not accepted by the merchant. The credit
	// card type must be supplied in rejected_card_type.
	OrderFailure_PAYMENT_ERROR_CARD_TYPE_REJECTED OrderFailure_Cause = 2
	// An error was encountered while processing the payment because the
	// provided credit card was declined.
	OrderFailure_PAYMENT_ERROR_CARD_DECLINED OrderFailure_Cause = 3
	// An error was encountered while processing the payment for this order.
	// Use this value to indicate a general payment related error, only if the
	// error does not match to a specific payment error above.
	OrderFailure_PAYMENT_ERROR OrderFailure_Cause = 4
	// Set when payment is rejected payment because you are requesting that the
	// transaction be tried again, but this time after undergoing 3DS1
	// challenge/response.  Note that the current transaction's failure state
	// will stay failed.  The retry will be completely separate.
	//
	// When this is the failure reason, payment_failure.3DS1_parameters
	// MUST be set.  If it is not, then the current cause will be treated as
	// if it were AGGREGATOR_PAYMENT_ERROR.
	OrderFailure_PAYMENT_REQUIRES_3DS1 OrderFailure_Cause = 5
)

var OrderFailure_Cause_name = map[int32]string{
	0: "CAUSE_UNSPECIFIED",
	1: "ORDER_UNFULFILLABLE",
	2: "PAYMENT_ERROR_CARD_TYPE_REJECTED",
	3: "PAYMENT_ERROR_CARD_DECLINED",
	4: "PAYMENT_ERROR",
	5: "PAYMENT_REQUIRES_3DS1",
}

var OrderFailure_Cause_value = map[string]int32{
	"CAUSE_UNSPECIFIED":                0,
	"ORDER_UNFULFILLABLE":              1,
	"PAYMENT_ERROR_CARD_TYPE_REJECTED": 2,
	"PAYMENT_ERROR_CARD_DECLINED":      3,
	"PAYMENT_ERROR":                    4,
	"PAYMENT_REQUIRES_3DS1":            5,
}

func (x OrderFailure_Cause) String() string {
	return proto.EnumName(OrderFailure_Cause_name, int32(x))
}

func (OrderFailure_Cause) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{31, 0}
}

// The result of an order fulfillability check.
type OrderFulfillability_OrderFulfillabilityResult int32

const (
	// Default value: Don't use.
	OrderFulfillability_ORDER_FULFILLABILITY_RESULT_UNSPECIFIED OrderFulfillability_OrderFulfillabilityResult = 0
	// The order can be fulfilled.
	OrderFulfillability_CAN_FULFILL OrderFulfillability_OrderFulfillabilityResult = 1
	// The order cannot be fulfilled due to one or more unfulfillable line
	// item(s).
	OrderFulfillability_UNFULFILLABLE_LINE_ITEM OrderFulfillability_OrderFulfillabilityResult = 2
	// The combination of the line items requested cannot be fulfilled.
	OrderFulfillability_UNFULFILLABLE_SERVICE_COMBINATION OrderFulfillability_OrderFulfillabilityResult = 3
	// The order cannot be fulfilled due to reasons that do not fall into the
	// categories above.
	OrderFulfillability_ORDER_UNFULFILLABLE_OTHER_REASON OrderFulfillability_OrderFulfillabilityResult = 4
)

var OrderFulfillability_OrderFulfillabilityResult_name = map[int32]string{
	0: "ORDER_FULFILLABILITY_RESULT_UNSPECIFIED",
	1: "CAN_FULFILL",
	2: "UNFULFILLABLE_LINE_ITEM",
	3: "UNFULFILLABLE_SERVICE_COMBINATION",
	4: "ORDER_UNFULFILLABLE_OTHER_REASON",
}

var OrderFulfillability_OrderFulfillabilityResult_value = map[string]int32{
	"ORDER_FULFILLABILITY_RESULT_UNSPECIFIED": 0,
	"CAN_FULFILL":                       1,
	"UNFULFILLABLE_LINE_ITEM":           2,
	"UNFULFILLABLE_SERVICE_COMBINATION": 3,
	"ORDER_UNFULFILLABLE_OTHER_REASON":  4,
}

func (x OrderFulfillability_OrderFulfillabilityResult) String() string {
	return proto.EnumName(OrderFulfillability_OrderFulfillabilityResult_name, int32(x))
}

func (OrderFulfillability_OrderFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{32, 0}
}

// The result of a line item fulfillability check.
type LineItemFulfillability_ItemFulfillabilityResult int32

const (
	// Default value: Don't use.
	LineItemFulfillability_ITEM_FULFILLABILITY_RESULT_UNSPECIFIED LineItemFulfillability_ItemFulfillabilityResult = 0
	// This line item can be fulfilled.
	LineItemFulfillability_CAN_FULFILL LineItemFulfillability_ItemFulfillabilityResult = 1
	// No adequate availability for the slot requested.
	LineItemFulfillability_SLOT_UNAVAILABLE LineItemFulfillability_ItemFulfillabilityResult = 2
	// Child tickets cannot be booked without an adult ticket.
	LineItemFulfillability_CHILD_TICKETS_WITHOUT_ADULT LineItemFulfillability_ItemFulfillabilityResult = 6
	// The combination of ticket types requested cannot be fulfilled.
	LineItemFulfillability_UNFULFILLABLE_TICKET_COMBINATION LineItemFulfillability_ItemFulfillabilityResult = 3
	// The total price of this line item is not correct.
	LineItemFulfillability_INCORRECT_PRICE LineItemFulfillability_ItemFulfillabilityResult = 4
	// The line item cannot be fulfilled for reasons that do not fall into
	// the categories above.
	LineItemFulfillability_ITEM_UNFULFILLABLE_OTHER_REASON LineItemFulfillability_ItemFulfillabilityResult = 5
)

var LineItemFulfillability_ItemFulfillabilityResult_name = map[int32]string{
	0: "ITEM_FULFILLABILITY_RESULT_UNSPECIFIED",
	1: "CAN_FULFILL",
	2: "SLOT_UNAVAILABLE",
	6: "CHILD_TICKETS_WITHOUT_ADULT",
	3: "UNFULFILLABLE_TICKET_COMBINATION",
	4: "INCORRECT_PRICE",
	5: "ITEM_UNFULFILLABLE_OTHER_REASON",
}

var LineItemFulfillability_ItemFulfillabilityResult_value = map[string]int32{
	"ITEM_FULFILLABILITY_RESULT_UNSPECIFIED": 0,
	"CAN_FULFILL":                            1,
	"SLOT_UNAVAILABLE":                       2,
	"CHILD_TICKETS_WITHOUT_ADULT":            6,
	"UNFULFILLABLE_TICKET_COMBINATION":       3,
	"INCORRECT_PRICE":                        4,
	"ITEM_UNFULFILLABLE_OTHER_REASON":        5,
}

func (x LineItemFulfillability_ItemFulfillabilityResult) String() string {
	return proto.EnumName(LineItemFulfillability_ItemFulfillabilityResult_name, int32(x))
}

func (LineItemFulfillability_ItemFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{33, 0}
}

// Control how much billing information to include in the
// payment token.
type TokenizationConfig_BillingInformationFormat int32

const (
	// Not specified.  Defaults to MIN.
	TokenizationConfig_BILLING_INFORMATION_FORMAT_UNSPECIFIED TokenizationConfig_BillingInformationFormat = 0
	// name, country code, and postal code (Google Pay default setting).
	TokenizationConfig_MIN TokenizationConfig_BillingInformationFormat = 1
	// name, street address, locality, region, country code, and postal code.
	TokenizationConfig_FULL TokenizationConfig_BillingInformationFormat = 2
)

var TokenizationConfig_BillingInformationFormat_name = map[int32]string{
	0: "BILLING_INFORMATION_FORMAT_UNSPECIFIED",
	1: "MIN",
	2: "FULL",
}

var TokenizationConfig_BillingInformationFormat_value = map[string]int32{
	"BILLING_INFORMATION_FORMAT_UNSPECIFIED": 0,
	"MIN":                                    1,
	"FULL":                                   2,
}

func (x TokenizationConfig_BillingInformationFormat) String() string {
	return proto.EnumName(TokenizationConfig_BillingInformationFormat_name, int32(x))
}

func (TokenizationConfig_BillingInformationFormat) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{36, 0}
}

type PaymentProcessingParameters_PaymentProcessor int32

const (
	PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED PaymentProcessingParameters_PaymentProcessor = 0
	PaymentProcessingParameters_PROCESSOR_STRIPE              PaymentProcessingParameters_PaymentProcessor = 1
	PaymentProcessingParameters_PROCESSOR_BRAINTREE           PaymentProcessingParameters_PaymentProcessor = 2
)

var PaymentProcessingParameters_PaymentProcessor_name = map[int32]string{
	0: "PAYMENT_PROCESSOR_UNSPECIFIED",
	1: "PROCESSOR_STRIPE",
	2: "PROCESSOR_BRAINTREE",
}

var PaymentProcessingParameters_PaymentProcessor_value = map[string]int32{
	"PAYMENT_PROCESSOR_UNSPECIFIED": 0,
	"PROCESSOR_STRIPE":              1,
	"PROCESSOR_BRAINTREE":           2,
}

func (x PaymentProcessingParameters_PaymentProcessor) String() string {
	return proto.EnumName(PaymentProcessingParameters_PaymentProcessor_name, int32(x))
}

func (PaymentProcessingParameters_PaymentProcessor) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{37, 0}
}

// Who handles payment processing?
// If payment is processed by the partner, CreateBooking request will
// include additional parameters (PaymentProcessingParameters) indicating
// the payment method to be used to process the payment.
type PaymentInformation_PaymentProcessedBy int32

const (
	PaymentInformation_PAYMENT_PROCESSED_BY_UNSPECIFIED PaymentInformation_PaymentProcessedBy = 0
	PaymentInformation_PROCESSED_BY_GOOGLE              PaymentInformation_PaymentProcessedBy = 1
	PaymentInformation_PROCESSED_BY_PARTNER             PaymentInformation_PaymentProcessedBy = 2
)

var PaymentInformation_PaymentProcessedBy_name = map[int32]string{
	0: "PAYMENT_PROCESSED_BY_UNSPECIFIED",
	1: "PROCESSED_BY_GOOGLE",
	2: "PROCESSED_BY_PARTNER",
}

var PaymentInformation_PaymentProcessedBy_value = map[string]int32{
	"PAYMENT_PROCESSED_BY_UNSPECIFIED": 0,
	"PROCESSED_BY_GOOGLE":              1,
	"PROCESSED_BY_PARTNER":             2,
}

func (x PaymentInformation_PaymentProcessedBy) String() string {
	return proto.EnumName(PaymentInformation_PaymentProcessedBy_name, int32(x))
}

func (PaymentInformation_PaymentProcessedBy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{39, 0}
}

// Request to check availability for a Slot.
type CheckAvailabilityRequest struct {
	// The appointment slot that is being checked (required)
	Slot                 *Slot    `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CheckAvailabilityRequest proto.InternalMessageInfo

func (m *CheckAvailabilityRequest) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

// Response for the CheckAvailability RPC with the availability of the
// appointment slot.
type CheckAvailabilityResponse struct {
	// The requested slot. (required)
	Slot *Slot `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	// Number of available spots.
	// 0 indicates that the appointment slot is not available. (required)
	CountAvailable int32 `protobuf:"varint,2,opt,name=count_available,json=countAvailable,proto3" json:"count_available,omitempty"`
	// If set, the last time (in seconds since the Unix epoch) that this specific
	// appointment slot can be cancelled through Reserve with Google. This field
	// will override any service-level cancellation rules. (optional)
	LastOnlineCancellableSec int64 `protobuf:"varint,5,opt,name=last_online_cancellable_sec,json=lastOnlineCancellableSec,proto3" json:"last_online_cancellable_sec,omitempty"`
	// The requirement to show the slots duration and/or endtime. This field will
	// be ignored if the slot is unavailable. (optional)
	DurationRequirement CheckAvailabilityResponse_DurationRequirement `protobuf:"varint,3,opt,name=duration_requirement,json=durationRequirement,proto3,enum=ext.maps.booking.partner.v3.CheckAvailabilityResponse_DurationRequirement" json:"duration_requirement,omitempty"`
	// Optionally, the partner can return additional updated information about the
	// availability for this merchant if this information is present when
	// responding to the CheckAvailabilityRequest and if there is no negative
	// impact on the CheckAvailability request latency.
	// For instance an entire day of merchant availability for a superset of
	// resources can be returned here.
	AvailabilityUpdate   *AvailabilityUpdate `protobuf:"bytes,4,opt,name=availability_update,json=availabilityUpdate,proto3" json:"availability_update,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_CheckAvailabilityResponse proto.InternalMessageInfo

func (m *CheckAvailabilityResponse) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *CheckAvailabilityResponse) GetCountAvailable() int32 {
	if m != nil {
		return m.CountAvailable
	}
	return 0
}

func (m *CheckAvailabilityResponse) GetLastOnlineCancellableSec() int64 {
	if m != nil {
		return m.LastOnlineCancellableSec
	}
	return 0
}

func (m *CheckAvailabilityResponse) GetDurationRequirement() CheckAvailabilityResponse_DurationRequirement {
	if m != nil {
		return m.DurationRequirement
	}
	return CheckAvailabilityResponse_DURATION_REQUIREMENT_UNSPECIFIED
}

func (m *CheckAvailabilityResponse) GetAvailabilityUpdate() *AvailabilityUpdate {
	if m != nil {
		return m.AvailabilityUpdate
	}
	return nil
}

// An update to one ore more slots indicating that the availability for the
// associated time has potentially changed.
type AvailabilityUpdate struct {
	SlotAvailability     []*SlotAvailability `protobuf:"bytes,1,rep,name=slot_availability,json=slotAvailability,proto3" json:"slot_availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_AvailabilityUpdate proto.InternalMessageInfo

func (m *AvailabilityUpdate) GetSlotAvailability() []*SlotAvailability {
	if m != nil {
		return m.SlotAvailability
	}
	return nil
}

// An inventory slot and associated count of open spots.
type SlotAvailability struct {
	Slot *Slot `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	// Number of available spots.
	// 0 indicates that the appointment slot is not available. (required)
	CountAvailable       int32    `protobuf:"varint,2,opt,name=count_available,json=countAvailable,proto3" json:"count_available,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SlotAvailability proto.InternalMessageInfo

func (m *SlotAvailability) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *SlotAvailability) GetCountAvailable() int32 {
	if m != nil {
		return m.CountAvailable
	}
	return 0
}

// Identifies a Slot service_id and start time and optionally, the Slot duration
// and resources, for a specific merchant. Note that this differs from the
// definition of Slot, as it does not include merchant_id identifier.
type SlotTime struct {
	// ID of the service. (required)
	ServiceId string `protobuf:"bytes,5,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of the appointment slot in seconds of UTC time since Unix epoch
	// (required)
	StartSec int64 `protobuf:"varint,1,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the appointment slot in seconds (optional)
	DurationSec int64 `protobuf:"varint,2,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Opaque tag that identifies the availability slot and matches the value
	// provided in the availability feed (optional)
	AvailabilityTag string `protobuf:"bytes,3,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"`
	// The set of resources that specifies the appointment slot, e.g. by
	// indicating the staff member and room selected by the user, or party size
	// for dining slots (optional)
	ResourceIds          *ResourceIds `protobuf:"bytes,4,opt,name=resource_ids,json=resourceIds,proto3" json:"resource_ids,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_SlotTime proto.InternalMessageInfo

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

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

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

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

func (m *SlotTime) GetResourceIds() *ResourceIds {
	if m != nil {
		return m.ResourceIds
	}
	return nil
}

type SlotTimeAvailability struct {
	// The SlotTime for which availability was checked.
	SlotTime *SlotTime `protobuf:"bytes,1,opt,name=slot_time,json=slotTime,proto3" json:"slot_time,omitempty"`
	// Whether the requested SlotTime is available
	Available            bool     `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SlotTimeAvailability proto.InternalMessageInfo

func (m *SlotTimeAvailability) GetSlotTime() *SlotTime {
	if m != nil {
		return m.SlotTime
	}
	return nil
}

func (m *SlotTimeAvailability) GetAvailable() bool {
	if m != nil {
		return m.Available
	}
	return false
}

// Request to lookup availabilities of a list of specified slot times for a
// given merchant/service.
type BatchAvailabilityLookupRequest struct {
	// ID of the merchant.
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// Multiple slot times to be checked for availability. All queried times apply
	// to the same merchant_id and service_id.
	SlotTime             []*SlotTime `protobuf:"bytes,3,rep,name=slot_time,json=slotTime,proto3" json:"slot_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_BatchAvailabilityLookupRequest proto.InternalMessageInfo

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

func (m *BatchAvailabilityLookupRequest) GetSlotTime() []*SlotTime {
	if m != nil {
		return m.SlotTime
	}
	return nil
}

// Response for the BatchAvailabilityLookupRequest RPC with the availabilities
// of the appointment slots.
type BatchAvailabilityLookupResponse struct {
	// The availabilities for the requested SlotTime entries. There must be
	// exactly one slot_time_availability for each SlotTime entry in the
	// [ext.maps.booking.partner.v3.BatchAvailabilityLookupRequest].
	SlotTimeAvailability []*SlotTimeAvailability `protobuf:"bytes,1,rep,name=slot_time_availability,json=slotTimeAvailability,proto3" json:"slot_time_availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_BatchAvailabilityLookupResponse proto.InternalMessageInfo

func (m *BatchAvailabilityLookupResponse) GetSlotTimeAvailability() []*SlotTimeAvailability {
	if m != nil {
		return m.SlotTimeAvailability
	}
	return nil
}

// Request to check the fulfillability of an order.
type CheckOrderFulfillabilityRequest struct {
	// The merchant that this order is intended for. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// The line items in this order. All services requested must belong to the
	// specified merchant. (required)
	Item                 []*LineItem `protobuf:"bytes,2,rep,name=item,proto3" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_CheckOrderFulfillabilityRequest proto.InternalMessageInfo

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

func (m *CheckOrderFulfillabilityRequest) GetItem() []*LineItem {
	if m != nil {
		return m.Item
	}
	return nil
}

// Response for the CheckOrderfulfillabilityRequest.
type CheckOrderFulfillabilityResponse struct {
	// Fulfillability status of the order, potentially contains updated
	// availabilities and prices of the requested line item. (required)
	Fulfillability *OrderFulfillability `protobuf:"bytes,1,opt,name=fulfillability,proto3" json:"fulfillability,omitempty"`
	// Total processing fees & taxes that need to be paid for this order.
	// (required)
	FeesAndTaxes         *Price   `protobuf:"bytes,2,opt,name=fees_and_taxes,json=feesAndTaxes,proto3" json:"fees_and_taxes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CheckOrderFulfillabilityResponse proto.InternalMessageInfo

func (m *CheckOrderFulfillabilityResponse) GetFulfillability() *OrderFulfillability {
	if m != nil {
		return m.Fulfillability
	}
	return nil
}

func (m *CheckOrderFulfillabilityResponse) GetFeesAndTaxes() *Price {
	if m != nil {
		return m.FeesAndTaxes
	}
	return nil
}

// Request to get booking status and prepayment status for a Booking.
type GetBookingStatusRequest struct {
	// ID of the existing booking (required)
	BookingId            string   `protobuf:"bytes,1,opt,name=booking_id,json=bookingId,proto3" json:"booking_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetBookingStatusRequest proto.InternalMessageInfo

func (m *GetBookingStatusRequest) GetBookingId() string {
	if m != nil {
		return m.BookingId
	}
	return ""
}

// Response for the GetBookingStatus RPC with booking status and prepayment
// status.
type GetBookingStatusResponse struct {
	// ID of the booking (required)
	BookingId string `protobuf:"bytes,1,opt,name=booking_id,json=bookingId,proto3" json:"booking_id,omitempty"`
	// Status of the booking (required)
	BookingStatus BookingStatus `protobuf:"varint,2,opt,name=booking_status,json=bookingStatus,proto3,enum=ext.maps.booking.partner.v3.BookingStatus" json:"booking_status,omitempty"`
	// Prepayment status of the booking (required)
	PrepaymentStatus     PrepaymentStatus `protobuf:"varint,3,opt,name=prepayment_status,json=prepaymentStatus,proto3,enum=ext.maps.booking.partner.v3.PrepaymentStatus" json:"prepayment_status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_GetBookingStatusResponse proto.InternalMessageInfo

func (m *GetBookingStatusResponse) GetBookingId() string {
	if m != nil {
		return m.BookingId
	}
	return ""
}

func (m *GetBookingStatusResponse) GetBookingStatus() BookingStatus {
	if m != nil {
		return m.BookingStatus
	}
	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
}

func (m *GetBookingStatusResponse) GetPrepaymentStatus() PrepaymentStatus {
	if m != nil {
		return m.PrepaymentStatus
	}
	return PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED
}

// Request to create a Booking for an inventory slot. Consumes the lease if
// provided.
type CreateBookingRequest struct {
	// The inventory slot that is being requested to make this booking.
	// If lease_ref is provided, slot must match the lease; slot is provided for
	// the partner to verify the lease information.
	// If lease_ref is absent, then create the booking for the slot. (required)
	Slot *Slot `protobuf:"bytes,1,opt,name=slot,proto3" json:"slot,omitempty"`
	// The lease that is being confirmed to make this booking.
	// If lease_ref is provided, then create the booking using the lease.
	// (optional)
	LeaseRef *LeaseReference `protobuf:"bytes,2,opt,name=lease_ref,json=leaseRef,proto3" json:"lease_ref,omitempty"`
	// Personal information of the user making the appointment (required)
	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// Information about payments. When payment authorizations are handled by
	// Google, if the booking request does not succeed, payment authorizations are
	// automatically canceled. (optional)
	PaymentInformation *PaymentInformation `protobuf:"bytes,4,opt,name=payment_information,json=paymentInformation,proto3" json:"payment_information,omitempty"`
	// The parameters to be used if the payment is processed by the partner
	// (i.e. payment_information.payment_processed_by is equal to
	// PROCESSED_BY_PARTNER). (optional)
	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,5,opt,name=payment_processing_parameters,json=paymentProcessingParameters,proto3" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for CreateBooking requests. (required)
	IdempotencyToken string `protobuf:"bytes,6,opt,name=idempotency_token,json=idempotencyToken,proto3" json:"idempotency_token,omitempty"`
	// A string from the user which contains any special requests or additional
	// information that they would like to notify the merchant about. (optional)
	AdditionalRequest    string   `protobuf:"bytes,7,opt,name=additional_request,json=additionalRequest,proto3" json:"additional_request,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateBookingRequest proto.InternalMessageInfo

func (m *CreateBookingRequest) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *CreateBookingRequest) GetLeaseRef() *LeaseReference {
	if m != nil {
		return m.LeaseRef
	}
	return nil
}

func (m *CreateBookingRequest) GetUserInformation() *UserInformation {
	if m != nil {
		return m.UserInformation
	}
	return nil
}

func (m *CreateBookingRequest) GetPaymentInformation() *PaymentInformation {
	if m != nil {
		return m.PaymentInformation
	}
	return nil
}

func (m *CreateBookingRequest) GetPaymentProcessingParameters() *PaymentProcessingParameters {
	if m != nil {
		return m.PaymentProcessingParameters
	}
	return nil
}

func (m *CreateBookingRequest) GetIdempotencyToken() string {
	if m != nil {
		return m.IdempotencyToken
	}
	return ""
}

func (m *CreateBookingRequest) GetAdditionalRequest() string {
	if m != nil {
		return m.AdditionalRequest
	}
	return ""
}

// Response with the created Booking for an inventory slot.
type CreateBookingResponse struct {
	// The created booking (required)
	Booking *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	// The updated user payment option used in this booking.
	// If a new payment option was purchased to pay for the booking, this should
	// be a newly created user payment option.
	// If an already purchased user payment option was used for this booking,
	// this should reflect an updated version of that user payment option.
	// (optional)
	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption,proto3" json:"user_payment_option,omitempty"`
	// If creating a booking fails, this field should reflect the business logic
	// error (e.g., slot has become unavailable) and all other fields in the
	// CreateBookingResponse message are expected to be unset. (required if
	// failure occurs)
	BookingFailure       *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure,proto3" json:"booking_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_CreateBookingResponse proto.InternalMessageInfo

func (m *CreateBookingResponse) GetBooking() *Booking {
	if m != nil {
		return m.Booking
	}
	return nil
}

func (m *CreateBookingResponse) GetUserPaymentOption() *UserPaymentOption {
	if m != nil {
		return m.UserPaymentOption
	}
	return nil
}

func (m *CreateBookingResponse) GetBookingFailure() *BookingFailure {
	if m != nil {
		return m.BookingFailure
	}
	return nil
}

// Request to create a Lease for a slot in the inventory.  The expiration time
// in the returned Lease may be modified by the backend, e.g. if the requested
// lease period is too long.
type CreateLeaseRequest struct {
	// The lease to be created with information about the appointment slot
	// (required)
	Lease                *Lease   `protobuf:"bytes,1,opt,name=lease,proto3" json:"lease,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateLeaseRequest proto.InternalMessageInfo

func (m *CreateLeaseRequest) GetLease() *Lease {
	if m != nil {
		return m.Lease
	}
	return nil
}

// Response for the CreateLease RPC with the created Lease.
type CreateLeaseResponse struct {
	// The created Lease (required)
	Lease *Lease `protobuf:"bytes,1,opt,name=lease,proto3" json:"lease,omitempty"`
	// If creating a lease fails, this field should reflect the business logic
	// error (e.g., slot has become unavailable) and lease field is expected to be
	// unset. (required if failure occurs)
	BookingFailure       *BookingFailure `protobuf:"bytes,2,opt,name=booking_failure,json=bookingFailure,proto3" json:"booking_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_CreateLeaseResponse proto.InternalMessageInfo

func (m *CreateLeaseResponse) GetLease() *Lease {
	if m != nil {
		return m.Lease
	}
	return nil
}

func (m *CreateLeaseResponse) GetBookingFailure() *BookingFailure {
	if m != nil {
		return m.BookingFailure
	}
	return nil
}

// Temporary lease for an inventory slot
type Lease struct {
	// ID of the lease.
	// Not populated in CreateLeaseRequest. The value is chosen by the partner and
	// has to be returned in the response of CreateLease. (required)
	LeaseId string `protobuf:"bytes,1,opt,name=lease_id,json=leaseId,proto3" json:"lease_id,omitempty"`
	// The appointment slot that the lease is created for. (required)
	Slot *Slot `protobuf:"bytes,2,opt,name=slot,proto3" json:"slot,omitempty"`
	// Unique identifier for this lease, chosen by Reserve with Google. Serves as
	// an idempotency token for CreateLease requests. (required)
	UserReference string `protobuf:"bytes,3,opt,name=user_reference,json=userReference,proto3" json:"user_reference,omitempty"`
	// Expiration time of the lease in UTC Timestamp (required)
	LeaseExpirationTimeSec int64    `protobuf:"varint,4,opt,name=lease_expiration_time_sec,json=leaseExpirationTimeSec,proto3" json:"lease_expiration_time_sec,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_Lease proto.InternalMessageInfo

func (m *Lease) GetLeaseId() string {
	if m != nil {
		return m.LeaseId
	}
	return ""
}

func (m *Lease) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *Lease) GetUserReference() string {
	if m != nil {
		return m.UserReference
	}
	return ""
}

func (m *Lease) GetLeaseExpirationTimeSec() int64 {
	if m != nil {
		return m.LeaseExpirationTimeSec
	}
	return 0
}

// Reference to a Lease that has been created via CreateLease.
type LeaseReference struct {
	// Lease ID (required)
	LeaseId              string   `protobuf:"bytes,1,opt,name=lease_id,json=leaseId,proto3" json:"lease_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LeaseReference proto.InternalMessageInfo

func (m *LeaseReference) GetLeaseId() string {
	if m != nil {
		return m.LeaseId
	}
	return ""
}

// Request to create an order.
type CreateOrderRequest struct {
	// The order to create. (required)
	Order *Order `protobuf:"bytes,1,opt,name=order,proto3" json:"order,omitempty"`
	// The parameters to be used if the payment is processed by the partner
	// (i.e. order.payment_information.payment_processed_by is equal to
	// PROCESSED_BY_PARTNER). (required if payment is processed by the partner)
	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,2,opt,name=payment_processing_parameters,json=paymentProcessingParameters,proto3" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for CreateOrder requests. (required)
	IdempotencyToken     string   `protobuf:"bytes,3,opt,name=idempotency_token,json=idempotencyToken,proto3" json:"idempotency_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateOrderRequest proto.InternalMessageInfo

func (m *CreateOrderRequest) GetOrder() *Order {
	if m != nil {
		return m.Order
	}
	return nil
}

func (m *CreateOrderRequest) GetPaymentProcessingParameters() *PaymentProcessingParameters {
	if m != nil {
		return m.PaymentProcessingParameters
	}
	return nil
}

func (m *CreateOrderRequest) GetIdempotencyToken() string {
	if m != nil {
		return m.IdempotencyToken
	}
	return ""
}

// Response for the CreateOrderRequest.
type CreateOrderResponse struct {
	// All line items in an order either fail or succeed together.
	// This means that if some of the items cannot be fulfilled, the entire
	// order must fail, the booking must not be made for any item, and the user
	// must not be charged.
	//
	// Types that are valid to be assigned to Result:
	//	*CreateOrderResponse_Order
	//	*CreateOrderResponse_OrderFailure
	Result               isCreateOrderResponse_Result `protobuf_oneof:"result"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_CreateOrderResponse proto.InternalMessageInfo

type isCreateOrderResponse_Result interface {
	isCreateOrderResponse_Result()
}

type CreateOrderResponse_Order struct {
	Order *Order `protobuf:"bytes,1,opt,name=order,proto3,oneof"`
}

type CreateOrderResponse_OrderFailure struct {
	OrderFailure *OrderFailure `protobuf:"bytes,2,opt,name=order_failure,json=orderFailure,proto3,oneof"`
}

func (*CreateOrderResponse_Order) isCreateOrderResponse_Result() {}

func (*CreateOrderResponse_OrderFailure) isCreateOrderResponse_Result() {}

func (m *CreateOrderResponse) GetResult() isCreateOrderResponse_Result {
	if m != nil {
		return m.Result
	}
	return nil
}

func (m *CreateOrderResponse) GetOrder() *Order {
	if x, ok := m.GetResult().(*CreateOrderResponse_Order); ok {
		return x.Order
	}
	return nil
}

func (m *CreateOrderResponse) GetOrderFailure() *OrderFailure {
	if x, ok := m.GetResult().(*CreateOrderResponse_OrderFailure); ok {
		return x.OrderFailure
	}
	return nil
}

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

// Request to list all bookings for a user
type ListBookingsRequest struct {
	// ID of the user (required)
	UserId               string   `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListBookingsRequest proto.InternalMessageInfo

func (m *ListBookingsRequest) GetUserId() string {
	if m != nil {
		return m.UserId
	}
	return ""
}

// Response for the ListBookings RPC with all bookings for the requested user.
type ListBookingsResponse struct {
	// All bookings of the user (required)
	Bookings             []*Booking `protobuf:"bytes,1,rep,name=bookings,proto3" json:"bookings,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_ListBookingsResponse proto.InternalMessageInfo

func (m *ListBookingsResponse) GetBookings() []*Booking {
	if m != nil {
		return m.Bookings
	}
	return nil
}

// Request to list orders.
type ListOrdersRequest struct {
	// Request of orders either by user ID, or by order ID.
	//
	// Types that are valid to be assigned to Ids:
	//	*ListOrdersRequest_UserId
	//	*ListOrdersRequest_OrderIds_
	Ids                  isListOrdersRequest_Ids `protobuf_oneof:"ids"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_ListOrdersRequest proto.InternalMessageInfo

type isListOrdersRequest_Ids interface {
	isListOrdersRequest_Ids()
}

type ListOrdersRequest_UserId struct {
	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3,oneof"`
}

type ListOrdersRequest_OrderIds_ struct {
	OrderIds *ListOrdersRequest_OrderIds `protobuf:"bytes,2,opt,name=order_ids,json=orderIds,proto3,oneof"`
}

func (*ListOrdersRequest_UserId) isListOrdersRequest_Ids() {}

func (*ListOrdersRequest_OrderIds_) isListOrdersRequest_Ids() {}

func (m *ListOrdersRequest) GetIds() isListOrdersRequest_Ids {
	if m != nil {
		return m.Ids
	}
	return nil
}

func (m *ListOrdersRequest) GetUserId() string {
	if x, ok := m.GetIds().(*ListOrdersRequest_UserId); ok {
		return x.UserId
	}
	return ""
}

func (m *ListOrdersRequest) GetOrderIds() *ListOrdersRequest_OrderIds {
	if x, ok := m.GetIds().(*ListOrdersRequest_OrderIds_); ok {
		return x.OrderIds
	}
	return nil
}

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

type ListOrdersRequest_OrderIds struct {
	OrderId              []string `protobuf:"bytes,1,rep,name=order_id,json=orderId,proto3" json:"order_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListOrdersRequest_OrderIds proto.InternalMessageInfo

func (m *ListOrdersRequest_OrderIds) GetOrderId() []string {
	if m != nil {
		return m.OrderId
	}
	return nil
}

// Response for the ListOrders RPC.
type ListOrdersResponse struct {
	// All requested orders (required)
	Order                []*Order `protobuf:"bytes,1,rep,name=order,proto3" json:"order,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListOrdersResponse proto.InternalMessageInfo

func (m *ListOrdersResponse) GetOrder() []*Order {
	if m != nil {
		return m.Order
	}
	return nil
}

// Request to update a Booking.
type UpdateBookingRequest struct {
	Booking              *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UpdateBookingRequest proto.InternalMessageInfo

func (m *UpdateBookingRequest) GetBooking() *Booking {
	if m != nil {
		return m.Booking
	}
	return nil
}

// Response with the updated Booking.
type UpdateBookingResponse struct {
	// The updated booking (required)
	Booking *Booking `protobuf:"bytes,1,opt,name=booking,proto3" json:"booking,omitempty"`
	// The updated user payment option originally used to pay for this booking.
	// This should be set if the UpdateBookingRequest results in a change to
	// the UserPaymentOption.
	// For instance, if the booking is canceled, the UserPaymentOption should
	// reflect an additional credit to the user. In the case of a multi-use
	// payment option, the current_count should be increased by one to
	// allow the user to create another booking with this payment option. In the
	// case of a single-use payment option, a new single-use user payment option
	// should be returned. (required if altered in update)
	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption,proto3" json:"user_payment_option,omitempty"`
	// If updating a booking fails, this field should reflect the business logic
	// error (e.g., booking is not cancellable) (required if failure occurs)
	BookingFailure       *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure,proto3" json:"booking_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_UpdateBookingResponse proto.InternalMessageInfo

func (m *UpdateBookingResponse) GetBooking() *Booking {
	if m != nil {
		return m.Booking
	}
	return nil
}

func (m *UpdateBookingResponse) GetUserPaymentOption() *UserPaymentOption {
	if m != nil {
		return m.UserPaymentOption
	}
	return nil
}

func (m *UpdateBookingResponse) GetBookingFailure() *BookingFailure {
	if m != nil {
		return m.BookingFailure
	}
	return nil
}

// A booking for an inventory slot
type Booking struct {
	// ID of this booking (required)
	BookingId string `protobuf:"bytes,1,opt,name=booking_id,json=bookingId,proto3" json:"booking_id,omitempty"`
	// The appointment slot of this booking (required)
	Slot *Slot `protobuf:"bytes,2,opt,name=slot,proto3" json:"slot,omitempty"`
	// Personal information of the user making the appointment (required)
	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// Status of the booking (required)
	Status BookingStatus `protobuf:"varint,4,opt,name=status,proto3,enum=ext.maps.booking.partner.v3.BookingStatus" json:"status,omitempty"`
	// Information about payment transactions that relate to the booking.
	// (optional)
	PaymentInformation   *PaymentInformation `protobuf:"bytes,5,opt,name=payment_information,json=paymentInformation,proto3" json:"payment_information,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *Booking) Reset()         { *m = Booking{} }
func (m *Booking) String() string { return proto.CompactTextString(m) }
func (*Booking) ProtoMessage()    {}
func (*Booking) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{26}
}

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

var xxx_messageInfo_Booking proto.InternalMessageInfo

func (m *Booking) GetBookingId() string {
	if m != nil {
		return m.BookingId
	}
	return ""
}

func (m *Booking) GetSlot() *Slot {
	if m != nil {
		return m.Slot
	}
	return nil
}

func (m *Booking) GetUserInformation() *UserInformation {
	if m != nil {
		return m.UserInformation
	}
	return nil
}

func (m *Booking) GetStatus() BookingStatus {
	if m != nil {
		return m.Status
	}
	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
}

func (m *Booking) GetPaymentInformation() *PaymentInformation {
	if m != nil {
		return m.PaymentInformation
	}
	return nil
}

// Information about payment failures.
type PaymentFailureInformation struct {
	// Parameters used by a RwG aggregator to initiate a 3DS1 authentication
	// protocol with the user.  Will be ignored unless
	// {Booking|Order}Failure.cause is set to PAYMENT_REQUIRES_3DS1.
	Threeds1Parameters   *PaymentFailureInformation_ThreeDS1Parameters `protobuf:"bytes,5,opt,name=threeds1_parameters,json=threeds1Parameters,proto3" json:"threeds1_parameters,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
	XXX_unrecognized     []byte                                        `json:"-"`
	XXX_sizecache        int32                                         `json:"-"`
}

func (m *PaymentFailureInformation) Reset()         { *m = PaymentFailureInformation{} }
func (m *PaymentFailureInformation) String() string { return proto.CompactTextString(m) }
func (*PaymentFailureInformation) ProtoMessage()    {}
func (*PaymentFailureInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{27}
}

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

var xxx_messageInfo_PaymentFailureInformation proto.InternalMessageInfo

func (m *PaymentFailureInformation) GetThreeds1Parameters() *PaymentFailureInformation_ThreeDS1Parameters {
	if m != nil {
		return m.Threeds1Parameters
	}
	return nil
}

// Parameters requesting that RwG perform a 3DS1 challenge.
//
// The parameters are set by EMVCo's description of the 3DS1 protocol.
type PaymentFailureInformation_ThreeDS1Parameters struct {
	// The URL from which to load a form to present to the User for
	// authentication.
	AcsUrl string `protobuf:"bytes,1,opt,name=acs_url,json=acsUrl,proto3" json:"acs_url,omitempty"`
	// A PaymentAuthentication Request.  To be posted to the ACSUrl form.
	PaReq string `protobuf:"bytes,2,opt,name=pa_req,json=paReq,proto3" json:"pa_req,omitempty"`
	// An identifier used by the ACS provider.  To be posted to the ACSUrl
	// form.
	TransactionId        string   `protobuf:"bytes,3,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PaymentFailureInformation_ThreeDS1Parameters proto.InternalMessageInfo

func (m *PaymentFailureInformation_ThreeDS1Parameters) GetAcsUrl() string {
	if m != nil {
		return m.AcsUrl
	}
	return ""
}

func (m *PaymentFailureInformation_ThreeDS1Parameters) GetPaReq() string {
	if m != nil {
		return m.PaReq
	}
	return ""
}

func (m *PaymentFailureInformation_ThreeDS1Parameters) GetTransactionId() string {
	if m != nil {
		return m.TransactionId
	}
	return ""
}

// Status data that conveys why (1) creating a lease or (2) creating or updating
// a booking fails.
// BookingFailure is intended to primarily capture business logic errors.
type BookingFailure struct {
	// The reason why the booking failed. (required)
	Cause BookingFailure_Cause `protobuf:"varint,1,opt,name=cause,proto3,enum=ext.maps.booking.partner.v3.BookingFailure_Cause" json:"cause,omitempty"`
	// (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
	RejectedCardType CreditCardType `protobuf:"varint,2,opt,name=rejected_card_type,json=rejectedCardType,proto3,enum=ext.maps.booking.partner.v3.CreditCardType" json:"rejected_card_type,omitempty"`
	// This optional field is used for the partner to include additional
	// information for debugging purpose only. (optional)
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// Details about payment failures.
	PaymentFailure       *PaymentFailureInformation `protobuf:"bytes,4,opt,name=payment_failure,json=paymentFailure,proto3" json:"payment_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *BookingFailure) Reset()         { *m = BookingFailure{} }
func (m *BookingFailure) String() string { return proto.CompactTextString(m) }
func (*BookingFailure) ProtoMessage()    {}
func (*BookingFailure) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{28}
}

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

var xxx_messageInfo_BookingFailure proto.InternalMessageInfo

func (m *BookingFailure) GetCause() BookingFailure_Cause {
	if m != nil {
		return m.Cause
	}
	return BookingFailure_CAUSE_UNSPECIFIED
}

func (m *BookingFailure) GetRejectedCardType() CreditCardType {
	if m != nil {
		return m.RejectedCardType
	}
	return CreditCardType_CREDIT_CARD_TYPE_UNSPECIFIED
}

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

func (m *BookingFailure) GetPaymentFailure() *PaymentFailureInformation {
	if m != nil {
		return m.PaymentFailure
	}
	return nil
}

// An order for service appointments with a merchant.
type Order struct {
	// ID of this Order, chosen by the booking partner who handles the order
	// (required in CreateOrderResponse and ListOrdersResponse, must not be set in
	// CreateOrderRequest)
	OrderId string `protobuf:"bytes,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"`
	// Personal information of the user making the order (required)
	UserInformation *UserInformation `protobuf:"bytes,2,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
	// Information about payment transactions that relate to the Order.
	// (optional)
	PaymentInformation *PaymentInformation `protobuf:"bytes,3,opt,name=payment_information,json=paymentInformation,proto3" json:"payment_information,omitempty"`
	// The merchant that all services in this Order belong to.
	MerchantId string `protobuf:"bytes,4,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// Line items in this order.
	Item                 []*LineItem `protobuf:"bytes,5,rep,name=item,proto3" json:"item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Order) Reset()         { *m = Order{} }
func (m *Order) String() string { return proto.CompactTextString(m) }
func (*Order) ProtoMessage()    {}
func (*Order) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{29}
}

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

var xxx_messageInfo_Order proto.InternalMessageInfo

func (m *Order) GetOrderId() string {
	if m != nil {
		return m.OrderId
	}
	return ""
}

func (m *Order) GetUserInformation() *UserInformation {
	if m != nil {
		return m.UserInformation
	}
	return nil
}

func (m *Order) GetPaymentInformation() *PaymentInformation {
	if m != nil {
		return m.PaymentInformation
	}
	return nil
}

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

func (m *Order) GetItem() []*LineItem {
	if m != nil {
		return m.Item
	}
	return nil
}

// A single item in an Order--the booking of a single service in a single time
// slot.
type LineItem struct {
	// ID of the merchant Service. (required)
	ServiceId string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of the appointment slot in seconds of UTC time since Unix epoch.
	// (required)
	StartSec int64 `protobuf:"varint,2,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the appointment slot in seconds. (required)
	DurationSec int64 `protobuf:"varint,3,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Number of tickets ordered by Ticket Type.
	Tickets []*LineItem_OrderedTickets `protobuf:"bytes,4,rep,name=tickets,proto3" json:"tickets,omitempty"`
	// In handling CreateOrderRequest and CheckOrderFulfillabilityRequest,
	// the total price (excluding taxes) of the item must be verified to guard
	// against price changes. In CreateOrderResponse and
	// CheckOrderFulfillabilityResponse, the price should be updated to the
	// correct value if the value from the request was incorrect or outdated.
	// (reqired)
	Price *Price `protobuf:"bytes,5,opt,name=price,proto3" json:"price,omitempty"`
	// Status of the Line Item. (required in CreateOrderResponse and
	// ListOrdersResponse; should not be set in requests)
	Status               BookingStatus `protobuf:"varint,6,opt,name=status,proto3,enum=ext.maps.booking.partner.v3.BookingStatus" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *LineItem) Reset()         { *m = LineItem{} }
func (m *LineItem) String() string { return proto.CompactTextString(m) }
func (*LineItem) ProtoMessage()    {}
func (*LineItem) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{30}
}

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

var xxx_messageInfo_LineItem proto.InternalMessageInfo

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

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

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

func (m *LineItem) GetTickets() []*LineItem_OrderedTickets {
	if m != nil {
		return m.Tickets
	}
	return nil
}

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

func (m *LineItem) GetStatus() BookingStatus {
	if m != nil {
		return m.Status
	}
	return BookingStatus_BOOKING_STATUS_UNSPECIFIED
}

type LineItem_OrderedTickets struct {
	TicketId             string   `protobuf:"bytes,1,opt,name=ticket_id,json=ticketId,proto3" json:"ticket_id,omitempty"`
	Count                int32    `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LineItem_OrderedTickets proto.InternalMessageInfo

func (m *LineItem_OrderedTickets) GetTicketId() string {
	if m != nil {
		return m.TicketId
	}
	return ""
}

func (m *LineItem_OrderedTickets) GetCount() int32 {
	if m != nil {
		return m.Count
	}
	return 0
}

// Status data that conveys why creating an order fails.
// OrderFailure is intended to primarily capture business logic errors.
type OrderFailure struct {
	// The reason why the order failed. (required)
	Cause OrderFailure_Cause `protobuf:"varint,1,opt,name=cause,proto3,enum=ext.maps.booking.partner.v3.OrderFailure_Cause" json:"cause,omitempty"`
	// (required only if cause is ORDER_UNFULFILLABLE)
	Fulfillability *OrderFulfillability `protobuf:"bytes,2,opt,name=fulfillability,proto3" json:"fulfillability,omitempty"`
	// (required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)
	RejectedCardType CreditCardType `protobuf:"varint,3,opt,name=rejected_card_type,json=rejectedCardType,proto3,enum=ext.maps.booking.partner.v3.CreditCardType" json:"rejected_card_type,omitempty"`
	// This optional field is used for the partner to include additional
	// information for debugging purpose only. (optional)
	Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	// Details about payment failures.
	PaymentFailure       *PaymentFailureInformation `protobuf:"bytes,5,opt,name=payment_failure,json=paymentFailure,proto3" json:"payment_failure,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *OrderFailure) Reset()         { *m = OrderFailure{} }
func (m *OrderFailure) String() string { return proto.CompactTextString(m) }
func (*OrderFailure) ProtoMessage()    {}
func (*OrderFailure) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{31}
}

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

var xxx_messageInfo_OrderFailure proto.InternalMessageInfo

func (m *OrderFailure) GetCause() OrderFailure_Cause {
	if m != nil {
		return m.Cause
	}
	return OrderFailure_CAUSE_UNSPECIFIED
}

func (m *OrderFailure) GetFulfillability() *OrderFulfillability {
	if m != nil {
		return m.Fulfillability
	}
	return nil
}

func (m *OrderFailure) GetRejectedCardType() CreditCardType {
	if m != nil {
		return m.RejectedCardType
	}
	return CreditCardType_CREDIT_CARD_TYPE_UNSPECIFIED
}

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

func (m *OrderFailure) GetPaymentFailure() *PaymentFailureInformation {
	if m != nil {
		return m.PaymentFailure
	}
	return nil
}

type OrderFulfillability struct {
	Result OrderFulfillability_OrderFulfillabilityResult `protobuf:"varint,1,opt,name=result,proto3,enum=ext.maps.booking.partner.v3.OrderFulfillability_OrderFulfillabilityResult" json:"result,omitempty"`
	// Fulfillability results of all line items in this order (required).
	ItemFulfillability []*LineItemFulfillability `protobuf:"bytes,2,rep,name=item_fulfillability,json=itemFulfillability,proto3" json:"item_fulfillability,omitempty"`
	// Additional description of the reason if the item is unfulfillable.
	// (optional)
	UnfulfillableReason  string   `protobuf:"bytes,3,opt,name=unfulfillable_reason,json=unfulfillableReason,proto3" json:"unfulfillable_reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OrderFulfillability) Reset()         { *m = OrderFulfillability{} }
func (m *OrderFulfillability) String() string { return proto.CompactTextString(m) }
func (*OrderFulfillability) ProtoMessage()    {}
func (*OrderFulfillability) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{32}
}

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

var xxx_messageInfo_OrderFulfillability proto.InternalMessageInfo

func (m *OrderFulfillability) GetResult() OrderFulfillability_OrderFulfillabilityResult {
	if m != nil {
		return m.Result
	}
	return OrderFulfillability_ORDER_FULFILLABILITY_RESULT_UNSPECIFIED
}

func (m *OrderFulfillability) GetItemFulfillability() []*LineItemFulfillability {
	if m != nil {
		return m.ItemFulfillability
	}
	return nil
}

func (m *OrderFulfillability) GetUnfulfillableReason() string {
	if m != nil {
		return m.UnfulfillableReason
	}
	return ""
}

// Fulfillability of a line item.
type LineItemFulfillability struct {
	// The line item of question. (required)
	Item *LineItem `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"`
	// (required)
	Result LineItemFulfillability_ItemFulfillabilityResult `protobuf:"varint,2,opt,name=result,proto3,enum=ext.maps.booking.partner.v3.LineItemFulfillability_ItemFulfillabilityResult" json:"result,omitempty"`
	// Additional description of the reason if the item is unfulfillable.
	// (optional)
	UnfulfillableReason string `protobuf:"bytes,3,opt,name=unfulfillable_reason,json=unfulfillableReason,proto3" json:"unfulfillable_reason,omitempty"`
	// (optional)
	Availability *LineItemFulfillability_UpdatedAvailability `protobuf:"bytes,4,opt,name=availability,proto3" json:"availability,omitempty"`
	// Updated ticket types can be piggybacked in
	// CheckOrderFulfillabilityResponse. If non-empty, all available ticket types
	// for this slot with up-to-date prices should be listed without omitting any.
	// (optional)
	TicketType           []*TicketType `protobuf:"bytes,5,rep,name=ticket_type,json=ticketType,proto3" json:"ticket_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *LineItemFulfillability) Reset()         { *m = LineItemFulfillability{} }
func (m *LineItemFulfillability) String() string { return proto.CompactTextString(m) }
func (*LineItemFulfillability) ProtoMessage()    {}
func (*LineItemFulfillability) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{33}
}

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

var xxx_messageInfo_LineItemFulfillability proto.InternalMessageInfo

func (m *LineItemFulfillability) GetItem() *LineItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *LineItemFulfillability) GetResult() LineItemFulfillability_ItemFulfillabilityResult {
	if m != nil {
		return m.Result
	}
	return LineItemFulfillability_ITEM_FULFILLABILITY_RESULT_UNSPECIFIED
}

func (m *LineItemFulfillability) GetUnfulfillableReason() string {
	if m != nil {
		return m.UnfulfillableReason
	}
	return ""
}

func (m *LineItemFulfillability) GetAvailability() *LineItemFulfillability_UpdatedAvailability {
	if m != nil {
		return m.Availability
	}
	return nil
}

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

// Updated availability for this slot can be piggybacked in
// CheckOrderFulfillabilityResponse.
type LineItemFulfillability_UpdatedAvailability struct {
	// Number of available spots for the given slot. 0 indicates no
	// availability. (required)
	SpotsOpen            int32    `protobuf:"varint,1,opt,name=spots_open,json=spotsOpen,proto3" json:"spots_open,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LineItemFulfillability_UpdatedAvailability proto.InternalMessageInfo

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

// 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_1820d8e1a9fad753, []int{34}
}

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 ""
}

// Resource specification that disambiguates an appointment slot
type ResourceIds struct {
	// The staff ID as provided in the feed or empty if not applicable or no staff
	// was selected. (optional)
	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId,proto3" json:"staff_id,omitempty"`
	// The room ID as provided in the feed or empty if not applicable or no room
	// was selected. (optional)
	RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
	// For Dining Reservations only: the number of seats requested in the booking.
	// (optional)
	PartySize            int32    `protobuf:"varint,3,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 *ResourceIds) Reset()         { *m = ResourceIds{} }
func (m *ResourceIds) String() string { return proto.CompactTextString(m) }
func (*ResourceIds) ProtoMessage()    {}
func (*ResourceIds) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{35}
}

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

var xxx_messageInfo_ResourceIds proto.InternalMessageInfo

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

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

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

// A configuration for payment-processor tokenization, set up on a per-Merchant
// basis.
type TokenizationConfig struct {
	// A tokenization configuration will typically have one
	// tokenization_parameter whose key is "gateway" and whose value is the
	// name of the processor.
	TokenizationParameter map[string]string `protobuf:"bytes,1,rep,name=tokenization_parameter,json=tokenizationParameter,proto3" json:"tokenization_parameter,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Include in the payment token the user's billing information as entered into
	// Google Pay with their FOP (see above).
	BillingInformationFormat TokenizationConfig_BillingInformationFormat `protobuf:"varint,2,opt,name=billing_information_format,json=billingInformationFormat,proto3,enum=ext.maps.booking.partner.v3.TokenizationConfig_BillingInformationFormat" json:"billing_information_format,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}                                    `json:"-"`
	XXX_unrecognized         []byte                                      `json:"-"`
	XXX_sizecache            int32                                       `json:"-"`
}

func (m *TokenizationConfig) Reset()         { *m = TokenizationConfig{} }
func (m *TokenizationConfig) String() string { return proto.CompactTextString(m) }
func (*TokenizationConfig) ProtoMessage()    {}
func (*TokenizationConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{36}
}

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

var xxx_messageInfo_TokenizationConfig proto.InternalMessageInfo

func (m *TokenizationConfig) GetTokenizationParameter() map[string]string {
	if m != nil {
		return m.TokenizationParameter
	}
	return nil
}

func (m *TokenizationConfig) GetBillingInformationFormat() TokenizationConfig_BillingInformationFormat {
	if m != nil {
		return m.BillingInformationFormat
	}
	return TokenizationConfig_BILLING_INFORMATION_FORMAT_UNSPECIFIED
}

type PaymentProcessingParameters struct {
	// The payment processor used to process payment for a given booking.
	// (required)
	//
	// Replaced by the payment_processor field.
	Processor PaymentProcessingParameters_PaymentProcessor `protobuf:"varint,1,opt,name=processor,proto3,enum=ext.maps.booking.partner.v3.PaymentProcessingParameters_PaymentProcessor" json:"processor,omitempty"` // Deprecated: Do not use.
	// The token representing the payment method that will be used to pay
	// for this booking. This token can be only used once. This token can be
	// only used for the merchant associated with this booking.
	//
	// Each processor may choose its own format for this field.
	// An example of Stripe's token is "tok_1C3orL2eZvKYlo2CxReMgS4K".
	//
	// Replaced by unparsed_payment_method_token, which contains
	// payment_method_token as one of its fields.
	// For example, for Stripe, unparsed_payment_method_token is a serialized
	// JSON object documented at https://stripe.com/docs/api#token_object.
	// payment_method_token is the 'id' field parsed out of that.
	PaymentMethodToken string `protobuf:"bytes,2,opt,name=payment_method_token,json=paymentMethodToken,proto3" json:"payment_method_token,omitempty"` // Deprecated: Do not use.
	// The full token received from Google Payments.  This is typically a
	// serialized JSON object.  See documentation from Google Payments and your
	// payment processor for the JSON format of the token for your processor.
	// https://developers.google.com/pay/api/#participating-google-pay-processors
	//
	// This token can only be used once, and only for the merchant associated with
	// this booking.
	UnparsedPaymentMethodToken string `protobuf:"bytes,5,opt,name=unparsed_payment_method_token,json=unparsedPaymentMethodToken,proto3" json:"unparsed_payment_method_token,omitempty"`
	// The payment processor API version that the given payment token is valid
	// for.
	//
	// Each processor may choose its own format for this field.
	// Stripe uses a date (e.g. "2017-06-15"). (required)
	// This is deprecated in favor of tokenization_parameters.
	Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` // Deprecated: Do not use.
	// The payment processor whose configuration was used to generate this token.
	// (required)
	// This is deprecated in favor of tokenization_parameters.
	PaymentProcessor string `protobuf:"bytes,4,opt,name=payment_processor,json=paymentProcessor,proto3" json:"payment_processor,omitempty"` // Deprecated: Do not use.
	// The tokenization_config supplied in the Merchant feed that was used
	// to generate unparsed_payment_method_token.
	TokenizationConfig   *TokenizationConfig `protobuf:"bytes,6,opt,name=tokenization_config,json=tokenizationConfig,proto3" json:"tokenization_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *PaymentProcessingParameters) Reset()         { *m = PaymentProcessingParameters{} }
func (m *PaymentProcessingParameters) String() string { return proto.CompactTextString(m) }
func (*PaymentProcessingParameters) ProtoMessage()    {}
func (*PaymentProcessingParameters) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{37}
}

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

var xxx_messageInfo_PaymentProcessingParameters proto.InternalMessageInfo

// Deprecated: Do not use.
func (m *PaymentProcessingParameters) GetProcessor() PaymentProcessingParameters_PaymentProcessor {
	if m != nil {
		return m.Processor
	}
	return PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED
}

// Deprecated: Do not use.
func (m *PaymentProcessingParameters) GetPaymentMethodToken() string {
	if m != nil {
		return m.PaymentMethodToken
	}
	return ""
}

func (m *PaymentProcessingParameters) GetUnparsedPaymentMethodToken() string {
	if m != nil {
		return m.UnparsedPaymentMethodToken
	}
	return ""
}

// Deprecated: Do not use.
func (m *PaymentProcessingParameters) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

// Deprecated: Do not use.
func (m *PaymentProcessingParameters) GetPaymentProcessor() string {
	if m != nil {
		return m.PaymentProcessor
	}
	return ""
}

func (m *PaymentProcessingParameters) GetTokenizationConfig() *TokenizationConfig {
	if m != nil {
		return m.TokenizationConfig
	}
	return nil
}

// This describes a payment option, such as a pack, membership, or
// single-session pass after it has been purchased by a user. It includes an
// identifier for the user payment option, as well as some information about
// the payment option with which it is associated.
type UserPaymentOption struct {
	// A unique identifier for the user payment option. This Id MUST be unique
	// for all UserPaymentOptions across all merchants and users. (required)
	UserPaymentOptionId string `protobuf:"bytes,1,opt,name=user_payment_option_id,json=userPaymentOptionId,proto3" json:"user_payment_option_id,omitempty"`
	// The user payment option will be valid (usable) between start_time and
	// end_time set in UTC. Attempts to use a user payment option to make a
	// booking outside of this interval will fail. (both optional)
	ValidStartTimeSec int64 `protobuf:"varint,2,opt,name=valid_start_time_sec,json=validStartTimeSec,proto3" json:"valid_start_time_sec,omitempty"`
	ValidEndTimeSec   int64 `protobuf:"varint,3,opt,name=valid_end_time_sec,json=validEndTimeSec,proto3" json:"valid_end_time_sec,omitempty"`
	// The type of the payment option associated with this user payment option.
	// This can be unlimited for a membership or subscription, multi-use for a
	// pack, or single-use. (required)
	Type PaymentOptionType `protobuf:"varint,4,opt,name=type,proto3,enum=ext.maps.booking.partner.v3.PaymentOptionType" json:"type,omitempty"`
	// The original number of uses for this user payment option when it was
	// purchased. This value is ignored for unlimited payment options. (required)
	OriginalCount int32 `protobuf:"varint,5,opt,name=original_count,json=originalCount,proto3" json:"original_count,omitempty"`
	// The number of uses remaining for this user payment option. If this number
	// is 0 for a pack, attempts to use this payment option to make a booking will
	// fail. (required)
	CurrentCount int32 `protobuf:"varint,6,opt,name=current_count,json=currentCount,proto3" json:"current_count,omitempty"`
	// The id of the payment option that has been used to purchase this user
	// payment option. (required)
	PaymentOptionId      string   `protobuf:"bytes,7,opt,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UserPaymentOption) Reset()         { *m = UserPaymentOption{} }
func (m *UserPaymentOption) String() string { return proto.CompactTextString(m) }
func (*UserPaymentOption) ProtoMessage()    {}
func (*UserPaymentOption) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{38}
}

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

var xxx_messageInfo_UserPaymentOption proto.InternalMessageInfo

func (m *UserPaymentOption) GetUserPaymentOptionId() string {
	if m != nil {
		return m.UserPaymentOptionId
	}
	return ""
}

func (m *UserPaymentOption) GetValidStartTimeSec() int64 {
	if m != nil {
		return m.ValidStartTimeSec
	}
	return 0
}

func (m *UserPaymentOption) GetValidEndTimeSec() int64 {
	if m != nil {
		return m.ValidEndTimeSec
	}
	return 0
}

func (m *UserPaymentOption) GetType() PaymentOptionType {
	if m != nil {
		return m.Type
	}
	return PaymentOptionType_PAYMENT_OPTION_TYPE_UNSPECIFIED
}

func (m *UserPaymentOption) GetOriginalCount() int32 {
	if m != nil {
		return m.OriginalCount
	}
	return 0
}

func (m *UserPaymentOption) GetCurrentCount() int32 {
	if m != nil {
		return m.CurrentCount
	}
	return 0
}

func (m *UserPaymentOption) GetPaymentOptionId() string {
	if m != nil {
		return m.PaymentOptionId
	}
	return ""
}

// Payment details that are sent when creating a new booking.
type PaymentInformation struct {
	// Prepayment status of the booking.
	// If the prepayment_status is PREPAYMENT_PROVIDED, then
	// payment_transaction_id contains the associated unique transaction id for
	// the purchase.
	// If the prepayment status is PREPAYMENT_REFUNDED, then
	// payment_transaction_id contains the associated unique transaction id for
	// the refund. (required)
	PrepaymentStatus PrepaymentStatus `protobuf:"varint,1,opt,name=prepayment_status,json=prepaymentStatus,proto3,enum=ext.maps.booking.partner.v3.PrepaymentStatus" json:"prepayment_status,omitempty"`
	// Unique identifier for a payment transaction associated with the booking.
	// If the payment is PROCESSED_BY_GOOGLE, this field will be set by Google.
	// If the payment is PROCESSED_BY_PARTNER, this field will be left empty in
	// Google's CreateBooking or CreateOrder requests to the partner, and it must
	// be set by the partner in their responses.
	PaymentTransactionId string `protobuf:"bytes,2,opt,name=payment_transaction_id,json=paymentTransactionId,proto3" json:"payment_transaction_id,omitempty"`
	// These fields must match the service price (specified in the Services feed)
	// or the PaymentOption corresponding with this service.
	// They are included in the booking request and response to verify that
	// the price indicated in the feed has not changed since the last feed
	// update.
	//
	// The price of the booking or order, exclusive of any taxes.
	// Existence of price or taxes does not imply that they have been paid,
	// prepayment_state should be used for that purpose. (required)
	Price *Price `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	// Taxes that are calculated to be paid for this booking.
	// This field can only be absent in one of the following cases:
	// (1) the price is exempt from or already inclusive of applicable taxes; or
	// (2) the break down between taxes and fees is not available.
	// (required when neither of the above holds)
	TaxAmount *Price `protobuf:"bytes,4,opt,name=tax_amount,json=taxAmount,proto3" json:"tax_amount,omitempty"`
	// Whether the partner or Google processed the payment. (required)
	PaymentProcessedBy PaymentInformation_PaymentProcessedBy `protobuf:"varint,5,opt,name=payment_processed_by,json=paymentProcessedBy,proto3,enum=ext.maps.booking.partner.v3.PaymentInformation_PaymentProcessedBy" json:"payment_processed_by,omitempty"`
	// The id of the payment option or user payment option associated with the
	// booking.
	// If a payment option is purchased as part of a booking, payment_option_id
	// will be set with the id of that payment option.
	// If an already purchased user payment option is being used to pay for a
	// booking, user_payment_option_id will be set with the id of that user
	// payment option.
	// When included as part of a response proto, the user_payment_option_id
	// should be set and must match the UserPaymentOption that is returned in the
	// RPC response (e.g. the user_payment_option returned in
	// CreateBookingResponse). (one of these required)
	//
	// Types that are valid to be assigned to PaymentId:
	//	*PaymentInformation_PaymentOptionId
	//	*PaymentInformation_UserPaymentOptionId
	PaymentId isPaymentInformation_PaymentId `protobuf_oneof:"payment_id"`
	// Defines how a deposit may be charged to the user. If there is a deposit,
	// this field should be set. (optional)
	Deposit *Deposit `protobuf:"bytes,8,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. If the user can be
	// charged a no show fee, this field should be set. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,9,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Total processing fees & taxes that the user needs to pay for the order;
	// only applicable to partners that handle order based booking (e.g., with
	// CreateOrder method). (optional)
	FeesAndTaxes         *Price   `protobuf:"bytes,10,opt,name=fees_and_taxes,json=feesAndTaxes,proto3" json:"fees_and_taxes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PaymentInformation) Reset()         { *m = PaymentInformation{} }
func (m *PaymentInformation) String() string { return proto.CompactTextString(m) }
func (*PaymentInformation) ProtoMessage()    {}
func (*PaymentInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{39}
}

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

var xxx_messageInfo_PaymentInformation proto.InternalMessageInfo

func (m *PaymentInformation) GetPrepaymentStatus() PrepaymentStatus {
	if m != nil {
		return m.PrepaymentStatus
	}
	return PrepaymentStatus_PREPAYMENT_STATUS_UNSPECIFIED
}

func (m *PaymentInformation) GetPaymentTransactionId() string {
	if m != nil {
		return m.PaymentTransactionId
	}
	return ""
}

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

func (m *PaymentInformation) GetTaxAmount() *Price {
	if m != nil {
		return m.TaxAmount
	}
	return nil
}

func (m *PaymentInformation) GetPaymentProcessedBy() PaymentInformation_PaymentProcessedBy {
	if m != nil {
		return m.PaymentProcessedBy
	}
	return PaymentInformation_PAYMENT_PROCESSED_BY_UNSPECIFIED
}

type isPaymentInformation_PaymentId interface {
	isPaymentInformation_PaymentId()
}

type PaymentInformation_PaymentOptionId struct {
	PaymentOptionId string `protobuf:"bytes,6,opt,name=payment_option_id,json=paymentOptionId,proto3,oneof"`
}

type PaymentInformation_UserPaymentOptionId struct {
	UserPaymentOptionId string `protobuf:"bytes,7,opt,name=user_payment_option_id,json=userPaymentOptionId,proto3,oneof"`
}

func (*PaymentInformation_PaymentOptionId) isPaymentInformation_PaymentId() {}

func (*PaymentInformation_UserPaymentOptionId) isPaymentInformation_PaymentId() {}

func (m *PaymentInformation) GetPaymentId() isPaymentInformation_PaymentId {
	if m != nil {
		return m.PaymentId
	}
	return nil
}

func (m *PaymentInformation) GetPaymentOptionId() string {
	if x, ok := m.GetPaymentId().(*PaymentInformation_PaymentOptionId); ok {
		return x.PaymentOptionId
	}
	return ""
}

func (m *PaymentInformation) GetUserPaymentOptionId() string {
	if x, ok := m.GetPaymentId().(*PaymentInformation_UserPaymentOptionId); ok {
		return x.UserPaymentOptionId
	}
	return ""
}

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

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

func (m *PaymentInformation) GetFeesAndTaxes() *Price {
	if m != nil {
		return m.FeesAndTaxes
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PaymentInformation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PaymentInformation_PaymentOptionId)(nil),
		(*PaymentInformation_UserPaymentOptionId)(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_1820d8e1a9fad753, []int{40}
}

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 ""
}

// 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=ext.maps.booking.partner.v3.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_1820d8e1a9fad753, []int{41}
}

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
}

// 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=ext.maps.booking.partner.v3.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_1820d8e1a9fad753, []int{42}
}

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
}

// An inventory slot
type Slot struct {
	// ID of the merchant for the slot (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// ID of the merchant Service (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of the appointment slot in seconds of UTC time since Unix epoch.
	// (required)
	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the appointment slot (required)
	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Opaque tag that identifies the availability slot and matches the value
	// provided in the availability feed (optional)
	AvailabilityTag string `protobuf:"bytes,5,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"`
	// The set of resources that disambiguates the appointment slot, e.g. by
	// indicating the staff member and room selected by the user (optional)
	Resources *ResourceIds `protobuf:"bytes,6,opt,name=resources,proto3" json:"resources,omitempty"`
	// Indicates whether bookings of this slot will be confirmed
	// synchronously or asynchronously. An UNSPECIFIED value will be interpreted
	// as synchronous.
	ConfirmationMode     ConfirmationMode `protobuf:"varint,7,opt,name=confirmation_mode,json=confirmationMode,proto3,enum=ext.maps.booking.partner.v3.ConfirmationMode" json:"confirmation_mode,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *Slot) Reset()         { *m = Slot{} }
func (m *Slot) String() string { return proto.CompactTextString(m) }
func (*Slot) ProtoMessage()    {}
func (*Slot) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{43}
}

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

var xxx_messageInfo_Slot proto.InternalMessageInfo

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

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

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

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

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

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

func (m *Slot) GetConfirmationMode() ConfirmationMode {
	if m != nil {
		return m.ConfirmationMode
	}
	return ConfirmationMode_CONFIRMATION_MODE_UNSPECIFIED
}

// Personal information about the person making a booking
type UserInformation struct {
	// Unique ID of the user to the partner, chosen by Reserve with Google.
	// (required)
	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	// Given name of the user (maximum 40 characters) (required)
	GivenName string `protobuf:"bytes,2,opt,name=given_name,json=givenName,proto3" json:"given_name,omitempty"`
	// Family name of the user (maximum 40 characters) (required)
	FamilyName string `protobuf:"bytes,3,opt,name=family_name,json=familyName,proto3" json:"family_name,omitempty"`
	// Address of the user (optional)
	Address *PostalAddress `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"`
	// Phone number of the user (required)
	Telephone string `protobuf:"bytes,5,opt,name=telephone,proto3" json:"telephone,omitempty"`
	// Email address of the user (required)
	Email                string   `protobuf:"bytes,6,opt,name=email,proto3" json:"email,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UserInformation) Reset()         { *m = UserInformation{} }
func (m *UserInformation) String() string { return proto.CompactTextString(m) }
func (*UserInformation) ProtoMessage()    {}
func (*UserInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{44}
}

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

var xxx_messageInfo_UserInformation proto.InternalMessageInfo

func (m *UserInformation) GetUserId() string {
	if m != nil {
		return m.UserId
	}
	return ""
}

func (m *UserInformation) GetGivenName() string {
	if m != nil {
		return m.GivenName
	}
	return ""
}

func (m *UserInformation) GetFamilyName() string {
	if m != nil {
		return m.FamilyName
	}
	return ""
}

func (m *UserInformation) GetAddress() *PostalAddress {
	if m != nil {
		return m.Address
	}
	return nil
}

func (m *UserInformation) GetTelephone() string {
	if m != nil {
		return m.Telephone
	}
	return ""
}

func (m *UserInformation) GetEmail() string {
	if m != nil {
		return m.Email
	}
	return ""
}

// The postal address for a merchant.
type PostalAddress struct {
	// The country, e.g. "USA". (required)
	Country string `protobuf:"bytes,1,opt,name=country,proto3" json:"country,omitempty"`
	// The locality/city, e.g. "Mountain View". (required)
	Locality string `protobuf:"bytes,2,opt,name=locality,proto3" json:"locality,omitempty"`
	// The region/state/province, e.g. "CA". (required)
	Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"`
	// The postal code, e.g. "94043". (required)
	PostalCode string `protobuf:"bytes,4,opt,name=postal_code,json=postalCode,proto3" json:"postal_code,omitempty"`
	// The street address, e.g. "1600 Amphitheatre Pkwy". (required)
	StreetAddress        string   `protobuf:"bytes,5,opt,name=street_address,json=streetAddress,proto3" json:"street_address,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PostalAddress) Reset()         { *m = PostalAddress{} }
func (m *PostalAddress) String() string { return proto.CompactTextString(m) }
func (*PostalAddress) ProtoMessage()    {}
func (*PostalAddress) Descriptor() ([]byte, []int) {
	return fileDescriptor_1820d8e1a9fad753, []int{45}
}

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

var xxx_messageInfo_PostalAddress proto.InternalMessageInfo

func (m *PostalAddress) GetCountry() string {
	if m != nil {
		return m.Country
	}
	return ""
}

func (m *PostalAddress) GetLocality() string {
	if m != nil {
		return m.Locality
	}
	return ""
}

func (m *PostalAddress) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *PostalAddress) GetPostalCode() string {
	if m != nil {
		return m.PostalCode
	}
	return ""
}

func (m *PostalAddress) GetStreetAddress() string {
	if m != nil {
		return m.StreetAddress
	}
	return ""
}

func init() {
	proto.RegisterEnum("ext.maps.booking.partner.v3.BookingStatus", BookingStatus_name, BookingStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.CreditCardType", CreditCardType_name, CreditCardType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.ConfirmationMode", ConfirmationMode_name, ConfirmationMode_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentOptionType", PaymentOptionType_name, PaymentOptionType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PrepaymentStatus", PrepaymentStatus_name, PrepaymentStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PriceType", PriceType_name, PriceType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.CheckAvailabilityResponse_DurationRequirement", CheckAvailabilityResponse_DurationRequirement_name, CheckAvailabilityResponse_DurationRequirement_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.BookingFailure_Cause", BookingFailure_Cause_name, BookingFailure_Cause_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.OrderFailure_Cause", OrderFailure_Cause_name, OrderFailure_Cause_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.OrderFulfillability_OrderFulfillabilityResult", OrderFulfillability_OrderFulfillabilityResult_name, OrderFulfillability_OrderFulfillabilityResult_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.LineItemFulfillability_ItemFulfillabilityResult", LineItemFulfillability_ItemFulfillabilityResult_name, LineItemFulfillability_ItemFulfillabilityResult_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.TokenizationConfig_BillingInformationFormat", TokenizationConfig_BillingInformationFormat_name, TokenizationConfig_BillingInformationFormat_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentProcessingParameters_PaymentProcessor", PaymentProcessingParameters_PaymentProcessor_name, PaymentProcessingParameters_PaymentProcessor_value)
	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentInformation_PaymentProcessedBy", PaymentInformation_PaymentProcessedBy_name, PaymentInformation_PaymentProcessedBy_value)
	proto.RegisterType((*CheckAvailabilityRequest)(nil), "ext.maps.booking.partner.v3.CheckAvailabilityRequest")
	proto.RegisterType((*CheckAvailabilityResponse)(nil), "ext.maps.booking.partner.v3.CheckAvailabilityResponse")
	proto.RegisterType((*AvailabilityUpdate)(nil), "ext.maps.booking.partner.v3.AvailabilityUpdate")
	proto.RegisterType((*SlotAvailability)(nil), "ext.maps.booking.partner.v3.SlotAvailability")
	proto.RegisterType((*SlotTime)(nil), "ext.maps.booking.partner.v3.SlotTime")
	proto.RegisterType((*SlotTimeAvailability)(nil), "ext.maps.booking.partner.v3.SlotTimeAvailability")
	proto.RegisterType((*BatchAvailabilityLookupRequest)(nil), "ext.maps.booking.partner.v3.BatchAvailabilityLookupRequest")
	proto.RegisterType((*BatchAvailabilityLookupResponse)(nil), "ext.maps.booking.partner.v3.BatchAvailabilityLookupResponse")
	proto.RegisterType((*CheckOrderFulfillabilityRequest)(nil), "ext.maps.booking.partner.v3.CheckOrderFulfillabilityRequest")
	proto.RegisterType((*CheckOrderFulfillabilityResponse)(nil), "ext.maps.booking.partner.v3.CheckOrderFulfillabilityResponse")
	proto.RegisterType((*GetBookingStatusRequest)(nil), "ext.maps.booking.partner.v3.GetBookingStatusRequest")
	proto.RegisterType((*GetBookingStatusResponse)(nil), "ext.maps.booking.partner.v3.GetBookingStatusResponse")
	proto.RegisterType((*CreateBookingRequest)(nil), "ext.maps.booking.partner.v3.CreateBookingRequest")
	proto.RegisterType((*CreateBookingResponse)(nil), "ext.maps.booking.partner.v3.CreateBookingResponse")
	proto.RegisterType((*CreateLeaseRequest)(nil), "ext.maps.booking.partner.v3.CreateLeaseRequest")
	proto.RegisterType((*CreateLeaseResponse)(nil), "ext.maps.booking.partner.v3.CreateLeaseResponse")
	proto.RegisterType((*Lease)(nil), "ext.maps.booking.partner.v3.Lease")
	proto.RegisterType((*LeaseReference)(nil), "ext.maps.booking.partner.v3.LeaseReference")
	proto.RegisterType((*CreateOrderRequest)(nil), "ext.maps.booking.partner.v3.CreateOrderRequest")
	proto.RegisterType((*CreateOrderResponse)(nil), "ext.maps.booking.partner.v3.CreateOrderResponse")
	proto.RegisterType((*ListBookingsRequest)(nil), "ext.maps.booking.partner.v3.ListBookingsRequest")
	proto.RegisterType((*ListBookingsResponse)(nil), "ext.maps.booking.partner.v3.ListBookingsResponse")
	proto.RegisterType((*ListOrdersRequest)(nil), "ext.maps.booking.partner.v3.ListOrdersRequest")
	proto.RegisterType((*ListOrdersRequest_OrderIds)(nil), "ext.maps.booking.partner.v3.ListOrdersRequest.OrderIds")
	proto.RegisterType((*ListOrdersResponse)(nil), "ext.maps.booking.partner.v3.ListOrdersResponse")
	proto.RegisterType((*UpdateBookingRequest)(nil), "ext.maps.booking.partner.v3.UpdateBookingRequest")
	proto.RegisterType((*UpdateBookingResponse)(nil), "ext.maps.booking.partner.v3.UpdateBookingResponse")
	proto.RegisterType((*Booking)(nil), "ext.maps.booking.partner.v3.Booking")
	proto.RegisterType((*PaymentFailureInformation)(nil), "ext.maps.booking.partner.v3.PaymentFailureInformation")
	proto.RegisterType((*PaymentFailureInformation_ThreeDS1Parameters)(nil), "ext.maps.booking.partner.v3.PaymentFailureInformation.ThreeDS1Parameters")
	proto.RegisterType((*BookingFailure)(nil), "ext.maps.booking.partner.v3.BookingFailure")
	proto.RegisterType((*Order)(nil), "ext.maps.booking.partner.v3.Order")
	proto.RegisterType((*LineItem)(nil), "ext.maps.booking.partner.v3.LineItem")
	proto.RegisterType((*LineItem_OrderedTickets)(nil), "ext.maps.booking.partner.v3.LineItem.OrderedTickets")
	proto.RegisterType((*OrderFailure)(nil), "ext.maps.booking.partner.v3.OrderFailure")
	proto.RegisterType((*OrderFulfillability)(nil), "ext.maps.booking.partner.v3.OrderFulfillability")
	proto.RegisterType((*LineItemFulfillability)(nil), "ext.maps.booking.partner.v3.LineItemFulfillability")
	proto.RegisterType((*LineItemFulfillability_UpdatedAvailability)(nil), "ext.maps.booking.partner.v3.LineItemFulfillability.UpdatedAvailability")
	proto.RegisterType((*TicketType)(nil), "ext.maps.booking.partner.v3.TicketType")
	proto.RegisterType((*ResourceIds)(nil), "ext.maps.booking.partner.v3.ResourceIds")
	proto.RegisterType((*TokenizationConfig)(nil), "ext.maps.booking.partner.v3.TokenizationConfig")
	proto.RegisterMapType((map[string]string)(nil), "ext.maps.booking.partner.v3.TokenizationConfig.TokenizationParameterEntry")
	proto.RegisterType((*PaymentProcessingParameters)(nil), "ext.maps.booking.partner.v3.PaymentProcessingParameters")
	proto.RegisterType((*UserPaymentOption)(nil), "ext.maps.booking.partner.v3.UserPaymentOption")
	proto.RegisterType((*PaymentInformation)(nil), "ext.maps.booking.partner.v3.PaymentInformation")
	proto.RegisterType((*Price)(nil), "ext.maps.booking.partner.v3.Price")
	proto.RegisterType((*NoShowFee)(nil), "ext.maps.booking.partner.v3.NoShowFee")
	proto.RegisterType((*Deposit)(nil), "ext.maps.booking.partner.v3.Deposit")
	proto.RegisterType((*Slot)(nil), "ext.maps.booking.partner.v3.Slot")
	proto.RegisterType((*UserInformation)(nil), "ext.maps.booking.partner.v3.UserInformation")
	proto.RegisterType((*PostalAddress)(nil), "ext.maps.booking.partner.v3.PostalAddress")
}

func init() { proto.RegisterFile("v3.proto", fileDescriptor_1820d8e1a9fad753) }

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