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

/*
Package ext_maps_booking_partner_v2 is a generated protocol buffer package.

It is generated from these files:
	booking_service.proto

It has these top-level messages:
	Slot
	Lease
	LeaseReference
	Booking
	UserInformation
	PostalAddress
	PaymentProcessingParameters
	Price
	UserPaymentOption
	PaymentInformation
	BookingFailure
	Resources
	CheckAvailabilityRequest
	CheckAvailabilityResponse
	CreateLeaseRequest
	CreateLeaseResponse
	CreateBookingRequest
	CreateBookingResponse
	UpdateBookingRequest
	UpdateBookingResponse
	GetBookingStatusRequest
	GetBookingStatusResponse
	ListBookingsRequest
	ListBookingsResponse
*/
package ext_maps_booking_partner_v2

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import google_protobuf "github.com/golang/protobuf/ptypes/duration"
import google_protobuf1 "google.golang.org/genproto/protobuf/field_mask"
import google_protobuf2 "github.com/golang/protobuf/ptypes/timestamp"

import (
	context "golang.org/x/net/context"
	grpc "google.golang.org/grpc"
)

// 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.ProtoPackageIsVersion2 // please upgrade the proto package

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 fileDescriptor0, []int{0} }

// 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: 6
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
)

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

func (x BookingStatus) String() string {
	return proto.EnumName(BookingStatus_name, int32(x))
}
func (BookingStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }

// 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 fileDescriptor0, []int{2} }

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 fileDescriptor0, []int{6, 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 fileDescriptor0, []int{9, 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
)

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

func (x BookingFailure_Cause) String() string {
	return proto.EnumName(BookingFailure_Cause_name, int32(x))
}
func (BookingFailure_Cause) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{10, 0} }

// Set if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED to indicate the type of
// credit card that was rejected.
type BookingFailure_CreditCardType int32

const (
	// Default value. Used if credit card type does not match to one below.
	BookingFailure_CREDIT_CARD_TYPE_UNSPECIFIED BookingFailure_CreditCardType = 0
	BookingFailure_VISA                         BookingFailure_CreditCardType = 1
	BookingFailure_MASTERCARD                   BookingFailure_CreditCardType = 2
	BookingFailure_AMERICAN_EXPRESS             BookingFailure_CreditCardType = 3
	BookingFailure_DISCOVER                     BookingFailure_CreditCardType = 4
)

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

func (x BookingFailure_CreditCardType) String() string {
	return proto.EnumName(BookingFailure_CreditCardType_name, int32(x))
}
func (BookingFailure_CreditCardType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor0, []int{10, 1}
}

// 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 fileDescriptor0, []int{13, 0}
}

// An inventory slot
type Slot struct {
	// ID of the merchant for the slot
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"`
	// ID of the merchant service
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" json:"service_id,omitempty"`
	// Start time of the appointment slot
	StartTime *google_protobuf2.Timestamp `protobuf:"bytes,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"`
	// Duration of the appointment slot
	Duration *google_protobuf.Duration `protobuf:"bytes,4,opt,name=duration" json:"duration,omitempty"`
	// Opaque tag that identifies the availability slot and matches the value
	// provided in the availability feed
	AvailabilityTag string `protobuf:"bytes,5,opt,name=availability_tag,json=availabilityTag" 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
	Resources *Resources `protobuf:"bytes,6,opt,name=resources" json:"resources,omitempty"`
}

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

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) GetStartTime() *google_protobuf2.Timestamp {
	if m != nil {
		return m.StartTime
	}
	return nil
}

func (m *Slot) GetDuration() *google_protobuf.Duration {
	if m != nil {
		return m.Duration
	}
	return nil
}

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

func (m *Slot) GetResources() *Resources {
	if m != nil {
		return m.Resources
	}
	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.
	LeaseId string `protobuf:"bytes,1,opt,name=lease_id,json=leaseId" json:"lease_id,omitempty"`
	// The appointment slot that the lease is created for.
	Slot *Slot `protobuf:"bytes,2,opt,name=slot" json:"slot,omitempty"`
	// Unique identifier for this lease, chosen by Reserve with Google. Serves as
	// an idempotency token for [ext.maps.booking.partner.v2.CreateLease]
	// requests.
	UserReference string `protobuf:"bytes,3,opt,name=user_reference,json=userReference" json:"user_reference,omitempty"`
	// Expiration time of the lease
	LeaseExpirationTime *google_protobuf2.Timestamp `protobuf:"bytes,4,opt,name=lease_expiration_time,json=leaseExpirationTime" json:"lease_expiration_time,omitempty"`
}

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

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) GetLeaseExpirationTime() *google_protobuf2.Timestamp {
	if m != nil {
		return m.LeaseExpirationTime
	}
	return nil
}

// Reference to a [ext.maps.booking.partner.v2.Lease] that has been created via
// [ext.maps.booking.partner.v2.CreateLease]
type LeaseReference struct {
	// Lease ID
	LeaseId string `protobuf:"bytes,1,opt,name=lease_id,json=leaseId" json:"lease_id,omitempty"`
}

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

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

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

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

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
}

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

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

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

// Postal address for a user
type PostalAddress struct {
	// The country, e.g. "USA".
	AddressCountry string `protobuf:"bytes,1,opt,name=address_country,json=addressCountry" json:"address_country,omitempty"`
	// The locality, e.g. "Mountain View".
	AddressLocality string `protobuf:"bytes,2,opt,name=address_locality,json=addressLocality" json:"address_locality,omitempty"`
	// The region, e.g. "CA".
	AddressRegion string `protobuf:"bytes,3,opt,name=address_region,json=addressRegion" json:"address_region,omitempty"`
	// The post office box number, e.g. "3112", optional.
	PostOfficeBoxNumber string `protobuf:"bytes,4,opt,name=post_office_box_number,json=postOfficeBoxNumber" json:"post_office_box_number,omitempty"`
	// The postal code, e.g. "94043".
	PostalCode string `protobuf:"bytes,5,opt,name=postal_code,json=postalCode" json:"postal_code,omitempty"`
	// The street address, e.g. "1600 Amphitheatre Pkwy".
	StreetAddress string `protobuf:"bytes,6,opt,name=street_address,json=streetAddress" json:"street_address,omitempty"`
}

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

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

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

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

func (m *PostalAddress) GetPostOfficeBoxNumber() string {
	if m != nil {
		return m.PostOfficeBoxNumber
	}
	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 ""
}

// Parameters to specify how the partner will process payment for a given
// booking.
//
// A sample request:
//   processor: PROCESSOR_STRIPE
//   payment_method_token: "pk_live_12345abcdef"
//   version: "2017-06-15"
type PaymentProcessingParameters struct {
	Processor PaymentProcessingParameters_PaymentProcessor `protobuf:"varint,1,opt,name=processor,enum=ext.maps.booking.partner.v2.PaymentProcessingParameters_PaymentProcessor" json:"processor,omitempty"`
	// 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.
	// Stripe uses "pk_live_1234abc..." for live keys and "pk_test_1234abc..."
	// for test keys.
	PaymentMethodToken string `protobuf:"bytes,2,opt,name=payment_method_token,json=paymentMethodToken" json:"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").
	Version string `protobuf:"bytes,3,opt,name=version" json:"version,omitempty"`
}

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

func (m *PaymentProcessingParameters) GetProcessor() PaymentProcessingParameters_PaymentProcessor {
	if m != nil {
		return m.Processor
	}
	return PaymentProcessingParameters_PAYMENT_PROCESSOR_UNSPECIFIED
}

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

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

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).
	PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros" json:"price_micros,omitempty"`
	// The currency of the price that is defined in ISO 4217.
	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"`
}

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

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

// 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.
	UserPaymentOptionId string `protobuf:"bytes,1,opt,name=user_payment_option_id,json=userPaymentOptionId" json:"user_payment_option_id,omitempty"`
	// The user payment option will be valid (usable) between start_time and
	// end_time. Attempts to use a user payment option to make a booking outside
	// of this interval  will fail.
	ValidStartTime *google_protobuf2.Timestamp `protobuf:"bytes,2,opt,name=valid_start_time,json=validStartTime" json:"valid_start_time,omitempty"`
	ValidEndTime   *google_protobuf2.Timestamp `protobuf:"bytes,3,opt,name=valid_end_time,json=validEndTime" json:"valid_end_time,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.
	Type PaymentOptionType `protobuf:"varint,4,opt,name=type,enum=ext.maps.booking.partner.v2.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.
	OriginalCount int32 `protobuf:"varint,5,opt,name=original_count,json=originalCount" 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.
	CurrentCount int32 `protobuf:"varint,6,opt,name=current_count,json=currentCount" json:"current_count,omitempty"`
	// The id of the payment option that has been used to purchase this user
	// payment option.
	PaymentOptionId string `protobuf:"bytes,7,opt,name=payment_option_id,json=paymentOptionId" json:"payment_option_id,omitempty"`
}

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

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

func (m *UserPaymentOption) GetValidStartTime() *google_protobuf2.Timestamp {
	if m != nil {
		return m.ValidStartTime
	}
	return nil
}

func (m *UserPaymentOption) GetValidEndTime() *google_protobuf2.Timestamp {
	if m != nil {
		return m.ValidEndTime
	}
	return nil
}

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.
	PrepaymentStatus PrepaymentStatus `protobuf:"varint,1,opt,name=prepayment_status,json=prepaymentStatus,enum=ext.maps.booking.partner.v2.PrepaymentStatus" json:"prepayment_status,omitempty"`
	// Unique identifier for a payment transaction associated with the booking.
	// Empty if not applicable.
	PaymentTransactionId string `protobuf:"bytes,2,opt,name=payment_transaction_id,json=paymentTransactionId" 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, 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.
	Price *Price `protobuf:"bytes,3,opt,name=price" json:"price,omitempty"`
	// Taxes that are calculated to be paid for this booking.
	// If this field is absent the price is assumed to be exempt from or already
	// inclusive of applicable taxes.
	TaxAmount          *Price                                `protobuf:"bytes,4,opt,name=tax_amount,json=taxAmount" json:"tax_amount,omitempty"`
	PaymentProcessedBy PaymentInformation_PaymentProcessedBy `protobuf:"varint,5,opt,name=payment_processed_by,json=paymentProcessedBy,enum=ext.maps.booking.partner.v2.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).
	//
	// Types that are valid to be assigned to PaymentId:
	//	*PaymentInformation_PaymentOptionId
	//	*PaymentInformation_UserPaymentOptionId
	PaymentId isPaymentInformation_PaymentId `protobuf_oneof:"payment_id"`
}

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

type isPaymentInformation_PaymentId interface {
	isPaymentInformation_PaymentId()
}

type PaymentInformation_PaymentOptionId struct {
	PaymentOptionId string `protobuf:"bytes,6,opt,name=payment_option_id,json=paymentOptionId,oneof"`
}
type PaymentInformation_UserPaymentOptionId struct {
	UserPaymentOptionId string `protobuf:"bytes,7,opt,name=user_payment_option_id,json=userPaymentOptionId,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) 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
}

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

// XXX_OneofFuncs is for the internal use of the proto package.
func (*PaymentInformation) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _PaymentInformation_OneofMarshaler, _PaymentInformation_OneofUnmarshaler, _PaymentInformation_OneofSizer, []interface{}{
		(*PaymentInformation_PaymentOptionId)(nil),
		(*PaymentInformation_UserPaymentOptionId)(nil),
	}
}

func _PaymentInformation_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*PaymentInformation)
	// payment_id
	switch x := m.PaymentId.(type) {
	case *PaymentInformation_PaymentOptionId:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.PaymentOptionId)
	case *PaymentInformation_UserPaymentOptionId:
		b.EncodeVarint(7<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.UserPaymentOptionId)
	case nil:
	default:
		return fmt.Errorf("PaymentInformation.PaymentId has unexpected type %T", x)
	}
	return nil
}

func _PaymentInformation_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*PaymentInformation)
	switch tag {
	case 6: // payment_id.payment_option_id
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.PaymentId = &PaymentInformation_PaymentOptionId{x}
		return true, err
	case 7: // payment_id.user_payment_option_id
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.PaymentId = &PaymentInformation_UserPaymentOptionId{x}
		return true, err
	default:
		return false, nil
	}
}

func _PaymentInformation_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*PaymentInformation)
	// payment_id
	switch x := m.PaymentId.(type) {
	case *PaymentInformation_PaymentOptionId:
		n += proto.SizeVarint(6<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(len(x.PaymentOptionId)))
		n += len(x.PaymentOptionId)
	case *PaymentInformation_UserPaymentOptionId:
		n += proto.SizeVarint(7<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(len(x.UserPaymentOptionId)))
		n += len(x.UserPaymentOptionId)
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// 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 {
	Cause            BookingFailure_Cause          `protobuf:"varint,1,opt,name=cause,enum=ext.maps.booking.partner.v2.BookingFailure_Cause" json:"cause,omitempty"`
	RejectedCardType BookingFailure_CreditCardType `protobuf:"varint,2,opt,name=rejected_card_type,json=rejectedCardType,enum=ext.maps.booking.partner.v2.BookingFailure_CreditCardType" json:"rejected_card_type,omitempty"`
	// This optional field is used for the partner to include additional
	// information for debugging purpose only.
	Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
}

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

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

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

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

// Resource specification that disambiguates an appointment slot
type Resources struct {
	// The staff ID as provided in the feed or empty if not applicable or no staff
	// was selected.
	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId" json:"staff_id,omitempty"`
	// The room ID as provided in the feed or empty if not applicable or no room
	// was selected.
	RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId" json:"room_id,omitempty"`
	// For Dining Reservations only: the number of seats requested in the booking.
	PartySize int32 `protobuf:"varint,3,opt,name=party_size,json=partySize" json:"party_size,omitempty"`
}

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

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

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

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

// Request to check availability for a [ext.maps.booking.partner.v2.Slot]
type CheckAvailabilityRequest struct {
	// The appointment slot that is being checked
	Slot *Slot `protobuf:"bytes,1,opt,name=slot" json:"slot,omitempty"`
}

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

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

// Response for the [ext.maps.booking.partner.v2.CheckAvailability] RPC with the
// availability of the appointment slot
type CheckAvailabilityResponse struct {
	// The requested slot.
	Slot *Slot `protobuf:"bytes,1,opt,name=slot" json:"slot,omitempty"`
	// Number of available spots.
	// 0 indicates that the appointment slot is not available.
	CountAvailable int32 `protobuf:"varint,2,opt,name=count_available,json=countAvailable" json:"count_available,omitempty"`
	// Optionally, return the requirement to show the slots duration and/or
	// endtime. This field will be ignored if slot is unavailable.
	DurationRequirement CheckAvailabilityResponse_DurationRequirement `protobuf:"varint,3,opt,name=duration_requirement,json=durationRequirement,enum=ext.maps.booking.partner.v2.CheckAvailabilityResponse_DurationRequirement" json:"duration_requirement,omitempty"`
}

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

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) GetDurationRequirement() CheckAvailabilityResponse_DurationRequirement {
	if m != nil {
		return m.DurationRequirement
	}
	return CheckAvailabilityResponse_DURATION_REQUIREMENT_UNSPECIFIED
}

// Request to create a [ext.maps.booking.partner.v2.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
	Lease *Lease `protobuf:"bytes,1,opt,name=lease" json:"lease,omitempty"`
}

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

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

// Response for the [ext.maps.booking.partner.v2.CreateLease] RPC with the
// created [ext.maps.booking.partner.v2.Lease]
type CreateLeaseResponse struct {
	// The created [ext.maps.booking.partner.v2.Lease]
	Lease *Lease `protobuf:"bytes,1,opt,name=lease" 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.
	BookingFailure *BookingFailure `protobuf:"bytes,2,opt,name=booking_failure,json=bookingFailure" json:"booking_failure,omitempty"`
}

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

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
}

// Request to create a [ext.maps.booking.partner.v2.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.
	Slot *Slot `protobuf:"bytes,1,opt,name=slot" 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.
	LeaseRef *LeaseReference `protobuf:"bytes,2,opt,name=lease_ref,json=leaseRef" json:"lease_ref,omitempty"`
	// Personal information of the user making the appointment
	UserInformation *UserInformation `protobuf:"bytes,3,opt,name=user_information,json=userInformation" 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.
	PaymentInformation *PaymentInformation `protobuf:"bytes,4,opt,name=payment_information,json=paymentInformation" 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).
	PaymentProcessingParameters *PaymentProcessingParameters `protobuf:"bytes,5,opt,name=payment_processing_parameters,json=paymentProcessingParameters" json:"payment_processing_parameters,omitempty"`
	// Idempotency token for [ext.maps.booking.partner.v2.CreateBooking] requests.
	IdempotencyToken string `protobuf:"bytes,6,opt,name=idempotency_token,json=idempotencyToken" json:"idempotency_token,omitempty"`
}

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

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

// Response with the created [ext.maps.booking.partner.v2.Booking] for an
// inventory slot
type CreateBookingResponse struct {
	// The created booking
	Booking *Booking `protobuf:"bytes,1,opt,name=booking" 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.
	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption" 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.
	BookingFailure *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure" json:"booking_failure,omitempty"`
}

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

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 update a [ext.maps.booking.partner.v2.Booking]
type UpdateBookingRequest struct {
	// Field mask of all booking fields to be updated
	UpdateMask *google_protobuf1.FieldMask `protobuf:"bytes,1,opt,name=update_mask,json=updateMask" json:"update_mask,omitempty"`
	// The booking to be updated
	// The following fields can be set in a booking:
	// - status, to cancel a booking.
	// - start_time and duration in the slot, to reschedule a booking.
	Booking *Booking `protobuf:"bytes,2,opt,name=booking" json:"booking,omitempty"`
}

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

func (m *UpdateBookingRequest) GetUpdateMask() *google_protobuf1.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

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

// Response with the updated [ext.maps.booking.partner.v2.Booking]
type UpdateBookingResponse struct {
	// The updated booking
	Booking *Booking `protobuf:"bytes,1,opt,name=booking" 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.
	UserPaymentOption *UserPaymentOption `protobuf:"bytes,2,opt,name=user_payment_option,json=userPaymentOption" json:"user_payment_option,omitempty"`
	// If updating a booking fails, this field should reflect the business logic
	// error (e.g., booking is not cancellable)
	BookingFailure *BookingFailure `protobuf:"bytes,3,opt,name=booking_failure,json=bookingFailure" json:"booking_failure,omitempty"`
}

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

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
}

// Request to get booking status and prepayment status for a
// [ext.maps.booking.partner.v2.Booking]
type GetBookingStatusRequest struct {
	// ID of the existing booking
	BookingId string `protobuf:"bytes,1,opt,name=booking_id,json=bookingId" json:"booking_id,omitempty"`
}

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

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

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

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

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 list all bookings for a user
type ListBookingsRequest struct {
	// ID of the user
	UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId" json:"user_id,omitempty"`
}

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

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

// Response for the [ext.maps.booking.partner.v2.ListBookings] RPC with all
// bookings for the requested user
type ListBookingsResponse struct {
	// All bookings of the user
	Bookings []*Booking `protobuf:"bytes,1,rep,name=bookings" json:"bookings,omitempty"`
}

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

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

func init() {
	proto.RegisterType((*Slot)(nil), "ext.maps.booking.partner.v2.Slot")
	proto.RegisterType((*Lease)(nil), "ext.maps.booking.partner.v2.Lease")
	proto.RegisterType((*LeaseReference)(nil), "ext.maps.booking.partner.v2.LeaseReference")
	proto.RegisterType((*Booking)(nil), "ext.maps.booking.partner.v2.Booking")
	proto.RegisterType((*UserInformation)(nil), "ext.maps.booking.partner.v2.UserInformation")
	proto.RegisterType((*PostalAddress)(nil), "ext.maps.booking.partner.v2.PostalAddress")
	proto.RegisterType((*PaymentProcessingParameters)(nil), "ext.maps.booking.partner.v2.PaymentProcessingParameters")
	proto.RegisterType((*Price)(nil), "ext.maps.booking.partner.v2.Price")
	proto.RegisterType((*UserPaymentOption)(nil), "ext.maps.booking.partner.v2.UserPaymentOption")
	proto.RegisterType((*PaymentInformation)(nil), "ext.maps.booking.partner.v2.PaymentInformation")
	proto.RegisterType((*BookingFailure)(nil), "ext.maps.booking.partner.v2.BookingFailure")
	proto.RegisterType((*Resources)(nil), "ext.maps.booking.partner.v2.Resources")
	proto.RegisterType((*CheckAvailabilityRequest)(nil), "ext.maps.booking.partner.v2.CheckAvailabilityRequest")
	proto.RegisterType((*CheckAvailabilityResponse)(nil), "ext.maps.booking.partner.v2.CheckAvailabilityResponse")
	proto.RegisterType((*CreateLeaseRequest)(nil), "ext.maps.booking.partner.v2.CreateLeaseRequest")
	proto.RegisterType((*CreateLeaseResponse)(nil), "ext.maps.booking.partner.v2.CreateLeaseResponse")
	proto.RegisterType((*CreateBookingRequest)(nil), "ext.maps.booking.partner.v2.CreateBookingRequest")
	proto.RegisterType((*CreateBookingResponse)(nil), "ext.maps.booking.partner.v2.CreateBookingResponse")
	proto.RegisterType((*UpdateBookingRequest)(nil), "ext.maps.booking.partner.v2.UpdateBookingRequest")
	proto.RegisterType((*UpdateBookingResponse)(nil), "ext.maps.booking.partner.v2.UpdateBookingResponse")
	proto.RegisterType((*GetBookingStatusRequest)(nil), "ext.maps.booking.partner.v2.GetBookingStatusRequest")
	proto.RegisterType((*GetBookingStatusResponse)(nil), "ext.maps.booking.partner.v2.GetBookingStatusResponse")
	proto.RegisterType((*ListBookingsRequest)(nil), "ext.maps.booking.partner.v2.ListBookingsRequest")
	proto.RegisterType((*ListBookingsResponse)(nil), "ext.maps.booking.partner.v2.ListBookingsResponse")
	proto.RegisterEnum("ext.maps.booking.partner.v2.PaymentOptionType", PaymentOptionType_name, PaymentOptionType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v2.BookingStatus", BookingStatus_name, BookingStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v2.PrepaymentStatus", PrepaymentStatus_name, PrepaymentStatus_value)
	proto.RegisterEnum("ext.maps.booking.partner.v2.PaymentProcessingParameters_PaymentProcessor", PaymentProcessingParameters_PaymentProcessor_name, PaymentProcessingParameters_PaymentProcessor_value)
	proto.RegisterEnum("ext.maps.booking.partner.v2.PaymentInformation_PaymentProcessedBy", PaymentInformation_PaymentProcessedBy_name, PaymentInformation_PaymentProcessedBy_value)
	proto.RegisterEnum("ext.maps.booking.partner.v2.BookingFailure_Cause", BookingFailure_Cause_name, BookingFailure_Cause_value)
	proto.RegisterEnum("ext.maps.booking.partner.v2.BookingFailure_CreditCardType", BookingFailure_CreditCardType_name, BookingFailure_CreditCardType_value)
	proto.RegisterEnum("ext.maps.booking.partner.v2.CheckAvailabilityResponse_DurationRequirement", CheckAvailabilityResponse_DurationRequirement_name, CheckAvailabilityResponse_DurationRequirement_value)
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// Client API for BookingService service

type BookingServiceClient interface {
	// Gets availability information for an appointment slot
	CheckAvailability(ctx context.Context, in *CheckAvailabilityRequest, opts ...grpc.CallOption) (*CheckAvailabilityResponse, error)
	// Creates a new lease
	CreateLease(ctx context.Context, in *CreateLeaseRequest, opts ...grpc.CallOption) (*CreateLeaseResponse, error)
	// Creates a booking
	CreateBooking(ctx context.Context, in *CreateBookingRequest, opts ...grpc.CallOption) (*CreateBookingResponse, error)
	// Updates an existing booking
	UpdateBooking(ctx context.Context, in *UpdateBookingRequest, opts ...grpc.CallOption) (*UpdateBookingResponse, error)
	// Gets status for an existing booking
	GetBookingStatus(ctx context.Context, in *GetBookingStatusRequest, opts ...grpc.CallOption) (*GetBookingStatusResponse, error)
	// Lists all bookings for a user
	ListBookings(ctx context.Context, in *ListBookingsRequest, opts ...grpc.CallOption) (*ListBookingsResponse, error)
}

type bookingServiceClient struct {
	cc *grpc.ClientConn
}

func NewBookingServiceClient(cc *grpc.ClientConn) BookingServiceClient {
	return &bookingServiceClient{cc}
}

func (c *bookingServiceClient) CheckAvailability(ctx context.Context, in *CheckAvailabilityRequest, opts ...grpc.CallOption) (*CheckAvailabilityResponse, error) {
	out := new(CheckAvailabilityResponse)
	err := grpc.Invoke(ctx, "/ext.maps.booking.partner.v2.BookingService/CheckAvailability", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bookingServiceClient) CreateLease(ctx context.Context, in *CreateLeaseRequest, opts ...grpc.CallOption) (*CreateLeaseResponse, error) {
	out := new(CreateLeaseResponse)
	err := grpc.Invoke(ctx, "/ext.maps.booking.partner.v2.BookingService/CreateLease", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bookingServiceClient) CreateBooking(ctx context.Context, in *CreateBookingRequest, opts ...grpc.CallOption) (*CreateBookingResponse, error) {
	out := new(CreateBookingResponse)
	err := grpc.Invoke(ctx, "/ext.maps.booking.partner.v2.BookingService/CreateBooking", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bookingServiceClient) UpdateBooking(ctx context.Context, in *UpdateBookingRequest, opts ...grpc.CallOption) (*UpdateBookingResponse, error) {
	out := new(UpdateBookingResponse)
	err := grpc.Invoke(ctx, "/ext.maps.booking.partner.v2.BookingService/UpdateBooking", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bookingServiceClient) GetBookingStatus(ctx context.Context, in *GetBookingStatusRequest, opts ...grpc.CallOption) (*GetBookingStatusResponse, error) {
	out := new(GetBookingStatusResponse)
	err := grpc.Invoke(ctx, "/ext.maps.booking.partner.v2.BookingService/GetBookingStatus", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *bookingServiceClient) ListBookings(ctx context.Context, in *ListBookingsRequest, opts ...grpc.CallOption) (*ListBookingsResponse, error) {
	out := new(ListBookingsResponse)
	err := grpc.Invoke(ctx, "/ext.maps.booking.partner.v2.BookingService/ListBookings", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Server API for BookingService service

type BookingServiceServer interface {
	// Gets availability information for an appointment slot
	CheckAvailability(context.Context, *CheckAvailabilityRequest) (*CheckAvailabilityResponse, error)
	// Creates a new lease
	CreateLease(context.Context, *CreateLeaseRequest) (*CreateLeaseResponse, error)
	// Creates a booking
	CreateBooking(context.Context, *CreateBookingRequest) (*CreateBookingResponse, error)
	// Updates an existing booking
	UpdateBooking(context.Context, *UpdateBookingRequest) (*UpdateBookingResponse, error)
	// Gets status for an existing booking
	GetBookingStatus(context.Context, *GetBookingStatusRequest) (*GetBookingStatusResponse, error)
	// Lists all bookings for a user
	ListBookings(context.Context, *ListBookingsRequest) (*ListBookingsResponse, error)
}

func RegisterBookingServiceServer(s *grpc.Server, srv BookingServiceServer) {
	s.RegisterService(&_BookingService_serviceDesc, srv)
}

func _BookingService_CheckAvailability_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CheckAvailabilityRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BookingServiceServer).CheckAvailability(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/ext.maps.booking.partner.v2.BookingService/CheckAvailability",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BookingServiceServer).CheckAvailability(ctx, req.(*CheckAvailabilityRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BookingService_CreateLease_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateLeaseRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BookingServiceServer).CreateLease(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/ext.maps.booking.partner.v2.BookingService/CreateLease",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BookingServiceServer).CreateLease(ctx, req.(*CreateLeaseRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BookingService_CreateBooking_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateBookingRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BookingServiceServer).CreateBooking(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/ext.maps.booking.partner.v2.BookingService/CreateBooking",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BookingServiceServer).CreateBooking(ctx, req.(*CreateBookingRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BookingService_UpdateBooking_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateBookingRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BookingServiceServer).UpdateBooking(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/ext.maps.booking.partner.v2.BookingService/UpdateBooking",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BookingServiceServer).UpdateBooking(ctx, req.(*UpdateBookingRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BookingService_GetBookingStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetBookingStatusRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BookingServiceServer).GetBookingStatus(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/ext.maps.booking.partner.v2.BookingService/GetBookingStatus",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BookingServiceServer).GetBookingStatus(ctx, req.(*GetBookingStatusRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BookingService_ListBookings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListBookingsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BookingServiceServer).ListBookings(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/ext.maps.booking.partner.v2.BookingService/ListBookings",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BookingServiceServer).ListBookings(ctx, req.(*ListBookingsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _BookingService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "ext.maps.booking.partner.v2.BookingService",
	HandlerType: (*BookingServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "CheckAvailability",
			Handler:    _BookingService_CheckAvailability_Handler,
		},
		{
			MethodName: "CreateLease",
			Handler:    _BookingService_CreateLease_Handler,
		},
		{
			MethodName: "CreateBooking",
			Handler:    _BookingService_CreateBooking_Handler,
		},
		{
			MethodName: "UpdateBooking",
			Handler:    _BookingService_UpdateBooking_Handler,
		},
		{
			MethodName: "GetBookingStatus",
			Handler:    _BookingService_GetBookingStatus_Handler,
		},
		{
			MethodName: "ListBookings",
			Handler:    _BookingService_ListBookings_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "booking_service.proto",
}

func init() { proto.RegisterFile("booking_service.proto", fileDescriptor0) }

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