Add waitlist api and update the service intake form fields
diff --git a/README.md b/README.md
index d35cf2e..e348a0a 100644
--- a/README.md
+++ b/README.md
@@ -5,9 +5,9 @@
 
 ## Testing Client
 
-Before using either the order based or booking based test utilites, the Go
-programming language must be installed on your workstation. A precompiled Go
-binary for your operating system can be [found here](https://golang.org/dl/)
+Before using the test utilites, the Go programming language must be installed on
+your workstation. A precompiled Go binary for your operating system can be
+[found here](https://golang.org/dl/)
 
 This guide will assume you're using the default GOPATH and subsequent GOBIN.
 For a comprehensive explanation of the GOPATH env variable please see
@@ -52,6 +52,10 @@
 
     go install $HOME/go/src/github.com/maps-booking-v3/testclient/bookingClient.go
 
+Or the waitlist based test client, run
+
+    go install $HOME/go/src/github.com/maps-booking-v3/testclient/waitlistClient.go
+
 ### Installing the utilities with Windows Powershell
 
 First, build your Go directory structure. A comprehensive guide on the intended
@@ -90,6 +94,10 @@
 
     go install $env:HOME\go\src\github.com\maps-booking-v3\testclient\bookingClient.go
 
+Or the waitlist based test client, run
+
+    go install $env:HOME\go\src\github.com\maps-booking-v3\testclient\waitlistClient.go
+
 ### Using the utilities
 
 After following the install steps above an executable should now live under the
@@ -175,6 +183,36 @@
     -output_to_terminal bool
         Output to terminal rather than a file.
 
+    waitlistClient.go
+    -server_addr string
+        Your http server's address in the format of host:port (default "example.com:80")
+    -service_feed string
+        Absolute path to service feed required for all tests except health. Feeds can be in either json or pb3 format.
+    -all_tests
+        Whether to test all endpoints syncronously.
+    -health_check_test
+        Whether to test the Health endpoint.
+    -batch_get_wait_estimates_test
+        Whether to test the BatchGetWaitEstimates endpoint.
+    -create_waitlist_entry_test
+        Whether to test the CreateWaitlistEntry endpoint.
+    -get_waitlist_entry_test
+        Whether to test the GetWaitlistEntry endpoint.
+    -delete_waitlist_entry_test
+        Whether to test the DeleteWaitlistEntry endpoint.
+    -ca_file string
+        Absolute path to your server's Certificate Authority root cert. Downloading all roots currently recommended by the Google Internet Authority is a suitable alternative https://pki.google.com/roots.pem. Leave blank to connect using http rather than https.
+    -credentials_file string
+        File containing credentials for your server. Leave blank to bypass authentication. File should have exactly one line of the form 'username:password'.
+    -full_server_name string
+        Fully qualified domain name. Same name used to sign CN. Only necessary if ca_file is specified and the base URL differs from the server address.
+    -num_test_services int
+        Maximum number of services to test from service_feed. Services will be selected randomly (default 10)
+    -output_dir string
+        Absolute path of dir to dump log file.
+    -output_to_terminal bool
+        Output to terminal rather than a file.
+
 Plese note that this testing tool makes reservations as a test user with
 **user_id = 0**. Therefore, if you are running the tool many times, or before
 final tests, you might want cancel all previous bookings for that user to make
@@ -188,18 +226,20 @@
 
     bin/orderClient -server_addr="external-dns:443" -all_tests=true -output_dir="/tmp" -availability_feed="/tmp/test.json" -service_feed="/tmp/service.json"
 
+    bin/waitlistClient -server_addr="external-dns:443" -all_tests=true -output_dir="/tmp" service_feed="/tmp/service.json"
+
 ### Testing
 
-It is important that as part of testing you verify all aspects of booking server
+It is important that as part of testing you verify all aspects of the server
 invocation - authentication, availability, cancellation, and rescheduling tests.
 As the final step, you must be able to execute the designated utility with the
 flag -all_tests=true and it should successfully pass the entire series of tests.
 
 ### Parsing the output
 
-Both test utilities will output a file with the prefix 'http_test_client_log_'
-followed by a timestamp in RFC3339 format. The output file contains a
-complete log of all Requests and Responses sent/received by the testing tool as
-well as diffs of the expected response in the event of errors.
-Similar to a compiler, an overview of the entire run can be found at the end
-of the file for user friendly digestion.
+The test utilities will output a file with the prefix 'http_test_client_log_'
+followed by a timestamp in RFC3339 format. The output file contains a complete
+log of all Requests and Responses sent/received by the testing tool as well as
+diffs of the expected response in the event of errors. Similar to a compiler, an
+overview of the entire run can be found at the end of the file for user friendly
+digestion.
diff --git a/api/api.go b/api/api.go
index 7b0a202..3d487fa 100644
--- a/api/api.go
+++ b/api/api.go
@@ -40,6 +40,7 @@
 
 	fpb "github.com/maps-booking-v3/feeds"
 	mpb "github.com/maps-booking-v3/v3"
+	wpb "github.com/maps-booking-v3/waitlist"
 )
 
 const (
@@ -589,3 +590,160 @@
 
 	return nil
 }
+
+// BatchGetWaitEstimates calls the partners API and verifies the returned WaitEstimates.
+func BatchGetWaitEstimates(s *fpb.Service, conn *HTTPConnection) error {
+	rules := s.GetWaitlistRules()
+
+	ps := make([]int32, rules.GetMaxPartySize()-rules.GetMinPartySize())
+	for i := range ps {
+		ps[i] = rules.GetMinPartySize() + int32(i)
+	}
+	reqPB := &wpb.BatchGetWaitEstimatesRequest{
+		MerchantId: s.GetMerchantId(),
+		ServiceId:  s.GetServiceId(),
+		PartySize:  ps,
+	}
+	req, err := conn.marshaler.MarshalToString(reqPB)
+	if err != nil {
+		return fmt.Errorf("Could not convert pb3 to json: %v", reqPB)
+	}
+	httpResp, err := sendRequest("BatchGetWaitEstimates", req, conn)
+	if err != nil {
+		return fmt.Errorf("invalid response. BatchGetWaitEstimates yielded error: %v", err)
+	}
+	var resp wpb.BatchGetWaitEstimatesResponse
+	if err := jsonpb.UnmarshalString(httpResp, &resp); err != nil {
+		return fmt.Errorf("BatchGetWaitEstimates: Could not parse HTTP response to pb3: %v", err)
+	}
+
+	if resp.GetWaitlistStatus() == wpb.WaitlistStatus_WAITLIST_STATUS_UNSPECIFIED {
+		return errors.New("BatchGetWaitEstimates: waitlist status was not specified in response")
+	} else if resp.GetWaitlistStatus() != wpb.WaitlistStatus_OPEN {
+		// Waitlist is closed. No further validation necessary.
+		return nil
+	}
+
+	// Waitlist status is OPEN
+	for _, we := range resp.GetWaitEstimate() {
+		if err := utils.ValidateWaitEstimate(we); err != nil {
+			return fmt.Errorf("BatchGetWaitEstimates invalid, %s, service id: %s",
+				err.Error(), s.GetServiceId())
+		} else if we.GetPartySize() > rules.GetMaxPartySize() ||
+			we.GetPartySize() < rules.GetMinPartySize() {
+			return fmt.Errorf("batchGetWaitEstimates: Party size outside of min/max for service id: %s."+
+				"returned party size: %d, min party size: %d, max party size: %d",
+				s.GetServiceId(), we.GetPartySize(), rules.GetMinPartySize(), rules.GetMaxPartySize())
+		}
+	}
+	return nil
+}
+
+// CreateWaitlistEntry attempts to create waitlist entries from a service.
+// The max party size listed for the service's waitlist rules is used for
+// the waitlist entry's party size.
+func CreateWaitlistEntry(s *fpb.Service, conn *HTTPConnection) (string, error) {
+	gen := rand.New(rand.NewSource(time.Now().UnixNano()))
+
+	reqPB := &wpb.CreateWaitlistEntryRequest{
+		MerchantId: s.GetMerchantId(),
+		ServiceId:  s.GetServiceId(),
+		PartySize:  s.GetWaitlistRules().GetMaxPartySize(),
+		UserInformation: &wpb.UserInformation{
+			UserId:     userID,
+			GivenName:  firstName,
+			FamilyName: lastName,
+			Telephone:  telephone,
+			Email:      email,
+		},
+		IdempotencyToken: strconv.Itoa(gen.Intn(1000000)),
+	}
+	if s.GetWaitlistRules().GetSupportsAdditionalRequest() {
+		reqPB.AdditionalRequest = "test additional request"
+	}
+	req, err := conn.marshaler.MarshalToString(reqPB)
+	if err != nil {
+		return "", fmt.Errorf("Could not convert pb3 to json: %v", reqPB)
+	}
+
+	httpResp, err := sendRequest("CreateWaitlistEntry", req, conn)
+	if err != nil {
+		return "", fmt.Errorf("invalid response. CreateWaitlistEntry  yielded error: %v", err)
+	}
+	var resp wpb.CreateWaitlistEntryResponse
+	if err := jsonpb.UnmarshalString(httpResp, &resp); err != nil {
+		return "", fmt.Errorf("CreateWaitlistEntry: Could not parse HTTP response to pb3: %v", err)
+	}
+
+	if resp.GetWaitlistBusinessLogicFailure() != nil {
+		return "", fmt.Errorf("invalid response. CreateWaitlistEntry failed with business logic failure %v",
+			resp.GetWaitlistBusinessLogicFailure())
+	}
+
+	if resp.GetWaitlistEntryId() == "" {
+		return "", fmt.Errorf("invalid response. CreateWaitlistEntry missing waitlist entry id for service: %s",
+			s.GetServiceId())
+	}
+
+	// Perform idempotency test.
+	log.Printf("Idempotency check -- CreateWaitlistEntry Request. Sent(unix): %s, Request %s", time.Now().UTC().Format(time.RFC850), reqPB.String())
+	idemHTTPResp, err := sendRequest("CreateWaitlistEntry", req, conn)
+	if err != nil {
+		return "", fmt.Errorf("invalid response. Idempotency check yielded error: %v", err)
+	}
+	var idemResp wpb.CreateWaitlistEntryResponse
+	if err := jsonpb.UnmarshalString(idemHTTPResp, &idemResp); err != nil {
+		return "", fmt.Errorf("CreateWaitlistEntry idem: Could not parse HTTP response to pb3: %v", err)
+	}
+
+	if diff := cmp.Diff(idemResp, resp); diff != "" {
+		return "", fmt.Errorf("Idempotency check invalid (-got +want)\n%s for service: %s", diff, s.GetServiceId())
+	}
+
+	return resp.GetWaitlistEntryId(), nil
+}
+
+// GetWaitlistEntry retrieves and validates the booking for the specified
+// waitlist entry id.
+func GetWaitlistEntry(id string, conn *HTTPConnection) (*wpb.WaitlistEntry, error) {
+	reqPB := &wpb.GetWaitlistEntryRequest{
+		WaitlistEntryId: id,
+	}
+
+	req, err := conn.marshaler.MarshalToString(reqPB)
+	if err != nil {
+		return nil, fmt.Errorf("Could not convert pb3 to json: %v", reqPB)
+	}
+	httpResp, err := sendRequest("GetWaitlistEntry", req, conn)
+	if err != nil {
+		return nil, fmt.Errorf("invalid response. GetWaitlistEntry yielded error: %v", err)
+	}
+	var resp wpb.GetWaitlistEntryResponse
+	if err := jsonpb.UnmarshalString(httpResp, &resp); err != nil {
+		return nil, fmt.Errorf("GetWaitlistEntry: Could not parse HTTP response to pb3: %v", err)
+	}
+
+	if iE := utils.ValidateWaitlistEntry(resp.GetWaitlistEntry()); iE != nil {
+		return nil, fmt.Errorf("invalid response. GetWaitlistEntry: %s", iE.Error())
+	}
+
+	return resp.GetWaitlistEntry(), nil
+}
+
+// DeleteWaitlistEntry makes a request to delete the waitlist entry.
+func DeleteWaitlistEntry(id string, conn *HTTPConnection) error {
+	reqPB := &wpb.DeleteWaitlistEntryRequest{
+		WaitlistEntryId: id,
+	}
+
+	req, err := conn.marshaler.MarshalToString(reqPB)
+	if err != nil {
+		return fmt.Errorf("Could not convert pb3 to json: %v", reqPB)
+	}
+
+	if _, err = sendRequest("DeleteWaitlistEntry", req, conn); err != nil {
+		return fmt.Errorf("invalid response. DeleteWaitlistEntry yielded error: %v", err)
+	}
+
+	return nil
+}
diff --git a/feeds/feeds.pb.go b/feeds/feeds.pb.go
index e9fa181..3766f8b 100644
--- a/feeds/feeds.pb.go
+++ b/feeds/feeds.pb.go
@@ -1,42 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // source: feeds.proto
 
-/*
-Package maps_booking_feeds is a generated protocol buffer package.
-
-It is generated from these files:
-	feeds.proto
-
-It has these top-level messages:
-	FeedMetadata
-	AvailabilityFeed
-	ServiceAvailability
-	Availability
-	Resources
-	TimeRange
-	ServiceFeed
-	Service
-	Price
-	SchedulingRules
-	TaxRate
-	ServiceIntakeFormField
-	ServiceIntakeForm
-	Deposit
-	NoShowFee
-	PriceType
-	RequireCreditCard
-	ActionLink
-	ActionPlatform
-	TicketType
-	RelatedMedia
-	ServiceAttributeValueId
-*/
-
 package maps_booking_feeds
 
-import proto "github.com/golang/protobuf/proto"
-import fmt "fmt"
-import math "math"
+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
@@ -68,6 +39,7 @@
 	0: "FIXED_RATE_DEFAULT",
 	1: "PER_PERSON",
 }
+
 var PriceType_value = map[string]int32{
 	"FIXED_RATE_DEFAULT": 0,
 	"PER_PERSON":         1,
@@ -76,8 +48,9 @@
 func (x PriceType) String() string {
 	return proto.EnumName(PriceType_name, int32(x))
 }
+
 func (PriceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{0}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{0}
 }
 
 // Defines whether a credit card is required in order to book an appointment.
@@ -103,6 +76,7 @@
 	1: "REQUIRE_CREDIT_CARD_CONDITIONAL",
 	2: "REQUIRE_CREDIT_CARD_ALWAYS",
 }
+
 var RequireCreditCard_value = map[string]int32{
 	"REQUIRE_CREDIT_CARD_UNSPECIFIED": 0,
 	"REQUIRE_CREDIT_CARD_CONDITIONAL": 1,
@@ -112,8 +86,9 @@
 func (x RequireCreditCard) String() string {
 	return proto.EnumName(RequireCreditCard_name, int32(x))
 }
+
 func (RequireCreditCard) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{1}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
 }
 
 // The platform that the action is performed on. Web application is the general
@@ -142,6 +117,7 @@
 	3: "ACTION_PLATFORM_ANDROID",
 	4: "ACTION_PLATFORM_IOS",
 }
+
 var ActionPlatform_value = map[string]int32{
 	"ACTION_PLATFORM_UNSPECIFIED":     0,
 	"ACTION_PLATFORM_WEB_APPLICATION": 1,
@@ -153,8 +129,9 @@
 func (x ActionPlatform) String() string {
 	return proto.EnumName(ActionPlatform_name, int32(x))
 }
+
 func (ActionPlatform) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{2}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
 }
 
 type FeedMetadata_ProcessingInstruction int32
@@ -176,6 +153,7 @@
 	1: "PROCESS_AS_COMPLETE",
 	2: "PROCESS_AS_INCREMENTAL",
 }
+
 var FeedMetadata_ProcessingInstruction_value = map[string]int32{
 	"PROCESS_UNKNOWN":        0,
 	"PROCESS_AS_COMPLETE":    1,
@@ -185,8 +163,9 @@
 func (x FeedMetadata_ProcessingInstruction) String() string {
 	return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x))
 }
+
 func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{0, 0}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{0, 0}
 }
 
 // Enum to indicate the prepayment type.
@@ -210,6 +189,7 @@
 	2: "OPTIONAL",
 	3: "NOT_SUPPORTED",
 }
+
 var Service_PrepaymentType_value = map[string]int32{
 	"PREPAYMENT_TYPE_UNSPECIFIED": 0,
 	"REQUIRED":                    1,
@@ -220,8 +200,9 @@
 func (x Service_PrepaymentType) String() string {
 	return proto.EnumName(Service_PrepaymentType_name, int32(x))
 }
+
 func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{7, 0}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 0}
 }
 
 type Service_ServiceType int32
@@ -241,6 +222,7 @@
 	3: "SERVICE_TYPE_EVENT_TICKET",
 	4: "SERVICE_TYPE_TRIP_TOUR",
 }
+
 var Service_ServiceType_value = map[string]int32{
 	"SERVICE_TYPE_UNSPECIFIED":        0,
 	"SERVICE_TYPE_DINING_RESERVATION": 1,
@@ -252,8 +234,9 @@
 func (x Service_ServiceType) String() string {
 	return proto.EnumName(Service_ServiceType_name, int32(x))
 }
+
 func (Service_ServiceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{7, 1}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 1}
 }
 
 // Enum to indicate the type of field.
@@ -285,6 +268,7 @@
 	5: "DROPDOWN",
 	6: "BOOLEAN",
 }
+
 var ServiceIntakeFormField_FieldType_value = map[string]int32{
 	"FIELD_TYPE_UNSPECIFIED": 0,
 	"SHORT_ANSWER":           1,
@@ -298,8 +282,9 @@
 func (x ServiceIntakeFormField_FieldType) String() string {
 	return proto.EnumName(ServiceIntakeFormField_FieldType_name, int32(x))
 }
+
 func (ServiceIntakeFormField_FieldType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{11, 0}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{11, 0}
 }
 
 // Enum to indicate the type of this media source. Only photos are supported.
@@ -318,6 +303,7 @@
 	0: "TYPE_UNSPECIFIED",
 	1: "PHOTO",
 }
+
 var RelatedMedia_MediaType_value = map[string]int32{
 	"TYPE_UNSPECIFIED": 0,
 	"PHOTO":            1,
@@ -326,8 +312,9 @@
 func (x RelatedMedia_MediaType) String() string {
 	return proto.EnumName(RelatedMedia_MediaType_name, int32(x))
 }
+
 func (RelatedMedia_MediaType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{17, 0}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{17, 0}
 }
 
 type FeedMetadata struct {
@@ -369,16 +356,17 @@
 func (m *FeedMetadata) String() string { return proto.CompactTextString(m) }
 func (*FeedMetadata) ProtoMessage()    {}
 func (*FeedMetadata) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{0}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{0}
 }
+
 func (m *FeedMetadata) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FeedMetadata.Unmarshal(m, b)
 }
 func (m *FeedMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_FeedMetadata.Marshal(b, m, deterministic)
 }
-func (dst *FeedMetadata) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FeedMetadata.Merge(dst, src)
+func (m *FeedMetadata) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FeedMetadata.Merge(m, src)
 }
 func (m *FeedMetadata) XXX_Size() int {
 	return xxx_messageInfo_FeedMetadata.Size(m)
@@ -436,16 +424,17 @@
 func (m *AvailabilityFeed) String() string { return proto.CompactTextString(m) }
 func (*AvailabilityFeed) ProtoMessage()    {}
 func (*AvailabilityFeed) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{1}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
 }
+
 func (m *AvailabilityFeed) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_AvailabilityFeed.Unmarshal(m, b)
 }
 func (m *AvailabilityFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_AvailabilityFeed.Marshal(b, m, deterministic)
 }
-func (dst *AvailabilityFeed) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AvailabilityFeed.Merge(dst, src)
+func (m *AvailabilityFeed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AvailabilityFeed.Merge(m, src)
 }
 func (m *AvailabilityFeed) XXX_Size() int {
 	return xxx_messageInfo_AvailabilityFeed.Size(m)
@@ -521,16 +510,17 @@
 func (m *ServiceAvailability) String() string { return proto.CompactTextString(m) }
 func (*ServiceAvailability) ProtoMessage()    {}
 func (*ServiceAvailability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{2}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
 }
+
 func (m *ServiceAvailability) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceAvailability.Unmarshal(m, b)
 }
 func (m *ServiceAvailability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ServiceAvailability.Marshal(b, m, deterministic)
 }
-func (dst *ServiceAvailability) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceAvailability.Merge(dst, src)
+func (m *ServiceAvailability) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ServiceAvailability.Merge(m, src)
 }
 func (m *ServiceAvailability) XXX_Size() int {
 	return xxx_messageInfo_ServiceAvailability.Size(m)
@@ -709,16 +699,17 @@
 func (m *Availability) String() string { return proto.CompactTextString(m) }
 func (*Availability) ProtoMessage()    {}
 func (*Availability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{3}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{3}
 }
+
 func (m *Availability) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Availability.Unmarshal(m, b)
 }
 func (m *Availability) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_Availability.Marshal(b, m, deterministic)
 }
-func (dst *Availability) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Availability.Merge(dst, src)
+func (m *Availability) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Availability.Merge(m, src)
 }
 func (m *Availability) XXX_Size() int {
 	return xxx_messageInfo_Availability.Size(m)
@@ -868,16 +859,17 @@
 func (m *Availability_Recurrence) String() string { return proto.CompactTextString(m) }
 func (*Availability_Recurrence) ProtoMessage()    {}
 func (*Availability_Recurrence) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{3, 0}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 0}
 }
+
 func (m *Availability_Recurrence) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Availability_Recurrence.Unmarshal(m, b)
 }
 func (m *Availability_Recurrence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_Availability_Recurrence.Marshal(b, m, deterministic)
 }
-func (dst *Availability_Recurrence) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Availability_Recurrence.Merge(dst, src)
+func (m *Availability_Recurrence) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Availability_Recurrence.Merge(m, src)
 }
 func (m *Availability_Recurrence) XXX_Size() int {
 	return xxx_messageInfo_Availability_Recurrence.Size(m)
@@ -929,16 +921,17 @@
 func (m *Availability_ScheduleException) String() string { return proto.CompactTextString(m) }
 func (*Availability_ScheduleException) ProtoMessage()    {}
 func (*Availability_ScheduleException) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{3, 1}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 1}
 }
+
 func (m *Availability_ScheduleException) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Availability_ScheduleException.Unmarshal(m, b)
 }
 func (m *Availability_ScheduleException) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_Availability_ScheduleException.Marshal(b, m, deterministic)
 }
-func (dst *Availability_ScheduleException) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Availability_ScheduleException.Merge(dst, src)
+func (m *Availability_ScheduleException) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Availability_ScheduleException.Merge(m, src)
 }
 func (m *Availability_ScheduleException) XXX_Size() int {
 	return xxx_messageInfo_Availability_ScheduleException.Size(m)
@@ -997,16 +990,17 @@
 func (m *Resources) String() string { return proto.CompactTextString(m) }
 func (*Resources) ProtoMessage()    {}
 func (*Resources) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{4}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{4}
 }
+
 func (m *Resources) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Resources.Unmarshal(m, b)
 }
 func (m *Resources) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_Resources.Marshal(b, m, deterministic)
 }
-func (dst *Resources) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Resources.Merge(dst, src)
+func (m *Resources) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Resources.Merge(m, src)
 }
 func (m *Resources) XXX_Size() int {
 	return xxx_messageInfo_Resources.Size(m)
@@ -1064,16 +1058,17 @@
 func (m *TimeRange) String() string { return proto.CompactTextString(m) }
 func (*TimeRange) ProtoMessage()    {}
 func (*TimeRange) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{5}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{5}
 }
+
 func (m *TimeRange) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TimeRange.Unmarshal(m, b)
 }
 func (m *TimeRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_TimeRange.Marshal(b, m, deterministic)
 }
-func (dst *TimeRange) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TimeRange.Merge(dst, src)
+func (m *TimeRange) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TimeRange.Merge(m, src)
 }
 func (m *TimeRange) XXX_Size() int {
 	return xxx_messageInfo_TimeRange.Size(m)
@@ -1110,16 +1105,17 @@
 func (m *ServiceFeed) String() string { return proto.CompactTextString(m) }
 func (*ServiceFeed) ProtoMessage()    {}
 func (*ServiceFeed) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{6}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{6}
 }
+
 func (m *ServiceFeed) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceFeed.Unmarshal(m, b)
 }
 func (m *ServiceFeed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ServiceFeed.Marshal(b, m, deterministic)
 }
-func (dst *ServiceFeed) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceFeed.Merge(dst, src)
+func (m *ServiceFeed) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ServiceFeed.Merge(m, src)
 }
 func (m *ServiceFeed) XXX_Size() int {
 	return xxx_messageInfo_ServiceFeed.Size(m)
@@ -1230,7 +1226,16 @@
 	// Rules to book/cancel an appointment. (optional)
 	Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules,proto3" json:"rules,omitempty"`
 	// Intake forms to customize the service. (optional)
-	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form,proto3" json:"form,omitempty"`
+	//
+	// Deprecated. Please see intake_form and per_ticket_intake_form.
+	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form,proto3" json:"form,omitempty"` // Deprecated: Do not use.
+	// A form requesting additional information from the user when they book this
+	// service. (optional)
+	IntakeForm *ServiceIntakeForm `protobuf:"bytes,20,opt,name=intake_form,json=intakeForm,proto3" json:"intake_form,omitempty"`
+	// A form requesting additional information from the user when they book this
+	// service. This form must be filled out once for each ticket the user is
+	// booking. (optional)
+	PerTicketIntakeForm *ServiceIntakeForm `protobuf:"bytes,21,opt,name=per_ticket_intake_form,json=perTicketIntakeForm,proto3" json:"per_ticket_intake_form,omitempty"`
 	// Whether a prepayment is required, optional or not supported. (optional)
 	PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,proto3,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"`
 	// The service's tax rate. If present this field overrides any tax_rate set at
@@ -1266,25 +1271,30 @@
 	// Each Service may have zero or more values for each service attribute
 	// defined in the corresponding Merchant.
 	ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId,proto3" json:"service_attribute_value_id,omitempty"`
-	XXX_NoUnkeyedLiteral    struct{}                   `json:"-"`
-	XXX_unrecognized        []byte                     `json:"-"`
-	XXX_sizecache           int32                      `json:"-"`
+	// Rules related to joining the waitlist. Should be populated if the service
+	// and merchant support waitlist functionality. Should not be populated
+	// otherwise.
+	WaitlistRules        *WaitlistRules `protobuf:"bytes,19,opt,name=waitlist_rules,json=waitlistRules,proto3" json:"waitlist_rules,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
 }
 
 func (m *Service) Reset()         { *m = Service{} }
 func (m *Service) String() string { return proto.CompactTextString(m) }
 func (*Service) ProtoMessage()    {}
 func (*Service) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{7}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{7}
 }
+
 func (m *Service) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Service.Unmarshal(m, b)
 }
 func (m *Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_Service.Marshal(b, m, deterministic)
 }
-func (dst *Service) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Service.Merge(dst, src)
+func (m *Service) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Service.Merge(m, src)
 }
 func (m *Service) XXX_Size() int {
 	return xxx_messageInfo_Service.Size(m)
@@ -1337,6 +1347,7 @@
 	return nil
 }
 
+// Deprecated: Do not use.
 func (m *Service) GetForm() []*ServiceIntakeForm {
 	if m != nil {
 		return m.Form
@@ -1344,6 +1355,20 @@
 	return nil
 }
 
+func (m *Service) GetIntakeForm() *ServiceIntakeForm {
+	if m != nil {
+		return m.IntakeForm
+	}
+	return nil
+}
+
+func (m *Service) GetPerTicketIntakeForm() *ServiceIntakeForm {
+	if m != nil {
+		return m.PerTicketIntakeForm
+	}
+	return nil
+}
+
 func (m *Service) GetPrepaymentType() Service_PrepaymentType {
 	if m != nil {
 		return m.PrepaymentType
@@ -1421,6 +1446,13 @@
 	return nil
 }
 
+func (m *Service) GetWaitlistRules() *WaitlistRules {
+	if m != nil {
+		return m.WaitlistRules
+	}
+	return nil
+}
+
 // The price of a service or a fee.
 type Price struct {
 	// The price in micro-units of the currency.
@@ -1443,16 +1475,17 @@
 func (m *Price) String() string { return proto.CompactTextString(m) }
 func (*Price) ProtoMessage()    {}
 func (*Price) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{8}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{8}
 }
+
 func (m *Price) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Price.Unmarshal(m, b)
 }
 func (m *Price) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_Price.Marshal(b, m, deterministic)
 }
-func (dst *Price) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Price.Merge(dst, src)
+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)
@@ -1505,16 +1538,17 @@
 func (m *SchedulingRules) String() string { return proto.CompactTextString(m) }
 func (*SchedulingRules) ProtoMessage()    {}
 func (*SchedulingRules) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{9}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{9}
 }
+
 func (m *SchedulingRules) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SchedulingRules.Unmarshal(m, b)
 }
 func (m *SchedulingRules) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_SchedulingRules.Marshal(b, m, deterministic)
 }
-func (dst *SchedulingRules) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SchedulingRules.Merge(dst, src)
+func (m *SchedulingRules) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SchedulingRules.Merge(m, src)
 }
 func (m *SchedulingRules) XXX_Size() int {
 	return xxx_messageInfo_SchedulingRules.Size(m)
@@ -1584,16 +1618,17 @@
 func (m *TaxRate) String() string { return proto.CompactTextString(m) }
 func (*TaxRate) ProtoMessage()    {}
 func (*TaxRate) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{10}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{10}
 }
+
 func (m *TaxRate) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TaxRate.Unmarshal(m, b)
 }
 func (m *TaxRate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_TaxRate.Marshal(b, m, deterministic)
 }
-func (dst *TaxRate) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TaxRate.Merge(dst, src)
+func (m *TaxRate) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TaxRate.Merge(m, src)
 }
 func (m *TaxRate) XXX_Size() int {
 	return xxx_messageInfo_TaxRate.Size(m)
@@ -1613,6 +1648,10 @@
 
 // Defines a field that is included in a ServiceIntakeForm.
 type ServiceIntakeFormField struct {
+	// A string from an aggregator partner which uniquely identifies a form field.
+	// This id should be the same as the id in the corresponding form field
+	// answer. (required)
+	Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"`
 	// The type of this field. (required)
 	Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,proto3,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"`
 	// The text shown to the user for this field. (required)
@@ -1631,16 +1670,17 @@
 func (m *ServiceIntakeFormField) String() string { return proto.CompactTextString(m) }
 func (*ServiceIntakeFormField) ProtoMessage()    {}
 func (*ServiceIntakeFormField) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{11}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{11}
 }
+
 func (m *ServiceIntakeFormField) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceIntakeFormField.Unmarshal(m, b)
 }
 func (m *ServiceIntakeFormField) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ServiceIntakeFormField.Marshal(b, m, deterministic)
 }
-func (dst *ServiceIntakeFormField) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceIntakeFormField.Merge(dst, src)
+func (m *ServiceIntakeFormField) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ServiceIntakeFormField.Merge(m, src)
 }
 func (m *ServiceIntakeFormField) XXX_Size() int {
 	return xxx_messageInfo_ServiceIntakeFormField.Size(m)
@@ -1651,6 +1691,13 @@
 
 var xxx_messageInfo_ServiceIntakeFormField proto.InternalMessageInfo
 
+func (m *ServiceIntakeFormField) GetId() string {
+	if m != nil {
+		return m.Id
+	}
+	return ""
+}
+
 func (m *ServiceIntakeFormField) GetType() ServiceIntakeFormField_FieldType {
 	if m != nil {
 		return m.Type
@@ -1684,11 +1731,11 @@
 	// Fields that will be displayed to the user. (required)
 	Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field,proto3" json:"field,omitempty"`
 	// If true, this form will be shown to first time customers.
-	// (one of first_time_customers or returning_customers required)
-	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers,proto3" json:"first_time_customers,omitempty"`
+	// Deprecated. This functionality is not supported for intake forms.
+	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers,proto3" json:"first_time_customers,omitempty"` // Deprecated: Do not use.
 	// If true, this form will be shown to repeat customers.
-	// (one of first_time_customers or returning_customers required)
-	ReturningCustomers   bool     `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers,proto3" json:"returning_customers,omitempty"`
+	// Deprecated. This functionality is not supported for intake forms.
+	ReturningCustomers   bool     `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers,proto3" json:"returning_customers,omitempty"` // Deprecated: Do not use.
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -1698,16 +1745,17 @@
 func (m *ServiceIntakeForm) String() string { return proto.CompactTextString(m) }
 func (*ServiceIntakeForm) ProtoMessage()    {}
 func (*ServiceIntakeForm) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{12}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{12}
 }
+
 func (m *ServiceIntakeForm) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceIntakeForm.Unmarshal(m, b)
 }
 func (m *ServiceIntakeForm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ServiceIntakeForm.Marshal(b, m, deterministic)
 }
-func (dst *ServiceIntakeForm) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceIntakeForm.Merge(dst, src)
+func (m *ServiceIntakeForm) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ServiceIntakeForm.Merge(m, src)
 }
 func (m *ServiceIntakeForm) XXX_Size() int {
 	return xxx_messageInfo_ServiceIntakeForm.Size(m)
@@ -1725,6 +1773,7 @@
 	return nil
 }
 
+// Deprecated: Do not use.
 func (m *ServiceIntakeForm) GetFirstTimeCustomers() bool {
 	if m != nil {
 		return m.FirstTimeCustomers
@@ -1732,6 +1781,7 @@
 	return false
 }
 
+// Deprecated: Do not use.
 func (m *ServiceIntakeForm) GetReturningCustomers() bool {
 	if m != nil {
 		return m.ReturningCustomers
@@ -1757,16 +1807,17 @@
 func (m *Deposit) String() string { return proto.CompactTextString(m) }
 func (*Deposit) ProtoMessage()    {}
 func (*Deposit) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{13}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{13}
 }
+
 func (m *Deposit) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Deposit.Unmarshal(m, b)
 }
 func (m *Deposit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_Deposit.Marshal(b, m, deterministic)
 }
-func (dst *Deposit) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Deposit.Merge(dst, src)
+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)
@@ -1815,16 +1866,17 @@
 func (m *NoShowFee) String() string { return proto.CompactTextString(m) }
 func (*NoShowFee) ProtoMessage()    {}
 func (*NoShowFee) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{14}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{14}
 }
+
 func (m *NoShowFee) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_NoShowFee.Unmarshal(m, b)
 }
 func (m *NoShowFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_NoShowFee.Marshal(b, m, deterministic)
 }
-func (dst *NoShowFee) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_NoShowFee.Merge(dst, src)
+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)
@@ -1872,16 +1924,17 @@
 func (m *ActionLink) String() string { return proto.CompactTextString(m) }
 func (*ActionLink) ProtoMessage()    {}
 func (*ActionLink) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{15}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{15}
 }
+
 func (m *ActionLink) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ActionLink.Unmarshal(m, b)
 }
 func (m *ActionLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ActionLink.Marshal(b, m, deterministic)
 }
-func (dst *ActionLink) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ActionLink.Merge(dst, src)
+func (m *ActionLink) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ActionLink.Merge(m, src)
 }
 func (m *ActionLink) XXX_Size() int {
 	return xxx_messageInfo_ActionLink.Size(m)
@@ -1942,16 +1995,17 @@
 func (m *TicketType) String() string { return proto.CompactTextString(m) }
 func (*TicketType) ProtoMessage()    {}
 func (*TicketType) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{16}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{16}
 }
+
 func (m *TicketType) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_TicketType.Unmarshal(m, b)
 }
 func (m *TicketType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_TicketType.Marshal(b, m, deterministic)
 }
-func (dst *TicketType) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TicketType.Merge(dst, src)
+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)
@@ -2002,16 +2056,17 @@
 func (m *RelatedMedia) String() string { return proto.CompactTextString(m) }
 func (*RelatedMedia) ProtoMessage()    {}
 func (*RelatedMedia) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{17}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{17}
 }
+
 func (m *RelatedMedia) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_RelatedMedia.Unmarshal(m, b)
 }
 func (m *RelatedMedia) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_RelatedMedia.Marshal(b, m, deterministic)
 }
-func (dst *RelatedMedia) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RelatedMedia.Merge(dst, src)
+func (m *RelatedMedia) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RelatedMedia.Merge(m, src)
 }
 func (m *RelatedMedia) XXX_Size() int {
 	return xxx_messageInfo_RelatedMedia.Size(m)
@@ -2061,16 +2116,17 @@
 func (m *ServiceAttributeValueId) String() string { return proto.CompactTextString(m) }
 func (*ServiceAttributeValueId) ProtoMessage()    {}
 func (*ServiceAttributeValueId) Descriptor() ([]byte, []int) {
-	return fileDescriptor_feeds_fc30b4ddff65807e, []int{18}
+	return fileDescriptor_7aa923a38d4cd9d3, []int{18}
 }
+
 func (m *ServiceAttributeValueId) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ServiceAttributeValueId.Unmarshal(m, b)
 }
 func (m *ServiceAttributeValueId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ServiceAttributeValueId.Marshal(b, m, deterministic)
 }
-func (dst *ServiceAttributeValueId) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ServiceAttributeValueId.Merge(dst, src)
+func (m *ServiceAttributeValueId) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ServiceAttributeValueId.Merge(m, src)
 }
 func (m *ServiceAttributeValueId) XXX_Size() int {
 	return xxx_messageInfo_ServiceAttributeValueId.Size(m)
@@ -2095,6 +2151,70 @@
 	return ""
 }
 
+// Rules related to joining the waitlist.
+type WaitlistRules struct {
+	// Required. Must be a positive integer for services providing waitlist
+	// functionality. If the service or merchant does not provide waitlist
+	// functionality, this must not be populated.
+	MinPartySize int32 `protobuf:"varint,1,opt,name=min_party_size,json=minPartySize,proto3" json:"min_party_size,omitempty"`
+	// Required. Must be a positive integer for services providing waitlist
+	// functionality. If the service or merchant does not provide waitlist
+	// functionality, this must not be populated.
+	MaxPartySize int32 `protobuf:"varint,2,opt,name=max_party_size,json=maxPartySize,proto3" json:"max_party_size,omitempty"`
+	// If true, the user will be able to send a free-form additional text request
+	// when joining the waitlist for this service.
+	SupportsAdditionalRequest bool     `protobuf:"varint,3,opt,name=supports_additional_request,json=supportsAdditionalRequest,proto3" json:"supports_additional_request,omitempty"`
+	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
+	XXX_unrecognized          []byte   `json:"-"`
+	XXX_sizecache             int32    `json:"-"`
+}
+
+func (m *WaitlistRules) Reset()         { *m = WaitlistRules{} }
+func (m *WaitlistRules) String() string { return proto.CompactTextString(m) }
+func (*WaitlistRules) ProtoMessage()    {}
+func (*WaitlistRules) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7aa923a38d4cd9d3, []int{19}
+}
+
+func (m *WaitlistRules) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WaitlistRules.Unmarshal(m, b)
+}
+func (m *WaitlistRules) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WaitlistRules.Marshal(b, m, deterministic)
+}
+func (m *WaitlistRules) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WaitlistRules.Merge(m, src)
+}
+func (m *WaitlistRules) XXX_Size() int {
+	return xxx_messageInfo_WaitlistRules.Size(m)
+}
+func (m *WaitlistRules) XXX_DiscardUnknown() {
+	xxx_messageInfo_WaitlistRules.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WaitlistRules proto.InternalMessageInfo
+
+func (m *WaitlistRules) GetMinPartySize() int32 {
+	if m != nil {
+		return m.MinPartySize
+	}
+	return 0
+}
+
+func (m *WaitlistRules) GetMaxPartySize() int32 {
+	if m != nil {
+		return m.MaxPartySize
+	}
+	return 0
+}
+
+func (m *WaitlistRules) GetSupportsAdditionalRequest() bool {
+	if m != nil {
+		return m.SupportsAdditionalRequest
+	}
+	return false
+}
+
 func init() {
 	proto.RegisterType((*FeedMetadata)(nil), "maps.booking.feeds.FeedMetadata")
 	proto.RegisterType((*AvailabilityFeed)(nil), "maps.booking.feeds.AvailabilityFeed")
@@ -2117,6 +2237,7 @@
 	proto.RegisterType((*TicketType)(nil), "maps.booking.feeds.TicketType")
 	proto.RegisterType((*RelatedMedia)(nil), "maps.booking.feeds.RelatedMedia")
 	proto.RegisterType((*ServiceAttributeValueId)(nil), "maps.booking.feeds.ServiceAttributeValueId")
+	proto.RegisterType((*WaitlistRules)(nil), "maps.booking.feeds.WaitlistRules")
 	proto.RegisterEnum("maps.booking.feeds.PriceType", PriceType_name, PriceType_value)
 	proto.RegisterEnum("maps.booking.feeds.RequireCreditCard", RequireCreditCard_name, RequireCreditCard_value)
 	proto.RegisterEnum("maps.booking.feeds.ActionPlatform", ActionPlatform_name, ActionPlatform_value)
@@ -2127,151 +2248,161 @@
 	proto.RegisterEnum("maps.booking.feeds.RelatedMedia_MediaType", RelatedMedia_MediaType_name, RelatedMedia_MediaType_value)
 }
 
-func init() { proto.RegisterFile("feeds.proto", fileDescriptor_feeds_fc30b4ddff65807e) }
+func init() { proto.RegisterFile("feeds.proto", fileDescriptor_7aa923a38d4cd9d3) }
 
-var fileDescriptor_feeds_fc30b4ddff65807e = []byte{
-	// 2281 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xdf, 0x72, 0xdb, 0xc6,
-	0xd5, 0x0f, 0x48, 0xd1, 0x24, 0x0f, 0x29, 0x09, 0x5c, 0x29, 0x12, 0x2c, 0xc7, 0xb1, 0x3e, 0xf8,
-	0xcb, 0x54, 0x95, 0x53, 0xa6, 0x95, 0x93, 0x4c, 0x32, 0x71, 0x93, 0x50, 0x20, 0x64, 0x61, 0x4c,
-	0x11, 0xf0, 0x12, 0xb2, 0xe3, 0xde, 0x6c, 0x20, 0x60, 0x45, 0x61, 0x4c, 0x02, 0xec, 0x02, 0x54,
-	0xac, 0xcc, 0xe4, 0xa6, 0x57, 0xbd, 0xec, 0x4c, 0xef, 0xfa, 0x04, 0xed, 0xd4, 0x0f, 0xd0, 0xc9,
-	0x5d, 0x9f, 0xa8, 0x0f, 0xd0, 0x9b, 0xce, 0x2e, 0x40, 0x10, 0x94, 0x20, 0xcb, 0x6d, 0x72, 0x23,
-	0x61, 0xcf, 0x39, 0xbf, 0xfd, 0x73, 0xce, 0x9e, 0xdf, 0x39, 0x4b, 0x68, 0x9c, 0x52, 0xea, 0x45,
-	0xed, 0x09, 0x0b, 0xe3, 0x10, 0xa1, 0xb1, 0x33, 0x89, 0xda, 0x27, 0x61, 0xf8, 0xd2, 0x0f, 0x86,
-	0x6d, 0xa1, 0x51, 0xff, 0x55, 0x82, 0xe6, 0x01, 0xa5, 0xde, 0x11, 0x8d, 0x1d, 0xcf, 0x89, 0x1d,
-	0x34, 0x86, 0x8d, 0x09, 0x0b, 0x5d, 0x1a, 0x45, 0x7e, 0x30, 0x24, 0x7e, 0x10, 0xc5, 0x6c, 0xea,
-	0xc6, 0x7e, 0x18, 0x28, 0xd2, 0xb6, 0xb4, 0xb3, 0xb2, 0xf7, 0x69, 0xfb, 0xea, 0x2c, 0xed, 0xfc,
-	0x0c, 0x6d, 0x2b, 0x83, 0x1b, 0x73, 0x34, 0x7e, 0x77, 0x52, 0x24, 0x46, 0xff, 0x07, 0xcd, 0xe8,
-	0xcc, 0x61, 0x1e, 0x09, 0xa6, 0xe3, 0x13, 0xca, 0x94, 0xd2, 0xb6, 0xb4, 0x53, 0xc1, 0x0d, 0x21,
-	0xeb, 0x0b, 0x11, 0x37, 0x89, 0xc3, 0xd8, 0x19, 0x11, 0x21, 0x8c, 0x94, 0x72, 0x62, 0x22, 0x64,
-	0x03, 0x21, 0x42, 0xeb, 0x50, 0x09, 0xc2, 0xc0, 0xa5, 0x4a, 0x65, 0x5b, 0xda, 0x59, 0xc2, 0xc9,
-	0x00, 0xfd, 0x06, 0xd6, 0x87, 0x34, 0xa0, 0xcc, 0xe1, 0x2b, 0x91, 0xd8, 0x1f, 0xd3, 0x28, 0x76,
-	0xc6, 0x13, 0x65, 0x69, 0x5b, 0xda, 0x29, 0xe3, 0xb5, 0xb9, 0xce, 0x9e, 0xa9, 0x54, 0x07, 0xde,
-	0x2d, 0xdc, 0x3e, 0x5a, 0x83, 0x55, 0x0b, 0x9b, 0x9a, 0x3e, 0x18, 0x90, 0xe3, 0xfe, 0x93, 0xbe,
-	0xf9, 0xbc, 0x2f, 0xbf, 0x83, 0x36, 0x61, 0x6d, 0x26, 0xec, 0x0c, 0x88, 0x66, 0x1e, 0x59, 0x3d,
-	0xdd, 0xd6, 0x65, 0x09, 0x6d, 0xc1, 0x46, 0x4e, 0x61, 0xf4, 0x35, 0xac, 0x1f, 0xe9, 0x7d, 0xbb,
-	0xd3, 0x93, 0x4b, 0xea, 0x6b, 0x09, 0xe4, 0xce, 0xb9, 0xe3, 0x8f, 0x9c, 0x13, 0x7f, 0xe4, 0xc7,
-	0x17, 0xdc, 0x77, 0xe8, 0x11, 0xd4, 0xc6, 0xa9, 0xff, 0x84, 0x9f, 0x1b, 0x7b, 0xdb, 0x37, 0xf9,
-	0x19, 0x67, 0x08, 0xf4, 0x3b, 0x58, 0x8f, 0x28, 0x3b, 0xf7, 0x5d, 0x4a, 0x9c, 0xdc, 0xcc, 0x4a,
-	0x69, 0xbb, 0xbc, 0xd3, 0xd8, 0xfb, 0x45, 0xd1, 0x4c, 0x83, 0xc4, 0x3e, 0xbf, 0x11, 0xbc, 0x16,
-	0x5d, 0x15, 0xaa, 0xff, 0x2e, 0xc1, 0x5a, 0x81, 0x31, 0xfa, 0x0c, 0x94, 0x28, 0x76, 0x58, 0x3c,
-	0xf7, 0x2b, 0x61, 0x34, 0x8a, 0x99, 0xef, 0xc6, 0xe2, 0x04, 0x65, 0xbc, 0x21, 0xf4, 0x99, 0x6f,
-	0x71, 0xaa, 0x45, 0x1f, 0xc3, 0x06, 0x0d, 0xbc, 0x22, 0x5c, 0x49, 0xe0, 0xd6, 0x69, 0xe0, 0x5d,
-	0x45, 0xfd, 0x1a, 0xd6, 0xc7, 0x94, 0xb9, 0x67, 0x4e, 0x10, 0x13, 0xdf, 0x9b, 0x63, 0xf8, 0x6d,
-	0xa8, 0x63, 0x34, 0xd3, 0x19, 0x5e, 0x86, 0x68, 0xc3, 0xec, 0x40, 0x0b, 0x80, 0x25, 0x01, 0x68,
-	0xa5, 0xaa, 0x9c, 0x7d, 0x0f, 0x10, 0xa3, 0x51, 0x38, 0x65, 0x2e, 0x8d, 0xe6, 0xe6, 0xb7, 0x44,
-	0x34, 0xee, 0x16, 0xf9, 0x10, 0xcf, 0xac, 0x71, 0x2b, 0x03, 0x66, 0xb3, 0x75, 0xa1, 0xb9, 0x10,
-	0x8b, 0x8a, 0x88, 0x45, 0x61, 0x54, 0x17, 0x82, 0xb0, 0x80, 0x52, 0x7f, 0xac, 0x42, 0x73, 0xc1,
-	0xed, 0xf7, 0xa0, 0x91, 0x73, 0x83, 0xf0, 0x74, 0x1d, 0xc3, 0xfc, 0xf4, 0xe8, 0x2e, 0xc0, 0xfc,
-	0xd4, 0xc2, 0xa3, 0x75, 0x5c, 0xcf, 0x0e, 0x8b, 0xee, 0x40, 0x3d, 0x09, 0x5b, 0x44, 0x5d, 0xe1,
-	0xbb, 0x32, 0xae, 0x09, 0xc1, 0x80, 0xba, 0x3c, 0xd3, 0xbc, 0x69, 0x9a, 0x2e, 0x5c, 0x9f, 0x24,
-	0x4a, 0x63, 0x26, 0xe3, 0x26, 0xf7, 0xa0, 0x11, 0x4d, 0xc2, 0x38, 0x22, 0x22, 0xfd, 0x44, 0xbe,
-	0x95, 0x31, 0x08, 0x91, 0xcd, 0x25, 0x62, 0x7d, 0x61, 0x10, 0x4e, 0x68, 0x20, 0xbc, 0x57, 0xc6,
-	0x75, 0x21, 0x31, 0x27, 0x34, 0x40, 0xbf, 0x04, 0x39, 0x7f, 0x40, 0x12, 0x3b, 0x43, 0xa5, 0x2a,
-	0x36, 0xb9, 0x9a, 0x97, 0xdb, 0xce, 0x10, 0x7d, 0x01, 0xf5, 0xcc, 0xad, 0x4a, 0xed, 0x6d, 0xc2,
-	0x30, 0xb7, 0x47, 0xbb, 0xd0, 0x9a, 0x38, 0x17, 0x63, 0x1a, 0xc4, 0x24, 0x9c, 0x88, 0x03, 0xf9,
-	0x9e, 0x52, 0xdf, 0x2e, 0xf3, 0x85, 0x52, 0x85, 0x29, 0xe4, 0x86, 0x87, 0x9e, 0x00, 0x30, 0xea,
-	0x4e, 0x19, 0xa3, 0x9c, 0x42, 0x40, 0xac, 0xf4, 0xe0, 0xa6, 0x40, 0xb5, 0x71, 0x06, 0xc1, 0x39,
-	0x38, 0x72, 0x00, 0x45, 0xee, 0x19, 0xf5, 0xa6, 0x23, 0x4a, 0xe8, 0x2b, 0x97, 0x8a, 0x45, 0x94,
-	0x86, 0x88, 0xfe, 0xde, 0x8d, 0x93, 0x0e, 0x52, 0xa8, 0x3e, 0x43, 0xe2, 0x56, 0x74, 0x59, 0x84,
-	0x3e, 0x81, 0xaa, 0x47, 0x27, 0x61, 0xe4, 0xc7, 0x4a, 0x53, 0x6c, 0xf6, 0x4e, 0xd1, 0xbc, 0xdd,
-	0xc4, 0x04, 0xcf, 0x6c, 0xd1, 0x6f, 0xa1, 0x11, 0x84, 0x24, 0x3a, 0x0b, 0xbf, 0x23, 0xa7, 0x94,
-	0x2a, 0xcb, 0xd7, 0x7b, 0xb4, 0x1f, 0x0e, 0xce, 0xc2, 0xef, 0x0e, 0x28, 0xc5, 0xf5, 0x60, 0xf6,
-	0x89, 0x8e, 0x61, 0x8d, 0xd1, 0xdf, 0x4f, 0x7d, 0x46, 0x89, 0xcb, 0xa8, 0xe7, 0xc7, 0xc4, 0x75,
-	0x98, 0xa7, 0xac, 0x88, 0xaa, 0xf0, 0x41, 0x71, 0x60, 0x84, 0xb9, 0x26, 0xac, 0x35, 0x87, 0x79,
-	0x3c, 0x4f, 0x2e, 0x89, 0xd0, 0xff, 0xc3, 0x4a, 0xec, 0xbb, 0x2f, 0x69, 0x4c, 0xe2, 0x8b, 0x89,
-	0xb8, 0xb3, 0xab, 0x22, 0x4a, 0xcd, 0x44, 0x6a, 0x5f, 0x4c, 0xa8, 0xe1, 0x6d, 0x7d, 0x0b, 0x30,
-	0xf7, 0x37, 0xda, 0x01, 0x99, 0xd1, 0x09, 0x75, 0x62, 0x32, 0x0d, 0x62, 0x7f, 0x24, 0xee, 0x6a,
-	0xc2, 0x39, 0x2b, 0x89, 0xfc, 0x98, 0x8b, 0xf9, 0x75, 0x9d, 0x5b, 0xd2, 0x73, 0xca, 0x2e, 0x84,
-	0x65, 0x52, 0x62, 0x52, 0x4b, 0x9d, 0x8b, 0x07, 0xd4, 0xdd, 0x7a, 0x0a, 0xad, 0x2b, 0xce, 0x47,
-	0x8f, 0x00, 0x38, 0x4d, 0x11, 0xe6, 0x04, 0x43, 0x9a, 0x12, 0x73, 0xa1, 0xc7, 0x38, 0x5f, 0x61,
-	0x6e, 0x84, 0xeb, 0xf1, 0xec, 0x53, 0xfd, 0x8b, 0x04, 0xf5, 0xec, 0x72, 0xa2, 0xdb, 0xc0, 0x13,
-	0xed, 0xf4, 0x74, 0x9e, 0xb6, 0x55, 0x31, 0x4e, 0x73, 0x56, 0xa8, 0x02, 0x67, 0x4c, 0xb3, 0x9c,
-	0xe5, 0x92, 0xbe, 0x33, 0xa6, 0x68, 0x13, 0xaa, 0x2c, 0x0c, 0xc7, 0x1c, 0x98, 0xb0, 0xdd, 0x2d,
-	0x3e, 0x4c, 0x92, 0x59, 0x28, 0x04, 0x2c, 0xe1, 0xb5, 0x1a, 0x17, 0x08, 0xd4, 0x5d, 0x80, 0x89,
-	0xc3, 0xe2, 0x0b, 0x12, 0xf9, 0xdf, 0x27, 0x85, 0xb1, 0x82, 0xeb, 0x42, 0x32, 0xf0, 0xbf, 0xa7,
-	0x6a, 0x07, 0xea, 0xd9, 0xa6, 0xf9, 0x44, 0x27, 0x74, 0xe8, 0x07, 0x39, 0x4f, 0xd6, 0x84, 0x80,
-	0xfb, 0x70, 0x13, 0xaa, 0x9c, 0xaf, 0x67, 0xae, 0x2b, 0xe3, 0x5b, 0x34, 0xf0, 0x06, 0xd4, 0x55,
-	0xff, 0x20, 0x41, 0x23, 0x2d, 0x0d, 0x3f, 0x43, 0x11, 0xfb, 0x04, 0xaa, 0x29, 0x4d, 0xa5, 0x75,
-	0xeb, 0xce, 0x1b, 0xea, 0x16, 0x9e, 0xd9, 0xaa, 0xaf, 0x01, 0xaa, 0xa9, 0xf0, 0x27, 0x93, 0x23,
-	0x82, 0x25, 0xe1, 0xca, 0xc4, 0xcb, 0xe2, 0x1b, 0x6d, 0x43, 0xc3, 0xa3, 0x91, 0xcb, 0xfc, 0x24,
-	0x91, 0x13, 0x2f, 0xe7, 0x45, 0xe8, 0x23, 0xa8, 0x4c, 0x98, 0x9f, 0x36, 0x1f, 0x8d, 0xbd, 0xdb,
-	0x45, 0xdb, 0xb6, 0xb8, 0x01, 0x4e, 0xec, 0xd0, 0xe7, 0x50, 0x61, 0xd3, 0x11, 0x8d, 0xd2, 0xda,
-	0x72, 0xbf, 0xf0, 0x9c, 0xc9, 0x5d, 0xf4, 0x83, 0x21, 0xe6, 0xa6, 0x38, 0x41, 0xa0, 0xcf, 0x61,
-	0xe9, 0x34, 0x64, 0x63, 0xa5, 0x2a, 0x3c, 0xf4, 0xc1, 0x1b, 0x3c, 0x64, 0x04, 0xb1, 0xf3, 0x92,
-	0x1e, 0x84, 0x6c, 0x8c, 0x05, 0x04, 0x0d, 0x60, 0x75, 0xc2, 0xe8, 0x8c, 0x14, 0x79, 0xb2, 0x09,
-	0x52, 0x5d, 0xd9, 0xdb, 0x7d, 0xc3, 0x2c, 0x6d, 0x2b, 0x83, 0xf0, 0x4c, 0xc4, 0x2b, 0x93, 0x85,
-	0x31, 0xfa, 0x14, 0x6a, 0xb1, 0xf3, 0x8a, 0x30, 0x27, 0xa6, 0x4a, 0xfd, 0x7a, 0x2e, 0xb2, 0x9d,
-	0x57, 0xd8, 0x89, 0x29, 0xae, 0xc6, 0xc9, 0x47, 0x31, 0x3d, 0x43, 0x31, 0x3d, 0xe7, 0xe8, 0xae,
-	0xf1, 0xbf, 0xd3, 0x5d, 0xf3, 0xe7, 0xa1, 0xbb, 0xe5, 0x9f, 0x48, 0x77, 0x5f, 0x41, 0xc3, 0x11,
-	0x1d, 0x25, 0x19, 0xf9, 0xc1, 0x4b, 0x65, 0x45, 0xc4, 0xf1, 0xfd, 0xc2, 0xba, 0x20, 0xcc, 0x7a,
-	0x7e, 0xf0, 0x12, 0x83, 0x93, 0x7d, 0xa3, 0x2f, 0x60, 0x49, 0xc4, 0x6e, 0x55, 0x6c, 0xe4, 0x4d,
-	0xbd, 0xdd, 0xec, 0xbf, 0x08, 0x9c, 0x00, 0xf1, 0xd5, 0x73, 0x64, 0xab, 0xc8, 0xd7, 0xaf, 0x6e,
-	0x67, 0xec, 0x8b, 0x61, 0xce, 0xc4, 0x48, 0x87, 0x65, 0x46, 0x47, 0x4e, 0x4c, 0x3d, 0x32, 0xa6,
-	0x9e, 0xef, 0x28, 0xad, 0xeb, 0xdb, 0x1a, 0x9c, 0x18, 0x1e, 0x71, 0x3b, 0xdc, 0x64, 0xb9, 0x11,
-	0x3a, 0x83, 0xad, 0xac, 0x61, 0x8d, 0x63, 0xe6, 0x9f, 0x4c, 0x63, 0x4a, 0xce, 0x9d, 0xd1, 0x54,
-	0xe4, 0x25, 0x12, 0x73, 0x3e, 0x78, 0x53, 0xdb, 0x3a, 0x03, 0x3d, 0xe3, 0x18, 0xc3, 0xc3, 0x9b,
-	0x51, 0xb1, 0x42, 0xfd, 0x16, 0x56, 0x16, 0xaf, 0x30, 0xba, 0x07, 0x77, 0x2c, 0xac, 0x5b, 0x9d,
-	0x17, 0xbc, 0x23, 0x27, 0xf6, 0x0b, 0x4b, 0x27, 0xc7, 0xfd, 0x81, 0xa5, 0x6b, 0xc6, 0x81, 0xa1,
-	0x77, 0xe5, 0x77, 0x50, 0x13, 0x6a, 0x58, 0x7f, 0x7a, 0x6c, 0x60, 0xbd, 0x2b, 0x4b, 0x7c, 0x64,
-	0x5a, 0xb6, 0x61, 0xf6, 0x79, 0xf3, 0x8e, 0x5a, 0xb0, 0xdc, 0x37, 0x6d, 0x32, 0x38, 0xb6, 0x2c,
-	0x13, 0xdb, 0x7a, 0x57, 0x2e, 0xab, 0x7f, 0x9f, 0xb3, 0xa0, 0x98, 0xff, 0x3d, 0x50, 0x06, 0x3a,
-	0x7e, 0x66, 0x68, 0x7a, 0xd1, 0xe4, 0xf7, 0xe1, 0xde, 0x82, 0xb6, 0x6b, 0xf4, 0x8d, 0xfe, 0x63,
-	0x82, 0x75, 0x2e, 0xed, 0xf0, 0x75, 0x64, 0x09, 0xbd, 0x0f, 0x5b, 0x0b, 0x46, 0x07, 0xa6, 0xd9,
-	0x25, 0x26, 0xee, 0xea, 0xd8, 0xe8, 0x3f, 0x96, 0x4b, 0xe8, 0x2e, 0xdc, 0x5e, 0xd0, 0xeb, 0xcf,
-	0xc4, 0x51, 0x0c, 0xed, 0x89, 0x6e, 0xcb, 0x65, 0xfe, 0xfa, 0x58, 0x50, 0xdb, 0xd8, 0xb0, 0x88,
-	0x6d, 0x1e, 0x63, 0x79, 0x49, 0xfd, 0x01, 0x2a, 0x82, 0x8b, 0x78, 0xaf, 0x27, 0xd8, 0x88, 0x8c,
-	0x7d, 0x97, 0x85, 0x51, 0xca, 0xfa, 0x0d, 0x21, 0x3b, 0x12, 0x22, 0x74, 0x1f, 0x96, 0xd3, 0x92,
-	0x7b, 0x41, 0xdc, 0xd0, 0x9b, 0x55, 0xa6, 0xe6, 0x4c, 0xa8, 0x85, 0x1e, 0x45, 0x1f, 0x02, 0xe2,
-	0x18, 0xfe, 0x58, 0x4c, 0x33, 0x99, 0xb7, 0x74, 0x09, 0x83, 0xca, 0xa9, 0x26, 0x49, 0x65, 0xdb,
-	0x19, 0xaa, 0x7f, 0x2e, 0xc1, 0xea, 0x25, 0x6a, 0xe3, 0x7d, 0xfa, 0xd8, 0x0f, 0x88, 0xe3, 0x9d,
-	0x3b, 0x81, 0x4b, 0x49, 0x1a, 0xf0, 0x74, 0x43, 0xad, 0xb1, 0x1f, 0x74, 0x12, 0xcd, 0x7e, 0xa2,
-	0x40, 0x5f, 0xc1, 0x7b, 0x79, 0xfb, 0x30, 0x18, 0xf9, 0x01, 0x25, 0x2e, 0x1f, 0xf0, 0x49, 0xd3,
-	0x22, 0x75, 0x7b, 0x0e, 0x34, 0x85, 0x85, 0x36, 0x33, 0x40, 0x4f, 0xe1, 0x5d, 0x7e, 0x17, 0x53,
-	0xc8, 0x28, 0xe9, 0x77, 0x39, 0x47, 0x94, 0x6f, 0x20, 0xf0, 0xfd, 0x92, 0x22, 0xe1, 0x35, 0x8e,
-	0xd5, 0x72, 0x50, 0xce, 0x16, 0x8f, 0x00, 0x82, 0x30, 0xe3, 0x9a, 0xa5, 0xb7, 0x99, 0xa7, 0x9e,
-	0x00, 0x0e, 0x28, 0x55, 0xdb, 0x50, 0x4d, 0x19, 0x92, 0xfb, 0x5c, 0x04, 0x84, 0x4c, 0x28, 0x73,
-	0x69, 0x90, 0xbc, 0xa5, 0x2a, 0xb8, 0x29, 0x84, 0x56, 0x22, 0x53, 0x7f, 0x2c, 0xc1, 0xc6, 0x15,
-	0x9a, 0x3f, 0xf0, 0xe9, 0xc8, 0x43, 0x87, 0x29, 0x3d, 0x24, 0x8f, 0xf5, 0x8f, 0xdf, 0xaa, 0x40,
-	0x08, 0x64, 0x5b, 0xfc, 0xcd, 0x71, 0xc5, 0x3a, 0x54, 0x46, 0xce, 0x09, 0x1d, 0xa5, 0x51, 0x4f,
-	0x06, 0x5c, 0x2a, 0xf2, 0x54, 0x29, 0x0b, 0xb2, 0x4e, 0x06, 0xbc, 0xf0, 0xfa, 0xfc, 0xcd, 0x24,
-	0xd8, 0xce, 0x13, 0xe7, 0xaf, 0x61, 0xf0, 0xa3, 0x94, 0x12, 0x3d, 0xf5, 0x8f, 0x12, 0xd4, 0xb3,
-	0x05, 0xf8, 0x05, 0x3d, 0x30, 0xf4, 0x5e, 0xb7, 0x28, 0x41, 0x64, 0x68, 0x0e, 0x0e, 0x4d, 0x6c,
-	0x93, 0x4e, 0x7f, 0xf0, 0x5c, 0xc7, 0xb2, 0x84, 0x96, 0xa1, 0x6e, 0x75, 0x70, 0xe7, 0x31, 0xee,
-	0x58, 0x87, 0x72, 0x89, 0xbf, 0xc4, 0x8f, 0x8e, 0x7b, 0xb6, 0x61, 0xf5, 0x74, 0xa2, 0x1d, 0x9a,
-	0x86, 0xa6, 0xcb, 0x65, 0xb4, 0x02, 0xa0, 0x1d, 0xea, 0xda, 0x93, 0x7d, 0xf3, 0x1b, 0x7d, 0x20,
-	0x2f, 0xf1, 0xac, 0xed, 0x62, 0xd3, 0xea, 0xf2, 0x77, 0x7a, 0x05, 0x35, 0xa0, 0xba, 0x6f, 0x9a,
-	0x3d, 0xbd, 0xd3, 0x97, 0x6f, 0xa9, 0xff, 0x90, 0xa0, 0x75, 0xc5, 0x05, 0xe8, 0x6b, 0xa8, 0x9c,
-	0xf2, 0xfd, 0x29, 0x92, 0x20, 0x9f, 0xdd, 0xb7, 0x77, 0x1c, 0x4e, 0x80, 0xfc, 0x81, 0x7a, 0xea,
-	0xb3, 0x28, 0x79, 0x10, 0x13, 0x77, 0x1a, 0xc5, 0xe1, 0x98, 0xb2, 0x48, 0xb8, 0xaf, 0x86, 0x91,
-	0xd0, 0xf1, 0x8e, 0x4b, 0x9b, 0x69, 0xd0, 0x47, 0xbc, 0xc4, 0xc4, 0x53, 0x16, 0xf0, 0xe4, 0x99,
-	0x03, 0xca, 0x09, 0x20, 0x53, 0x65, 0x00, 0xf5, 0x9f, 0x12, 0x54, 0xd3, 0x3a, 0x87, 0x1e, 0xce,
-	0xab, 0xa2, 0x74, 0x53, 0xdf, 0x91, 0xd5, 0xc4, 0x4b, 0xa9, 0xb3, 0x90, 0x00, 0xf3, 0xfe, 0x2e,
-	0x97, 0x3a, 0xf9, 0x7b, 0xce, 0x7b, 0xc1, 0xaf, 0xa1, 0x99, 0xce, 0x95, 0x54, 0x90, 0xb2, 0xb8,
-	0x66, 0x77, 0xaf, 0x5d, 0x5a, 0xdc, 0xa7, 0x46, 0x0a, 0xe1, 0x03, 0x95, 0x41, 0x3d, 0xab, 0xb7,
-	0xe8, 0x01, 0x94, 0x79, 0xbe, 0xdc, 0x78, 0x00, 0x6e, 0x85, 0x3e, 0x83, 0xda, 0x29, 0xa5, 0xff,
-	0xc5, 0xba, 0xd5, 0x53, 0x2a, 0x3e, 0xd4, 0xbf, 0x49, 0x00, 0xf3, 0x72, 0x8a, 0x64, 0x28, 0x4f,
-	0xd9, 0x28, 0x6d, 0x0f, 0xf9, 0x27, 0xda, 0x82, 0xda, 0xc8, 0x09, 0x86, 0x53, 0x67, 0x38, 0x23,
-	0xb9, 0x6c, 0x8c, 0x7e, 0x25, 0x7e, 0x16, 0x10, 0x8f, 0x7a, 0xea, 0x11, 0x37, 0x9c, 0x06, 0x31,
-	0xbb, 0x48, 0xaf, 0x7f, 0x6b, 0xae, 0xd1, 0x12, 0x05, 0xfa, 0x12, 0x6a, 0x93, 0x91, 0x13, 0x8b,
-	0x2e, 0x6d, 0x49, 0xec, 0x52, 0xbd, 0xbe, 0xba, 0x5b, 0xa9, 0x25, 0xce, 0x30, 0xea, 0x9f, 0x24,
-	0x80, 0x79, 0xf1, 0x2d, 0x78, 0x1e, 0x25, 0xdb, 0x5e, 0x78, 0x1e, 0xa1, 0x07, 0xd0, 0x8a, 0xce,
-	0x42, 0x16, 0x93, 0x7c, 0xab, 0x9a, 0x1c, 0x44, 0x16, 0x8a, 0x6e, 0x51, 0xbf, 0x5a, 0x7e, 0xbb,
-	0x7e, 0x55, 0xfd, 0xab, 0x04, 0xcd, 0x7c, 0x31, 0x2f, 0x70, 0xe0, 0x97, 0x29, 0xed, 0x94, 0xae,
-	0xef, 0x28, 0xf3, 0x33, 0xb4, 0xc5, 0xdf, 0x1c, 0xd9, 0x28, 0x50, 0x75, 0x9d, 0x64, 0xdb, 0x49,
-	0xe9, 0x98, 0x0d, 0xd5, 0x0f, 0xa1, 0x9e, 0x19, 0xa3, 0x75, 0x90, 0x0b, 0x28, 0xa3, 0x0e, 0x15,
-	0xeb, 0xd0, 0xb4, 0x4d, 0x59, 0x52, 0x9f, 0xc3, 0xe6, 0x35, 0x2d, 0x02, 0x2f, 0x78, 0xf3, 0x5e,
-	0x23, 0xf3, 0x63, 0x23, 0x93, 0x19, 0x1e, 0x7f, 0xa2, 0x65, 0x4d, 0x48, 0xe2, 0xbd, 0xea, 0x79,
-	0x82, 0xde, 0x7d, 0x08, 0xf5, 0xec, 0x62, 0xa1, 0x0d, 0x40, 0x07, 0xc6, 0x37, 0x7a, 0x97, 0xe0,
-	0x8e, 0xad, 0x93, 0xae, 0x7e, 0xd0, 0x39, 0xee, 0xd9, 0xf2, 0x3b, 0x9c, 0x85, 0x2c, 0x1d, 0x13,
-	0x4b, 0xc7, 0x03, 0x5e, 0xc7, 0x77, 0x7f, 0x80, 0xd6, 0x95, 0xa6, 0x90, 0x77, 0x00, 0x69, 0x7b,
-	0x41, 0x34, 0xac, 0x77, 0x0d, 0x9b, 0x68, 0x1d, 0xdc, 0xbd, 0xda, 0x26, 0x14, 0x19, 0x69, 0x66,
-	0xbf, 0x6b, 0xa4, 0xcd, 0x88, 0x68, 0x13, 0x8a, 0x8c, 0x3a, 0xbd, 0xe7, 0x9d, 0x17, 0x03, 0xb9,
-	0xb4, 0xfb, 0x5a, 0x82, 0x95, 0xc5, 0x7b, 0xc6, 0x9b, 0x9f, 0x8e, 0xc6, 0x27, 0x20, 0x56, 0xaf,
-	0x63, 0x1f, 0x98, 0xf8, 0xe8, 0xea, 0xc2, 0x97, 0x0d, 0x9e, 0xeb, 0xfb, 0xa4, 0x63, 0x59, 0x3d,
-	0x43, 0xcb, 0xf5, 0x27, 0x97, 0x8d, 0x8e, 0xcc, 0x7d, 0xa3, 0xa7, 0x73, 0x5b, 0xb9, 0x84, 0xee,
-	0xc0, 0xe6, 0x65, 0x7d, 0xa7, 0xdf, 0xc5, 0xa6, 0xd1, 0x95, 0xcb, 0x68, 0x13, 0xd6, 0x2e, 0x2b,
-	0x0d, 0x73, 0x20, 0x2f, 0x9d, 0xdc, 0x12, 0xbf, 0x52, 0x3f, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff,
-	0xff, 0x1b, 0x9f, 0x88, 0x50, 0xb4, 0x16, 0x00, 0x00,
+var fileDescriptor_7aa923a38d4cd9d3 = []byte{
+	// 2434 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcf, 0x73, 0xdb, 0xc6,
+	0xf5, 0x0f, 0x49, 0xd1, 0x24, 0x1f, 0x29, 0x09, 0x5a, 0xc9, 0x12, 0x6d, 0xc7, 0xb1, 0x82, 0x7c,
+	0x33, 0x5f, 0xd7, 0x4e, 0xd5, 0xd6, 0x4e, 0x32, 0xe9, 0xe4, 0x27, 0x4d, 0x82, 0x31, 0xc6, 0x14,
+	0x81, 0x2c, 0xa9, 0x28, 0xce, 0x65, 0x03, 0x01, 0x2b, 0x09, 0x63, 0x12, 0x60, 0x17, 0xa0, 0x6d,
+	0x65, 0x26, 0x97, 0x9e, 0x7a, 0xec, 0x4c, 0x6f, 0xed, 0x4c, 0xcf, 0xed, 0x34, 0x7f, 0x41, 0x4f,
+	0xed, 0xb5, 0xff, 0x4c, 0xff, 0x80, 0x5e, 0x3a, 0xfb, 0x16, 0x04, 0x40, 0x09, 0xb2, 0x9d, 0x26,
+	0x17, 0x19, 0xfb, 0xde, 0xe7, 0xbd, 0xdd, 0x7d, 0xbb, 0xef, 0xf3, 0xde, 0xd2, 0xd0, 0x3c, 0xe6,
+	0xdc, 0x8b, 0xf6, 0x66, 0x22, 0x8c, 0x43, 0x42, 0xa6, 0xce, 0x2c, 0xda, 0x3b, 0x0a, 0xc3, 0x27,
+	0x7e, 0x70, 0xb2, 0x87, 0x1a, 0xfd, 0xdf, 0x65, 0x68, 0xf5, 0x39, 0xf7, 0xf6, 0x79, 0xec, 0x78,
+	0x4e, 0xec, 0x90, 0x29, 0x6c, 0xcf, 0x44, 0xe8, 0xf2, 0x28, 0xf2, 0x83, 0x13, 0xe6, 0x07, 0x51,
+	0x2c, 0xe6, 0x6e, 0xec, 0x87, 0x41, 0xbb, 0xb4, 0x5b, 0xba, 0xbd, 0x76, 0xef, 0xfd, 0xbd, 0x8b,
+	0x5e, 0xf6, 0xf2, 0x1e, 0xf6, 0xec, 0xd4, 0xdc, 0xcc, 0xac, 0xe9, 0xd5, 0x59, 0x91, 0x98, 0xbc,
+	0x09, 0xad, 0xe8, 0xd4, 0x11, 0x1e, 0x0b, 0xe6, 0xd3, 0x23, 0x2e, 0xda, 0xe5, 0xdd, 0xd2, 0xed,
+	0x2a, 0x6d, 0xa2, 0x6c, 0x88, 0x22, 0x09, 0x89, 0xc3, 0xd8, 0x99, 0x30, 0x14, 0x46, 0xed, 0x8a,
+	0x82, 0xa0, 0x6c, 0x84, 0x22, 0xb2, 0x05, 0xd5, 0x20, 0x0c, 0x5c, 0xde, 0xae, 0xee, 0x96, 0x6e,
+	0xaf, 0x50, 0x35, 0x20, 0xbf, 0x82, 0xad, 0x13, 0x1e, 0x70, 0xe1, 0xc8, 0x99, 0x58, 0xec, 0x4f,
+	0x79, 0x14, 0x3b, 0xd3, 0x59, 0x7b, 0x65, 0xb7, 0x74, 0xbb, 0x42, 0x37, 0x33, 0xdd, 0x78, 0xa1,
+	0xd2, 0x1d, 0xb8, 0x5a, 0xb8, 0x7c, 0xb2, 0x09, 0xeb, 0x36, 0xb5, 0xba, 0xc6, 0x68, 0xc4, 0x0e,
+	0x86, 0x8f, 0x86, 0xd6, 0xe1, 0x50, 0x7b, 0x8d, 0xec, 0xc0, 0xe6, 0x42, 0xd8, 0x19, 0xb1, 0xae,
+	0xb5, 0x6f, 0x0f, 0x8c, 0xb1, 0xa1, 0x95, 0xc8, 0x75, 0xd8, 0xce, 0x29, 0xcc, 0x61, 0x97, 0x1a,
+	0xfb, 0xc6, 0x70, 0xdc, 0x19, 0x68, 0x65, 0xfd, 0xfb, 0x12, 0x68, 0x9d, 0xa7, 0x8e, 0x3f, 0x71,
+	0x8e, 0xfc, 0x89, 0x1f, 0x9f, 0xc9, 0xd8, 0x91, 0x8f, 0xa0, 0x3e, 0x4d, 0xe2, 0x87, 0x71, 0x6e,
+	0xde, 0xdb, 0x7d, 0x59, 0x9c, 0x69, 0x6a, 0x41, 0xbe, 0x86, 0xad, 0x88, 0x8b, 0xa7, 0xbe, 0xcb,
+	0x99, 0x93, 0xf3, 0xdc, 0x2e, 0xef, 0x56, 0x6e, 0x37, 0xef, 0xfd, 0x7f, 0x91, 0xa7, 0x91, 0xc2,
+	0xe7, 0x17, 0x42, 0x37, 0xa3, 0x8b, 0x42, 0xfd, 0x3f, 0x65, 0xd8, 0x2c, 0x00, 0x93, 0x0f, 0xa0,
+	0x1d, 0xc5, 0x8e, 0x88, 0xb3, 0xb8, 0x32, 0xc1, 0xa3, 0x58, 0xf8, 0x6e, 0x8c, 0x3b, 0xa8, 0xd0,
+	0x6d, 0xd4, 0xa7, 0xb1, 0xa5, 0x89, 0x96, 0xbc, 0x0b, 0xdb, 0x3c, 0xf0, 0x8a, 0xec, 0xca, 0x68,
+	0xb7, 0xc5, 0x03, 0xef, 0xa2, 0xd5, 0x2f, 0x61, 0x6b, 0xca, 0x85, 0x7b, 0xea, 0x04, 0x31, 0xf3,
+	0xbd, 0xcc, 0x46, 0xde, 0x86, 0x06, 0x25, 0x0b, 0x9d, 0xe9, 0xa5, 0x16, 0x7b, 0xb0, 0xd8, 0xd0,
+	0x92, 0xc1, 0x0a, 0x1a, 0x6c, 0x24, 0xaa, 0x1c, 0x7e, 0x00, 0x44, 0xf0, 0x28, 0x9c, 0x0b, 0x97,
+	0x47, 0x19, 0xfc, 0x0a, 0x9e, 0xc6, 0xcd, 0xa2, 0x18, 0xd2, 0x05, 0x9a, 0x6e, 0xa4, 0x86, 0xa9,
+	0xb7, 0x1e, 0xb4, 0x96, 0xce, 0xa2, 0x8a, 0x67, 0x51, 0x78, 0xaa, 0x4b, 0x87, 0xb0, 0x64, 0xa5,
+	0xff, 0xbd, 0x06, 0xad, 0xa5, 0xb0, 0xdf, 0x82, 0x66, 0x2e, 0x0c, 0x18, 0xe9, 0x06, 0x85, 0x6c,
+	0xf7, 0xe4, 0x26, 0x40, 0xb6, 0x6b, 0x8c, 0x68, 0x83, 0x36, 0xd2, 0xcd, 0x92, 0x1b, 0xd0, 0x50,
+	0xc7, 0x16, 0x71, 0x17, 0x63, 0x57, 0xa1, 0x75, 0x14, 0x8c, 0xb8, 0x2b, 0x33, 0xcd, 0x9b, 0x27,
+	0xe9, 0x22, 0xf5, 0x2a, 0x51, 0x9a, 0x0b, 0x99, 0x84, 0xdc, 0x82, 0x66, 0x34, 0x0b, 0xe3, 0x88,
+	0x61, 0xfa, 0x61, 0xbe, 0x55, 0x28, 0xa0, 0x68, 0x2c, 0x25, 0x38, 0x3f, 0x02, 0xc2, 0x19, 0x0f,
+	0x30, 0x7a, 0x15, 0xda, 0x40, 0x89, 0x35, 0xe3, 0x01, 0xf9, 0x19, 0x68, 0xf9, 0x0d, 0xb2, 0xd8,
+	0x39, 0x69, 0xd7, 0x70, 0x91, 0xeb, 0x79, 0xf9, 0xd8, 0x39, 0x21, 0x1f, 0x42, 0x23, 0x0d, 0x6b,
+	0xbb, 0xfe, 0x2a, 0xc7, 0x90, 0xe1, 0xc9, 0x1d, 0xd8, 0x98, 0x39, 0x67, 0x53, 0x1e, 0xc4, 0x2c,
+	0x9c, 0xe1, 0x86, 0x7c, 0xaf, 0xdd, 0xd8, 0xad, 0xc8, 0x89, 0x12, 0x85, 0x85, 0x72, 0xd3, 0x23,
+	0x8f, 0x00, 0x04, 0x77, 0xe7, 0x42, 0x70, 0x49, 0x21, 0x80, 0x33, 0xdd, 0x7d, 0xd9, 0x41, 0xed,
+	0xd1, 0xd4, 0x84, 0xe6, 0xcc, 0x89, 0x03, 0x24, 0x72, 0x4f, 0xb9, 0x37, 0x9f, 0x70, 0xc6, 0x9f,
+	0xbb, 0x1c, 0x27, 0x69, 0x37, 0xf1, 0xf4, 0xef, 0xbd, 0xd4, 0xe9, 0x28, 0x31, 0x35, 0x16, 0x96,
+	0x74, 0x23, 0x3a, 0x2f, 0x22, 0xef, 0x41, 0xcd, 0xe3, 0xb3, 0x30, 0xf2, 0xe3, 0x76, 0x0b, 0x17,
+	0x7b, 0xa3, 0xc8, 0x6f, 0x4f, 0x41, 0xe8, 0x02, 0x4b, 0x3e, 0x86, 0x66, 0x10, 0xb2, 0xe8, 0x34,
+	0x7c, 0xc6, 0x8e, 0x39, 0x6f, 0xaf, 0x5e, 0x1e, 0xd1, 0x61, 0x38, 0x3a, 0x0d, 0x9f, 0xf5, 0x39,
+	0xa7, 0x8d, 0x60, 0xf1, 0x49, 0x0e, 0x60, 0x53, 0xf0, 0xdf, 0xcc, 0x7d, 0xc1, 0x99, 0x2b, 0xb8,
+	0xe7, 0xc7, 0xcc, 0x75, 0x84, 0xd7, 0x5e, 0xc3, 0xaa, 0xf0, 0x76, 0xf1, 0xc1, 0x20, 0xbc, 0x8b,
+	0xe8, 0xae, 0x23, 0x3c, 0x99, 0x27, 0xe7, 0x44, 0xe4, 0xff, 0x60, 0x2d, 0xf6, 0xdd, 0x27, 0x3c,
+	0x66, 0xf1, 0xd9, 0x0c, 0xef, 0xec, 0x3a, 0x9e, 0x52, 0x4b, 0x49, 0xc7, 0x67, 0x33, 0x6e, 0x7a,
+	0xd7, 0xbf, 0x01, 0xc8, 0xe2, 0x4d, 0x6e, 0x83, 0x26, 0xf8, 0x8c, 0x3b, 0x31, 0x9b, 0x07, 0xb1,
+	0x3f, 0xc1, 0xbb, 0xaa, 0x38, 0x67, 0x4d, 0xc9, 0x0f, 0xa4, 0x58, 0x5e, 0xd7, 0x0c, 0xc9, 0x9f,
+	0x72, 0x71, 0x86, 0x48, 0x55, 0x62, 0x12, 0xa4, 0x21, 0xc5, 0x23, 0xee, 0x5e, 0xff, 0x02, 0x36,
+	0x2e, 0x04, 0x9f, 0x7c, 0x04, 0x20, 0x69, 0x8a, 0x09, 0x27, 0x38, 0xe1, 0x09, 0x31, 0x17, 0x46,
+	0x4c, 0xf2, 0x15, 0x95, 0x20, 0xda, 0x88, 0x17, 0x9f, 0xfa, 0x1f, 0x4b, 0xd0, 0x48, 0x2f, 0x27,
+	0xb9, 0x06, 0x32, 0xd1, 0x8e, 0x8f, 0xb3, 0xb4, 0xad, 0xe1, 0x38, 0xc9, 0x59, 0x54, 0x05, 0xce,
+	0x94, 0xa7, 0x39, 0x2b, 0x25, 0x43, 0x67, 0xca, 0xc9, 0x0e, 0xd4, 0x44, 0x18, 0x4e, 0xa5, 0xa1,
+	0x62, 0xbb, 0x2b, 0x72, 0xa8, 0x92, 0x19, 0x15, 0x68, 0xa6, 0x78, 0xad, 0x2e, 0x05, 0x68, 0x75,
+	0x13, 0x60, 0xe6, 0x88, 0xf8, 0x8c, 0x45, 0xfe, 0xb7, 0xaa, 0x30, 0x56, 0x69, 0x03, 0x25, 0x23,
+	0xff, 0x5b, 0xae, 0x77, 0xa0, 0x91, 0x2e, 0x5a, 0x3a, 0x3a, 0xe2, 0x27, 0x7e, 0x90, 0x8b, 0x64,
+	0x1d, 0x05, 0x32, 0x86, 0x3b, 0x50, 0x93, 0x7c, 0xbd, 0x08, 0x5d, 0x85, 0x5e, 0xe1, 0x81, 0x37,
+	0xe2, 0xae, 0xfe, 0xdb, 0x12, 0x34, 0x93, 0xd2, 0xf0, 0x13, 0x14, 0xb1, 0xf7, 0xa0, 0x96, 0xd0,
+	0x54, 0x52, 0xb7, 0x6e, 0xbc, 0xa0, 0x6e, 0xd1, 0x05, 0x56, 0xff, 0x73, 0x0b, 0x6a, 0x89, 0xf0,
+	0x47, 0x93, 0x23, 0x81, 0x15, 0x0c, 0xa5, 0x8a, 0x32, 0x7e, 0x93, 0x5d, 0x68, 0x7a, 0x3c, 0x72,
+	0x85, 0xaf, 0x12, 0x59, 0x45, 0x39, 0x2f, 0x22, 0xbf, 0x80, 0xea, 0x4c, 0xf8, 0x49, 0xf3, 0xd1,
+	0xbc, 0x77, 0xad, 0x68, 0xd9, 0xb6, 0x04, 0x50, 0x85, 0x23, 0xbf, 0x86, 0xaa, 0x98, 0x4f, 0x78,
+	0x94, 0xd4, 0x96, 0xb7, 0x0a, 0xf7, 0xa9, 0xee, 0xa2, 0x1f, 0x9c, 0x50, 0x09, 0xa5, 0xca, 0x82,
+	0x7c, 0x0c, 0x2b, 0xc7, 0xa1, 0x98, 0xb6, 0x6b, 0x18, 0xa1, 0xb7, 0x5f, 0x10, 0x21, 0x33, 0x88,
+	0x9d, 0x27, 0xbc, 0x1f, 0x8a, 0xe9, 0x83, 0x72, 0xbb, 0x44, 0xd1, 0x8c, 0xf4, 0xa1, 0xe9, 0xa3,
+	0x9c, 0xa1, 0x97, 0x2d, 0x9c, 0xff, 0xd5, 0xbc, 0x50, 0xf0, 0xd3, 0x6f, 0xf2, 0x35, 0x6c, 0xcf,
+	0xb8, 0x60, 0x49, 0xe2, 0xe6, 0x5d, 0x5e, 0xfd, 0x21, 0x2e, 0x37, 0x67, 0x5c, 0x8c, 0xd1, 0x47,
+	0x26, 0x24, 0x23, 0x58, 0x9f, 0x09, 0xbe, 0x20, 0x6f, 0x49, 0x0a, 0x48, 0xfe, 0x6b, 0xf7, 0xee,
+	0xbc, 0xc0, 0xe9, 0x9e, 0x9d, 0x9a, 0x48, 0xc6, 0xa0, 0x6b, 0xb3, 0xa5, 0x31, 0x79, 0x1f, 0xea,
+	0xb1, 0xf3, 0x9c, 0x09, 0x27, 0xe6, 0xed, 0xc6, 0xe5, 0x9c, 0x39, 0x76, 0x9e, 0x53, 0x27, 0xe6,
+	0xb4, 0x16, 0xab, 0x8f, 0xe2, 0x32, 0x02, 0xc5, 0x65, 0x24, 0x47, 0xcb, 0xcd, 0xff, 0x9d, 0x96,
+	0x5b, 0x3f, 0x0d, 0x2d, 0xaf, 0xfe, 0x48, 0x5a, 0xfe, 0x14, 0x9a, 0x0e, 0x76, 0xbe, 0x6c, 0xe2,
+	0x07, 0x4f, 0xda, 0x6b, 0x78, 0xdf, 0xde, 0x28, 0xac, 0x5f, 0x08, 0x1b, 0xf8, 0xc1, 0x13, 0x0a,
+	0x4e, 0xfa, 0x4d, 0x3e, 0x84, 0x15, 0x3c, 0xbb, 0x75, 0x5c, 0xc8, 0x8b, 0x7a, 0xd0, 0xc5, 0xbf,
+	0x78, 0x70, 0x68, 0x24, 0x67, 0xcf, 0x15, 0x85, 0xb6, 0x76, 0xf9, 0xec, 0xe3, 0xb4, 0x4a, 0x50,
+	0xc8, 0x2a, 0x06, 0x31, 0x60, 0x55, 0xf0, 0x89, 0x13, 0x73, 0x8f, 0x4d, 0xb9, 0xe7, 0x3b, 0xed,
+	0x8d, 0xcb, 0xdb, 0x2f, 0xaa, 0x80, 0xfb, 0x12, 0x47, 0x5b, 0x22, 0x37, 0x22, 0xa7, 0x70, 0x3d,
+	0x6d, 0xac, 0xe3, 0x58, 0xf8, 0x47, 0xf3, 0x98, 0xb3, 0xa7, 0xce, 0x64, 0x8e, 0xfc, 0x41, 0xd0,
+	0xe7, 0xdd, 0x17, 0xb5, 0xd7, 0x0b, 0xa3, 0x2f, 0xa5, 0x8d, 0xe9, 0xd1, 0x9d, 0xa8, 0x58, 0x41,
+	0x1e, 0xc2, 0xda, 0x33, 0xc7, 0x8f, 0x27, 0x7e, 0x14, 0x33, 0x45, 0x0e, 0x9b, 0x78, 0x11, 0xde,
+	0x2c, 0xf2, 0x7e, 0x98, 0x20, 0x15, 0x35, 0xac, 0x3e, 0xcb, 0x0f, 0xf5, 0x6f, 0x60, 0x6d, 0x39,
+	0x19, 0xc8, 0x2d, 0xb8, 0x61, 0x53, 0xc3, 0xee, 0x3c, 0x96, 0x6f, 0x10, 0x36, 0x7e, 0x6c, 0x1b,
+	0xec, 0x60, 0x38, 0xb2, 0x8d, 0xae, 0xd9, 0x37, 0x8d, 0x9e, 0xf6, 0x1a, 0x69, 0x41, 0x9d, 0x1a,
+	0x5f, 0x1c, 0x98, 0xd4, 0xe8, 0x69, 0x25, 0x39, 0xb2, 0xec, 0xb1, 0x69, 0x0d, 0xe5, 0x73, 0x85,
+	0x6c, 0xc0, 0xea, 0xd0, 0x1a, 0xb3, 0xd1, 0x81, 0x6d, 0x5b, 0x74, 0x6c, 0xf4, 0xb4, 0x8a, 0xfe,
+	0xb7, 0x8c, 0xf7, 0xd1, 0xff, 0xeb, 0xd0, 0x1e, 0x19, 0xf4, 0x4b, 0xb3, 0x6b, 0x14, 0x39, 0x7f,
+	0x0b, 0x6e, 0x2d, 0x69, 0x7b, 0xe6, 0xd0, 0x1c, 0x7e, 0xce, 0xa8, 0x21, 0xa5, 0x1d, 0x39, 0x8f,
+	0x56, 0x22, 0x6f, 0xc0, 0xf5, 0x25, 0x50, 0xdf, 0xb2, 0x7a, 0xcc, 0xa2, 0x3d, 0x83, 0x9a, 0xc3,
+	0xcf, 0xb5, 0x32, 0xb9, 0x09, 0xd7, 0x96, 0xf4, 0xc6, 0x97, 0xb8, 0x15, 0xb3, 0xfb, 0xc8, 0x18,
+	0x6b, 0x15, 0xf9, 0xde, 0x5a, 0x52, 0x8f, 0xa9, 0x69, 0xb3, 0xb1, 0x75, 0x40, 0xb5, 0x15, 0xfd,
+	0x3b, 0xa8, 0x22, 0xfb, 0xca, 0xee, 0x16, 0xf9, 0x97, 0x4d, 0x7d, 0x57, 0x84, 0x51, 0x52, 0xe7,
+	0x9a, 0x28, 0xdb, 0x47, 0x11, 0x79, 0x0b, 0x56, 0x93, 0x26, 0xe3, 0x8c, 0xb9, 0xa1, 0xb7, 0xa8,
+	0xc5, 0xad, 0x85, 0xb0, 0x1b, 0x7a, 0x9c, 0xbc, 0x03, 0x44, 0xda, 0xc8, 0xe7, 0x71, 0xc2, 0x09,
+	0xb2, 0x89, 0x55, 0x35, 0x43, 0x4b, 0x34, 0x8a, 0x14, 0xc6, 0xce, 0x89, 0xfe, 0x87, 0x32, 0xac,
+	0x9f, 0x23, 0x73, 0xf9, 0x32, 0x99, 0xfa, 0x01, 0x73, 0xbc, 0xa7, 0x4e, 0xe0, 0x72, 0x96, 0x1c,
+	0x6e, 0xb2, 0xa0, 0x8d, 0xa9, 0x1f, 0x74, 0x94, 0xe6, 0x81, 0x52, 0x90, 0x4f, 0xe1, 0xf5, 0x3c,
+	0x3e, 0x0c, 0x26, 0x7e, 0xc0, 0x99, 0x2b, 0x07, 0xd2, 0x69, 0x52, 0x96, 0xaf, 0x65, 0x86, 0x16,
+	0x22, 0xba, 0x0b, 0x00, 0xf9, 0x02, 0xae, 0xca, 0x5b, 0x9d, 0x98, 0x4c, 0x54, 0x87, 0x2f, 0xd9,
+	0xa6, 0xf2, 0x92, 0x92, 0x85, 0xb5, 0x63, 0x53, 0xda, 0x76, 0x73, 0xa6, 0x92, 0x77, 0x3e, 0x02,
+	0x08, 0xc2, 0x94, 0xb5, 0x56, 0x5e, 0xc5, 0x4f, 0x43, 0x19, 0xf4, 0x39, 0xd7, 0xf7, 0xa0, 0x96,
+	0x70, 0xad, 0x8c, 0x39, 0x1e, 0x08, 0x9b, 0x71, 0xe1, 0xf2, 0x40, 0xbd, 0x1e, 0xab, 0xb4, 0x85,
+	0x42, 0x5b, 0xc9, 0xf4, 0x7f, 0x95, 0x61, 0xfb, 0x42, 0xfd, 0xe8, 0xfb, 0x7c, 0xe2, 0x91, 0x35,
+	0x28, 0xfb, 0x1e, 0xd6, 0xde, 0x06, 0x2d, 0xfb, 0x32, 0x93, 0x14, 0xf1, 0xa8, 0x9f, 0x2b, 0xde,
+	0x7d, 0xa5, 0x4a, 0x84, 0x9e, 0xf6, 0xf0, 0x6f, 0x8e, 0x85, 0xb6, 0xa0, 0x3a, 0x71, 0x8e, 0xf8,
+	0x24, 0xb9, 0x05, 0x6a, 0x20, 0xa5, 0xc8, 0x00, 0xed, 0x0a, 0x96, 0x01, 0x35, 0x90, 0xad, 0x87,
+	0x2f, 0x5f, 0x8d, 0xc8, 0xa3, 0x1e, 0xc6, 0xa3, 0x4e, 0xc1, 0x8f, 0x12, 0xb2, 0xf5, 0xf4, 0xdf,
+	0x95, 0xa0, 0x91, 0x4e, 0x20, 0x2f, 0x6c, 0xdf, 0x34, 0x06, 0xbd, 0xa2, 0x84, 0xd1, 0xa0, 0x35,
+	0x7a, 0x68, 0xd1, 0x31, 0xeb, 0x0c, 0x47, 0x87, 0x06, 0xd5, 0x4a, 0x64, 0x15, 0x1a, 0x76, 0x87,
+	0x76, 0x3e, 0xa7, 0x1d, 0xfb, 0xa1, 0x56, 0x26, 0x9b, 0xb0, 0xbe, 0x7f, 0x30, 0x18, 0x9b, 0xf6,
+	0xc0, 0x60, 0xdd, 0x87, 0x96, 0xd9, 0x35, 0xb4, 0x0a, 0x59, 0x03, 0xe8, 0x3e, 0x34, 0xba, 0x8f,
+	0x1e, 0x58, 0x5f, 0x19, 0x23, 0x6d, 0x45, 0x66, 0x71, 0x8f, 0x5a, 0x76, 0xcf, 0x3a, 0x1c, 0x6a,
+	0x55, 0xd2, 0x84, 0xda, 0x03, 0xcb, 0x1a, 0x18, 0x9d, 0xa1, 0x76, 0x45, 0xff, 0x47, 0x09, 0x36,
+	0x2e, 0x84, 0x80, 0x7c, 0x06, 0xd5, 0x63, 0xb9, 0xbe, 0x76, 0x09, 0x69, 0xed, 0xce, 0xab, 0x07,
+	0x8e, 0x2a, 0x43, 0xf2, 0x2e, 0x6c, 0x1d, 0xfb, 0x22, 0x52, 0x3f, 0x09, 0x30, 0x77, 0x1e, 0xc5,
+	0xe1, 0x94, 0x8b, 0x08, 0xc3, 0x57, 0xc7, 0x1b, 0x40, 0x50, 0x2f, 0xfb, 0xce, 0xee, 0x42, 0x4b,
+	0xee, 0xcb, 0x02, 0x16, 0xcf, 0x45, 0x20, 0x13, 0x2a, 0x33, 0xaa, 0x64, 0x46, 0xa9, 0x3a, 0x35,
+	0xd2, 0xff, 0x59, 0x82, 0x5a, 0x52, 0x49, 0xc9, 0xfd, 0xac, 0xee, 0x96, 0x5e, 0xd6, 0x81, 0xa5,
+	0x55, 0xf7, 0x5c, 0x4a, 0x2d, 0x25, 0x46, 0xd6, 0xe9, 0xe6, 0x52, 0x2a, 0x7f, 0xff, 0x65, 0x57,
+	0xfc, 0x19, 0xb4, 0x12, 0x5f, 0xaa, 0x46, 0x55, 0xf0, 0xba, 0xdd, 0xbc, 0x74, 0x6a, 0xbc, 0x57,
+	0xcd, 0xc4, 0x44, 0x0e, 0x74, 0x01, 0x8d, 0xb4, 0xa2, 0x93, 0xbb, 0x50, 0x91, 0x79, 0xf4, 0xd2,
+	0x0d, 0x48, 0x14, 0xf9, 0x00, 0xea, 0xc7, 0x9c, 0xff, 0x80, 0x79, 0x6b, 0xc7, 0x1c, 0x3f, 0xf4,
+	0xbf, 0x96, 0x00, 0xb2, 0x82, 0x4d, 0x34, 0xa8, 0xcc, 0xc5, 0x24, 0x69, 0x94, 0xe5, 0x27, 0xb9,
+	0x0e, 0xf5, 0x89, 0x13, 0x9c, 0xcc, 0x9d, 0x93, 0x05, 0xf9, 0xa5, 0x63, 0xf2, 0x73, 0xfc, 0x81,
+	0x04, 0x7f, 0xde, 0xe0, 0x1e, 0x73, 0xc3, 0x79, 0x10, 0x8b, 0xb3, 0x24, 0x0d, 0x36, 0x32, 0x4d,
+	0x57, 0x29, 0xc8, 0x27, 0x50, 0x9f, 0x4d, 0x9c, 0x18, 0xdb, 0xc2, 0x15, 0x5c, 0xa5, 0x7e, 0x79,
+	0xff, 0x60, 0x27, 0x48, 0x9a, 0xda, 0xe8, 0xbf, 0x2f, 0x01, 0x64, 0xe5, 0xbd, 0xe0, 0xa1, 0xa8,
+	0x96, 0xbd, 0xf4, 0x50, 0x24, 0x77, 0x61, 0x23, 0x3a, 0x0d, 0x45, 0xcc, 0xf2, 0x4d, 0xbb, 0xda,
+	0x88, 0x86, 0x8a, 0x5e, 0x51, 0xe7, 0x5e, 0x79, 0xb5, 0xce, 0x5d, 0xff, 0x4b, 0x09, 0x5a, 0xf9,
+	0x76, 0xa1, 0x20, 0x80, 0x9f, 0x24, 0xf4, 0x53, 0xbe, 0xbc, 0x67, 0xcd, 0x7b, 0xd8, 0xc3, 0xbf,
+	0x39, 0xd2, 0x69, 0x43, 0xcd, 0x75, 0xd4, 0xb2, 0x55, 0x49, 0x59, 0x0c, 0xf5, 0x77, 0xa0, 0x91,
+	0x82, 0xc9, 0x16, 0x68, 0x05, 0xd4, 0xd1, 0x80, 0xaa, 0xfd, 0xd0, 0x1a, 0x5b, 0x5a, 0x49, 0x3f,
+	0x84, 0x9d, 0x4b, 0x9a, 0x10, 0x59, 0x08, 0xb3, 0x6e, 0x26, 0x8d, 0x63, 0x33, 0x95, 0x99, 0x9e,
+	0x7c, 0xac, 0xa6, 0x6d, 0x8e, 0x8a, 0x5e, 0xed, 0xa9, 0xb2, 0xd6, 0xff, 0x54, 0x82, 0xd5, 0xa5,
+	0x06, 0x44, 0x9e, 0x8c, 0xcc, 0xa5, 0xdc, 0x6b, 0x33, 0xa5, 0xf0, 0xc0, 0x5e, 0x3c, 0x38, 0x11,
+	0xe5, 0x3c, 0xcf, 0xa3, 0xca, 0x09, 0xca, 0x79, 0x9e, 0xa1, 0x3e, 0x81, 0x1b, 0xd1, 0x7c, 0x36,
+	0x0b, 0x45, 0x1c, 0x31, 0xc7, 0xf3, 0x7c, 0xb9, 0x73, 0x67, 0x82, 0xc4, 0xca, 0x23, 0xf5, 0x6b,
+	0x5f, 0x9d, 0x5e, 0x5b, 0x40, 0x3a, 0x29, 0x82, 0x2a, 0xc0, 0x9d, 0xfb, 0xd0, 0x48, 0xaf, 0x3d,
+	0xd9, 0x06, 0xd2, 0x37, 0xbf, 0x32, 0x7a, 0x8c, 0x76, 0xc6, 0x06, 0xeb, 0x19, 0xfd, 0xce, 0xc1,
+	0x60, 0xac, 0xbd, 0x26, 0xb9, 0xd2, 0x36, 0x28, 0xb3, 0x0d, 0x3a, 0x92, 0xdd, 0xc7, 0x9d, 0xef,
+	0x60, 0xe3, 0x42, 0x53, 0x2c, 0xfb, 0x96, 0xa4, 0x29, 0x62, 0x5d, 0x6a, 0xf4, 0xcc, 0x31, 0xeb,
+	0x76, 0x68, 0xef, 0x62, 0x73, 0x53, 0x04, 0xea, 0x5a, 0xc3, 0x9e, 0x99, 0xb4, 0x50, 0xd8, 0xdc,
+	0x14, 0x81, 0x3a, 0x83, 0xc3, 0xce, 0xe3, 0x91, 0x56, 0xbe, 0xf3, 0x7d, 0x09, 0xd6, 0x96, 0xb3,
+	0x40, 0xb6, 0x6c, 0x9d, 0xae, 0x74, 0xc0, 0xec, 0x41, 0x67, 0xdc, 0xb7, 0xe8, 0xfe, 0xc5, 0x89,
+	0xcf, 0x03, 0x0e, 0x8d, 0x07, 0xac, 0x63, 0xdb, 0x03, 0xb3, 0x9b, 0xeb, 0xaa, 0xce, 0x83, 0xf6,
+	0xad, 0x07, 0xe6, 0xc0, 0x90, 0x58, 0xad, 0x4c, 0x6e, 0xc0, 0xce, 0x79, 0x7d, 0x67, 0xd8, 0xa3,
+	0x96, 0xd9, 0xd3, 0x2a, 0x64, 0x07, 0x36, 0xcf, 0x2b, 0x4d, 0x6b, 0xa4, 0xad, 0x1c, 0x5d, 0xc1,
+	0xff, 0x4d, 0xb8, 0xff, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x3f, 0x56, 0x84, 0x5c, 0x18,
+	0x00, 0x00,
 }
diff --git a/feeds/feeds.proto b/feeds/feeds.proto
index d714f46..f3c863d 100644
--- a/feeds/feeds.proto
+++ b/feeds/feeds.proto
@@ -409,7 +409,18 @@
   // Rules to book/cancel an appointment. (optional)
   SchedulingRules rules = 6;
   // Intake forms to customize the service. (optional)
-  repeated ServiceIntakeForm form = 7;
+  //
+  // Deprecated. Please see intake_form and per_ticket_intake_form.
+  repeated ServiceIntakeForm form = 7 [deprecated = true];
+
+  // A form requesting additional information from the user when they book this
+  // service. (optional)
+  ServiceIntakeForm intake_form = 20;
+
+  // A form requesting additional information from the user when they book this
+  // service. This form must be filled out once for each ticket the user is
+  // booking. (optional)
+  ServiceIntakeForm per_ticket_intake_form = 21;
 
   // Enum to indicate the prepayment type.
   enum PrepaymentType {
@@ -476,6 +487,11 @@
   // Each Service may have zero or more values for each service attribute
   // defined in the corresponding Merchant.
   repeated ServiceAttributeValueId service_attribute_value_id = 18;
+
+  // Rules related to joining the waitlist. Should be populated if the service
+  // and merchant support waitlist functionality. Should not be populated
+  // otherwise.
+  WaitlistRules waitlist_rules = 19;
 }
 
 // The price of a service or a fee.
@@ -533,6 +549,11 @@
 
 // Defines a field that is included in a ServiceIntakeForm.
 message ServiceIntakeFormField {
+  // A string from an aggregator partner which uniquely identifies a form field.
+  // This id should be the same as the id in the corresponding form field
+  // answer. (required)
+  string id = 5;
+
   // Enum to indicate the type of field.
   enum FieldType {
     // Fields of unspecified or unknown type will be ignored.
@@ -571,12 +592,12 @@
   repeated ServiceIntakeFormField field = 1;
 
   // If true, this form will be shown to first time customers.
-  // (one of first_time_customers or returning_customers required)
-  bool first_time_customers = 2;
+  // Deprecated. This functionality is not supported for intake forms.
+  bool first_time_customers = 2 [deprecated = true];
 
   // If true, this form will be shown to repeat customers.
-  // (one of first_time_customers or returning_customers required)
-  bool returning_customers = 3;
+  // Deprecated. This functionality is not supported for intake forms.
+  bool returning_customers = 3 [deprecated = true];
 }
 
 // A deposit that the user may be charged or have a hold on their credit card
@@ -726,3 +747,18 @@
   // in the service attribute definition.
   string value_id = 2;
 }
+
+// Rules related to joining the waitlist.
+message WaitlistRules {
+  // Required. Must be a positive integer for services providing waitlist
+  // functionality. If the service or merchant does not provide waitlist
+  // functionality, this must not be populated.
+  int32 min_party_size = 1;
+  // Required. Must be a positive integer for services providing waitlist
+  // functionality. If the service or merchant does not provide waitlist
+  // functionality, this must not be populated.
+  int32 max_party_size = 2;
+  // If true, the user will be able to send a free-form additional text request
+  // when joining the waitlist for this service.
+  bool supports_additional_request = 3;
+}
diff --git a/proto/v3.proto b/proto/v3.proto
index c443878..7775478 100644
--- a/proto/v3.proto
+++ b/proto/v3.proto
@@ -161,8 +161,7 @@
   // 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 payment_processing_parameters =
-      5;
+  PaymentProcessingParameters payment_processing_parameters = 5;
 
   // Idempotency token for CreateBooking requests. (required)
   string idempotency_token = 6;
@@ -577,6 +576,8 @@
     CAN_FULFILL = 1;
     // No adequate availability for the slot requested.
     SLOT_UNAVAILABLE = 2;
+    // Child tickets cannot be booked without an adult ticket.
+    CHILD_TICKETS_WITHOUT_ADULT = 6;
     // The combination of ticket types requested cannot be fulfilled.
     UNFULFILLABLE_TICKET_COMBINATION = 3;
     // The total price of this line item is not correct.
diff --git a/proto/waitlist.proto b/proto/waitlist.proto
new file mode 100644
index 0000000..5784284
--- /dev/null
+++ b/proto/waitlist.proto
@@ -0,0 +1,323 @@
+// API v3 waitlist public interface declaration
+syntax = "proto3";
+
+// Waitlist partner API protos
+package ext.maps.booking.partner.v3.waitlist;
+
+// +------+------------------------------+----------------------------------+
+// | Verb |          HTTP Path           |      Request/Response Body       |
+// +------+------------------------------+----------------------------------+
+// | GET  | /v3/HealthCheck              | -                                |
+// |      |                              | -                                |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/BatchGetWaitlistEstimates| BatchGetWaitlistEstimatesRequest |
+// |      |                              | BatchGetWaitlistEstimatesResponse|
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/CreateWaitlistEntry      | CreateWaitlistEntryRequest       |
+// |      |                              | CreateWaitlistEntryResponse      |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/GetWaitlistEntry         | GetWaitlistEntryRequest          |
+// |      |                              | GetWaitlistEntryResponse         |
+// +------+------------------------------+----------------------------------+
+// | POST | /v3/DeleteWaitlistEntry      | DeleteWaitlistEntryRequest       |
+// |      |                              | google.protobuf.Empty            |
+// +------+------------------------------+----------------------------------+
+
+// BatchGetWaitEstimates method
+
+// Batch request for the wait estimates for the specified merchant, service and
+// party sizes.
+message BatchGetWaitEstimatesRequest {
+  // Required. Partner-provided ID for the merchant.
+  string merchant_id = 1;
+
+  // Required. Partner-provided ID for the service.
+  string service_id = 2;
+
+  // Required. The different party sizes WaitEstimates are requested for.
+  // WaitEstimates may differ with the number of people in the party.
+  repeated int32 party_size = 3;
+}
+
+// Response for the BatchGetWaitEstimates RPC with the wait estimates of the
+// specified merchant, service and party sizes.
+message BatchGetWaitEstimatesResponse {
+  // Required. A status for the waitlist that indicates whether new users can
+  // join and what the reason is if they can’t join. If the waitlist is not
+  // open, all other fields in the BatchGetWaitEstimatesResponse are expected to
+  // be unset.
+  WaitlistStatus waitlist_status = 1;
+
+  // The wait estimates for each party size requested. The response should
+  // contain exactly one wait estimate for each party size sent in the request.
+  // If a party size is not available for some reason, prefer ommitting it
+  // instead of returning an error so that the user will have some options to
+  // choose from.
+  repeated WaitEstimate wait_estimate = 2;
+}
+
+// A status for the waitlist that determines if new users can join and what
+// the reason is if they can’t join.
+enum WaitlistStatus {
+  WAITLIST_STATUS_UNSPECIFIED = 0;
+  // The waitlist is open and is accepting new users.
+  OPEN = 1;
+  // There is currently no wait and users should arrive at the merchant
+  // without joining the waitlist.
+  CLOSED_NO_WAIT = 2;
+  // The waitlist is not currently accepting new users because it is full
+  // or closed for other reasons.
+  CLOSED_OTHER = 3;
+}
+
+// The range of time for the current estimated seat time for the user. Estimated
+// seat time range must change over time when the merchant or partner updates
+// their estimates.
+message EstimatedSeatTimeRange {
+  // Required. The lower bound for the range. Expressed as the number of seconds
+  // since the Unix epoch.
+  int64 start_seconds = 1;
+
+  // Required. The upper bound for the range. Expressed as the number of seconds
+  // since the Unix epoch.
+  int64 end_seconds = 2;
+}
+
+// Contains fields measuring how long (in time or # of people) until the
+// user is ready to leave the waitlist and be seated.
+message WaitLength {
+  // The count of how many other parties are ahead of the user in the waitlist.
+  // parties_ahead_count must change over time as parties ahead
+  // in the waitlist are seated or leave the waitlist. Either
+  // parties_ahead_count or estimated_seat_time_range must be populated. Both
+  // should be populated.
+  int32 parties_ahead_count = 1;
+
+  // The range of time that the user is estimated to be seated in. Either
+  // parties_ahead_count or estimated_seat_time_range must be populated. Both
+  // should be populated.
+  EstimatedSeatTimeRange estimated_seat_time_range = 2;
+}
+
+// The wait estimate for a particular party size, merchant and service.
+message WaitEstimate {
+  // Required. The party size this wait estimate applies to.
+  int32 party_size = 1;
+
+  // Required. Contains fields measuring how long (in time or # of people) until
+  // the user is ready to leave the waitlist and be seated.
+  WaitLength wait_length = 2;
+}
+
+// CreateWaitlistEntry method
+
+// Request for a user to join the waitlist.
+//
+// Reserve with Google may retry REST HTTP requests if no response is
+// received. If the exact same CreateWaitlistEntry is received a second time,
+// then the same CreateWaitlistResponse must be returned. A second waitlist
+// entry must not be created.
+message CreateWaitlistEntryRequest {
+  // Required. Partner-provided ID for the merchant.
+  string merchant_id = 1;
+
+  // Required. Partner-provided ID for the service.
+  string service_id = 2;
+
+  // Required. The party size requested for the waitlist entry.
+  int32 party_size = 3;
+
+  // Required. Personal information of the user joining the waitlist.
+  UserInformation user_information = 4;
+
+  // A string from the user which contains any special requests or additional
+  // information that they would like to notify the merchant about.
+  // This will be populated when the user submits an additional request to
+  // Reserve with Google. The partner can disable this functionality at the
+  // service level by setting supports_additional_request to false in the
+  // service feed.
+  string additional_request = 5;
+
+  // Required. Used to differentiate retries from separate requests. If the
+  // exact same CreateWaitlistEntry is received a second time, (including
+  // idempotency_token) then the same CreateWaitlistResponse must be returned.
+  string idempotency_token = 6;
+}
+
+// Response for the CreateWaitlistEntry RPC with the waitlist entry ID or any
+// failing business logic information.
+message CreateWaitlistEntryResponse {
+  // Unique partner-provided ID for the newly created entry in the waitlist.
+  // Required if the waitlist entry was created successfully. Unique for all
+  // time.
+  string waitlist_entry_id = 1;
+
+  WaitlistBusinessLogicFailure waitlist_business_logic_failure = 2;
+}
+
+// GetWaitlistEntry method
+
+// Get the waitlist entry corresponding to the provided waitlist entry ID.
+message GetWaitlistEntryRequest {
+  // Required. The partner-provided waitlist entry ID to request info for.
+  string waitlist_entry_id = 1;
+}
+
+// Response with the waitlist entry corresponding to the provided
+// waitlist entry ID.
+message GetWaitlistEntryResponse {
+  // Required. The partner-provided information about a user’s waitlist entry.
+  WaitlistEntry waitlist_entry = 1;
+}
+
+// DeleteWaitlistEntry method
+
+// Cancel the user's entry in the waitlist.
+message DeleteWaitlistEntryRequest {
+  // Required. The partner-provided ID for the waitlist entry to be deleted.
+  string waitlist_entry_id = 1;
+}
+
+// WaitlistEntry specification
+
+enum WaitlistEntryState {
+  WAITLIST_ENTRY_STATE_UNSPECIFIED = 0;
+  // The waitlist entry was created and the user is currently waiting in the
+  // waitlist.
+  WAITING = 1;
+  // The waitlist entry has been canceled. Cancellation for no-shows should use
+  // the NO_SHOW state.
+  CANCELED = 2;
+  // The merchant is ready to serve the user.
+  SERVICE_READY = 3;
+  // The user has checked in with the host and is waiting to be seated.
+  CHECKED_IN = 4;
+  // The user has arrived and been seated by the merchant.
+  SEATED = 5;
+  // The user did not arrive at the merchant in time and lost their space.
+  NO_SHOW = 6;
+}
+
+// The times at which the waitlist entry changed state.
+message WaitlistEntryStateTimes {
+  // Required. The time at which the waitlist entry was created.
+  // In seconds since Unix epoch.
+  int64 created_time_seconds = 1;
+
+  // The time that the waitlist entry was cancelled. Must be populated
+  // when the waitlist entry has been canceled but not before.
+  // In seconds since Unix epoch.
+  int64 canceled_time_seconds = 2;
+
+  // The time the merchant was ready to serve the user.
+  // service_readied_time_seconds must be populated after the merchant is
+  // ready to serve the user but not before.
+  // In seconds since Unix epoch.
+  int64 service_readied_time_seconds = 3;
+
+  // The actual time the user checked in with the host. checked_in_time must be
+  // populated after the user has checked in with the merchant but not before.
+  // In seconds since Unix epoch.
+  int64 checked_in_time_seconds = 4;
+
+  // The seated time for the user. seated_time_seconds must be populated
+  // when the user has been seated but not before.
+  // In seconds since Unix epoch.
+  int64 seated_time_seconds = 5;
+
+  // The time that the user was marked as a no-show. marked_no_show_time_seconds
+  // must be populated when the user has been marked a no-show but not before.
+  // In seconds since Unix epoch.
+  int64 marked_no_show_time_seconds = 6;
+}
+
+// An entry in the waitlist.
+message WaitlistEntry {
+  // Required.
+  WaitlistEntryState waitlist_entry_state = 1;
+
+  // Required. The times at which the waitlist entry changed state.
+  WaitlistEntryStateTimes waitlist_entry_state_times = 2;
+
+  // Required. Contains fields measuring how long (in time or # of people) until
+  // the user is ready to leave the waitlist and be seated.
+  WaitEstimate wait_estimate = 3;
+}
+
+// WaitlistBusinessLogicFailure specification
+
+// Status data that conveys why creating a waitlist entry fails.
+// If there is a business logic error that is not captured here, please
+// reach out to the Reserve with Google team to add it to this list. Other
+// errors should be returned using standard HTTP error codes.
+message WaitlistBusinessLogicFailure {
+  enum Cause {
+    // Default value: Don't use; amounts to an "unknown error"
+    // Unexpected errors must be returned using standard HTTP error codes.
+    CAUSE_UNSPECIFIED = 0;
+
+    // The user has already booked a waitlist entry with the partner.
+    EXISTING_WAITLIST_ENTRY = 1;
+
+    // The requested party size is below the merchant’s minimum.
+    BELOW_MIN_PARTY_SIZE = 2;
+
+    // The requested party size is above the merchant’s maximum.
+    ABOVE_MAX_PARTY_SIZE = 3;
+
+    // The requested merchant is currently closed.
+    MERCHANT_CLOSED = 4;
+
+    // There is currently no wait and the user should walk in without joining
+    // the waitlist.
+    NO_WAIT = 5;
+
+    // The waitlist is at capacity and new users are not being accepted at this
+    // time.
+    WAITLIST_FULL = 6;
+  }
+  // Required. The reason why the booking failed.
+  Cause cause = 1;
+
+  // This optional field is used for the partner to include additional
+  // information for debugging purposes only.
+  string description = 2;
+}
+
+// User specification
+
+// Personal information about the person making a booking
+message UserInformation {
+  // Unique ID of the user to the partner, chosen by Reserve with Google.
+  // (required)
+  string user_id = 1;
+
+  // Given name of the user (maximum 40 characters) (required)
+  string given_name = 2;
+
+  // Family name of the user (maximum 40 characters) (required)
+  string family_name = 3;
+
+  // Address of the user (optional)
+  PostalAddress address = 4;
+
+  // Phone number of the user (required)
+  string telephone = 5;
+
+  // Email address of the user (required)
+  string email = 6;
+}
+
+// The postal address for a merchant.
+message PostalAddress {
+  // The country, e.g. "USA". (required)
+  string country = 1;
+  // The locality/city, e.g. "Mountain View". (required)
+  string locality = 2;
+  // The region/state/province, e.g. "CA". (required)
+  string region = 3;
+  // The postal code, e.g. "94043". (required)
+  string postal_code = 4;
+  // The street address, e.g. "1600 Amphitheatre Pkwy". (required)
+  string street_address = 5;
+}
diff --git a/testclient/waitlistClient.go b/testclient/waitlistClient.go
new file mode 100644
index 0000000..92098bf
--- /dev/null
+++ b/testclient/waitlistClient.go
@@ -0,0 +1,253 @@
+/*
+Copyright 2017 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+package main
+
+import (
+	"flag"
+	"fmt"
+	"log"
+	"os"
+	"path/filepath"
+	"time"
+
+	"github.com/maps-booking-v3/api"
+	"github.com/maps-booking-v3/utils"
+
+	fpb "github.com/maps-booking-v3/feeds"
+)
+
+const logFile = "http_test_client_log_"
+
+var (
+	serverAddr                = flag.String("server_addr", "example.com:80", "Your http server's address in the format of host:port")
+	credentialsFile           = flag.String("credentials_file", "", "File containing credentials for your server. Leave blank to bypass authentication. File should have exactly one line of the form 'username:password'.")
+	numTestServices           = flag.Int("num_test_services", 10, "Maximum number of services to test from service_feed. Services will be selected randomly")
+	allFlows                  = flag.Bool("all_tests", false, "Whether to test all endpoints.")
+	healthFlow                = flag.Bool("health_check_test", false, "Whether to test the Health endpoint.")
+	batchGetWaitEstimatesFlow = flag.Bool("batch_get_wait_estimates_test", false, "Whether to test the BatchGetWaitEstimates endpoint.")
+	createWaitlistEntryFlow   = flag.Bool("create_waitlist_entry_test", false, "Whether to test the CreateWaitlistEntry endpoint.")
+	getWaitlistEntryFlow      = flag.Bool("get_waitlist_entry_test", false, "Whether to test the GetWaitlistEntry endpoint. CreateWaitlistEntry will also be called to create the entries.")
+	deleteWaitlistEntryFlow   = flag.Bool("delete_waitlist_entry_test", false, "Whether to test the DeleteWaitlistEntry endpoint. CreateWaitlistEntry will also be called to create the entries.")
+	serviceFeed               = flag.String("service_feed", "", "Absolute path to service feed required for all tests except health. Feeds can be in either json or pb3 format.")
+	outputDir                 = flag.String("output_dir", "", "Absolute path of dir to dump log file.")
+	caFile                    = flag.String("ca_file", "", "Absolute path to your server's Certificate Authority root cert. Downloading all roots currently recommended by the Google Internet Authority is a suitable alternative https://pki.google.com/roots.pem. Leave blank to connect using http rather than https.")
+	fullServerName            = flag.String("full_server_name", "", "Fully qualified domain name. Same name used to sign CN. Only necessary if ca_file is specified and the base URL differs from the server address.")
+	outputToTerminal          = flag.Bool("output_to_terminal", false, "Output to terminal rather than a file.")
+)
+
+type counters struct {
+	TotalServicesProcessed       int
+	HealthCheckSuccess           bool
+	BatchGetWaitEstimatesSuccess int
+	BatchGetWaitEstimatesErrors  int
+	CreateWaitlistEntrySuccess   int
+	CreateWaitlistEntryErrors    int
+	GetWaitlistEntrySuccess      int
+	GetWaitlistEntryErrors       int
+	DeleteWaitlistEntrySuccess   int
+	DeleteWaitlistEntryErrors    int
+}
+
+// GenerateWaitlistEntries creates a waitlist entry for each provided service.
+func GenerateWaitlistEntries(services []*fpb.Service, stats *counters, conn *api.HTTPConnection) []string {
+	log.Println("no previous waitlist entries to use, acquiring new inventory")
+	utils.LogFlow("Generate Fresh Entries", "Start")
+	defer utils.LogFlow("Generate Fresh Entries", "End")
+
+	var out []string
+	totalServices := len(services)
+	for i, s := range services {
+		id, err := api.CreateWaitlistEntry(s, conn)
+		if err != nil {
+			log.Printf("%s. skipping waitlistEntry %d/%d, serviceID: %s",
+				err.Error(), i, totalServices, s.GetServiceId())
+			stats.CreateWaitlistEntryErrors++
+			continue
+		}
+		out = append(out, id)
+		stats.CreateWaitlistEntrySuccess++
+	}
+	return out
+}
+
+func createLogFile() (*os.File, error) {
+	var err error
+	outPath := *outputDir
+	if outPath == "" {
+		outPath, err = os.Getwd()
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	now := time.Now().UTC()
+	nowString := fmt.Sprintf("%d-%02d-%02d_%02d-%02d-%02d", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
+	outFile := filepath.Join(outPath, fmt.Sprintf("%s%s", logFile, nowString))
+
+	return os.Create(outFile)
+}
+
+func logStats(stats counters) {
+	log.Println("\n************* Begin Stats *************\n")
+	var totalErrors int
+	if *healthFlow || *allFlows {
+		if stats.HealthCheckSuccess {
+			log.Println("HealthCheck Succeeded")
+		} else {
+			totalErrors++
+			log.Println("HealthCheck Failed")
+		}
+	}
+	if *batchGetWaitEstimatesFlow || *allFlows {
+		totalErrors += stats.BatchGetWaitEstimatesErrors
+		log.Printf("BatchGetWaitEstimates Errors: %d/%d", stats.BatchGetWaitEstimatesErrors, stats.BatchGetWaitEstimatesErrors+stats.BatchGetWaitEstimatesSuccess)
+	}
+	if *createWaitlistEntryFlow || *allFlows {
+		totalErrors += stats.CreateWaitlistEntryErrors
+		log.Printf("CreateWaitlistEntry Errors: %d/%d", stats.CreateWaitlistEntryErrors, stats.CreateWaitlistEntryErrors+stats.CreateWaitlistEntrySuccess)
+	}
+	if *getWaitlistEntryFlow || *allFlows {
+		totalErrors += stats.GetWaitlistEntryErrors
+		log.Printf("GetWaitlistEntry Errors: %d/%d", stats.GetWaitlistEntryErrors, stats.GetWaitlistEntryErrors+stats.GetWaitlistEntrySuccess)
+	}
+	if *deleteWaitlistEntryFlow || *allFlows {
+		totalErrors += stats.DeleteWaitlistEntryErrors
+		log.Printf("DeleteWaitlistEntry Errors: %d/%d", stats.DeleteWaitlistEntryErrors, stats.DeleteWaitlistEntryErrors+stats.DeleteWaitlistEntrySuccess)
+	}
+
+	log.Println("\n\n\n")
+	if totalErrors == 0 {
+		log.Println("All Tests Pass!")
+	} else {
+		log.Printf("Found %d Errors", totalErrors)
+	}
+
+	log.Println("\n************* End Stats *************\n")
+	os.Exit(totalErrors)
+}
+
+func main() {
+	flag.Parse()
+	var stats counters
+
+	if !*outputToTerminal {
+		// Set up logging before continuing with flows
+		f, err := createLogFile()
+		if err != nil {
+			log.Fatalf("Failed to create log file %v", err)
+		}
+		defer f.Close()
+		log.SetOutput(f)
+	}
+
+	conn, err := api.InitHTTPConnection(*serverAddr, *credentialsFile, *caFile, *fullServerName)
+	if err != nil {
+		log.Fatalf("Failed to init http connection %v", err)
+	}
+
+	// HealthCheck Flow
+	if *healthFlow || *allFlows {
+		stats.HealthCheckSuccess = true
+		if err := api.HealthCheck(conn); err != nil {
+			stats.HealthCheckSuccess = false
+			log.Println(err.Error())
+		}
+		if !*allFlows && !*batchGetWaitEstimatesFlow && !*createWaitlistEntryFlow &&
+			!*getWaitlistEntryFlow && !*deleteWaitlistEntryFlow {
+			logStats(stats)
+		}
+	}
+
+	// Build services.
+	if *serviceFeed == "" {
+		log.Fatal("please set service_feed flag if you wish to test additional flows")
+	}
+
+	var services []*fpb.Service
+	services, err = utils.ParseServiceFeed(*serviceFeed)
+	if err != nil {
+		log.Fatalf("Failed to get services: %v", err.Error())
+	}
+	// Remove services without waitlist rules.
+	waitlistServices := services[:0]
+	for _, s := range services {
+		if s.GetWaitlistRules() != nil {
+			waitlistServices = append(waitlistServices, s)
+		}
+	}
+
+	if len(services) == 0 {
+		log.Fatal("no services have waitlist rules")
+	}
+	reducedServices := utils.ReduceServices(waitlistServices, *numTestServices)
+	stats.TotalServicesProcessed += len(reducedServices)
+
+	// BatchGetWaitEstimates Flow
+	if *batchGetWaitEstimatesFlow || *allFlows {
+		utils.LogFlow("BatchGetWaitEstimates", "Start")
+
+		for i, s := range reducedServices {
+			if err = api.BatchGetWaitEstimates(s, conn); err != nil {
+				log.Printf("%s. BatchGerWaitEstimates failed for service %d/%d. Service_id:",
+					err.Error(), i, stats.TotalServicesProcessed, s.GetServiceId())
+				stats.BatchGetWaitEstimatesErrors++
+				continue
+			}
+			stats.BatchGetWaitEstimatesSuccess++
+		}
+		utils.LogFlow("BatchGetWaitEstimates", "End")
+	}
+	// CreateWaitlistEntry Flow.
+	var ids []string
+	if *createWaitlistEntryFlow || *getWaitlistEntryFlow ||
+		*deleteWaitlistEntryFlow || *allFlows {
+		utils.LogFlow("CreateWaitlistEntry", "Start")
+		ids = GenerateWaitlistEntries(reducedServices, &stats, conn)
+		utils.LogFlow("CreateWaitlistEntry", "End")
+	}
+	// GetWaitlistEntry Flow
+	if *getWaitlistEntryFlow || *allFlows {
+		utils.LogFlow("GetWaitlistEntry", "Start")
+		for _, id := range ids {
+			if _, err = api.GetWaitlistEntry(id, conn); err != nil {
+				log.Printf("%s. get waitlist entry failed for waitlist entry id: %s",
+					err.Error(), id)
+				stats.GetWaitlistEntryErrors++
+				continue
+			}
+			stats.GetWaitlistEntrySuccess++
+		}
+		utils.LogFlow("GetWaitlistEntry", "End")
+	}
+
+	// DeleteWaitlistentry Flow
+	if *deleteWaitlistEntryFlow || *allFlows {
+		utils.LogFlow("DeleteWaitlistEntry", "Start")
+
+		for _, id := range ids {
+			if err = api.DeleteWaitlistEntry(id, conn); err != nil {
+				log.Printf("%s. Delete waitlist entry failed for waitlist entry id: %s",
+					err.Error(), id)
+				stats.DeleteWaitlistEntryErrors++
+				continue
+			}
+			stats.DeleteWaitlistEntrySuccess++
+		}
+		utils.LogFlow("DeleteWaitlistEntry", "End")
+	}
+
+	logStats(stats)
+}
diff --git a/utils/utils.go b/utils/utils.go
index fa87aa6..f23c4a8 100644
--- a/utils/utils.go
+++ b/utils/utils.go
@@ -34,6 +34,7 @@
 
 	fpb "github.com/maps-booking-v3/feeds"
 	mpb "github.com/maps-booking-v3/v3"
+	wpb "github.com/maps-booking-v3/waitlist"
 )
 
 // SlotKey is a struct representing a unique service.
@@ -49,7 +50,23 @@
 	log.Println(strings.Join([]string{"\n##########\n", status, f, "Flow", "\n##########"}, " "))
 }
 
-func parseServiceFeed(serviceFeed string) ([]*fpb.Service, error) {
+// ReduceServices randomly selects and returns numTestServices from the provided services.
+func ReduceServices(allServices []*fpb.Service, numTestServices int) []*fpb.Service {
+	reducedServices := make([]*fpb.Service, 0, numTestServices)
+
+	if len(allServices) <= numTestServices {
+		reducedServices = allServices
+	} else {
+		for _, n := range rand.Perm(len(allServices))[0:numTestServices] {
+			reducedServices = append(reducedServices, allServices[n])
+		}
+	}
+	log.Printf("Selected %d services out of a possible %d", len(reducedServices), len(allServices))
+	return reducedServices
+}
+
+// ParseServiceFeed returns a slice of services for each service in the feed.
+func ParseServiceFeed(serviceFeed string) ([]*fpb.Service, error) {
 	var feed fpb.ServiceFeed
 	content, err := ioutil.ReadFile(serviceFeed)
 	if err != nil {
@@ -137,7 +154,7 @@
 
 // MerchantLineItemMapFrom attempts to build a collection of LineItems from a service and availability feed.
 func MerchantLineItemMapFrom(serviceFeed, availabilityFeed string, testSlots int) (map[string][]*mpb.LineItem, error) {
-	services, err := parseServiceFeed(serviceFeed)
+	services, err := ParseServiceFeed(serviceFeed)
 	if err != nil {
 		return nil, err
 	}
@@ -422,3 +439,47 @@
 	}
 	return m
 }
+
+// ValidateWaitEstimate validates all the fields are populated for the wait estimate.
+func ValidateWaitEstimate(waitEstimate *wpb.WaitEstimate) error {
+	if waitEstimate.GetPartySize() <= 0 {
+		return errors.New("party size <= 0")
+	}
+	waitLength := waitEstimate.GetWaitLength()
+	if waitLength == nil {
+		return errors.New("wait estimate not specified")
+	}
+	if waitLength.GetPartiesAheadCount() < 0 {
+		return errors.New("parties ahead count < 0")
+	}
+	estimatedSeatTimeRange := waitLength.GetEstimatedSeatTimeRange()
+	if estimatedSeatTimeRange == nil {
+		return errors.New("estimated seat time range not specified")
+	}
+	if estimatedSeatTimeRange.GetStartSeconds() <= 0 {
+		return errors.New("start seconds <= 0")
+	}
+	if estimatedSeatTimeRange.GetEndSeconds() <= 0 {
+		return errors.New("end seconds <= 0")
+	}
+	return nil
+}
+
+// ValidateWaitlistEntry validates all the fields are populated for the waitlist entry.
+func ValidateWaitlistEntry(waitlistEntry *wpb.WaitlistEntry) error {
+	if waitlistEntry.GetWaitlistEntryState() == wpb.WaitlistEntryState_WAITLIST_ENTRY_STATE_UNSPECIFIED {
+		return errors.New("waitlist entry state not specified")
+	}
+	stateTimes := waitlistEntry.GetWaitlistEntryStateTimes()
+	if stateTimes == nil {
+		return errors.New("WaitlistEntryStateTimes not specified")
+	}
+	if stateTimes.GetCreatedTimeSeconds() <= 0 {
+		return errors.New("created time seconds <= 0")
+	}
+	waitEstimate := waitlistEntry.GetWaitEstimate()
+	if waitEstimate == nil {
+		return errors.New("wait estimate not specified")
+	}
+	return ValidateWaitEstimate(waitEstimate)
+}
diff --git a/v3/v3.pb.go b/v3/v3.pb.go
index 3db0270..20c140b 100644
--- a/v3/v3.pb.go
+++ b/v3/v3.pb.go
@@ -1,11 +1,15 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // source: v3.proto
 
+// Booking partner API protos
 package ext_maps_booking_partner_v3
 
-import proto "github.com/golang/protobuf/proto"
-import fmt "fmt"
-import math "math"
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+)
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -52,6 +56,7 @@
 	4: "NO_SHOW",
 	5: "NO_SHOW_PENALIZED",
 }
+
 var BookingStatus_value = map[string]int32{
 	"BOOKING_STATUS_UNSPECIFIED":    0,
 	"CONFIRMED":                     1,
@@ -64,8 +69,9 @@
 func (x BookingStatus) String() string {
 	return proto.EnumName(BookingStatus_name, int32(x))
 }
+
 func (BookingStatus) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{0}
+	return fileDescriptor_1820d8e1a9fad753, []int{0}
 }
 
 // Used when booking/order failure cause is PAYMENT_ERROR_CARD_TYPE_REJECTED to
@@ -88,19 +94,21 @@
 	3: "AMERICAN_EXPRESS",
 	4: "DISCOVER",
 }
+
 var CreditCardType_value = map[string]int32{
 	"CREDIT_CARD_TYPE_UNSPECIFIED": 0,
-	"VISA":             1,
-	"MASTERCARD":       2,
-	"AMERICAN_EXPRESS": 3,
-	"DISCOVER":         4,
+	"VISA":                         1,
+	"MASTERCARD":                   2,
+	"AMERICAN_EXPRESS":             3,
+	"DISCOVER":                     4,
 }
 
 func (x CreditCardType) String() string {
 	return proto.EnumName(CreditCardType_name, int32(x))
 }
+
 func (CreditCardType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{1}
+	return fileDescriptor_1820d8e1a9fad753, []int{1}
 }
 
 type PaymentOptionType int32
@@ -118,6 +126,7 @@
 	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,
@@ -128,8 +137,9 @@
 func (x PaymentOptionType) String() string {
 	return proto.EnumName(PaymentOptionType_name, int32(x))
 }
+
 func (PaymentOptionType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{2}
+	return fileDescriptor_1820d8e1a9fad753, []int{2}
 }
 
 // Prepayment status of a booking.
@@ -163,6 +173,7 @@
 	3: "PREPAYMENT_REFUNDED",
 	4: "PREPAYMENT_CREDITED",
 }
+
 var PrepaymentStatus_value = map[string]int32{
 	"PREPAYMENT_STATUS_UNSPECIFIED": 0,
 	"PREPAYMENT_PROVIDED":           1,
@@ -174,8 +185,9 @@
 func (x PrepaymentStatus) String() string {
 	return proto.EnumName(PrepaymentStatus_name, int32(x))
 }
+
 func (PrepaymentStatus) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{3}
+	return fileDescriptor_1820d8e1a9fad753, []int{3}
 }
 
 // Defines how a total price is determined from an availability.
@@ -197,6 +209,7 @@
 	0: "FIXED_RATE_DEFAULT",
 	1: "PER_PERSON",
 }
+
 var PriceType_value = map[string]int32{
 	"FIXED_RATE_DEFAULT": 0,
 	"PER_PERSON":         1,
@@ -205,8 +218,9 @@
 func (x PriceType) String() string {
 	return proto.EnumName(PriceType_name, int32(x))
 }
+
 func (PriceType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{4}
+	return fileDescriptor_1820d8e1a9fad753, []int{4}
 }
 
 // This enum indicates what requirements exist for the user to acknowledge or
@@ -228,6 +242,7 @@
 	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,
@@ -237,8 +252,9 @@
 func (x CheckAvailabilityResponse_DurationRequirement) String() string {
 	return proto.EnumName(CheckAvailabilityResponse_DurationRequirement_name, int32(x))
 }
+
 func (CheckAvailabilityResponse_DurationRequirement) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{1, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{1, 0}
 }
 
 type BookingFailure_Cause int32
@@ -297,6 +313,7 @@
 	11: "BOOKING_NOT_CANCELLABLE",
 	12: "OVERLAPPING_RESERVATION",
 }
+
 var BookingFailure_Cause_value = map[string]int32{
 	"CAUSE_UNSPECIFIED":                0,
 	"SLOT_UNAVAILABLE":                 1,
@@ -316,8 +333,9 @@
 func (x BookingFailure_Cause) String() string {
 	return proto.EnumName(BookingFailure_Cause_name, int32(x))
 }
+
 func (BookingFailure_Cause) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{23, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{23, 0}
 }
 
 type OrderFailure_Cause int32
@@ -347,6 +365,7 @@
 	3: "PAYMENT_ERROR_CARD_DECLINED",
 	4: "PAYMENT_ERROR",
 }
+
 var OrderFailure_Cause_value = map[string]int32{
 	"CAUSE_UNSPECIFIED":                0,
 	"ORDER_UNFULFILLABLE":              1,
@@ -358,8 +377,9 @@
 func (x OrderFailure_Cause) String() string {
 	return proto.EnumName(OrderFailure_Cause_name, int32(x))
 }
+
 func (OrderFailure_Cause) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{26, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{26, 0}
 }
 
 // The result of an order fulfillability check.
@@ -387,19 +407,21 @@
 	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,
+	"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_v3_e164fdd8b81531d4, []int{27, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{27, 0}
 }
 
 // The result of a line item fulfillability check.
@@ -412,6 +434,8 @@
 	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.
@@ -425,14 +449,17 @@
 	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,
@@ -441,8 +468,9 @@
 func (x LineItemFulfillability_ItemFulfillabilityResult) String() string {
 	return proto.EnumName(LineItemFulfillability_ItemFulfillabilityResult_name, int32(x))
 }
+
 func (LineItemFulfillability_ItemFulfillabilityResult) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{28, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{28, 0}
 }
 
 type PaymentProcessingParameters_PaymentProcessor int32
@@ -458,6 +486,7 @@
 	1: "PROCESSOR_STRIPE",
 	2: "PROCESSOR_BRAINTREE",
 }
+
 var PaymentProcessingParameters_PaymentProcessor_value = map[string]int32{
 	"PAYMENT_PROCESSOR_UNSPECIFIED": 0,
 	"PROCESSOR_STRIPE":              1,
@@ -467,8 +496,9 @@
 func (x PaymentProcessingParameters_PaymentProcessor) String() string {
 	return proto.EnumName(PaymentProcessingParameters_PaymentProcessor_name, int32(x))
 }
+
 func (PaymentProcessingParameters_PaymentProcessor) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{31, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{31, 0}
 }
 
 // Who handles payment processing?
@@ -488,6 +518,7 @@
 	1: "PROCESSED_BY_GOOGLE",
 	2: "PROCESSED_BY_PARTNER",
 }
+
 var PaymentInformation_PaymentProcessedBy_value = map[string]int32{
 	"PAYMENT_PROCESSED_BY_UNSPECIFIED": 0,
 	"PROCESSED_BY_GOOGLE":              1,
@@ -497,8 +528,9 @@
 func (x PaymentInformation_PaymentProcessedBy) String() string {
 	return proto.EnumName(PaymentInformation_PaymentProcessedBy_name, int32(x))
 }
+
 func (PaymentInformation_PaymentProcessedBy) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{33, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{33, 0}
 }
 
 // Request to check availability for a Slot.
@@ -514,16 +546,17 @@
 func (m *CheckAvailabilityRequest) String() string { return proto.CompactTextString(m) }
 func (*CheckAvailabilityRequest) ProtoMessage()    {}
 func (*CheckAvailabilityRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{0}
+	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 (dst *CheckAvailabilityRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CheckAvailabilityRequest.Merge(dst, src)
+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)
@@ -568,16 +601,17 @@
 func (m *CheckAvailabilityResponse) String() string { return proto.CompactTextString(m) }
 func (*CheckAvailabilityResponse) ProtoMessage()    {}
 func (*CheckAvailabilityResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{1}
+	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 (dst *CheckAvailabilityResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CheckAvailabilityResponse.Merge(dst, src)
+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)
@@ -629,16 +663,17 @@
 func (m *AvailabilityUpdate) String() string { return proto.CompactTextString(m) }
 func (*AvailabilityUpdate) ProtoMessage()    {}
 func (*AvailabilityUpdate) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{2}
+	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 (dst *AvailabilityUpdate) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AvailabilityUpdate.Merge(dst, src)
+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)
@@ -671,16 +706,17 @@
 func (m *SlotAvailability) String() string { return proto.CompactTextString(m) }
 func (*SlotAvailability) ProtoMessage()    {}
 func (*SlotAvailability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{3}
+	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 (dst *SlotAvailability) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SlotAvailability.Merge(dst, src)
+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)
@@ -721,16 +757,17 @@
 func (m *CheckOrderFulfillabilityRequest) String() string { return proto.CompactTextString(m) }
 func (*CheckOrderFulfillabilityRequest) ProtoMessage()    {}
 func (*CheckOrderFulfillabilityRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{4}
+	return fileDescriptor_1820d8e1a9fad753, []int{4}
 }
+
 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 (dst *CheckOrderFulfillabilityRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CheckOrderFulfillabilityRequest.Merge(dst, src)
+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)
@@ -772,16 +809,17 @@
 func (m *CheckOrderFulfillabilityResponse) String() string { return proto.CompactTextString(m) }
 func (*CheckOrderFulfillabilityResponse) ProtoMessage()    {}
 func (*CheckOrderFulfillabilityResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{5}
+	return fileDescriptor_1820d8e1a9fad753, []int{5}
 }
+
 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 (dst *CheckOrderFulfillabilityResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CheckOrderFulfillabilityResponse.Merge(dst, src)
+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)
@@ -819,16 +857,17 @@
 func (m *GetBookingStatusRequest) String() string { return proto.CompactTextString(m) }
 func (*GetBookingStatusRequest) ProtoMessage()    {}
 func (*GetBookingStatusRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{6}
+	return fileDescriptor_1820d8e1a9fad753, []int{6}
 }
+
 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 (dst *GetBookingStatusRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetBookingStatusRequest.Merge(dst, src)
+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)
@@ -864,16 +903,17 @@
 func (m *GetBookingStatusResponse) String() string { return proto.CompactTextString(m) }
 func (*GetBookingStatusResponse) ProtoMessage()    {}
 func (*GetBookingStatusResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{7}
+	return fileDescriptor_1820d8e1a9fad753, []int{7}
 }
+
 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 (dst *GetBookingStatusResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetBookingStatusResponse.Merge(dst, src)
+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)
@@ -941,16 +981,17 @@
 func (m *CreateBookingRequest) String() string { return proto.CompactTextString(m) }
 func (*CreateBookingRequest) ProtoMessage()    {}
 func (*CreateBookingRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{8}
+	return fileDescriptor_1820d8e1a9fad753, []int{8}
 }
+
 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 (dst *CreateBookingRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateBookingRequest.Merge(dst, src)
+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)
@@ -1035,16 +1076,17 @@
 func (m *CreateBookingResponse) String() string { return proto.CompactTextString(m) }
 func (*CreateBookingResponse) ProtoMessage()    {}
 func (*CreateBookingResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{9}
+	return fileDescriptor_1820d8e1a9fad753, []int{9}
 }
+
 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 (dst *CreateBookingResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateBookingResponse.Merge(dst, src)
+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)
@@ -1092,16 +1134,17 @@
 func (m *CreateLeaseRequest) String() string { return proto.CompactTextString(m) }
 func (*CreateLeaseRequest) ProtoMessage()    {}
 func (*CreateLeaseRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{10}
+	return fileDescriptor_1820d8e1a9fad753, []int{10}
 }
+
 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 (dst *CreateLeaseRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateLeaseRequest.Merge(dst, src)
+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)
@@ -1136,16 +1179,17 @@
 func (m *CreateLeaseResponse) String() string { return proto.CompactTextString(m) }
 func (*CreateLeaseResponse) ProtoMessage()    {}
 func (*CreateLeaseResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{11}
+	return fileDescriptor_1820d8e1a9fad753, []int{11}
 }
+
 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 (dst *CreateLeaseResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateLeaseResponse.Merge(dst, src)
+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)
@@ -1192,16 +1236,17 @@
 func (m *Lease) String() string { return proto.CompactTextString(m) }
 func (*Lease) ProtoMessage()    {}
 func (*Lease) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{12}
+	return fileDescriptor_1820d8e1a9fad753, []int{12}
 }
+
 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 (dst *Lease) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Lease.Merge(dst, src)
+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)
@@ -1253,16 +1298,17 @@
 func (m *LeaseReference) String() string { return proto.CompactTextString(m) }
 func (*LeaseReference) ProtoMessage()    {}
 func (*LeaseReference) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{13}
+	return fileDescriptor_1820d8e1a9fad753, []int{13}
 }
+
 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 (dst *LeaseReference) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LeaseReference.Merge(dst, src)
+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)
@@ -1299,16 +1345,17 @@
 func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) }
 func (*CreateOrderRequest) ProtoMessage()    {}
 func (*CreateOrderRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{14}
+	return fileDescriptor_1820d8e1a9fad753, []int{14}
 }
+
 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 (dst *CreateOrderRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateOrderRequest.Merge(dst, src)
+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)
@@ -1360,16 +1407,17 @@
 func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) }
 func (*CreateOrderResponse) ProtoMessage()    {}
 func (*CreateOrderResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{15}
+	return fileDescriptor_1820d8e1a9fad753, []int{15}
 }
+
 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 (dst *CreateOrderResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateOrderResponse.Merge(dst, src)
+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)
@@ -1387,11 +1435,13 @@
 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_Order) isCreateOrderResponse_Result() {}
+
 func (*CreateOrderResponse_OrderFailure) isCreateOrderResponse_Result() {}
 
 func (m *CreateOrderResponse) GetResult() isCreateOrderResponse_Result {
@@ -1502,16 +1552,17 @@
 func (m *ListBookingsRequest) String() string { return proto.CompactTextString(m) }
 func (*ListBookingsRequest) ProtoMessage()    {}
 func (*ListBookingsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{16}
+	return fileDescriptor_1820d8e1a9fad753, []int{16}
 }
+
 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 (dst *ListBookingsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListBookingsRequest.Merge(dst, src)
+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)
@@ -1542,16 +1593,17 @@
 func (m *ListBookingsResponse) String() string { return proto.CompactTextString(m) }
 func (*ListBookingsResponse) ProtoMessage()    {}
 func (*ListBookingsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{17}
+	return fileDescriptor_1820d8e1a9fad753, []int{17}
 }
+
 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 (dst *ListBookingsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListBookingsResponse.Merge(dst, src)
+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)
@@ -1586,16 +1638,17 @@
 func (m *ListOrdersRequest) String() string { return proto.CompactTextString(m) }
 func (*ListOrdersRequest) ProtoMessage()    {}
 func (*ListOrdersRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{18}
+	return fileDescriptor_1820d8e1a9fad753, []int{18}
 }
+
 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 (dst *ListOrdersRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListOrdersRequest.Merge(dst, src)
+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)
@@ -1613,11 +1666,13 @@
 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_UserId) isListOrdersRequest_Ids() {}
+
 func (*ListOrdersRequest_OrderIds_) isListOrdersRequest_Ids() {}
 
 func (m *ListOrdersRequest) GetIds() isListOrdersRequest_Ids {
@@ -1722,16 +1777,17 @@
 func (m *ListOrdersRequest_OrderIds) String() string { return proto.CompactTextString(m) }
 func (*ListOrdersRequest_OrderIds) ProtoMessage()    {}
 func (*ListOrdersRequest_OrderIds) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{18, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{18, 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 (dst *ListOrdersRequest_OrderIds) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListOrdersRequest_OrderIds.Merge(dst, src)
+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)
@@ -1762,16 +1818,17 @@
 func (m *ListOrdersResponse) String() string { return proto.CompactTextString(m) }
 func (*ListOrdersResponse) ProtoMessage()    {}
 func (*ListOrdersResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{19}
+	return fileDescriptor_1820d8e1a9fad753, []int{19}
 }
+
 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 (dst *ListOrdersResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListOrdersResponse.Merge(dst, src)
+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)
@@ -1805,16 +1862,17 @@
 func (m *UpdateBookingRequest) String() string { return proto.CompactTextString(m) }
 func (*UpdateBookingRequest) ProtoMessage()    {}
 func (*UpdateBookingRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{20}
+	return fileDescriptor_1820d8e1a9fad753, []int{20}
 }
+
 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 (dst *UpdateBookingRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UpdateBookingRequest.Merge(dst, src)
+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)
@@ -1858,16 +1916,17 @@
 func (m *UpdateBookingResponse) String() string { return proto.CompactTextString(m) }
 func (*UpdateBookingResponse) ProtoMessage()    {}
 func (*UpdateBookingResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{21}
+	return fileDescriptor_1820d8e1a9fad753, []int{21}
 }
+
 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 (dst *UpdateBookingResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UpdateBookingResponse.Merge(dst, src)
+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)
@@ -1921,16 +1980,17 @@
 func (m *Booking) String() string { return proto.CompactTextString(m) }
 func (*Booking) ProtoMessage()    {}
 func (*Booking) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{22}
+	return fileDescriptor_1820d8e1a9fad753, []int{22}
 }
+
 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 (dst *Booking) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Booking.Merge(dst, src)
+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)
@@ -1996,16 +2056,17 @@
 func (m *BookingFailure) String() string { return proto.CompactTextString(m) }
 func (*BookingFailure) ProtoMessage()    {}
 func (*BookingFailure) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{23}
+	return fileDescriptor_1820d8e1a9fad753, []int{23}
 }
+
 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 (dst *BookingFailure) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BookingFailure.Merge(dst, src)
+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)
@@ -2061,16 +2122,17 @@
 func (m *Order) String() string { return proto.CompactTextString(m) }
 func (*Order) ProtoMessage()    {}
 func (*Order) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{24}
+	return fileDescriptor_1820d8e1a9fad753, []int{24}
 }
+
 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 (dst *Order) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Order.Merge(dst, src)
+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)
@@ -2147,16 +2209,17 @@
 func (m *LineItem) String() string { return proto.CompactTextString(m) }
 func (*LineItem) ProtoMessage()    {}
 func (*LineItem) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{25}
+	return fileDescriptor_1820d8e1a9fad753, []int{25}
 }
+
 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 (dst *LineItem) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LineItem.Merge(dst, src)
+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)
@@ -2221,16 +2284,17 @@
 func (m *LineItem_OrderedTickets) String() string { return proto.CompactTextString(m) }
 func (*LineItem_OrderedTickets) ProtoMessage()    {}
 func (*LineItem_OrderedTickets) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{25, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{25, 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 (dst *LineItem_OrderedTickets) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LineItem_OrderedTickets.Merge(dst, src)
+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)
@@ -2276,16 +2340,17 @@
 func (m *OrderFailure) String() string { return proto.CompactTextString(m) }
 func (*OrderFailure) ProtoMessage()    {}
 func (*OrderFailure) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{26}
+	return fileDescriptor_1820d8e1a9fad753, []int{26}
 }
+
 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 (dst *OrderFailure) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OrderFailure.Merge(dst, src)
+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)
@@ -2340,16 +2405,17 @@
 func (m *OrderFulfillability) String() string { return proto.CompactTextString(m) }
 func (*OrderFulfillability) ProtoMessage()    {}
 func (*OrderFulfillability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{27}
+	return fileDescriptor_1820d8e1a9fad753, []int{27}
 }
+
 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 (dst *OrderFulfillability) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_OrderFulfillability.Merge(dst, src)
+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)
@@ -2406,16 +2472,17 @@
 func (m *LineItemFulfillability) String() string { return proto.CompactTextString(m) }
 func (*LineItemFulfillability) ProtoMessage()    {}
 func (*LineItemFulfillability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{28}
+	return fileDescriptor_1820d8e1a9fad753, []int{28}
 }
+
 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 (dst *LineItemFulfillability) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LineItemFulfillability.Merge(dst, src)
+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)
@@ -2480,16 +2547,17 @@
 }
 func (*LineItemFulfillability_UpdatedAvailability) ProtoMessage() {}
 func (*LineItemFulfillability_UpdatedAvailability) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{28, 0}
+	return fileDescriptor_1820d8e1a9fad753, []int{28, 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 (dst *LineItemFulfillability_UpdatedAvailability) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LineItemFulfillability_UpdatedAvailability.Merge(dst, src)
+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)
@@ -2529,16 +2597,17 @@
 func (m *TicketType) String() string { return proto.CompactTextString(m) }
 func (*TicketType) ProtoMessage()    {}
 func (*TicketType) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{29}
+	return fileDescriptor_1820d8e1a9fad753, []int{29}
 }
+
 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 (dst *TicketType) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TicketType.Merge(dst, src)
+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)
@@ -2590,16 +2659,17 @@
 func (m *ResourceIds) String() string { return proto.CompactTextString(m) }
 func (*ResourceIds) ProtoMessage()    {}
 func (*ResourceIds) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{30}
+	return fileDescriptor_1820d8e1a9fad753, []int{30}
 }
+
 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 (dst *ResourceIds) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ResourceIds.Merge(dst, src)
+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)
@@ -2676,16 +2746,17 @@
 func (m *PaymentProcessingParameters) String() string { return proto.CompactTextString(m) }
 func (*PaymentProcessingParameters) ProtoMessage()    {}
 func (*PaymentProcessingParameters) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{31}
+	return fileDescriptor_1820d8e1a9fad753, []int{31}
 }
+
 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 (dst *PaymentProcessingParameters) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PaymentProcessingParameters.Merge(dst, src)
+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)
@@ -2769,16 +2840,17 @@
 func (m *UserPaymentOption) String() string { return proto.CompactTextString(m) }
 func (*UserPaymentOption) ProtoMessage()    {}
 func (*UserPaymentOption) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{32}
+	return fileDescriptor_1820d8e1a9fad753, []int{32}
 }
+
 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 (dst *UserPaymentOption) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UserPaymentOption.Merge(dst, src)
+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)
@@ -2907,16 +2979,17 @@
 func (m *PaymentInformation) String() string { return proto.CompactTextString(m) }
 func (*PaymentInformation) ProtoMessage()    {}
 func (*PaymentInformation) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{33}
+	return fileDescriptor_1820d8e1a9fad753, []int{33}
 }
+
 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 (dst *PaymentInformation) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PaymentInformation.Merge(dst, src)
+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)
@@ -2927,27 +3000,6 @@
 
 var xxx_messageInfo_PaymentInformation proto.InternalMessageInfo
 
-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) GetPrepaymentStatus() PrepaymentStatus {
 	if m != nil {
 		return m.PrepaymentStatus
@@ -2983,6 +3035,29 @@
 	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
@@ -3106,16 +3181,17 @@
 func (m *Price) String() string { return proto.CompactTextString(m) }
 func (*Price) ProtoMessage()    {}
 func (*Price) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{34}
+	return fileDescriptor_1820d8e1a9fad753, []int{34}
 }
+
 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 (dst *Price) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Price.Merge(dst, src)
+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)
@@ -3164,16 +3240,17 @@
 func (m *NoShowFee) String() string { return proto.CompactTextString(m) }
 func (*NoShowFee) ProtoMessage()    {}
 func (*NoShowFee) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{35}
+	return fileDescriptor_1820d8e1a9fad753, []int{35}
 }
+
 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 (dst *NoShowFee) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_NoShowFee.Merge(dst, src)
+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)
@@ -3216,16 +3293,17 @@
 func (m *Deposit) String() string { return proto.CompactTextString(m) }
 func (*Deposit) ProtoMessage()    {}
 func (*Deposit) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{36}
+	return fileDescriptor_1820d8e1a9fad753, []int{36}
 }
+
 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 (dst *Deposit) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Deposit.Merge(dst, src)
+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)
@@ -3283,16 +3361,17 @@
 func (m *Slot) String() string { return proto.CompactTextString(m) }
 func (*Slot) ProtoMessage()    {}
 func (*Slot) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{37}
+	return fileDescriptor_1820d8e1a9fad753, []int{37}
 }
+
 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 (dst *Slot) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Slot.Merge(dst, src)
+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)
@@ -3369,16 +3448,17 @@
 func (m *UserInformation) String() string { return proto.CompactTextString(m) }
 func (*UserInformation) ProtoMessage()    {}
 func (*UserInformation) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{38}
+	return fileDescriptor_1820d8e1a9fad753, []int{38}
 }
+
 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 (dst *UserInformation) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UserInformation.Merge(dst, src)
+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)
@@ -3452,16 +3532,17 @@
 func (m *PostalAddress) String() string { return proto.CompactTextString(m) }
 func (*PostalAddress) ProtoMessage()    {}
 func (*PostalAddress) Descriptor() ([]byte, []int) {
-	return fileDescriptor_v3_e164fdd8b81531d4, []int{39}
+	return fileDescriptor_1820d8e1a9fad753, []int{39}
 }
+
 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 (dst *PostalAddress) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_PostalAddress.Merge(dst, src)
+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)
@@ -3565,213 +3646,215 @@
 	proto.RegisterEnum("ext.maps.booking.partner.v3.PaymentInformation_PaymentProcessedBy", PaymentInformation_PaymentProcessedBy_name, PaymentInformation_PaymentProcessedBy_value)
 }
 
-func init() { proto.RegisterFile("v3.proto", fileDescriptor_v3_e164fdd8b81531d4) }
+func init() { proto.RegisterFile("v3.proto", fileDescriptor_1820d8e1a9fad753) }
 
-var fileDescriptor_v3_e164fdd8b81531d4 = []byte{
-	// 3278 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3a, 0xcd, 0x6f, 0x1b, 0xc7,
-	0xf5, 0x5e, 0x7e, 0x88, 0xe2, 0xa3, 0x44, 0xad, 0x46, 0x8a, 0x4d, 0xf9, 0x23, 0x96, 0x37, 0x76,
-	0xe2, 0xc8, 0x89, 0xf2, 0x8b, 0xec, 0xe0, 0x97, 0x14, 0x45, 0xda, 0x15, 0x39, 0xb2, 0x36, 0xa1,
-	0x48, 0x66, 0xb8, 0x94, 0xed, 0x1c, 0xba, 0x59, 0x73, 0x47, 0xf2, 0xd6, 0x24, 0x97, 0xd9, 0x5d,
-	0x2a, 0x56, 0xd0, 0xdc, 0x7a, 0xed, 0xa1, 0xe8, 0xa1, 0xe8, 0xa1, 0xc7, 0x1c, 0x0a, 0xb4, 0x40,
-	0x0f, 0xbd, 0x14, 0xbd, 0x14, 0x28, 0xd0, 0x4b, 0x91, 0x53, 0x0f, 0xed, 0xa9, 0x87, 0xa2, 0x87,
-	0xfe, 0x0b, 0x01, 0x8a, 0xa2, 0x98, 0x8f, 0xe5, 0xc7, 0x92, 0xa2, 0x28, 0xc5, 0xee, 0xa5, 0x17,
-	0x41, 0xf3, 0xbe, 0xe6, 0xcd, 0x7b, 0x6f, 0xde, 0x7b, 0xf3, 0x96, 0x30, 0x7f, 0x74, 0x77, 0xb3,
-	0xeb, 0x7b, 0xa1, 0x87, 0xae, 0xd0, 0x67, 0xe1, 0x66, 0xdb, 0xee, 0x06, 0x9b, 0x8f, 0x3d, 0xef,
-	0xa9, 0xdb, 0x39, 0xdc, 0xec, 0xda, 0x7e, 0xd8, 0xa1, 0xfe, 0xe6, 0xd1, 0x5d, 0xed, 0x23, 0x28,
-	0x14, 0x9f, 0xd0, 0xe6, 0x53, 0xfd, 0xc8, 0x76, 0x5b, 0xf6, 0x63, 0xb7, 0xe5, 0x86, 0xc7, 0x84,
-	0x7e, 0xda, 0xa3, 0x41, 0x88, 0xde, 0x81, 0x54, 0xd0, 0xf2, 0xc2, 0x82, 0xb2, 0xae, 0xdc, 0xce,
-	0x6d, 0xdd, 0xd8, 0x9c, 0x22, 0x67, 0xb3, 0xde, 0xf2, 0x42, 0xc2, 0xc9, 0xb5, 0x3f, 0x25, 0x61,
-	0x6d, 0x82, 0xcc, 0xa0, 0xeb, 0x75, 0x02, 0x7a, 0x4e, 0xa1, 0xe8, 0x35, 0x58, 0x6a, 0x7a, 0xbd,
-	0x4e, 0x68, 0xd9, 0x42, 0x68, 0x8b, 0x16, 0x12, 0xeb, 0xca, 0xed, 0x34, 0xc9, 0x73, 0xb0, 0x1e,
-	0x41, 0xd1, 0x17, 0xb0, 0xea, 0xf4, 0x7c, 0x3b, 0x74, 0xbd, 0x8e, 0xe5, 0xd3, 0x4f, 0x7b, 0xae,
-	0x4f, 0xdb, 0xb4, 0x13, 0x16, 0x92, 0xeb, 0xca, 0xed, 0xfc, 0xd6, 0x07, 0x53, 0xf7, 0x3b, 0x51,
-	0xeb, 0xcd, 0x92, 0x14, 0x49, 0x06, 0x12, 0xc9, 0x8a, 0x33, 0x0e, 0x44, 0x9f, 0xc0, 0x8a, 0x3d,
-	0x24, 0xc0, 0xea, 0x75, 0x1d, 0x3b, 0xa4, 0x85, 0x14, 0x3f, 0xed, 0x5b, 0x53, 0x77, 0x1f, 0xde,
-	0xb8, 0xc1, 0xd9, 0x08, 0xb2, 0xc7, 0x60, 0x5a, 0x1b, 0x56, 0x26, 0x68, 0x83, 0x6e, 0xc2, 0x7a,
-	0xa9, 0x41, 0x74, 0xd3, 0xa8, 0x56, 0x2c, 0x82, 0x3f, 0x6a, 0x18, 0x04, 0xef, 0xe1, 0x8a, 0x69,
-	0x35, 0x2a, 0xf5, 0x1a, 0x2e, 0x1a, 0x3b, 0x06, 0x2e, 0xa9, 0x17, 0x50, 0x01, 0x56, 0x4b, 0x55,
-	0xab, 0x52, 0x35, 0xad, 0xfa, 0x6e, 0xf5, 0x81, 0x15, 0x71, 0xa8, 0x0a, 0xba, 0x08, 0x68, 0xaf,
-	0x51, 0x8f, 0xc3, 0x13, 0x5a, 0x17, 0xd0, 0xb8, 0x62, 0xe8, 0x63, 0x58, 0x66, 0x6e, 0xb1, 0x86,
-	0xf5, 0x2b, 0x28, 0xeb, 0xc9, 0xdb, 0xb9, 0xad, 0x37, 0x4f, 0x75, 0xe9, 0x88, 0x85, 0xd5, 0x20,
-	0x06, 0xd1, 0x7c, 0x50, 0xe3, 0x54, 0x2f, 0x3a, 0x6a, 0xb4, 0x2f, 0xe0, 0x3a, 0x77, 0x7e, 0xd5,
-	0x77, 0xa8, 0xbf, 0xd3, 0x6b, 0x1d, 0xb8, 0xad, 0xf8, 0x6d, 0xb8, 0x0e, 0xb9, 0x36, 0xf5, 0x9b,
-	0x4f, 0xec, 0x4e, 0x68, 0xb9, 0x0e, 0xd7, 0x24, 0x4b, 0x20, 0x02, 0x19, 0x0e, 0x7a, 0x0f, 0x52,
-	0x6e, 0x48, 0xdb, 0x85, 0x04, 0x37, 0xc3, 0xad, 0xa9, 0x3a, 0x96, 0xdd, 0x0e, 0x35, 0x42, 0xda,
-	0x26, 0x9c, 0x45, 0xfb, 0xa3, 0x02, 0xeb, 0x27, 0xef, 0x2f, 0x6f, 0xce, 0x43, 0xc8, 0x1f, 0x8c,
-	0x60, 0xa4, 0x35, 0xfe, 0x6f, 0xea, 0x4e, 0x93, 0x24, 0xc6, 0xe4, 0xa0, 0x5d, 0xc8, 0x1f, 0x50,
-	0x1a, 0x58, 0x76, 0xc7, 0xb1, 0x42, 0xfb, 0x19, 0x0d, 0xb8, 0x95, 0x72, 0x5b, 0xda, 0x54, 0xc9,
-	0x35, 0xdf, 0x6d, 0x52, 0xb2, 0xc0, 0x38, 0xf5, 0x8e, 0x63, 0x32, 0x3e, 0xed, 0x5d, 0xb8, 0x74,
-	0x9f, 0x86, 0xdb, 0x82, 0xb8, 0x1e, 0xda, 0x61, 0x2f, 0x88, 0xec, 0x77, 0x0d, 0x40, 0x0a, 0x19,
-	0x98, 0x2f, 0x2b, 0x21, 0x86, 0xa3, 0xfd, 0x53, 0x81, 0xc2, 0x38, 0xab, 0x3c, 0xfa, 0x74, 0x5e,
-	0xf4, 0x11, 0xe4, 0x23, 0x74, 0xc0, 0x19, 0xb9, 0xfe, 0xf9, 0xad, 0x8d, 0xa9, 0xfa, 0x8f, 0x6e,
-	0xb5, 0xf8, 0x78, 0x78, 0xc9, 0x02, 0xbc, 0xeb, 0xd3, 0xae, 0x7d, 0xcc, 0x2e, 0x57, 0x24, 0x55,
-	0xe4, 0x90, 0x37, 0x4f, 0xb1, 0x4a, 0xc4, 0x25, 0x05, 0xab, 0xdd, 0x18, 0x44, 0xfb, 0x65, 0x0a,
-	0x56, 0x8b, 0x3e, 0xb5, 0x43, 0x2a, 0x55, 0xf8, 0x66, 0x09, 0x17, 0xed, 0x42, 0xb6, 0x45, 0xed,
-	0x80, 0x5a, 0x3e, 0x3d, 0x90, 0x9e, 0xbb, 0x33, 0x3d, 0xfa, 0x18, 0x35, 0xa1, 0x07, 0xd4, 0xa7,
-	0x9d, 0x26, 0x25, 0xf3, 0x2d, 0xb9, 0x46, 0x0f, 0x40, 0xed, 0x05, 0xd4, 0xb7, 0xdc, 0xce, 0x81,
-	0xe7, 0xb7, 0x79, 0x8e, 0xe1, 0x87, 0xce, 0x6d, 0xbd, 0x31, 0x55, 0x60, 0x23, 0xa0, 0xbe, 0x31,
-	0xe0, 0x21, 0x4b, 0xbd, 0x51, 0x00, 0x4b, 0x8b, 0x91, 0x2d, 0x87, 0x65, 0xcf, 0x92, 0x16, 0x6b,
-	0x82, 0x6f, 0x58, 0x3c, 0xea, 0x8e, 0xc1, 0xd0, 0x0f, 0xe0, 0x5a, 0xb4, 0x43, 0xd7, 0xf7, 0x9a,
-	0x34, 0x08, 0x58, 0x38, 0x74, 0x6d, 0xdf, 0x6e, 0xd3, 0x90, 0xfa, 0x41, 0x21, 0xcd, 0xf7, 0x7a,
-	0x77, 0x96, 0xbd, 0x6a, 0x7d, 0x01, 0xb5, 0x3e, 0x3f, 0xb9, 0xd2, 0x3d, 0x19, 0x89, 0xee, 0xc0,
-	0xb2, 0xeb, 0xd0, 0x76, 0xd7, 0x0b, 0x69, 0xa7, 0x79, 0x6c, 0x85, 0xde, 0x53, 0xda, 0x29, 0xcc,
-	0xf1, 0x38, 0x55, 0x87, 0x10, 0x26, 0x83, 0xa3, 0x37, 0x01, 0xd9, 0x8e, 0xe3, 0x32, 0xb5, 0xed,
-	0x16, 0x2f, 0x52, 0x34, 0x08, 0x0b, 0x19, 0x4e, 0xbd, 0x3c, 0xc0, 0xc8, 0xa8, 0xd0, 0x7e, 0x94,
-	0x80, 0x97, 0x62, 0xe1, 0x22, 0xaf, 0xc5, 0xfb, 0x90, 0x91, 0x87, 0x90, 0x21, 0x73, 0x73, 0x96,
-	0x80, 0x27, 0x11, 0x13, 0xfa, 0x1e, 0xac, 0x70, 0x77, 0x47, 0x86, 0xf3, 0xba, 0xdc, 0x2b, 0x22,
-	0x84, 0x36, 0x4f, 0xf5, 0xb8, 0xb4, 0x56, 0x95, 0x73, 0x91, 0xe5, 0x5e, 0x1c, 0x84, 0x4c, 0x58,
-	0x8a, 0xee, 0xe5, 0x81, 0xed, 0xb6, 0x7a, 0x3e, 0x95, 0xd1, 0x74, 0x67, 0x16, 0x3d, 0x77, 0x04,
-	0x0b, 0x89, 0xee, 0xb6, 0x5c, 0x6b, 0x15, 0x40, 0xc2, 0x1c, 0x32, 0x8c, 0xc5, 0xdd, 0x79, 0x17,
-	0xd2, 0x3c, 0x8c, 0xa5, 0x25, 0xb4, 0x19, 0x2e, 0x80, 0x60, 0xd0, 0xbe, 0x54, 0x60, 0x65, 0x44,
-	0xa0, 0xb4, 0xee, 0xb9, 0x25, 0x4e, 0x3a, 0x77, 0xe2, 0x9b, 0x9f, 0xfb, 0x77, 0x0a, 0xa4, 0xf9,
-	0x36, 0x68, 0x0d, 0xc4, 0x95, 0x1d, 0x24, 0xc3, 0x0c, 0x5f, 0x1b, 0x4e, 0x3f, 0x85, 0x24, 0xce,
-	0x96, 0x42, 0x6e, 0x41, 0x9e, 0x47, 0x82, 0x1f, 0x25, 0x05, 0xee, 0xa8, 0x2c, 0x59, 0x64, 0xd0,
-	0x7e, 0xa6, 0x40, 0xef, 0xc1, 0x9a, 0xd8, 0x98, 0x3e, 0xeb, 0xba, 0xb2, 0xc9, 0x0a, 0xdd, 0x36,
-	0xb5, 0x02, 0xda, 0xe4, 0x97, 0x39, 0x49, 0x2e, 0x72, 0x02, 0xdc, 0xc7, 0x9b, 0x6e, 0x9b, 0xd6,
-	0x69, 0x53, 0xbb, 0x03, 0xf9, 0xd1, 0xb4, 0x33, 0xe5, 0x14, 0xda, 0xd7, 0x4a, 0xe4, 0x63, 0x5e,
-	0xbe, 0x86, 0x7c, 0xec, 0xb1, 0xf5, 0x4c, 0x1e, 0x11, 0x9c, 0x82, 0xe1, 0xf4, 0xec, 0x90, 0xf8,
-	0xaf, 0x67, 0x87, 0xe4, 0xe4, 0xec, 0xa0, 0xfd, 0xaa, 0x1f, 0x8e, 0xf2, 0xec, 0x32, 0x1c, 0xbf,
-	0x75, 0xe6, 0xc3, 0xef, 0x5e, 0x88, 0x8e, 0x5f, 0x83, 0x45, 0xfe, 0x4f, 0x2c, 0x1c, 0x5f, 0x9f,
-	0xa1, 0x73, 0x10, 0x0c, 0xbb, 0x17, 0xc8, 0x82, 0x37, 0xb4, 0xde, 0x9e, 0x87, 0x39, 0x9f, 0x06,
-	0xbd, 0x56, 0xa8, 0x6d, 0xc2, 0x4a, 0xd9, 0x0d, 0xa2, 0xc2, 0xdd, 0x2f, 0xf7, 0x97, 0x20, 0x23,
-	0x4a, 0x49, 0xe4, 0xdc, 0x39, 0x5e, 0x13, 0x1c, 0xed, 0x21, 0xac, 0x8e, 0xd2, 0xcb, 0xf3, 0x7d,
-	0x17, 0xe6, 0xa5, 0x12, 0x81, 0xec, 0x24, 0x67, 0xcb, 0x66, 0x7d, 0x2e, 0xed, 0x37, 0x0a, 0x2c,
-	0x33, 0xd1, 0x5c, 0xf1, 0xbe, 0x22, 0x6b, 0x31, 0x45, 0x76, 0x2f, 0x44, 0xaa, 0xa0, 0x7d, 0xc8,
-	0x0a, 0xb3, 0xb8, 0x4e, 0x14, 0x01, 0xff, 0x7f, 0x4a, 0xdb, 0x16, 0x93, 0x2e, 0x8c, 0x64, 0x38,
-	0xc1, 0xee, 0x05, 0x32, 0xef, 0xc9, 0xff, 0x2f, 0xdf, 0x82, 0xf9, 0x08, 0xce, 0xa2, 0x3c, 0xda,
-	0x83, 0x1f, 0x2b, 0x4b, 0x32, 0x92, 0x6e, 0x3b, 0x0d, 0x49, 0xd7, 0x09, 0x58, 0x3e, 0x1b, 0x96,
-	0x3b, 0xc8, 0x3e, 0x91, 0xbb, 0x93, 0x67, 0x8a, 0x75, 0x6d, 0x1f, 0x56, 0x45, 0x97, 0x1e, 0xeb,
-	0x2e, 0xbe, 0x61, 0xb5, 0xe0, 0x75, 0x28, 0x26, 0xf8, 0x7f, 0xba, 0x0e, 0xfd, 0x2d, 0x01, 0x19,
-	0x49, 0x72, 0x5a, 0x83, 0x7a, 0xce, 0xac, 0xfc, 0xc2, 0xda, 0xb1, 0x6d, 0x98, 0x93, 0x2d, 0x6d,
-	0xea, 0xcc, 0x8d, 0xb2, 0xe4, 0x3c, 0xa9, 0xa5, 0x4b, 0x3f, 0xb7, 0x96, 0x4e, 0xfb, 0x4b, 0x0a,
-	0xf2, 0xa3, 0x3e, 0x40, 0xf7, 0x21, 0xdd, 0xb4, 0x7b, 0xb2, 0x26, 0xe7, 0xb7, 0xde, 0x3e, 0x83,
-	0xff, 0x36, 0x8b, 0x8c, 0x91, 0x08, 0x7e, 0xf4, 0x08, 0x90, 0x4f, 0xbf, 0x4f, 0x9b, 0x21, 0x75,
-	0xac, 0xa6, 0xed, 0x3b, 0x56, 0x78, 0xdc, 0xa5, 0xf2, 0xd9, 0x30, 0x3d, 0x2a, 0x8a, 0x3e, 0x75,
-	0xdc, 0xb0, 0x68, 0xfb, 0x8e, 0x79, 0xdc, 0xa5, 0x44, 0x8d, 0xc4, 0x44, 0x10, 0xb4, 0x0e, 0x39,
-	0x87, 0x06, 0x4d, 0xdf, 0xed, 0xf6, 0x1d, 0x96, 0x25, 0xc3, 0x20, 0xed, 0xdf, 0x09, 0x48, 0x73,
-	0x6d, 0xd0, 0x4b, 0xb0, 0x5c, 0xd4, 0x1b, 0x75, 0x1c, 0x7b, 0xa6, 0xaf, 0x82, 0x5a, 0x2f, 0x57,
-	0xd9, 0xe3, 0x5d, 0xdf, 0xd7, 0x8d, 0xb2, 0xbe, 0x5d, 0xc6, 0xaa, 0x82, 0xae, 0xc3, 0x15, 0x0e,
-	0xd5, 0xcb, 0x04, 0xeb, 0xa5, 0x47, 0xd6, 0x76, 0xb5, 0xfa, 0x21, 0x2e, 0x59, 0xdb, 0x8f, 0xac,
-	0x46, 0x1d, 0x13, 0x35, 0x81, 0x96, 0x61, 0xb1, 0x8c, 0xf5, 0x3a, 0xb6, 0xf0, 0xc3, 0x9a, 0x41,
-	0x70, 0x49, 0x4d, 0x32, 0x9e, 0x6a, 0xc3, 0xac, 0x1b, 0x25, 0x6c, 0x15, 0xf5, 0x4a, 0x11, 0x97,
-	0xcb, 0x62, 0x44, 0xf0, 0xc0, 0xa8, 0x94, 0xaa, 0x0f, 0xd4, 0x14, 0xba, 0x09, 0xeb, 0x35, 0xfd,
-	0x11, 0x1f, 0x15, 0x60, 0x42, 0xaa, 0xc4, 0x2a, 0xea, 0xa4, 0x64, 0x99, 0x8f, 0x6a, 0xd8, 0x22,
-	0xf8, 0x03, 0x5c, 0x34, 0x71, 0x49, 0x4d, 0x33, 0x31, 0x13, 0xa8, 0x4a, 0xb8, 0x58, 0x36, 0x2a,
-	0xb8, 0xa4, 0xce, 0xa1, 0xab, 0x50, 0x88, 0x08, 0xaa, 0x35, 0xbe, 0x43, 0xa5, 0x6a, 0x5a, 0xfb,
-	0x7a, 0xd9, 0x28, 0xa9, 0x19, 0xa6, 0xd8, 0x08, 0xbb, 0x3a, 0x8f, 0x34, 0x78, 0x99, 0x69, 0xcd,
-	0xb4, 0x62, 0x94, 0xcc, 0x06, 0xa3, 0x02, 0xd4, 0x2c, 0xba, 0x06, 0x6b, 0xec, 0x8c, 0x46, 0xe5,
-	0x7e, 0xff, 0xcc, 0xf2, 0x10, 0xb8, 0xa4, 0x02, 0xba, 0x02, 0x97, 0x22, 0x34, 0x13, 0x11, 0x9d,
-	0x8f, 0x19, 0x2b, 0xc7, 0x90, 0xd5, 0x7d, 0x4c, 0xca, 0x7a, 0xad, 0xc6, 0x08, 0x08, 0xae, 0x63,
-	0xb2, 0x2f, 0x86, 0x1a, 0x0b, 0xda, 0x6f, 0x13, 0x90, 0xe6, 0x39, 0x33, 0x96, 0x9e, 0x95, 0xa1,
-	0xf4, 0x3c, 0xf1, 0xf6, 0x25, 0x5e, 0xe0, 0x63, 0x28, 0xf9, 0xfc, 0x1e, 0x43, 0xb1, 0x59, 0x45,
-	0xea, 0xc4, 0x59, 0x45, 0xfa, 0xec, 0xb3, 0x8a, 0x7f, 0x25, 0x60, 0x3e, 0x02, 0xb1, 0xbc, 0x17,
-	0x50, 0xff, 0xc8, 0x6d, 0x0e, 0x75, 0x71, 0x59, 0x09, 0x31, 0x1c, 0x74, 0x05, 0xb2, 0x41, 0x68,
-	0xfb, 0x21, 0xef, 0x0f, 0x13, 0xbc, 0x3f, 0x9c, 0xe7, 0x80, 0x3a, 0x6d, 0xa2, 0x1b, 0xb0, 0xd0,
-	0x9f, 0xd4, 0x31, 0x7c, 0x92, 0xe3, 0x73, 0x11, 0x8c, 0x91, 0x54, 0x20, 0x13, 0xba, 0xcd, 0xa7,
-	0x34, 0x64, 0x89, 0x8a, 0x69, 0x7a, 0x6f, 0x26, 0x4d, 0x45, 0x3d, 0xa4, 0x8e, 0x29, 0x78, 0x49,
-	0x24, 0x84, 0x15, 0xd5, 0xae, 0xef, 0x36, 0xa9, 0xcc, 0x52, 0xb3, 0xcc, 0x37, 0x04, 0xc3, 0x50,
-	0xc6, 0x9c, 0x3b, 0x6f, 0xc6, 0xbc, 0x5c, 0x84, 0xfc, 0xa8, 0x62, 0xcc, 0x3e, 0x42, 0xb5, 0x81,
-	0xf5, 0xe6, 0x05, 0xc0, 0x70, 0xd0, 0x2a, 0xa4, 0xf9, 0x94, 0x4a, 0x8e, 0xac, 0xc4, 0x42, 0xfb,
-	0x7d, 0x12, 0x16, 0x86, 0x3b, 0x33, 0x84, 0x47, 0x53, 0xe2, 0x5b, 0x33, 0xf7, 0x74, 0xa3, 0x09,
-	0x71, 0x7c, 0xba, 0x94, 0x78, 0x4e, 0xd3, 0xa5, 0xc9, 0xa9, 0x36, 0xf9, 0x02, 0x52, 0x6d, 0x6a,
-	0x3c, 0xd5, 0xfe, 0x58, 0x39, 0x25, 0xd5, 0x5e, 0x82, 0x95, 0x2a, 0x29, 0x61, 0x62, 0x35, 0x2a,
-	0x3b, 0x8d, 0xf2, 0x8e, 0x51, 0x8e, 0xb2, 0xed, 0x2c, 0x89, 0x31, 0x71, 0x5a, 0x62, 0x4c, 0x8e,
-	0xa7, 0xbe, 0x94, 0xf6, 0xd7, 0x24, 0xac, 0x4c, 0x30, 0x1c, 0x7a, 0x1c, 0xf5, 0xd4, 0xd2, 0x95,
-	0x1f, 0x9c, 0xd5, 0xf4, 0x9b, 0x93, 0xc7, 0x87, 0xbd, 0x56, 0x48, 0xa4, 0x64, 0xe4, 0xc0, 0x0a,
-	0xbb, 0xc5, 0xd6, 0x98, 0xaf, 0xd9, 0xed, 0xba, 0x3b, 0xd3, 0xed, 0x8a, 0xc9, 0x47, 0xee, 0x18,
-	0x0c, 0xbd, 0x0d, 0xab, 0xbd, 0x4e, 0x7f, 0x8b, 0x16, 0xb5, 0x7c, 0x6a, 0x07, 0xfd, 0x5a, 0xb8,
-	0x32, 0x82, 0x23, 0x1c, 0xa5, 0xfd, 0x41, 0x81, 0xb5, 0x13, 0xd5, 0x47, 0x77, 0xe0, 0x35, 0xe1,
-	0xa5, 0xbe, 0x8f, 0x8c, 0xb2, 0x61, 0x3e, 0x62, 0x69, 0xbd, 0x51, 0x8e, 0x0f, 0xb9, 0x97, 0x20,
-	0x57, 0xd4, 0x2b, 0x11, 0xa9, 0xaa, 0xb0, 0x5a, 0x30, 0xe2, 0x5d, 0x8b, 0x39, 0xc7, 0x32, 0x4c,
-	0xbc, 0xa7, 0x26, 0xd0, 0x2d, 0xb8, 0x31, 0x8a, 0x64, 0x85, 0xc2, 0x28, 0x62, 0xab, 0x58, 0xdd,
-	0xdb, 0x36, 0x2a, 0xa2, 0x64, 0x24, 0x59, 0x38, 0x4c, 0x88, 0x13, 0xab, 0x6a, 0xee, 0x62, 0x62,
-	0x11, 0xac, 0xd7, 0xab, 0x15, 0x35, 0xa5, 0xfd, 0x22, 0x0d, 0x17, 0x27, 0xdb, 0xa9, 0x9f, 0x72,
-	0x45, 0x87, 0x7c, 0x96, 0x94, 0x8b, 0x9c, 0x7e, 0x60, 0x88, 0x06, 0xa5, 0x7c, 0x0e, 0x3f, 0x6d,
-	0x4e, 0x70, 0xdd, 0x68, 0x68, 0x9c, 0xdd, 0x69, 0xe8, 0x29, 0x2c, 0x8c, 0x7c, 0x01, 0x10, 0xf3,
-	0xbc, 0xfb, 0xe7, 0x51, 0x4f, 0xbc, 0x2c, 0x9c, 0x91, 0x6f, 0x03, 0x23, 0xc2, 0xd1, 0x2e, 0xe4,
-	0x64, 0xb2, 0xe4, 0x09, 0x44, 0x94, 0xae, 0xd7, 0xa6, 0xee, 0x25, 0xf2, 0x2c, 0x4f, 0x1e, 0x10,
-	0xf6, 0xff, 0xbf, 0x7c, 0x0f, 0x56, 0x26, 0x6c, 0xc7, 0x8b, 0x59, 0xd7, 0x0b, 0x03, 0xcb, 0xeb,
-	0xd2, 0x0e, 0xf7, 0x53, 0x9a, 0x64, 0x39, 0xa4, 0xda, 0xa5, 0x1d, 0xed, 0x2b, 0x05, 0x0a, 0x27,
-	0x19, 0x11, 0x6d, 0xc0, 0xab, 0x2c, 0x9e, 0xce, 0x17, 0x9f, 0x93, 0xda, 0xbd, 0x04, 0x8b, 0xb8,
-	0xd1, 0x58, 0x33, 0x8d, 0xe2, 0x87, 0xd8, 0x8c, 0xc5, 0xe5, 0x0a, 0x2c, 0x19, 0x95, 0x62, 0x95,
-	0x10, 0x5c, 0x34, 0xad, 0x1a, 0x31, 0x8a, 0x58, 0x4d, 0xa1, 0x57, 0xe0, 0x3a, 0xd7, 0x66, 0x4a,
-	0xac, 0xa6, 0xb5, 0x9f, 0x29, 0x00, 0x03, 0x03, 0xa1, 0x9b, 0x90, 0x1f, 0x32, 0xef, 0xa0, 0x20,
-	0x2d, 0x0c, 0x0c, 0x67, 0x38, 0xe8, 0x0e, 0x2c, 0x07, 0x4f, 0x3c, 0x3f, 0xb4, 0x86, 0xf3, 0x6e,
-	0x42, 0x8c, 0x32, 0x38, 0xa2, 0x34, 0x80, 0x0f, 0xca, 0x6d, 0xf2, 0x8c, 0xe5, 0x56, 0xfb, 0x04,
-	0x72, 0x84, 0x06, 0x5e, 0xcf, 0x67, 0x6d, 0x04, 0x7f, 0x44, 0x07, 0xa1, 0x7d, 0x70, 0x30, 0xd4,
-	0xa5, 0xf1, 0xb5, 0xe1, 0xa0, 0x4b, 0x90, 0xf1, 0x3d, 0xaf, 0xcd, 0x30, 0x42, 0x8d, 0x39, 0xb6,
-	0x34, 0x1c, 0xe6, 0x4d, 0x26, 0xfd, 0xd8, 0x0a, 0xdc, 0xcf, 0x85, 0x06, 0x69, 0x92, 0xe5, 0x90,
-	0xba, 0xfb, 0x39, 0xd5, 0x7e, 0x9d, 0x84, 0x2b, 0x53, 0x06, 0x3a, 0xe8, 0x29, 0x64, 0xe5, 0xa4,
-	0xc8, 0xf3, 0x65, 0x3e, 0x36, 0xce, 0x3b, 0x1d, 0x8a, 0xe1, 0x3c, 0x7f, 0x3b, 0x51, 0x50, 0xc8,
-	0x40, 0x3e, 0xba, 0x07, 0xab, 0x51, 0x47, 0xd8, 0xa6, 0xe1, 0x13, 0xcf, 0x91, 0x33, 0x22, 0x7e,
-	0x22, 0x4e, 0x1c, 0x75, 0x79, 0x7b, 0x1c, 0x2d, 0xe6, 0xc8, 0x3a, 0x5c, 0xeb, 0x75, 0xba, 0xb6,
-	0x1f, 0x50, 0xc7, 0x9a, 0xc8, 0x9e, 0xe6, 0x06, 0xb9, 0x1c, 0x11, 0xd5, 0xc6, 0x45, 0x14, 0x20,
-	0x73, 0x44, 0xfd, 0x60, 0xf0, 0x4e, 0x89, 0x96, 0xcc, 0xd1, 0xb1, 0x89, 0x99, 0xe7, 0xcb, 0x02,
-	0xab, 0x76, 0x63, 0xc7, 0xd1, 0x1c, 0x50, 0xe3, 0x47, 0x44, 0x37, 0xe0, 0x5a, 0x54, 0xf8, 0x6a,
-	0xa4, 0x5a, 0xc4, 0xf5, 0x7a, 0x95, 0x8c, 0x3f, 0x73, 0x06, 0xa8, 0xba, 0x49, 0x8c, 0x1a, 0x2b,
-	0xbc, 0x97, 0x60, 0x65, 0x00, 0xdd, 0x26, 0xba, 0x51, 0x31, 0x09, 0xc6, 0x6a, 0x42, 0xfb, 0x7b,
-	0x02, 0x96, 0xc7, 0xde, 0xfb, 0xe8, 0x2e, 0x5c, 0x9c, 0x30, 0x3c, 0x18, 0x44, 0xca, 0xca, 0xd8,
-	0x3c, 0xc0, 0x70, 0xd0, 0x5b, 0xb0, 0x7a, 0x64, 0xb7, 0x5c, 0xc7, 0x12, 0xed, 0x69, 0x7f, 0x86,
-	0x29, 0x7a, 0xd4, 0x65, 0x8e, 0xab, 0x33, 0x94, 0x1c, 0x5f, 0xa2, 0x3b, 0x80, 0x04, 0x03, 0xed,
-	0x38, 0x03, 0x72, 0xd1, 0xb2, 0x2e, 0x71, 0x0c, 0xee, 0x38, 0x11, 0xf1, 0x36, 0xa4, 0x78, 0x8a,
-	0x12, 0x8f, 0xeb, 0xcd, 0x59, 0xc2, 0x46, 0x68, 0xc6, 0x33, 0x15, 0xe7, 0x45, 0xb7, 0x20, 0xef,
-	0xf9, 0xee, 0xa1, 0xdb, 0xb1, 0x5b, 0x96, 0x68, 0x03, 0xd3, 0x3c, 0x84, 0x17, 0x23, 0x68, 0x91,
-	0x01, 0xd1, 0x2b, 0xb0, 0xd8, 0xec, 0xf9, 0x3e, 0x3b, 0xb8, 0xa0, 0x9a, 0xe3, 0x54, 0x0b, 0x12,
-	0x28, 0x88, 0x36, 0x06, 0xbe, 0x1c, 0x58, 0x47, 0x7c, 0x6f, 0x58, 0xea, 0x8e, 0x5a, 0x46, 0xfb,
-	0x6a, 0x0e, 0xd0, 0xf8, 0x2b, 0x63, 0xf2, 0xf7, 0x30, 0xe5, 0xb9, 0x7c, 0x0f, 0x43, 0xf7, 0xe0,
-	0x62, 0x24, 0x38, 0xf4, 0xed, 0x4e, 0x60, 0x37, 0x23, 0x1d, 0xc5, 0x8d, 0x8e, 0xee, 0x86, 0x39,
-	0x40, 0x1a, 0xce, 0xf9, 0x93, 0x0b, 0xd2, 0x01, 0x42, 0xfb, 0x99, 0x65, 0xb7, 0xb9, 0xc1, 0x52,
-	0x33, 0xb3, 0x67, 0x43, 0xfb, 0x99, 0xce, 0x99, 0x50, 0x38, 0xb8, 0xb0, 0xf2, 0x76, 0x50, 0xc7,
-	0x7a, 0x7c, 0xcc, 0x7d, 0x94, 0xdf, 0xda, 0x3e, 0xe3, 0x1b, 0x2e, 0x96, 0x1f, 0xa8, 0xb3, 0x7d,
-	0xdc, 0xbf, 0xf0, 0x43, 0x30, 0xf4, 0xc6, 0x24, 0x3f, 0xce, 0xc9, 0xa1, 0x66, 0xdc, 0x93, 0xe8,
-	0x9d, 0x13, 0x2f, 0x46, 0x46, 0xb2, 0x4c, 0xbc, 0x1a, 0xef, 0x43, 0xc6, 0xa1, 0x5d, 0x2f, 0x70,
-	0xc3, 0xc2, 0xfc, 0x0c, 0xc3, 0xbc, 0x92, 0xa0, 0x25, 0x11, 0x13, 0xda, 0x81, 0x5c, 0xc7, 0xb3,
-	0x82, 0x27, 0xde, 0x67, 0xd6, 0x01, 0xa5, 0x85, 0x2c, 0x97, 0xf1, 0xea, 0x54, 0x19, 0x15, 0xaf,
-	0xfe, 0xc4, 0xfb, 0x6c, 0x87, 0x52, 0x92, 0xed, 0x44, 0xff, 0x4e, 0xf8, 0x28, 0x0d, 0xe7, 0xfc,
-	0x28, 0xdd, 0xee, 0x47, 0xf4, 0xb0, 0x31, 0x87, 0xfa, 0x7b, 0x99, 0x6e, 0xe4, 0x2c, 0x25, 0xfe,
-	0x3c, 0x18, 0xc1, 0xde, 0xaf, 0x56, 0xef, 0xf3, 0xe7, 0x41, 0x01, 0x56, 0x47, 0x10, 0x35, 0x9d,
-	0x98, 0x15, 0x4c, 0xd4, 0xc4, 0xf6, 0x02, 0x2b, 0x3c, 0xf2, 0x79, 0xef, 0x68, 0x5f, 0x40, 0x9a,
-	0xeb, 0xc4, 0x9e, 0xbb, 0x3c, 0xfc, 0xac, 0xb6, 0xdb, 0xf4, 0x3d, 0x71, 0x79, 0x92, 0x24, 0xc7,
-	0x61, 0x7b, 0x1c, 0x34, 0xb8, 0xcc, 0xcd, 0x63, 0xab, 0xe9, 0x39, 0x54, 0xc6, 0xff, 0x42, 0x04,
-	0x2c, 0x7a, 0x0e, 0x45, 0x6f, 0x00, 0x62, 0x3c, 0x6e, 0xe7, 0x30, 0xf2, 0x68, 0x68, 0x1f, 0x46,
-	0x5f, 0x13, 0x24, 0x46, 0x66, 0x13, 0xfb, 0x50, 0xfb, 0xa1, 0x02, 0xd9, 0xbe, 0x79, 0xd1, 0x3d,
-	0x48, 0x32, 0x9f, 0x28, 0x33, 0x1b, 0x92, 0x91, 0x23, 0x1d, 0xe6, 0x0f, 0x28, 0x1d, 0x7e, 0xb6,
-	0xbd, 0x7a, 0x3a, 0x2b, 0x4f, 0x65, 0x99, 0x03, 0xca, 0xff, 0xd1, 0xfe, 0xac, 0x40, 0x46, 0x46,
-	0x0a, 0xfa, 0xf6, 0x20, 0xc0, 0x66, 0x57, 0xa4, 0x1f, 0x5e, 0xdf, 0x81, 0xab, 0x6d, 0xb7, 0x63,
-	0xd9, 0xce, 0x91, 0xdd, 0x69, 0x52, 0xab, 0xc9, 0xfe, 0xb6, 0x5a, 0x83, 0x29, 0x82, 0xc8, 0xe0,
-	0x6b, 0x6d, 0xb7, 0xa3, 0x0b, 0x92, 0xe2, 0x10, 0x05, 0x4b, 0xce, 0x06, 0x2c, 0x48, 0x59, 0xe7,
-	0x39, 0x51, 0x4e, 0xf2, 0xf2, 0x53, 0x7d, 0xad, 0x40, 0xaa, 0xde, 0xf2, 0x66, 0xf8, 0x6d, 0xc8,
-	0xe8, 0x9c, 0x24, 0x31, 0x75, 0x4e, 0x92, 0x3c, 0x65, 0x4e, 0x92, 0x1a, 0x9f, 0x93, 0xbc, 0x0e,
-	0xea, 0xc8, 0xaf, 0x8e, 0x58, 0x44, 0x88, 0xe2, 0xbf, 0x34, 0x0c, 0x37, 0xed, 0x43, 0xb4, 0x03,
-	0x59, 0x5f, 0x76, 0x56, 0x62, 0x96, 0x91, 0xdb, 0xba, 0x3d, 0xf5, 0xec, 0x43, 0x7d, 0x18, 0x19,
-	0xb0, 0x6a, 0xff, 0x50, 0x60, 0x29, 0x36, 0xe9, 0x3a, 0xf1, 0x9b, 0x0f, 0x3b, 0xfe, 0xa1, 0x7b,
-	0x44, 0x3b, 0x56, 0xc7, 0x6e, 0x47, 0x51, 0x9d, 0xe5, 0x90, 0x8a, 0xdd, 0xa6, 0xcc, 0x7c, 0x07,
-	0x76, 0xdb, 0x6d, 0x1d, 0x0b, 0xbc, 0x88, 0x65, 0x10, 0x20, 0x4e, 0x50, 0x82, 0x8c, 0xed, 0x38,
-	0x3e, 0x0d, 0x02, 0x99, 0xae, 0xa7, 0x8f, 0x5f, 0x6a, 0x5e, 0x10, 0xda, 0x2d, 0x5d, 0x70, 0x90,
-	0x88, 0x15, 0x5d, 0x85, 0x6c, 0x48, 0x5b, 0xb4, 0xfb, 0xc4, 0xeb, 0x50, 0x69, 0x9e, 0x01, 0x00,
-	0xad, 0x42, 0x9a, 0xb6, 0x6d, 0xb7, 0x25, 0x3f, 0xdb, 0x8b, 0x85, 0xf6, 0xa5, 0x02, 0x8b, 0x23,
-	0xe2, 0x58, 0xcb, 0xc4, 0x2b, 0xad, 0x7f, 0x1c, 0xb5, 0xa2, 0x72, 0x89, 0x2e, 0xc3, 0x7c, 0xcb,
-	0x6b, 0xda, 0xfd, 0xe1, 0x49, 0x96, 0xf4, 0xd7, 0xe8, 0x22, 0x7b, 0xc2, 0x1d, 0x0e, 0xfa, 0x2c,
-	0xb9, 0x62, 0x47, 0xef, 0x72, 0xf1, 0xe2, 0xc2, 0xcb, 0x49, 0x9d, 0x00, 0xf1, 0xeb, 0x7e, 0x0b,
-	0xf2, 0x41, 0xe8, 0x53, 0x1a, 0x5a, 0x91, 0x05, 0x84, 0xe6, 0x8b, 0x02, 0x2a, 0xb5, 0xda, 0xf8,
-	0x89, 0x02, 0x8b, 0x23, 0x53, 0x27, 0xf4, 0x32, 0x5c, 0x8e, 0xa6, 0xa3, 0x75, 0x53, 0x37, 0x1b,
-	0xf5, 0x58, 0x66, 0x5b, 0x84, 0x6c, 0xb1, 0x5a, 0xd9, 0x31, 0xc8, 0x1e, 0x2e, 0xa9, 0x0a, 0x6f,
-	0xd7, 0x70, 0xa5, 0xc4, 0xc8, 0xf7, 0x30, 0x29, 0xee, 0xea, 0x15, 0xf6, 0xd2, 0xe0, 0x78, 0xf9,
-	0x53, 0x30, 0xb4, 0x00, 0xf3, 0x62, 0xc6, 0xca, 0x07, 0x1b, 0x39, 0xc8, 0x54, 0xaa, 0xfc, 0xe7,
-	0x62, 0x6a, 0x0a, 0xbd, 0x04, 0xcb, 0x72, 0x61, 0xd5, 0x70, 0x45, 0x2f, 0x1b, 0x1f, 0xe3, 0x92,
-	0x9a, 0xde, 0xe8, 0x42, 0x7e, 0x74, 0x86, 0x83, 0xd6, 0xe1, 0x6a, 0x91, 0xe0, 0x92, 0x61, 0x0e,
-	0x8d, 0x53, 0x46, 0xf5, 0x9a, 0x87, 0xd4, 0xbe, 0x51, 0xd7, 0x55, 0x05, 0xe5, 0x01, 0xf6, 0xf4,
-	0xba, 0x89, 0x09, 0x23, 0x55, 0x13, 0xac, 0x5d, 0xd4, 0xf7, 0x30, 0x31, 0xd8, 0xe3, 0x09, 0x3f,
-	0xac, 0x11, 0x5c, 0xaf, 0xab, 0x49, 0xa6, 0x55, 0xc9, 0xa8, 0x17, 0xab, 0xfb, 0x98, 0xa8, 0xa9,
-	0x8d, 0x9f, 0x2a, 0xb0, 0x3c, 0xd6, 0x52, 0xb1, 0xf7, 0x50, 0x6c, 0x3a, 0x3d, 0x61, 0xe3, 0x6b,
-	0xb0, 0x16, 0x23, 0xaa, 0x1b, 0x95, 0xfb, 0x65, 0x6c, 0x35, 0xea, 0x2c, 0xe1, 0x8f, 0x4f, 0xb8,
-	0xf7, 0x1a, 0x65, 0xd3, 0xe0, 0xd8, 0x04, 0x3b, 0x57, 0x0c, 0xdb, 0xa8, 0x94, 0x8d, 0x3d, 0xc3,
-	0xc4, 0x25, 0x4e, 0x91, 0xdc, 0xf8, 0xb9, 0x02, 0x6a, 0xbc, 0x19, 0xe2, 0x56, 0x27, 0x38, 0xe2,
-	0x9c, 0xe8, 0x27, 0x5e, 0x81, 0xf0, 0x50, 0xa9, 0xda, 0x37, 0x4a, 0xdc, 0x63, 0x57, 0xe0, 0xd2,
-	0x10, 0xa2, 0x52, 0x1d, 0x42, 0x26, 0x62, 0x5c, 0x04, 0xef, 0x34, 0x2a, 0x25, 0xee, 0xb6, 0x51,
-	0x84, 0xf0, 0x05, 0x2e, 0xa9, 0xa9, 0x8d, 0xbb, 0x90, 0xed, 0xa7, 0x39, 0x74, 0x11, 0xd0, 0x8e,
-	0xf1, 0x10, 0x97, 0x2c, 0xa2, 0x9b, 0xd8, 0x2a, 0xe1, 0x1d, 0xbd, 0x51, 0x36, 0xd5, 0x0b, 0xcc,
-	0x25, 0x35, 0x4c, 0xac, 0x1a, 0x26, 0xec, 0x0d, 0xa9, 0x3c, 0x9e, 0xe3, 0x3f, 0x31, 0xbd, 0xfb,
-	0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x14, 0x95, 0x3d, 0x8b, 0x6e, 0x2a, 0x00, 0x00,
+var fileDescriptor_1820d8e1a9fad753 = []byte{
+	// 3301 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3a, 0x3b, 0x70, 0x1b, 0xd7,
+	0x76, 0x5a, 0x7c, 0x08, 0xe2, 0x80, 0x04, 0x97, 0x97, 0xb4, 0x04, 0xea, 0x63, 0x51, 0x6b, 0xc9,
+	0x96, 0x29, 0x9b, 0x8e, 0x29, 0x79, 0x62, 0x67, 0x32, 0x4e, 0x96, 0xd8, 0x4b, 0x71, 0x6d, 0x10,
+	0x80, 0x2f, 0x16, 0x94, 0xe4, 0x22, 0xeb, 0x15, 0xf6, 0x92, 0xda, 0x08, 0xc0, 0xc2, 0xbb, 0x0b,
+	0x5a, 0xf4, 0xc4, 0x5d, 0xda, 0x14, 0x99, 0x14, 0x99, 0x14, 0x29, 0xdd, 0x25, 0x33, 0x29, 0xd2,
+	0x64, 0xd2, 0x64, 0x26, 0x33, 0x29, 0x92, 0x49, 0x95, 0x22, 0xa9, 0x52, 0x64, 0x52, 0xbc, 0xea,
+	0xf5, 0x9e, 0x79, 0xf3, 0xe6, 0xcd, 0xfd, 0x2c, 0x3e, 0x0b, 0x10, 0x04, 0x69, 0xe9, 0x35, 0xaf,
+	0xe1, 0xf0, 0x9e, 0xdf, 0x3d, 0xf7, 0x9c, 0x73, 0xcf, 0x39, 0xf7, 0x2c, 0x60, 0xf1, 0xe4, 0xe1,
+	0x76, 0x2f, 0xf0, 0x23, 0x1f, 0xdd, 0xa0, 0xaf, 0xa2, 0xed, 0x8e, 0xd3, 0x0b, 0xb7, 0x9f, 0xfb,
+	0xfe, 0x4b, 0xaf, 0x7b, 0xbc, 0xdd, 0x73, 0x82, 0xa8, 0x4b, 0x83, 0xed, 0x93, 0x87, 0xda, 0x57,
+	0x50, 0x2a, 0xbf, 0xa0, 0xad, 0x97, 0xfa, 0x89, 0xe3, 0xb5, 0x9d, 0xe7, 0x5e, 0xdb, 0x8b, 0x4e,
+	0x09, 0xfd, 0xb6, 0x4f, 0xc3, 0x08, 0x7d, 0x02, 0x99, 0xb0, 0xed, 0x47, 0x25, 0x65, 0x53, 0xb9,
+	0x5f, 0xd8, 0xb9, 0xb3, 0x3d, 0x43, 0xce, 0x76, 0xa3, 0xed, 0x47, 0x84, 0x93, 0x6b, 0xff, 0x91,
+	0x86, 0x8d, 0x29, 0x32, 0xc3, 0x9e, 0xdf, 0x0d, 0xe9, 0x25, 0x85, 0xa2, 0xf7, 0x60, 0xa5, 0xe5,
+	0xf7, 0xbb, 0x91, 0xed, 0x08, 0xa1, 0x6d, 0x5a, 0x4a, 0x6d, 0x2a, 0xf7, 0xb3, 0xa4, 0xc8, 0xc1,
+	0x7a, 0x0c, 0x45, 0x3f, 0xc0, 0xba, 0xdb, 0x0f, 0x9c, 0xc8, 0xf3, 0xbb, 0x76, 0x40, 0xbf, 0xed,
+	0x7b, 0x01, 0xed, 0xd0, 0x6e, 0x54, 0x4a, 0x6f, 0x2a, 0xf7, 0x8b, 0x3b, 0x5f, 0xcc, 0xdc, 0xef,
+	0x4c, 0xad, 0xb7, 0x0d, 0x29, 0x92, 0x0c, 0x25, 0x92, 0x35, 0x77, 0x12, 0x88, 0xbe, 0x81, 0x35,
+	0x67, 0x44, 0x80, 0xdd, 0xef, 0xb9, 0x4e, 0x44, 0x4b, 0x19, 0x7e, 0xda, 0x8f, 0x66, 0xee, 0x3e,
+	0xba, 0x71, 0x93, 0xb3, 0x11, 0xe4, 0x4c, 0xc0, 0xb4, 0x0e, 0xac, 0x4d, 0xd1, 0x06, 0xdd, 0x85,
+	0x4d, 0xa3, 0x49, 0x74, 0xcb, 0xac, 0x55, 0x6d, 0x82, 0xbf, 0x6a, 0x9a, 0x04, 0x1f, 0xe0, 0xaa,
+	0x65, 0x37, 0xab, 0x8d, 0x3a, 0x2e, 0x9b, 0x7b, 0x26, 0x36, 0xd4, 0x2b, 0xa8, 0x04, 0xeb, 0x46,
+	0xcd, 0xae, 0xd6, 0x2c, 0xbb, 0xb1, 0x5f, 0x7b, 0x62, 0xc7, 0x1c, 0xaa, 0x82, 0xae, 0x02, 0x3a,
+	0x68, 0x36, 0x92, 0xf0, 0x94, 0xd6, 0x03, 0x34, 0xa9, 0x18, 0xfa, 0x1a, 0x56, 0x99, 0x5b, 0xec,
+	0x51, 0xfd, 0x4a, 0xca, 0x66, 0xfa, 0x7e, 0x61, 0xe7, 0xc3, 0x73, 0x5d, 0x3a, 0x66, 0x61, 0x35,
+	0x4c, 0x40, 0xb4, 0x00, 0xd4, 0x24, 0xd5, 0x9b, 0x8e, 0x1a, 0xed, 0x07, 0xb8, 0xcd, 0x9d, 0x5f,
+	0x0b, 0x5c, 0x1a, 0xec, 0xf5, 0xdb, 0x47, 0x5e, 0x3b, 0x79, 0x1b, 0x6e, 0x43, 0xa1, 0x43, 0x83,
+	0xd6, 0x0b, 0xa7, 0x1b, 0xd9, 0x9e, 0xcb, 0x35, 0xc9, 0x13, 0x88, 0x41, 0xa6, 0x8b, 0x3e, 0x83,
+	0x8c, 0x17, 0xd1, 0x4e, 0x29, 0xc5, 0xcd, 0x70, 0x6f, 0xa6, 0x8e, 0x15, 0xaf, 0x4b, 0xcd, 0x88,
+	0x76, 0x08, 0x67, 0xd1, 0xfe, 0x4d, 0x81, 0xcd, 0xb3, 0xf7, 0x97, 0x37, 0xe7, 0x29, 0x14, 0x8f,
+	0xc6, 0x30, 0xd2, 0x1a, 0xbf, 0x37, 0x73, 0xa7, 0x69, 0x12, 0x13, 0x72, 0xd0, 0x3e, 0x14, 0x8f,
+	0x28, 0x0d, 0x6d, 0xa7, 0xeb, 0xda, 0x91, 0xf3, 0x8a, 0x86, 0xdc, 0x4a, 0x85, 0x1d, 0x6d, 0xa6,
+	0xe4, 0x7a, 0xe0, 0xb5, 0x28, 0x59, 0x62, 0x9c, 0x7a, 0xd7, 0xb5, 0x18, 0x9f, 0xf6, 0x29, 0x5c,
+	0x7b, 0x4c, 0xa3, 0x5d, 0x41, 0xdc, 0x88, 0x9c, 0xa8, 0x1f, 0xc6, 0xf6, 0xbb, 0x05, 0x20, 0x85,
+	0x0c, 0xcd, 0x97, 0x97, 0x10, 0xd3, 0xd5, 0x7e, 0xa1, 0x40, 0x69, 0x92, 0x55, 0x1e, 0x7d, 0x36,
+	0x2f, 0xfa, 0x0a, 0x8a, 0x31, 0x3a, 0xe4, 0x8c, 0x5c, 0xff, 0xe2, 0xce, 0xd6, 0x4c, 0xfd, 0xc7,
+	0xb7, 0x5a, 0x7e, 0x3e, 0xba, 0x64, 0x01, 0xde, 0x0b, 0x68, 0xcf, 0x39, 0x65, 0x97, 0x2b, 0x96,
+	0x2a, 0x72, 0xc8, 0x87, 0xe7, 0x58, 0x25, 0xe6, 0x92, 0x82, 0xd5, 0x5e, 0x02, 0xa2, 0xfd, 0x5d,
+	0x06, 0xd6, 0xcb, 0x01, 0x75, 0x22, 0x2a, 0x55, 0xf8, 0x79, 0x09, 0x17, 0xed, 0x43, 0xbe, 0x4d,
+	0x9d, 0x90, 0xda, 0x01, 0x3d, 0x92, 0x9e, 0x7b, 0x30, 0x3b, 0xfa, 0x18, 0x35, 0xa1, 0x47, 0x34,
+	0xa0, 0xdd, 0x16, 0x25, 0x8b, 0x6d, 0xb9, 0x46, 0x4f, 0x40, 0xed, 0x87, 0x34, 0xb0, 0xbd, 0xee,
+	0x91, 0x1f, 0x74, 0x78, 0x8e, 0xe1, 0x87, 0x2e, 0xec, 0x7c, 0x30, 0x53, 0x60, 0x33, 0xa4, 0x81,
+	0x39, 0xe4, 0x21, 0x2b, 0xfd, 0x71, 0x00, 0x4b, 0x8b, 0xb1, 0x2d, 0x47, 0x65, 0xcf, 0x93, 0x16,
+	0xeb, 0x82, 0x6f, 0x54, 0x3c, 0xea, 0x4d, 0xc0, 0xd0, 0x9f, 0xc1, 0xad, 0x78, 0x87, 0x5e, 0xe0,
+	0xb7, 0x68, 0x18, 0xb2, 0x70, 0xe8, 0x39, 0x81, 0xd3, 0xa1, 0x11, 0x0d, 0xc2, 0x52, 0x96, 0xef,
+	0xf5, 0xe9, 0x3c, 0x7b, 0xd5, 0x07, 0x02, 0xea, 0x03, 0x7e, 0x72, 0xa3, 0x77, 0x36, 0x12, 0x3d,
+	0x80, 0x55, 0xcf, 0xa5, 0x9d, 0x9e, 0x1f, 0xd1, 0x6e, 0xeb, 0xd4, 0x8e, 0xfc, 0x97, 0xb4, 0x5b,
+	0x5a, 0xe0, 0x71, 0xaa, 0x8e, 0x20, 0x2c, 0x06, 0x47, 0x1f, 0x02, 0x72, 0x5c, 0xd7, 0x63, 0x6a,
+	0x3b, 0x6d, 0x5e, 0xa4, 0x68, 0x18, 0x95, 0x72, 0x9c, 0x7a, 0x75, 0x88, 0x91, 0x51, 0xa1, 0xfd,
+	0x45, 0x0a, 0xde, 0x4a, 0x84, 0x8b, 0xbc, 0x16, 0x9f, 0x43, 0x4e, 0x1e, 0x42, 0x86, 0xcc, 0xdd,
+	0x79, 0x02, 0x9e, 0xc4, 0x4c, 0xe8, 0x4f, 0x60, 0x8d, 0xbb, 0x3b, 0x36, 0x9c, 0xdf, 0xe3, 0x5e,
+	0x11, 0x21, 0xb4, 0x7d, 0xae, 0xc7, 0xa5, 0xb5, 0x6a, 0x9c, 0x8b, 0xac, 0xf6, 0x93, 0x20, 0x64,
+	0xc1, 0x4a, 0x7c, 0x2f, 0x8f, 0x1c, 0xaf, 0xdd, 0x0f, 0xa8, 0x8c, 0xa6, 0x07, 0xf3, 0xe8, 0xb9,
+	0x27, 0x58, 0x48, 0x7c, 0xb7, 0xe5, 0x5a, 0xab, 0x02, 0x12, 0xe6, 0x90, 0x61, 0x2c, 0xee, 0xce,
+	0xa7, 0x90, 0xe5, 0x61, 0x2c, 0x2d, 0xa1, 0xcd, 0x71, 0x01, 0x04, 0x83, 0xf6, 0xa3, 0x02, 0x6b,
+	0x63, 0x02, 0xa5, 0x75, 0x2f, 0x2d, 0x71, 0xda, 0xb9, 0x53, 0x3f, 0xff, 0xdc, 0xff, 0xac, 0x40,
+	0x96, 0x6f, 0x83, 0x36, 0x40, 0x5c, 0xd9, 0x61, 0x32, 0xcc, 0xf1, 0xb5, 0xe9, 0x0e, 0x52, 0x48,
+	0xea, 0x62, 0x29, 0xe4, 0x1e, 0x14, 0x79, 0x24, 0x04, 0x71, 0x52, 0xe0, 0x8e, 0xca, 0x93, 0x65,
+	0x06, 0x1d, 0x64, 0x0a, 0xf4, 0x19, 0x6c, 0x88, 0x8d, 0xe9, 0xab, 0x9e, 0x27, 0x9b, 0xac, 0xc8,
+	0xeb, 0x50, 0x3b, 0xa4, 0x2d, 0x7e, 0x99, 0xd3, 0xe4, 0x2a, 0x27, 0xc0, 0x03, 0xbc, 0xe5, 0x75,
+	0x68, 0x83, 0xb6, 0xb4, 0x07, 0x50, 0x1c, 0x4f, 0x3b, 0x33, 0x4e, 0xa1, 0xfd, 0xa4, 0xc4, 0x3e,
+	0xe6, 0xe5, 0x6b, 0xc4, 0xc7, 0x3e, 0x5b, 0xcf, 0xe5, 0x11, 0xc1, 0x29, 0x18, 0xce, 0xcf, 0x0e,
+	0xa9, 0xdf, 0x7a, 0x76, 0x48, 0x4f, 0xcf, 0x0e, 0xda, 0xdf, 0x0f, 0xc2, 0x51, 0x9e, 0x5d, 0x86,
+	0xe3, 0x1f, 0x5c, 0xf8, 0xf0, 0xfb, 0x57, 0xe2, 0xe3, 0xd7, 0x61, 0x99, 0xff, 0x93, 0x08, 0xc7,
+	0xf7, 0xe7, 0xe8, 0x1c, 0x04, 0xc3, 0xfe, 0x15, 0xb2, 0xe4, 0x8f, 0xac, 0x77, 0x17, 0x61, 0x21,
+	0xa0, 0x61, 0xbf, 0x1d, 0x69, 0xdb, 0xb0, 0x56, 0xf1, 0xc2, 0xb8, 0x70, 0x0f, 0xca, 0xfd, 0x35,
+	0xc8, 0x89, 0x52, 0x12, 0x3b, 0x77, 0x81, 0xd7, 0x04, 0x57, 0x7b, 0x0a, 0xeb, 0xe3, 0xf4, 0xf2,
+	0x7c, 0x7f, 0x0c, 0x8b, 0x52, 0x89, 0x50, 0x76, 0x92, 0xf3, 0x65, 0xb3, 0x01, 0x97, 0xf6, 0x8f,
+	0x0a, 0xac, 0x32, 0xd1, 0x5c, 0xf1, 0x81, 0x22, 0x1b, 0x09, 0x45, 0xf6, 0xaf, 0xc4, 0xaa, 0xa0,
+	0x43, 0xc8, 0x0b, 0xb3, 0x78, 0x6e, 0x1c, 0x01, 0xbf, 0x7f, 0x4e, 0xdb, 0x96, 0x90, 0x2e, 0x8c,
+	0x64, 0xba, 0xe1, 0xfe, 0x15, 0xb2, 0xe8, 0xcb, 0xff, 0xaf, 0xdf, 0x83, 0xc5, 0x18, 0xce, 0xa2,
+	0x3c, 0xde, 0x83, 0x1f, 0x2b, 0x4f, 0x72, 0x92, 0x6e, 0x37, 0x0b, 0x69, 0xcf, 0x0d, 0x59, 0x3e,
+	0x1b, 0x95, 0x3b, 0xcc, 0x3e, 0xb1, 0xbb, 0xd3, 0x17, 0x8a, 0x75, 0xed, 0x10, 0xd6, 0x45, 0x97,
+	0x9e, 0xe8, 0x2e, 0x7e, 0x66, 0xb5, 0xe0, 0x75, 0x28, 0x21, 0xf8, 0x77, 0xba, 0x0e, 0xfd, 0x6f,
+	0x0a, 0x72, 0x92, 0xe4, 0xbc, 0x06, 0xf5, 0x92, 0x59, 0xf9, 0x8d, 0xb5, 0x63, 0xbb, 0xb0, 0x20,
+	0x5b, 0xda, 0xcc, 0x85, 0x1b, 0x65, 0xc9, 0x79, 0x56, 0x4b, 0x97, 0x7d, 0x6d, 0x2d, 0x9d, 0xf6,
+	0xdf, 0x19, 0x28, 0x8e, 0xfb, 0x00, 0x3d, 0x86, 0x6c, 0xcb, 0xe9, 0xcb, 0x9a, 0x5c, 0xdc, 0xf9,
+	0xf8, 0x02, 0xfe, 0xdb, 0x2e, 0x33, 0x46, 0x22, 0xf8, 0xd1, 0x33, 0x40, 0x01, 0xfd, 0x53, 0xda,
+	0x8a, 0xa8, 0x6b, 0xb7, 0x9c, 0xc0, 0xb5, 0xa3, 0xd3, 0x1e, 0x95, 0xcf, 0x86, 0xd9, 0x51, 0x51,
+	0x0e, 0xa8, 0xeb, 0x45, 0x65, 0x27, 0x70, 0xad, 0xd3, 0x1e, 0x25, 0x6a, 0x2c, 0x26, 0x86, 0xa0,
+	0x4d, 0x28, 0xb8, 0x34, 0x6c, 0x05, 0x5e, 0x6f, 0xe0, 0xb0, 0x3c, 0x19, 0x05, 0x69, 0xbf, 0x4e,
+	0x41, 0x96, 0x6b, 0x83, 0xde, 0x82, 0xd5, 0xb2, 0xde, 0x6c, 0xe0, 0xc4, 0x33, 0x7d, 0x1d, 0xd4,
+	0x46, 0xa5, 0xc6, 0x1e, 0xef, 0xfa, 0xa1, 0x6e, 0x56, 0xf4, 0xdd, 0x0a, 0x56, 0x15, 0x74, 0x1b,
+	0x6e, 0x70, 0xa8, 0x5e, 0x21, 0x58, 0x37, 0x9e, 0xd9, 0xbb, 0xb5, 0xda, 0x97, 0xd8, 0xb0, 0x77,
+	0x9f, 0xd9, 0xcd, 0x06, 0x26, 0x6a, 0x0a, 0xad, 0xc2, 0x72, 0x05, 0xeb, 0x0d, 0x6c, 0xe3, 0xa7,
+	0x75, 0x93, 0x60, 0x43, 0x4d, 0x33, 0x9e, 0x5a, 0xd3, 0x6a, 0x98, 0x06, 0xb6, 0xcb, 0x7a, 0xb5,
+	0x8c, 0x2b, 0x15, 0x31, 0x22, 0x78, 0x62, 0x56, 0x8d, 0xda, 0x13, 0x35, 0x83, 0xee, 0xc2, 0x66,
+	0x5d, 0x7f, 0xc6, 0x47, 0x05, 0x98, 0x90, 0x1a, 0xb1, 0xcb, 0x3a, 0x31, 0x6c, 0xeb, 0x59, 0x1d,
+	0xdb, 0x04, 0x7f, 0x81, 0xcb, 0x16, 0x36, 0xd4, 0x2c, 0x13, 0x33, 0x85, 0xca, 0xc0, 0xe5, 0x8a,
+	0x59, 0xc5, 0x86, 0xba, 0x80, 0x6e, 0x42, 0x29, 0x26, 0xa8, 0xd5, 0xf9, 0x0e, 0xd5, 0x9a, 0x65,
+	0x1f, 0xea, 0x15, 0xd3, 0x50, 0x73, 0x4c, 0xb1, 0x31, 0x76, 0x75, 0x11, 0x69, 0xf0, 0x36, 0xd3,
+	0x9a, 0x69, 0xc5, 0x28, 0x99, 0x0d, 0xc6, 0x05, 0xa8, 0x79, 0x74, 0x0b, 0x36, 0xd8, 0x19, 0xcd,
+	0xea, 0xe3, 0xc1, 0x99, 0xe5, 0x21, 0xb0, 0xa1, 0x02, 0xba, 0x01, 0xd7, 0x62, 0x34, 0x13, 0x11,
+	0x9f, 0x8f, 0x19, 0xab, 0xc0, 0x90, 0xb5, 0x43, 0x4c, 0x2a, 0x7a, 0xbd, 0xce, 0x08, 0x08, 0x6e,
+	0x60, 0x72, 0x28, 0x86, 0x1a, 0x4b, 0xda, 0x3f, 0xa5, 0x20, 0xcb, 0x73, 0x66, 0x22, 0x3d, 0x2b,
+	0x23, 0xe9, 0x79, 0xea, 0xed, 0x4b, 0xbd, 0xc1, 0xc7, 0x50, 0xfa, 0xf5, 0x3d, 0x86, 0x12, 0xb3,
+	0x8a, 0xcc, 0x99, 0xb3, 0x8a, 0xec, 0xc5, 0x67, 0x15, 0xbf, 0x4a, 0xc1, 0x62, 0x0c, 0x62, 0x79,
+	0x2f, 0xa4, 0xc1, 0x89, 0xd7, 0x1a, 0xe9, 0xe2, 0xf2, 0x12, 0x62, 0xba, 0xe8, 0x06, 0xe4, 0xc3,
+	0xc8, 0x09, 0x22, 0xde, 0x1f, 0xa6, 0x78, 0x7f, 0xb8, 0xc8, 0x01, 0x0d, 0xda, 0x42, 0x77, 0x60,
+	0x69, 0x30, 0xa9, 0x63, 0xf8, 0x34, 0xc7, 0x17, 0x62, 0x18, 0x23, 0xa9, 0x42, 0x2e, 0xf2, 0x5a,
+	0x2f, 0x69, 0xc4, 0x12, 0x15, 0xd3, 0xf4, 0xd1, 0x5c, 0x9a, 0x8a, 0x7a, 0x48, 0x5d, 0x4b, 0xf0,
+	0x92, 0x58, 0x08, 0x2b, 0xaa, 0xbd, 0xc0, 0x6b, 0x51, 0x99, 0xa5, 0xe6, 0x99, 0x6f, 0x08, 0x86,
+	0x91, 0x8c, 0xb9, 0x70, 0xd9, 0x8c, 0x79, 0xbd, 0x0c, 0xc5, 0x71, 0xc5, 0x98, 0x7d, 0x84, 0x6a,
+	0x43, 0xeb, 0x2d, 0x0a, 0x80, 0xe9, 0xa2, 0x75, 0xc8, 0xf2, 0x29, 0x95, 0x1c, 0x59, 0x89, 0x85,
+	0xf6, 0x2f, 0x69, 0x58, 0x1a, 0xed, 0xcc, 0x10, 0x1e, 0x4f, 0x89, 0x1f, 0xcd, 0xdd, 0xd3, 0x8d,
+	0x27, 0xc4, 0xc9, 0xe9, 0x52, 0xea, 0x35, 0x4d, 0x97, 0xa6, 0xa7, 0xda, 0xf4, 0x1b, 0x48, 0xb5,
+	0x99, 0xc9, 0x54, 0xfb, 0x97, 0xca, 0x39, 0xa9, 0xf6, 0x1a, 0xac, 0xd5, 0x88, 0x81, 0x89, 0xdd,
+	0xac, 0xee, 0x35, 0x2b, 0x7b, 0x66, 0x25, 0xce, 0xb6, 0xf3, 0x24, 0xc6, 0xd4, 0x79, 0x89, 0x31,
+	0x3d, 0x99, 0xfa, 0x32, 0xda, 0xff, 0xa4, 0x61, 0x6d, 0x8a, 0xe1, 0xd0, 0xf3, 0xb8, 0xa7, 0x96,
+	0xae, 0xfc, 0xe2, 0xa2, 0xa6, 0xdf, 0x9e, 0x3e, 0x3e, 0xec, 0xb7, 0x23, 0x22, 0x25, 0x23, 0x17,
+	0xd6, 0xd8, 0x2d, 0xb6, 0x27, 0x7c, 0xcd, 0x6e, 0xd7, 0xc3, 0xb9, 0x6e, 0x57, 0x42, 0x3e, 0xf2,
+	0x26, 0x60, 0xe8, 0x63, 0x58, 0xef, 0x77, 0x07, 0x5b, 0xb4, 0xa9, 0x1d, 0x50, 0x27, 0x1c, 0xd4,
+	0xc2, 0xb5, 0x31, 0x1c, 0xe1, 0x28, 0xed, 0x5f, 0x15, 0xd8, 0x38, 0x53, 0x7d, 0xf4, 0x00, 0xde,
+	0x13, 0x5e, 0x1a, 0xf8, 0xc8, 0xac, 0x98, 0xd6, 0x33, 0x96, 0xd6, 0x9b, 0x95, 0xe4, 0x90, 0x7b,
+	0x05, 0x0a, 0x65, 0xbd, 0x1a, 0x93, 0xaa, 0x0a, 0xab, 0x05, 0x63, 0xde, 0xb5, 0x99, 0x73, 0x6c,
+	0xd3, 0xc2, 0x07, 0x6a, 0x0a, 0xdd, 0x83, 0x3b, 0xe3, 0x48, 0x56, 0x28, 0xcc, 0x32, 0xb6, 0xcb,
+	0xb5, 0x83, 0x5d, 0xb3, 0x2a, 0x4a, 0x46, 0x9a, 0x85, 0xc3, 0x94, 0x38, 0xb1, 0x6b, 0xd6, 0x3e,
+	0x26, 0x36, 0xc1, 0x7a, 0xa3, 0x56, 0x55, 0x33, 0xda, 0xbf, 0x67, 0xe1, 0xea, 0x74, 0x3b, 0x0d,
+	0x52, 0xae, 0xe8, 0x90, 0x2f, 0x92, 0x72, 0x91, 0x3b, 0x08, 0x0c, 0xd1, 0xa0, 0x54, 0x2e, 0xe1,
+	0xa7, 0xed, 0x29, 0xae, 0x1b, 0x0f, 0x8d, 0x8b, 0x3b, 0x0d, 0xbd, 0x84, 0xa5, 0xb1, 0x2f, 0x00,
+	0x62, 0x9e, 0xf7, 0xf8, 0x32, 0xea, 0x89, 0x97, 0x85, 0x3b, 0xf6, 0x6d, 0x60, 0x4c, 0x38, 0xda,
+	0x87, 0x82, 0x4c, 0x96, 0x3c, 0x81, 0x88, 0xd2, 0xf5, 0xde, 0xcc, 0xbd, 0x44, 0x9e, 0xe5, 0xc9,
+	0x03, 0xa2, 0xc1, 0xff, 0xd7, 0x1f, 0xc1, 0xda, 0x94, 0xed, 0x78, 0x31, 0xeb, 0xf9, 0x51, 0x68,
+	0xfb, 0x3d, 0xda, 0xe5, 0x7e, 0xca, 0x92, 0x3c, 0x87, 0xd4, 0x7a, 0xb4, 0xab, 0xfd, 0x52, 0x81,
+	0xd2, 0x59, 0x46, 0x44, 0x5b, 0xf0, 0x2e, 0x8b, 0xa7, 0xcb, 0xc5, 0xe7, 0xb4, 0x76, 0x8f, 0xa7,
+	0x96, 0xf2, 0xbe, 0x59, 0x31, 0x6c, 0xcb, 0x2c, 0x7f, 0x89, 0xad, 0x86, 0xfd, 0xc4, 0xb4, 0xf6,
+	0x6b, 0x4d, 0xcb, 0xd6, 0x8d, 0x66, 0xc5, 0x52, 0x17, 0x58, 0x48, 0x8e, 0x07, 0xa3, 0x20, 0x4c,
+	0x04, 0xee, 0x1a, 0xac, 0x98, 0xd5, 0x72, 0x8d, 0x10, 0x5c, 0xb6, 0xec, 0x3a, 0x31, 0xcb, 0x58,
+	0xcd, 0xa0, 0x77, 0xe0, 0x36, 0x57, 0x77, 0x46, 0x30, 0x67, 0xb5, 0xbf, 0x51, 0x00, 0x86, 0x16,
+	0x44, 0x77, 0xa1, 0x38, 0x62, 0xff, 0x61, 0xc5, 0x5a, 0x1a, 0x5a, 0xd6, 0x74, 0xd1, 0x03, 0x58,
+	0x0d, 0x5f, 0xf8, 0x41, 0x64, 0x8f, 0x26, 0xe6, 0x94, 0x98, 0x75, 0x70, 0x84, 0x31, 0x84, 0x0f,
+	0xeb, 0x71, 0xfa, 0x82, 0xf5, 0x58, 0xfb, 0x06, 0x0a, 0x84, 0x86, 0x7e, 0x3f, 0x60, 0x7d, 0x06,
+	0x7f, 0x65, 0x87, 0x91, 0x73, 0x74, 0x34, 0xd2, 0xc6, 0xf1, 0xb5, 0xe9, 0xa2, 0x6b, 0x90, 0x0b,
+	0x7c, 0xbf, 0xc3, 0x30, 0x42, 0x8d, 0x05, 0xb6, 0x34, 0x5d, 0xe6, 0x6e, 0x26, 0xfd, 0xd4, 0x0e,
+	0xbd, 0xef, 0x85, 0x06, 0x59, 0x92, 0xe7, 0x90, 0x86, 0xf7, 0x3d, 0xd5, 0xfe, 0x21, 0x0d, 0x37,
+	0x66, 0x4c, 0x7c, 0xd0, 0x4b, 0xc8, 0xcb, 0x51, 0x92, 0x1f, 0xc8, 0x84, 0x6d, 0x5e, 0x76, 0x7c,
+	0x94, 0xc0, 0xf9, 0xc1, 0x6e, 0xaa, 0xa4, 0x90, 0xa1, 0x7c, 0xf4, 0x08, 0xd6, 0xe3, 0x96, 0xb1,
+	0x43, 0xa3, 0x17, 0xbe, 0x2b, 0x87, 0x48, 0xfc, 0x44, 0x9c, 0x38, 0x6e, 0x03, 0x0f, 0x38, 0x5a,
+	0x0c, 0x9a, 0x75, 0xb8, 0xd5, 0xef, 0xf6, 0x9c, 0x20, 0xa4, 0xae, 0x3d, 0x95, 0x3d, 0xcb, 0x0d,
+	0x72, 0x3d, 0x26, 0xaa, 0x4f, 0x8a, 0x28, 0x41, 0xee, 0x84, 0x06, 0xe1, 0xf0, 0x21, 0x13, 0x2f,
+	0x99, 0xa3, 0x13, 0x23, 0x35, 0x3f, 0x90, 0x15, 0x58, 0xed, 0x25, 0x8e, 0xa3, 0xb9, 0xa0, 0x26,
+	0x8f, 0x88, 0xee, 0xc0, 0xad, 0xb8, 0x32, 0xd6, 0x49, 0xad, 0x8c, 0x1b, 0x8d, 0x1a, 0x99, 0x7c,
+	0x07, 0x0d, 0x51, 0x0d, 0x8b, 0x98, 0x75, 0x56, 0x99, 0xaf, 0xc1, 0xda, 0x10, 0xba, 0x4b, 0x74,
+	0xb3, 0x6a, 0x11, 0x8c, 0xd5, 0x94, 0xf6, 0x7f, 0x29, 0x58, 0x9d, 0x18, 0x08, 0xa0, 0x87, 0x70,
+	0x75, 0xca, 0x74, 0x61, 0x18, 0x29, 0x6b, 0x13, 0x03, 0x03, 0xd3, 0x45, 0x1f, 0xc1, 0xfa, 0x89,
+	0xd3, 0xf6, 0x5c, 0x5b, 0xf4, 0xaf, 0x83, 0x21, 0xa7, 0x68, 0x62, 0x57, 0x39, 0xae, 0xc1, 0x50,
+	0x72, 0xbe, 0x89, 0x1e, 0x00, 0x12, 0x0c, 0xb4, 0xeb, 0x0e, 0xc9, 0x45, 0x4f, 0xbb, 0xc2, 0x31,
+	0xb8, 0xeb, 0xc6, 0xc4, 0xbb, 0x90, 0xe1, 0x39, 0x4c, 0xbc, 0xbe, 0xb7, 0xe7, 0x09, 0x1b, 0xa1,
+	0x19, 0x4f, 0x65, 0x9c, 0x17, 0xdd, 0x83, 0xa2, 0x1f, 0x78, 0xc7, 0x5e, 0xd7, 0x69, 0xdb, 0xa2,
+	0x4f, 0xcc, 0xf2, 0x10, 0x5e, 0x8e, 0xa1, 0x65, 0x06, 0x44, 0xef, 0xc0, 0x72, 0xab, 0x1f, 0x04,
+	0xec, 0xe0, 0x82, 0x6a, 0x81, 0x53, 0x2d, 0x49, 0xa0, 0x20, 0xda, 0x1a, 0xfa, 0x72, 0x68, 0x1d,
+	0xf1, 0x41, 0x62, 0xa5, 0x37, 0x6e, 0x19, 0xed, 0x3f, 0x17, 0x00, 0x4d, 0x3e, 0x43, 0xa6, 0x7f,
+	0x30, 0x53, 0x5e, 0xcb, 0x07, 0x33, 0xf4, 0x08, 0xae, 0xc6, 0x82, 0xa3, 0xc0, 0xe9, 0x86, 0x4e,
+	0x2b, 0xd6, 0x51, 0xdc, 0xe8, 0xf8, 0x6e, 0x58, 0x43, 0xa4, 0xe9, 0x5e, 0x3e, 0xb9, 0x20, 0x1d,
+	0x20, 0x72, 0x5e, 0xd9, 0x4e, 0x87, 0x1b, 0x2c, 0x33, 0x37, 0x7b, 0x3e, 0x72, 0x5e, 0xe9, 0x9c,
+	0x09, 0x45, 0xc3, 0x0b, 0x2b, 0x6f, 0x07, 0x75, 0xed, 0xe7, 0xa7, 0xdc, 0x47, 0xc5, 0x9d, 0xdd,
+	0x0b, 0x3e, 0xf2, 0x12, 0xf9, 0x81, 0xba, 0xbb, 0xa7, 0x83, 0x0b, 0x3f, 0x02, 0x43, 0x1f, 0x4c,
+	0xf3, 0xe3, 0x82, 0x9c, 0x7a, 0x26, 0x3d, 0x89, 0x3e, 0x39, 0xf3, 0x62, 0xe4, 0x24, 0xcb, 0xd4,
+	0xab, 0xf1, 0x39, 0xe4, 0x5c, 0xda, 0xf3, 0x43, 0x2f, 0x2a, 0x2d, 0xce, 0x31, 0xed, 0x33, 0x04,
+	0x2d, 0x89, 0x99, 0xd0, 0x1e, 0x14, 0xba, 0xbe, 0x1d, 0xbe, 0xf0, 0xbf, 0xb3, 0x8f, 0x28, 0x2d,
+	0xe5, 0xb9, 0x8c, 0x77, 0x67, 0xca, 0xa8, 0xfa, 0x8d, 0x17, 0xfe, 0x77, 0x7b, 0x94, 0x92, 0x7c,
+	0x37, 0xfe, 0x77, 0xca, 0x57, 0x6b, 0xb8, 0xe4, 0x57, 0xeb, 0xce, 0x20, 0xa2, 0x47, 0x8d, 0x39,
+	0xf2, 0x00, 0x90, 0xe9, 0x46, 0x0e, 0x5b, 0x92, 0xef, 0x87, 0x31, 0xec, 0xe3, 0x5a, 0xed, 0x31,
+	0x7f, 0x3f, 0x94, 0x60, 0x7d, 0x0c, 0x51, 0xd7, 0x89, 0x55, 0xc5, 0x44, 0x4d, 0xed, 0x2e, 0xb1,
+	0xc2, 0x23, 0xdf, 0xff, 0xae, 0xf6, 0x03, 0x64, 0xb9, 0x4e, 0xec, 0x3d, 0xcc, 0xc3, 0xcf, 0xee,
+	0x78, 0xad, 0xc0, 0x17, 0x97, 0x27, 0x4d, 0x0a, 0x1c, 0x76, 0xc0, 0x41, 0xc3, 0xcb, 0xdc, 0x3a,
+	0xb5, 0x5b, 0xbe, 0x4b, 0x65, 0xfc, 0x2f, 0xc5, 0xc0, 0xb2, 0xef, 0x52, 0xf4, 0x01, 0x20, 0xc6,
+	0xe3, 0x75, 0x8f, 0x63, 0x8f, 0x46, 0xce, 0x71, 0xfc, 0xb9, 0x41, 0x62, 0x64, 0x36, 0x71, 0x8e,
+	0xb5, 0x3f, 0x57, 0x20, 0x3f, 0x30, 0x2f, 0x7a, 0x04, 0x69, 0xe6, 0x13, 0x65, 0x6e, 0x43, 0x32,
+	0x72, 0xa4, 0xc3, 0xe2, 0x11, 0xa5, 0xa3, 0xef, 0xba, 0x77, 0xcf, 0x67, 0xe5, 0xa9, 0x2c, 0x77,
+	0x44, 0xf9, 0x3f, 0xda, 0x7f, 0x29, 0x90, 0x93, 0x91, 0x82, 0xfe, 0x70, 0x18, 0x60, 0xf3, 0x2b,
+	0x32, 0x08, 0xaf, 0x3f, 0x82, 0x9b, 0x1d, 0xaf, 0x6b, 0x3b, 0xee, 0x89, 0xd3, 0x6d, 0x51, 0xbb,
+	0xc5, 0xfe, 0xb6, 0xdb, 0xc3, 0x31, 0x83, 0xc8, 0xe0, 0x1b, 0x1d, 0xaf, 0xab, 0x0b, 0x92, 0xf2,
+	0x08, 0x05, 0x4b, 0xce, 0x26, 0x2c, 0x49, 0x59, 0x97, 0x39, 0x51, 0x41, 0xf2, 0xf2, 0x53, 0xfd,
+	0xa4, 0x40, 0xa6, 0xd1, 0xf6, 0xe7, 0xf8, 0xf1, 0xc8, 0xf8, 0x20, 0x25, 0x35, 0x73, 0x90, 0x92,
+	0x3e, 0x67, 0x90, 0x92, 0x99, 0x1c, 0xa4, 0xbc, 0x0f, 0xea, 0xd8, 0xcf, 0x92, 0x58, 0x44, 0x88,
+	0xe2, 0xbf, 0x32, 0x0a, 0xb7, 0x9c, 0x63, 0xb4, 0x07, 0xf9, 0x40, 0x76, 0x56, 0x62, 0xd8, 0x51,
+	0xd8, 0xb9, 0x3f, 0xf3, 0xec, 0x23, 0x7d, 0x18, 0x19, 0xb2, 0x6a, 0xff, 0xaf, 0xc0, 0x4a, 0x62,
+	0x14, 0x76, 0xe6, 0x47, 0x21, 0x76, 0xfc, 0x63, 0xef, 0x84, 0x76, 0xed, 0xae, 0xd3, 0x89, 0xa3,
+	0x3a, 0xcf, 0x21, 0x55, 0xa7, 0x43, 0x99, 0xf9, 0x8e, 0x9c, 0x8e, 0xd7, 0x3e, 0x15, 0x78, 0x11,
+	0xcb, 0x20, 0x40, 0x9c, 0xc0, 0x80, 0x9c, 0xe3, 0xba, 0x01, 0x0d, 0x43, 0x99, 0xae, 0x67, 0xcf,
+	0x67, 0xea, 0x7e, 0x18, 0x39, 0x6d, 0x5d, 0x70, 0x90, 0x98, 0x15, 0xdd, 0x84, 0x7c, 0x44, 0xdb,
+	0xb4, 0xf7, 0xc2, 0xef, 0x52, 0x69, 0x9e, 0x21, 0x00, 0xad, 0x43, 0x96, 0x76, 0x1c, 0xaf, 0x2d,
+	0xbf, 0xeb, 0x8b, 0x85, 0xf6, 0xa3, 0x02, 0xcb, 0x63, 0xe2, 0x58, 0xcb, 0xc4, 0x2b, 0x6d, 0x70,
+	0x1a, 0xb7, 0xa2, 0x72, 0x89, 0xae, 0xc3, 0x62, 0xdb, 0x6f, 0x39, 0x83, 0xe9, 0x4a, 0x9e, 0x0c,
+	0xd6, 0xe8, 0x2a, 0x7b, 0xe3, 0x1d, 0x0f, 0xfb, 0x2c, 0xb9, 0x62, 0x47, 0xef, 0x71, 0xf1, 0xe2,
+	0xc2, 0xcb, 0x51, 0x9e, 0x00, 0xf1, 0xeb, 0x7e, 0x0f, 0x8a, 0x61, 0x14, 0x50, 0x1a, 0xd9, 0xb1,
+	0x05, 0x84, 0xe6, 0xcb, 0x02, 0x2a, 0xb5, 0xda, 0xfa, 0x2b, 0x05, 0x96, 0xc7, 0xc6, 0x52, 0xe8,
+	0x6d, 0xb8, 0x1e, 0x8f, 0x4f, 0x1b, 0x96, 0x6e, 0x35, 0x1b, 0x89, 0xcc, 0xb6, 0x0c, 0xf9, 0x72,
+	0xad, 0xba, 0x67, 0x92, 0x03, 0x6c, 0xa8, 0x0a, 0x6f, 0xd7, 0x70, 0xd5, 0x60, 0xe4, 0x07, 0x98,
+	0x94, 0xf7, 0xf5, 0x2a, 0x7b, 0x69, 0x70, 0xbc, 0xfc, 0xad, 0x18, 0x5a, 0x82, 0x45, 0x31, 0x84,
+	0xe5, 0x93, 0x8f, 0x02, 0xe4, 0xaa, 0x35, 0xfe, 0x7b, 0x32, 0x35, 0x83, 0xde, 0x82, 0x55, 0xb9,
+	0xb0, 0xeb, 0xb8, 0xaa, 0x57, 0xcc, 0xaf, 0xb1, 0xa1, 0x66, 0xb7, 0x7a, 0x50, 0x1c, 0x1f, 0xf2,
+	0xa0, 0x4d, 0xb8, 0x59, 0x26, 0xd8, 0x30, 0xad, 0x91, 0x79, 0xcb, 0xb8, 0x5e, 0x8b, 0x90, 0x39,
+	0x34, 0x1b, 0xba, 0xaa, 0xa0, 0x22, 0xc0, 0x81, 0xde, 0xb0, 0x30, 0x61, 0xa4, 0x6a, 0x8a, 0xb5,
+	0x8b, 0xfa, 0x01, 0x26, 0x26, 0x7b, 0x5d, 0xe1, 0xa7, 0x75, 0x82, 0x1b, 0x0d, 0x35, 0xcd, 0xb4,
+	0x32, 0xcc, 0x46, 0xb9, 0x76, 0x88, 0x89, 0x9a, 0xd9, 0xfa, 0x6b, 0x05, 0x56, 0x27, 0x5a, 0x2a,
+	0xf6, 0x1e, 0x4a, 0x8c, 0xaf, 0xa7, 0x6c, 0x7c, 0x0b, 0x36, 0x12, 0x44, 0x0d, 0xb3, 0xfa, 0xb8,
+	0x82, 0xed, 0x66, 0x83, 0x25, 0xfc, 0xc9, 0x11, 0xf8, 0x41, 0xb3, 0x62, 0x99, 0x1c, 0x9b, 0x62,
+	0xe7, 0x4a, 0x60, 0x9b, 0xd5, 0x8a, 0x79, 0x60, 0x5a, 0xd8, 0xe0, 0x14, 0xe9, 0xad, 0xbf, 0x55,
+	0x40, 0x4d, 0x36, 0x43, 0xdc, 0xea, 0x04, 0xc7, 0x9c, 0x53, 0xfd, 0xc4, 0x2b, 0x10, 0x1e, 0x29,
+	0x55, 0x87, 0xa6, 0xc1, 0x3d, 0x76, 0x03, 0xae, 0x8d, 0x20, 0xaa, 0xb5, 0x11, 0x64, 0x2a, 0xc1,
+	0x45, 0xf0, 0x5e, 0xb3, 0x6a, 0x70, 0xb7, 0x8d, 0x23, 0x84, 0x2f, 0xb0, 0xa1, 0x66, 0xb6, 0x1e,
+	0x42, 0x7e, 0x90, 0xe6, 0xd0, 0x55, 0x40, 0x7b, 0xe6, 0x53, 0x6c, 0xd8, 0x44, 0xb7, 0xb0, 0x6d,
+	0xe0, 0x3d, 0x9d, 0xbd, 0x49, 0xaf, 0x30, 0x97, 0xd4, 0x31, 0xb1, 0xeb, 0x98, 0xb0, 0x37, 0xa4,
+	0xf2, 0x7c, 0x81, 0xff, 0x06, 0xf5, 0xe1, 0x6f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xdf, 0xdc, 0x5d,
+	0x0e, 0x8f, 0x2a, 0x00, 0x00,
 }
diff --git a/waitlist/waitlist.pb.go b/waitlist/waitlist.pb.go
new file mode 100644
index 0000000..09df310
--- /dev/null
+++ b/waitlist/waitlist.pb.go
@@ -0,0 +1,1202 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: waitlist.proto
+
+// Waitlist partner API protos
+package ext_maps_booking_partner_v3_waitlist
+
+/*
+Waitlist partner API protos
+*/
+
+import (
+	fmt "fmt"
+	math "math"
+
+	proto "github.com/golang/protobuf/proto"
+)
+
+// 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
+
+// A status for the waitlist that determines if new users can join and what
+// the reason is if they can’t join.
+type WaitlistStatus int32
+
+const (
+	WaitlistStatus_WAITLIST_STATUS_UNSPECIFIED WaitlistStatus = 0
+	// The waitlist is open and is accepting new users.
+	WaitlistStatus_OPEN WaitlistStatus = 1
+	// There is currently no wait and users should arrive at the merchant
+	// without joining the waitlist.
+	WaitlistStatus_CLOSED_NO_WAIT WaitlistStatus = 2
+	// The waitlist is not currently accepting new users because it is full
+	// or closed for other reasons.
+	WaitlistStatus_CLOSED_OTHER WaitlistStatus = 3
+)
+
+var WaitlistStatus_name = map[int32]string{
+	0: "WAITLIST_STATUS_UNSPECIFIED",
+	1: "OPEN",
+	2: "CLOSED_NO_WAIT",
+	3: "CLOSED_OTHER",
+}
+
+var WaitlistStatus_value = map[string]int32{
+	"WAITLIST_STATUS_UNSPECIFIED": 0,
+	"OPEN":                        1,
+	"CLOSED_NO_WAIT":              2,
+	"CLOSED_OTHER":                3,
+}
+
+func (x WaitlistStatus) String() string {
+	return proto.EnumName(WaitlistStatus_name, int32(x))
+}
+
+func (WaitlistStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{0}
+}
+
+type WaitlistEntryState int32
+
+const (
+	WaitlistEntryState_WAITLIST_ENTRY_STATE_UNSPECIFIED WaitlistEntryState = 0
+	// The waitlist entry was created and the user is currently waiting in the
+	// waitlist.
+	WaitlistEntryState_WAITING WaitlistEntryState = 1
+	// The waitlist entry has been canceled. Cancellation for no-shows should use
+	// the NO_SHOW state.
+	WaitlistEntryState_CANCELED WaitlistEntryState = 2
+	// The merchant is ready to serve the user.
+	WaitlistEntryState_SERVICE_READY WaitlistEntryState = 3
+	// The user has checked in with the host and is waiting to be seated.
+	WaitlistEntryState_CHECKED_IN WaitlistEntryState = 4
+	// The user has arrived and been seated by the merchant.
+	WaitlistEntryState_SEATED WaitlistEntryState = 5
+	// The user did not arrive at the merchant in time and lost their space.
+	WaitlistEntryState_NO_SHOW WaitlistEntryState = 6
+)
+
+var WaitlistEntryState_name = map[int32]string{
+	0: "WAITLIST_ENTRY_STATE_UNSPECIFIED",
+	1: "WAITING",
+	2: "CANCELED",
+	3: "SERVICE_READY",
+	4: "CHECKED_IN",
+	5: "SEATED",
+	6: "NO_SHOW",
+}
+
+var WaitlistEntryState_value = map[string]int32{
+	"WAITLIST_ENTRY_STATE_UNSPECIFIED": 0,
+	"WAITING":                          1,
+	"CANCELED":                         2,
+	"SERVICE_READY":                    3,
+	"CHECKED_IN":                       4,
+	"SEATED":                           5,
+	"NO_SHOW":                          6,
+}
+
+func (x WaitlistEntryState) String() string {
+	return proto.EnumName(WaitlistEntryState_name, int32(x))
+}
+
+func (WaitlistEntryState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{1}
+}
+
+type WaitlistBusinessLogicFailure_Cause int32
+
+const (
+	// Default value: Don't use; amounts to an "unknown error"
+	// Unexpected errors must be returned using standard HTTP error codes.
+	WaitlistBusinessLogicFailure_CAUSE_UNSPECIFIED WaitlistBusinessLogicFailure_Cause = 0
+	// The user has already booked a waitlist entry with the partner.
+	WaitlistBusinessLogicFailure_EXISTING_WAITLIST_ENTRY WaitlistBusinessLogicFailure_Cause = 1
+	// The requested party size is below the merchant’s minimum.
+	WaitlistBusinessLogicFailure_BELOW_MIN_PARTY_SIZE WaitlistBusinessLogicFailure_Cause = 2
+	// The requested party size is above the merchant’s maximum.
+	WaitlistBusinessLogicFailure_ABOVE_MAX_PARTY_SIZE WaitlistBusinessLogicFailure_Cause = 3
+	// The requested merchant is currently closed.
+	WaitlistBusinessLogicFailure_MERCHANT_CLOSED WaitlistBusinessLogicFailure_Cause = 4
+	// There is currently no wait and the user should walk in without joining
+	// the waitlist.
+	WaitlistBusinessLogicFailure_NO_WAIT WaitlistBusinessLogicFailure_Cause = 5
+	// The waitlist is at capacity and new users are not being accepted at this
+	// time.
+	WaitlistBusinessLogicFailure_WAITLIST_FULL WaitlistBusinessLogicFailure_Cause = 6
+)
+
+var WaitlistBusinessLogicFailure_Cause_name = map[int32]string{
+	0: "CAUSE_UNSPECIFIED",
+	1: "EXISTING_WAITLIST_ENTRY",
+	2: "BELOW_MIN_PARTY_SIZE",
+	3: "ABOVE_MAX_PARTY_SIZE",
+	4: "MERCHANT_CLOSED",
+	5: "NO_WAIT",
+	6: "WAITLIST_FULL",
+}
+
+var WaitlistBusinessLogicFailure_Cause_value = map[string]int32{
+	"CAUSE_UNSPECIFIED":       0,
+	"EXISTING_WAITLIST_ENTRY": 1,
+	"BELOW_MIN_PARTY_SIZE":    2,
+	"ABOVE_MAX_PARTY_SIZE":    3,
+	"MERCHANT_CLOSED":         4,
+	"NO_WAIT":                 5,
+	"WAITLIST_FULL":           6,
+}
+
+func (x WaitlistBusinessLogicFailure_Cause) String() string {
+	return proto.EnumName(WaitlistBusinessLogicFailure_Cause_name, int32(x))
+}
+
+func (WaitlistBusinessLogicFailure_Cause) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{12, 0}
+}
+
+// Batch request for the wait estimates for the specified merchant, service and
+// party sizes.
+type BatchGetWaitEstimatesRequest struct {
+	// Required. Partner-provided ID for the merchant.
+	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
+	// Required. Partner-provided ID for the service.
+	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
+	// Required. The different party sizes WaitEstimates are requested for.
+	// WaitEstimates may differ with the number of people in the party.
+	PartySize            []int32  `protobuf:"varint,3,rep,packed,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *BatchGetWaitEstimatesRequest) Reset()         { *m = BatchGetWaitEstimatesRequest{} }
+func (m *BatchGetWaitEstimatesRequest) String() string { return proto.CompactTextString(m) }
+func (*BatchGetWaitEstimatesRequest) ProtoMessage()    {}
+func (*BatchGetWaitEstimatesRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{0}
+}
+
+func (m *BatchGetWaitEstimatesRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BatchGetWaitEstimatesRequest.Unmarshal(m, b)
+}
+func (m *BatchGetWaitEstimatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BatchGetWaitEstimatesRequest.Marshal(b, m, deterministic)
+}
+func (m *BatchGetWaitEstimatesRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BatchGetWaitEstimatesRequest.Merge(m, src)
+}
+func (m *BatchGetWaitEstimatesRequest) XXX_Size() int {
+	return xxx_messageInfo_BatchGetWaitEstimatesRequest.Size(m)
+}
+func (m *BatchGetWaitEstimatesRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_BatchGetWaitEstimatesRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BatchGetWaitEstimatesRequest proto.InternalMessageInfo
+
+func (m *BatchGetWaitEstimatesRequest) GetMerchantId() string {
+	if m != nil {
+		return m.MerchantId
+	}
+	return ""
+}
+
+func (m *BatchGetWaitEstimatesRequest) GetServiceId() string {
+	if m != nil {
+		return m.ServiceId
+	}
+	return ""
+}
+
+func (m *BatchGetWaitEstimatesRequest) GetPartySize() []int32 {
+	if m != nil {
+		return m.PartySize
+	}
+	return nil
+}
+
+// Response for the BatchGetWaitEstimates RPC with the wait estimates of the
+// specified merchant, service and party sizes.
+type BatchGetWaitEstimatesResponse struct {
+	// Required. A status for the waitlist that indicates whether new users can
+	// join and what the reason is if they can’t join. If the waitlist is not
+	// open, all other fields in the BatchGetWaitEstimatesResponse are expected to
+	// be unset.
+	WaitlistStatus WaitlistStatus `protobuf:"varint,1,opt,name=waitlist_status,json=waitlistStatus,proto3,enum=ext.maps.booking.partner.v3.waitlist.WaitlistStatus" json:"waitlist_status,omitempty"`
+	// The wait estimates for each party size requested. The response should
+	// contain exactly one wait estimate for each party size sent in the request.
+	// If a party size is not available for some reason, prefer ommitting it
+	// instead of returning an error so that the user will have some options to
+	// choose from.
+	WaitEstimate         []*WaitEstimate `protobuf:"bytes,2,rep,name=wait_estimate,json=waitEstimate,proto3" json:"wait_estimate,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *BatchGetWaitEstimatesResponse) Reset()         { *m = BatchGetWaitEstimatesResponse{} }
+func (m *BatchGetWaitEstimatesResponse) String() string { return proto.CompactTextString(m) }
+func (*BatchGetWaitEstimatesResponse) ProtoMessage()    {}
+func (*BatchGetWaitEstimatesResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{1}
+}
+
+func (m *BatchGetWaitEstimatesResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_BatchGetWaitEstimatesResponse.Unmarshal(m, b)
+}
+func (m *BatchGetWaitEstimatesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_BatchGetWaitEstimatesResponse.Marshal(b, m, deterministic)
+}
+func (m *BatchGetWaitEstimatesResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BatchGetWaitEstimatesResponse.Merge(m, src)
+}
+func (m *BatchGetWaitEstimatesResponse) XXX_Size() int {
+	return xxx_messageInfo_BatchGetWaitEstimatesResponse.Size(m)
+}
+func (m *BatchGetWaitEstimatesResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_BatchGetWaitEstimatesResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BatchGetWaitEstimatesResponse proto.InternalMessageInfo
+
+func (m *BatchGetWaitEstimatesResponse) GetWaitlistStatus() WaitlistStatus {
+	if m != nil {
+		return m.WaitlistStatus
+	}
+	return WaitlistStatus_WAITLIST_STATUS_UNSPECIFIED
+}
+
+func (m *BatchGetWaitEstimatesResponse) GetWaitEstimate() []*WaitEstimate {
+	if m != nil {
+		return m.WaitEstimate
+	}
+	return nil
+}
+
+// The range of time for the current estimated seat time for the user. Estimated
+// seat time range must change over time when the merchant or partner updates
+// their estimates.
+type EstimatedSeatTimeRange struct {
+	// Required. The lower bound for the range. Expressed as the number of seconds
+	// since the Unix epoch.
+	StartSeconds int64 `protobuf:"varint,1,opt,name=start_seconds,json=startSeconds,proto3" json:"start_seconds,omitempty"`
+	// Required. The upper bound for the range. Expressed as the number of seconds
+	// since the Unix epoch.
+	EndSeconds           int64    `protobuf:"varint,2,opt,name=end_seconds,json=endSeconds,proto3" json:"end_seconds,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EstimatedSeatTimeRange) Reset()         { *m = EstimatedSeatTimeRange{} }
+func (m *EstimatedSeatTimeRange) String() string { return proto.CompactTextString(m) }
+func (*EstimatedSeatTimeRange) ProtoMessage()    {}
+func (*EstimatedSeatTimeRange) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{2}
+}
+
+func (m *EstimatedSeatTimeRange) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EstimatedSeatTimeRange.Unmarshal(m, b)
+}
+func (m *EstimatedSeatTimeRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EstimatedSeatTimeRange.Marshal(b, m, deterministic)
+}
+func (m *EstimatedSeatTimeRange) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EstimatedSeatTimeRange.Merge(m, src)
+}
+func (m *EstimatedSeatTimeRange) XXX_Size() int {
+	return xxx_messageInfo_EstimatedSeatTimeRange.Size(m)
+}
+func (m *EstimatedSeatTimeRange) XXX_DiscardUnknown() {
+	xxx_messageInfo_EstimatedSeatTimeRange.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EstimatedSeatTimeRange proto.InternalMessageInfo
+
+func (m *EstimatedSeatTimeRange) GetStartSeconds() int64 {
+	if m != nil {
+		return m.StartSeconds
+	}
+	return 0
+}
+
+func (m *EstimatedSeatTimeRange) GetEndSeconds() int64 {
+	if m != nil {
+		return m.EndSeconds
+	}
+	return 0
+}
+
+// Contains fields measuring how long (in time or # of people) until the
+// user is ready to leave the waitlist and be seated.
+type WaitLength struct {
+	// The count of how many other parties are ahead of the user in the waitlist.
+	// parties_ahead_count must change over time as parties ahead
+	// in the waitlist are seated or leave the waitlist. Either
+	// parties_ahead_count or estimated_seat_time_range must be populated. Both
+	// should be populated.
+	PartiesAheadCount int32 `protobuf:"varint,1,opt,name=parties_ahead_count,json=partiesAheadCount,proto3" json:"parties_ahead_count,omitempty"`
+	// The range of time that the user is estimated to be seated in. Either
+	// parties_ahead_count or estimated_seat_time_range must be populated. Both
+	// should be populated.
+	EstimatedSeatTimeRange *EstimatedSeatTimeRange `protobuf:"bytes,2,opt,name=estimated_seat_time_range,json=estimatedSeatTimeRange,proto3" json:"estimated_seat_time_range,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{}                `json:"-"`
+	XXX_unrecognized       []byte                  `json:"-"`
+	XXX_sizecache          int32                   `json:"-"`
+}
+
+func (m *WaitLength) Reset()         { *m = WaitLength{} }
+func (m *WaitLength) String() string { return proto.CompactTextString(m) }
+func (*WaitLength) ProtoMessage()    {}
+func (*WaitLength) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{3}
+}
+
+func (m *WaitLength) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WaitLength.Unmarshal(m, b)
+}
+func (m *WaitLength) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WaitLength.Marshal(b, m, deterministic)
+}
+func (m *WaitLength) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WaitLength.Merge(m, src)
+}
+func (m *WaitLength) XXX_Size() int {
+	return xxx_messageInfo_WaitLength.Size(m)
+}
+func (m *WaitLength) XXX_DiscardUnknown() {
+	xxx_messageInfo_WaitLength.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WaitLength proto.InternalMessageInfo
+
+func (m *WaitLength) GetPartiesAheadCount() int32 {
+	if m != nil {
+		return m.PartiesAheadCount
+	}
+	return 0
+}
+
+func (m *WaitLength) GetEstimatedSeatTimeRange() *EstimatedSeatTimeRange {
+	if m != nil {
+		return m.EstimatedSeatTimeRange
+	}
+	return nil
+}
+
+// The wait estimate for a particular party size, merchant and service.
+type WaitEstimate struct {
+	// Required. The party size this wait estimate applies to.
+	PartySize int32 `protobuf:"varint,1,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
+	// Required. Contains fields measuring how long (in time or # of people) until
+	// the user is ready to leave the waitlist and be seated.
+	WaitLength           *WaitLength `protobuf:"bytes,2,opt,name=wait_length,json=waitLength,proto3" json:"wait_length,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *WaitEstimate) Reset()         { *m = WaitEstimate{} }
+func (m *WaitEstimate) String() string { return proto.CompactTextString(m) }
+func (*WaitEstimate) ProtoMessage()    {}
+func (*WaitEstimate) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{4}
+}
+
+func (m *WaitEstimate) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WaitEstimate.Unmarshal(m, b)
+}
+func (m *WaitEstimate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WaitEstimate.Marshal(b, m, deterministic)
+}
+func (m *WaitEstimate) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WaitEstimate.Merge(m, src)
+}
+func (m *WaitEstimate) XXX_Size() int {
+	return xxx_messageInfo_WaitEstimate.Size(m)
+}
+func (m *WaitEstimate) XXX_DiscardUnknown() {
+	xxx_messageInfo_WaitEstimate.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WaitEstimate proto.InternalMessageInfo
+
+func (m *WaitEstimate) GetPartySize() int32 {
+	if m != nil {
+		return m.PartySize
+	}
+	return 0
+}
+
+func (m *WaitEstimate) GetWaitLength() *WaitLength {
+	if m != nil {
+		return m.WaitLength
+	}
+	return nil
+}
+
+// Request for a user to join the waitlist.
+//
+// Reserve with Google may retry REST HTTP requests if no response is
+// received. If the exact same CreateWaitlistEntry is received a second time,
+// then the same CreateWaitlistResponse must be returned. A second waitlist
+// entry must not be created.
+type CreateWaitlistEntryRequest struct {
+	// Required. Partner-provided ID for the merchant.
+	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
+	// Required. Partner-provided ID for the service.
+	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
+	// Required. The party size requested for the waitlist entry.
+	PartySize int32 `protobuf:"varint,3,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
+	// Required. Personal information of the user joining the waitlist.
+	UserInformation *UserInformation `protobuf:"bytes,4,opt,name=user_information,json=userInformation,proto3" json:"user_information,omitempty"`
+	// A string from the user which contains any special requests or additional
+	// information that they would like to notify the merchant about.
+	// This will be populated when the user submits an additional request to
+	// Reserve with Google. The partner can disable this functionality at the
+	// service level by setting supports_additional_request to false in the
+	// service feed.
+	AdditionalRequest string `protobuf:"bytes,5,opt,name=additional_request,json=additionalRequest,proto3" json:"additional_request,omitempty"`
+	// Required. Used to differentiate retries from separate requests. If the
+	// exact same CreateWaitlistEntry is received a second time, (including
+	// idempotency_token) then the same CreateWaitlistResponse must be returned.
+	IdempotencyToken     string   `protobuf:"bytes,6,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 *CreateWaitlistEntryRequest) Reset()         { *m = CreateWaitlistEntryRequest{} }
+func (m *CreateWaitlistEntryRequest) String() string { return proto.CompactTextString(m) }
+func (*CreateWaitlistEntryRequest) ProtoMessage()    {}
+func (*CreateWaitlistEntryRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{5}
+}
+
+func (m *CreateWaitlistEntryRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateWaitlistEntryRequest.Unmarshal(m, b)
+}
+func (m *CreateWaitlistEntryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateWaitlistEntryRequest.Marshal(b, m, deterministic)
+}
+func (m *CreateWaitlistEntryRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateWaitlistEntryRequest.Merge(m, src)
+}
+func (m *CreateWaitlistEntryRequest) XXX_Size() int {
+	return xxx_messageInfo_CreateWaitlistEntryRequest.Size(m)
+}
+func (m *CreateWaitlistEntryRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateWaitlistEntryRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateWaitlistEntryRequest proto.InternalMessageInfo
+
+func (m *CreateWaitlistEntryRequest) GetMerchantId() string {
+	if m != nil {
+		return m.MerchantId
+	}
+	return ""
+}
+
+func (m *CreateWaitlistEntryRequest) GetServiceId() string {
+	if m != nil {
+		return m.ServiceId
+	}
+	return ""
+}
+
+func (m *CreateWaitlistEntryRequest) GetPartySize() int32 {
+	if m != nil {
+		return m.PartySize
+	}
+	return 0
+}
+
+func (m *CreateWaitlistEntryRequest) GetUserInformation() *UserInformation {
+	if m != nil {
+		return m.UserInformation
+	}
+	return nil
+}
+
+func (m *CreateWaitlistEntryRequest) GetAdditionalRequest() string {
+	if m != nil {
+		return m.AdditionalRequest
+	}
+	return ""
+}
+
+func (m *CreateWaitlistEntryRequest) GetIdempotencyToken() string {
+	if m != nil {
+		return m.IdempotencyToken
+	}
+	return ""
+}
+
+// Response for the CreateWaitlistEntry RPC with the waitlist entry ID or any
+// failing business logic information.
+type CreateWaitlistEntryResponse struct {
+	// Unique partner-provided ID for the newly created entry in the waitlist.
+	// Required if the waitlist entry was created successfully. Unique for all
+	// time.
+	WaitlistEntryId              string                        `protobuf:"bytes,1,opt,name=waitlist_entry_id,json=waitlistEntryId,proto3" json:"waitlist_entry_id,omitempty"`
+	WaitlistBusinessLogicFailure *WaitlistBusinessLogicFailure `protobuf:"bytes,2,opt,name=waitlist_business_logic_failure,json=waitlistBusinessLogicFailure,proto3" json:"waitlist_business_logic_failure,omitempty"`
+	XXX_NoUnkeyedLiteral         struct{}                      `json:"-"`
+	XXX_unrecognized             []byte                        `json:"-"`
+	XXX_sizecache                int32                         `json:"-"`
+}
+
+func (m *CreateWaitlistEntryResponse) Reset()         { *m = CreateWaitlistEntryResponse{} }
+func (m *CreateWaitlistEntryResponse) String() string { return proto.CompactTextString(m) }
+func (*CreateWaitlistEntryResponse) ProtoMessage()    {}
+func (*CreateWaitlistEntryResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{6}
+}
+
+func (m *CreateWaitlistEntryResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CreateWaitlistEntryResponse.Unmarshal(m, b)
+}
+func (m *CreateWaitlistEntryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CreateWaitlistEntryResponse.Marshal(b, m, deterministic)
+}
+func (m *CreateWaitlistEntryResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateWaitlistEntryResponse.Merge(m, src)
+}
+func (m *CreateWaitlistEntryResponse) XXX_Size() int {
+	return xxx_messageInfo_CreateWaitlistEntryResponse.Size(m)
+}
+func (m *CreateWaitlistEntryResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateWaitlistEntryResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateWaitlistEntryResponse proto.InternalMessageInfo
+
+func (m *CreateWaitlistEntryResponse) GetWaitlistEntryId() string {
+	if m != nil {
+		return m.WaitlistEntryId
+	}
+	return ""
+}
+
+func (m *CreateWaitlistEntryResponse) GetWaitlistBusinessLogicFailure() *WaitlistBusinessLogicFailure {
+	if m != nil {
+		return m.WaitlistBusinessLogicFailure
+	}
+	return nil
+}
+
+// Get the waitlist entry corresponding to the provided waitlist entry ID.
+type GetWaitlistEntryRequest struct {
+	// Required. The partner-provided waitlist entry ID to request info for.
+	WaitlistEntryId      string   `protobuf:"bytes,1,opt,name=waitlist_entry_id,json=waitlistEntryId,proto3" json:"waitlist_entry_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetWaitlistEntryRequest) Reset()         { *m = GetWaitlistEntryRequest{} }
+func (m *GetWaitlistEntryRequest) String() string { return proto.CompactTextString(m) }
+func (*GetWaitlistEntryRequest) ProtoMessage()    {}
+func (*GetWaitlistEntryRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{7}
+}
+
+func (m *GetWaitlistEntryRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetWaitlistEntryRequest.Unmarshal(m, b)
+}
+func (m *GetWaitlistEntryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetWaitlistEntryRequest.Marshal(b, m, deterministic)
+}
+func (m *GetWaitlistEntryRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetWaitlistEntryRequest.Merge(m, src)
+}
+func (m *GetWaitlistEntryRequest) XXX_Size() int {
+	return xxx_messageInfo_GetWaitlistEntryRequest.Size(m)
+}
+func (m *GetWaitlistEntryRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetWaitlistEntryRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetWaitlistEntryRequest proto.InternalMessageInfo
+
+func (m *GetWaitlistEntryRequest) GetWaitlistEntryId() string {
+	if m != nil {
+		return m.WaitlistEntryId
+	}
+	return ""
+}
+
+// Response with the waitlist entry corresponding to the provided
+// waitlist entry ID.
+type GetWaitlistEntryResponse struct {
+	// Required. The partner-provided information about a user’s waitlist entry.
+	WaitlistEntry        *WaitlistEntry `protobuf:"bytes,1,opt,name=waitlist_entry,json=waitlistEntry,proto3" json:"waitlist_entry,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
+}
+
+func (m *GetWaitlistEntryResponse) Reset()         { *m = GetWaitlistEntryResponse{} }
+func (m *GetWaitlistEntryResponse) String() string { return proto.CompactTextString(m) }
+func (*GetWaitlistEntryResponse) ProtoMessage()    {}
+func (*GetWaitlistEntryResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{8}
+}
+
+func (m *GetWaitlistEntryResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetWaitlistEntryResponse.Unmarshal(m, b)
+}
+func (m *GetWaitlistEntryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetWaitlistEntryResponse.Marshal(b, m, deterministic)
+}
+func (m *GetWaitlistEntryResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetWaitlistEntryResponse.Merge(m, src)
+}
+func (m *GetWaitlistEntryResponse) XXX_Size() int {
+	return xxx_messageInfo_GetWaitlistEntryResponse.Size(m)
+}
+func (m *GetWaitlistEntryResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetWaitlistEntryResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetWaitlistEntryResponse proto.InternalMessageInfo
+
+func (m *GetWaitlistEntryResponse) GetWaitlistEntry() *WaitlistEntry {
+	if m != nil {
+		return m.WaitlistEntry
+	}
+	return nil
+}
+
+// Cancel the user's entry in the waitlist.
+type DeleteWaitlistEntryRequest struct {
+	// Required. The partner-provided ID for the waitlist entry to be deleted.
+	WaitlistEntryId      string   `protobuf:"bytes,1,opt,name=waitlist_entry_id,json=waitlistEntryId,proto3" json:"waitlist_entry_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DeleteWaitlistEntryRequest) Reset()         { *m = DeleteWaitlistEntryRequest{} }
+func (m *DeleteWaitlistEntryRequest) String() string { return proto.CompactTextString(m) }
+func (*DeleteWaitlistEntryRequest) ProtoMessage()    {}
+func (*DeleteWaitlistEntryRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{9}
+}
+
+func (m *DeleteWaitlistEntryRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DeleteWaitlistEntryRequest.Unmarshal(m, b)
+}
+func (m *DeleteWaitlistEntryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DeleteWaitlistEntryRequest.Marshal(b, m, deterministic)
+}
+func (m *DeleteWaitlistEntryRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteWaitlistEntryRequest.Merge(m, src)
+}
+func (m *DeleteWaitlistEntryRequest) XXX_Size() int {
+	return xxx_messageInfo_DeleteWaitlistEntryRequest.Size(m)
+}
+func (m *DeleteWaitlistEntryRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DeleteWaitlistEntryRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DeleteWaitlistEntryRequest proto.InternalMessageInfo
+
+func (m *DeleteWaitlistEntryRequest) GetWaitlistEntryId() string {
+	if m != nil {
+		return m.WaitlistEntryId
+	}
+	return ""
+}
+
+// The times at which the waitlist entry changed state.
+type WaitlistEntryStateTimes struct {
+	// Required. The time at which the waitlist entry was created.
+	// In seconds since Unix epoch.
+	CreatedTimeSeconds int64 `protobuf:"varint,1,opt,name=created_time_seconds,json=createdTimeSeconds,proto3" json:"created_time_seconds,omitempty"`
+	// The time that the waitlist entry was cancelled. Must be populated
+	// when the waitlist entry has been canceled but not before.
+	// In seconds since Unix epoch.
+	CanceledTimeSeconds int64 `protobuf:"varint,2,opt,name=canceled_time_seconds,json=canceledTimeSeconds,proto3" json:"canceled_time_seconds,omitempty"`
+	// The time the merchant was ready to serve the user.
+	// service_readied_time_seconds must be populated after the merchant is
+	// ready to serve the user but not before.
+	// In seconds since Unix epoch.
+	ServiceReadiedTimeSeconds int64 `protobuf:"varint,3,opt,name=service_readied_time_seconds,json=serviceReadiedTimeSeconds,proto3" json:"service_readied_time_seconds,omitempty"`
+	// The actual time the user checked in with the host. checked_in_time must be
+	// populated after the user has checked in with the merchant but not before.
+	// In seconds since Unix epoch.
+	CheckedInTimeSeconds int64 `protobuf:"varint,4,opt,name=checked_in_time_seconds,json=checkedInTimeSeconds,proto3" json:"checked_in_time_seconds,omitempty"`
+	// The seated time for the user. seated_time_seconds must be populated
+	// when the user has been seated but not before.
+	// In seconds since Unix epoch.
+	SeatedTimeSeconds int64 `protobuf:"varint,5,opt,name=seated_time_seconds,json=seatedTimeSeconds,proto3" json:"seated_time_seconds,omitempty"`
+	// The time that the user was marked as a no-show. marked_no_show_time_seconds
+	// must be populated when the user has been marked a no-show but not before.
+	// In seconds since Unix epoch.
+	MarkedNoShowTimeSeconds int64    `protobuf:"varint,6,opt,name=marked_no_show_time_seconds,json=markedNoShowTimeSeconds,proto3" json:"marked_no_show_time_seconds,omitempty"`
+	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
+	XXX_unrecognized        []byte   `json:"-"`
+	XXX_sizecache           int32    `json:"-"`
+}
+
+func (m *WaitlistEntryStateTimes) Reset()         { *m = WaitlistEntryStateTimes{} }
+func (m *WaitlistEntryStateTimes) String() string { return proto.CompactTextString(m) }
+func (*WaitlistEntryStateTimes) ProtoMessage()    {}
+func (*WaitlistEntryStateTimes) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{10}
+}
+
+func (m *WaitlistEntryStateTimes) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WaitlistEntryStateTimes.Unmarshal(m, b)
+}
+func (m *WaitlistEntryStateTimes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WaitlistEntryStateTimes.Marshal(b, m, deterministic)
+}
+func (m *WaitlistEntryStateTimes) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WaitlistEntryStateTimes.Merge(m, src)
+}
+func (m *WaitlistEntryStateTimes) XXX_Size() int {
+	return xxx_messageInfo_WaitlistEntryStateTimes.Size(m)
+}
+func (m *WaitlistEntryStateTimes) XXX_DiscardUnknown() {
+	xxx_messageInfo_WaitlistEntryStateTimes.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WaitlistEntryStateTimes proto.InternalMessageInfo
+
+func (m *WaitlistEntryStateTimes) GetCreatedTimeSeconds() int64 {
+	if m != nil {
+		return m.CreatedTimeSeconds
+	}
+	return 0
+}
+
+func (m *WaitlistEntryStateTimes) GetCanceledTimeSeconds() int64 {
+	if m != nil {
+		return m.CanceledTimeSeconds
+	}
+	return 0
+}
+
+func (m *WaitlistEntryStateTimes) GetServiceReadiedTimeSeconds() int64 {
+	if m != nil {
+		return m.ServiceReadiedTimeSeconds
+	}
+	return 0
+}
+
+func (m *WaitlistEntryStateTimes) GetCheckedInTimeSeconds() int64 {
+	if m != nil {
+		return m.CheckedInTimeSeconds
+	}
+	return 0
+}
+
+func (m *WaitlistEntryStateTimes) GetSeatedTimeSeconds() int64 {
+	if m != nil {
+		return m.SeatedTimeSeconds
+	}
+	return 0
+}
+
+func (m *WaitlistEntryStateTimes) GetMarkedNoShowTimeSeconds() int64 {
+	if m != nil {
+		return m.MarkedNoShowTimeSeconds
+	}
+	return 0
+}
+
+// An entry in the waitlist.
+type WaitlistEntry struct {
+	// Required.
+	WaitlistEntryState WaitlistEntryState `protobuf:"varint,1,opt,name=waitlist_entry_state,json=waitlistEntryState,proto3,enum=ext.maps.booking.partner.v3.waitlist.WaitlistEntryState" json:"waitlist_entry_state,omitempty"`
+	// Required. The times at which the waitlist entry changed state.
+	WaitlistEntryStateTimes *WaitlistEntryStateTimes `protobuf:"bytes,2,opt,name=waitlist_entry_state_times,json=waitlistEntryStateTimes,proto3" json:"waitlist_entry_state_times,omitempty"`
+	// Required. Contains fields measuring how long (in time or # of people) until
+	// the user is ready to leave the waitlist and be seated.
+	WaitEstimate         *WaitEstimate `protobuf:"bytes,3,opt,name=wait_estimate,json=waitEstimate,proto3" json:"wait_estimate,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *WaitlistEntry) Reset()         { *m = WaitlistEntry{} }
+func (m *WaitlistEntry) String() string { return proto.CompactTextString(m) }
+func (*WaitlistEntry) ProtoMessage()    {}
+func (*WaitlistEntry) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{11}
+}
+
+func (m *WaitlistEntry) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WaitlistEntry.Unmarshal(m, b)
+}
+func (m *WaitlistEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WaitlistEntry.Marshal(b, m, deterministic)
+}
+func (m *WaitlistEntry) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WaitlistEntry.Merge(m, src)
+}
+func (m *WaitlistEntry) XXX_Size() int {
+	return xxx_messageInfo_WaitlistEntry.Size(m)
+}
+func (m *WaitlistEntry) XXX_DiscardUnknown() {
+	xxx_messageInfo_WaitlistEntry.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WaitlistEntry proto.InternalMessageInfo
+
+func (m *WaitlistEntry) GetWaitlistEntryState() WaitlistEntryState {
+	if m != nil {
+		return m.WaitlistEntryState
+	}
+	return WaitlistEntryState_WAITLIST_ENTRY_STATE_UNSPECIFIED
+}
+
+func (m *WaitlistEntry) GetWaitlistEntryStateTimes() *WaitlistEntryStateTimes {
+	if m != nil {
+		return m.WaitlistEntryStateTimes
+	}
+	return nil
+}
+
+func (m *WaitlistEntry) GetWaitEstimate() *WaitEstimate {
+	if m != nil {
+		return m.WaitEstimate
+	}
+	return nil
+}
+
+// Status data that conveys why creating a waitlist entry fails.
+// If there is a business logic error that is not captured here, please
+// reach out to the Reserve with Google team to add it to this list. Other
+// errors should be returned using standard HTTP error codes.
+type WaitlistBusinessLogicFailure struct {
+	// Required. The reason why the booking failed.
+	Cause WaitlistBusinessLogicFailure_Cause `protobuf:"varint,1,opt,name=cause,proto3,enum=ext.maps.booking.partner.v3.waitlist.WaitlistBusinessLogicFailure_Cause" json:"cause,omitempty"`
+	// This optional field is used for the partner to include additional
+	// information for debugging purposes only.
+	Description          string   `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *WaitlistBusinessLogicFailure) Reset()         { *m = WaitlistBusinessLogicFailure{} }
+func (m *WaitlistBusinessLogicFailure) String() string { return proto.CompactTextString(m) }
+func (*WaitlistBusinessLogicFailure) ProtoMessage()    {}
+func (*WaitlistBusinessLogicFailure) Descriptor() ([]byte, []int) {
+	return fileDescriptor_c4272259c545fcea, []int{12}
+}
+
+func (m *WaitlistBusinessLogicFailure) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WaitlistBusinessLogicFailure.Unmarshal(m, b)
+}
+func (m *WaitlistBusinessLogicFailure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WaitlistBusinessLogicFailure.Marshal(b, m, deterministic)
+}
+func (m *WaitlistBusinessLogicFailure) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WaitlistBusinessLogicFailure.Merge(m, src)
+}
+func (m *WaitlistBusinessLogicFailure) XXX_Size() int {
+	return xxx_messageInfo_WaitlistBusinessLogicFailure.Size(m)
+}
+func (m *WaitlistBusinessLogicFailure) XXX_DiscardUnknown() {
+	xxx_messageInfo_WaitlistBusinessLogicFailure.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WaitlistBusinessLogicFailure proto.InternalMessageInfo
+
+func (m *WaitlistBusinessLogicFailure) GetCause() WaitlistBusinessLogicFailure_Cause {
+	if m != nil {
+		return m.Cause
+	}
+	return WaitlistBusinessLogicFailure_CAUSE_UNSPECIFIED
+}
+
+func (m *WaitlistBusinessLogicFailure) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+// 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_c4272259c545fcea, []int{13}
+}
+
+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_c4272259c545fcea, []int{14}
+}
+
+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.RegisterType((*BatchGetWaitEstimatesRequest)(nil), "ext.maps.booking.partner.v3.waitlist.BatchGetWaitEstimatesRequest")
+	proto.RegisterType((*BatchGetWaitEstimatesResponse)(nil), "ext.maps.booking.partner.v3.waitlist.BatchGetWaitEstimatesResponse")
+	proto.RegisterType((*EstimatedSeatTimeRange)(nil), "ext.maps.booking.partner.v3.waitlist.EstimatedSeatTimeRange")
+	proto.RegisterType((*WaitLength)(nil), "ext.maps.booking.partner.v3.waitlist.WaitLength")
+	proto.RegisterType((*WaitEstimate)(nil), "ext.maps.booking.partner.v3.waitlist.WaitEstimate")
+	proto.RegisterType((*CreateWaitlistEntryRequest)(nil), "ext.maps.booking.partner.v3.waitlist.CreateWaitlistEntryRequest")
+	proto.RegisterType((*CreateWaitlistEntryResponse)(nil), "ext.maps.booking.partner.v3.waitlist.CreateWaitlistEntryResponse")
+	proto.RegisterType((*GetWaitlistEntryRequest)(nil), "ext.maps.booking.partner.v3.waitlist.GetWaitlistEntryRequest")
+	proto.RegisterType((*GetWaitlistEntryResponse)(nil), "ext.maps.booking.partner.v3.waitlist.GetWaitlistEntryResponse")
+	proto.RegisterType((*DeleteWaitlistEntryRequest)(nil), "ext.maps.booking.partner.v3.waitlist.DeleteWaitlistEntryRequest")
+	proto.RegisterType((*WaitlistEntryStateTimes)(nil), "ext.maps.booking.partner.v3.waitlist.WaitlistEntryStateTimes")
+	proto.RegisterType((*WaitlistEntry)(nil), "ext.maps.booking.partner.v3.waitlist.WaitlistEntry")
+	proto.RegisterType((*WaitlistBusinessLogicFailure)(nil), "ext.maps.booking.partner.v3.waitlist.WaitlistBusinessLogicFailure")
+	proto.RegisterType((*UserInformation)(nil), "ext.maps.booking.partner.v3.waitlist.UserInformation")
+	proto.RegisterType((*PostalAddress)(nil), "ext.maps.booking.partner.v3.waitlist.PostalAddress")
+	proto.RegisterEnum("ext.maps.booking.partner.v3.waitlist.WaitlistStatus", WaitlistStatus_name, WaitlistStatus_value)
+	proto.RegisterEnum("ext.maps.booking.partner.v3.waitlist.WaitlistEntryState", WaitlistEntryState_name, WaitlistEntryState_value)
+	proto.RegisterEnum("ext.maps.booking.partner.v3.waitlist.WaitlistBusinessLogicFailure_Cause", WaitlistBusinessLogicFailure_Cause_name, WaitlistBusinessLogicFailure_Cause_value)
+}
+
+func init() { proto.RegisterFile("waitlist.proto", fileDescriptor_c4272259c545fcea) }
+
+var fileDescriptor_c4272259c545fcea = []byte{
+	// 1295 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0xcd, 0x6e, 0xdb, 0x46,
+	0x10, 0x2e, 0x25, 0x4b, 0x8e, 0x47, 0xfe, 0xa1, 0xd6, 0x4e, 0xa4, 0xd8, 0x0e, 0x62, 0xb0, 0x29,
+	0x10, 0xa4, 0xa8, 0x10, 0x38, 0x0d, 0xd0, 0x43, 0x8a, 0x42, 0x96, 0x98, 0x98, 0xa8, 0x2c, 0xb9,
+	0xa4, 0x1c, 0x27, 0x01, 0x9a, 0xed, 0x86, 0x9c, 0x58, 0x6c, 0x28, 0x52, 0xe5, 0xae, 0xac, 0x3a,
+	0x40, 0x81, 0x5e, 0x7b, 0xec, 0x3b, 0xb4, 0x8f, 0xd0, 0x43, 0x9f, 0xa0, 0xd7, 0x5e, 0x8a, 0x3e,
+	0x41, 0x8f, 0x7d, 0x87, 0x82, 0xbb, 0xa4, 0x2c, 0xc9, 0x4e, 0x60, 0x27, 0xe8, 0x8d, 0x3b, 0x3f,
+	0xdf, 0xcc, 0x37, 0x3b, 0x3b, 0x23, 0xc1, 0xf2, 0x88, 0xf9, 0x22, 0xf0, 0xb9, 0xa8, 0x0d, 0xe2,
+	0x48, 0x44, 0xe4, 0x16, 0x7e, 0x2f, 0x6a, 0x7d, 0x36, 0xe0, 0xb5, 0x17, 0x51, 0xf4, 0xca, 0x0f,
+	0x8f, 0x6a, 0x03, 0x16, 0x8b, 0x10, 0xe3, 0xda, 0xf1, 0xbd, 0x5a, 0x66, 0x6b, 0xfc, 0x00, 0x9b,
+	0x3b, 0x4c, 0xb8, 0xbd, 0x47, 0x28, 0x0e, 0x99, 0x2f, 0x4c, 0x2e, 0xfc, 0x3e, 0x13, 0xc8, 0x6d,
+	0xfc, 0x6e, 0x88, 0x5c, 0x90, 0x9b, 0x50, 0xea, 0x63, 0xec, 0xf6, 0x58, 0x28, 0xa8, 0xef, 0x55,
+	0xb5, 0x2d, 0xed, 0xf6, 0x82, 0x0d, 0x99, 0xc8, 0xf2, 0xc8, 0x0d, 0x00, 0x8e, 0xf1, 0xb1, 0xef,
+	0x62, 0xa2, 0xcf, 0x49, 0xfd, 0x42, 0x2a, 0x51, 0xea, 0x24, 0xec, 0x09, 0xe5, 0xfe, 0x6b, 0xac,
+	0xe6, 0xb7, 0xf2, 0xb7, 0x0b, 0xf6, 0x82, 0x94, 0x38, 0xfe, 0x6b, 0x34, 0xfe, 0xd6, 0xe0, 0xc6,
+	0x1b, 0xe2, 0xf3, 0x41, 0x14, 0x72, 0x24, 0x5f, 0xc3, 0x4a, 0x96, 0x2c, 0xe5, 0x82, 0x89, 0x21,
+	0x97, 0x49, 0x2c, 0x6f, 0x7f, 0x5a, 0xbb, 0x08, 0xc1, 0xda, 0x61, 0xfa, 0xe1, 0x48, 0x5f, 0x7b,
+	0x5c, 0x25, 0x75, 0x26, 0x87, 0xb0, 0x94, 0x48, 0x28, 0xa6, 0x81, 0xab, 0xb9, 0xad, 0xfc, 0xed,
+	0xd2, 0xf6, 0xf6, 0xc5, 0xc1, 0xb3, 0x94, 0xed, 0xc5, 0xd1, 0xc4, 0xc9, 0x78, 0x0e, 0xd7, 0xb2,
+	0x6f, 0xcf, 0x41, 0x26, 0xba, 0x7e, 0x1f, 0x6d, 0x16, 0x1e, 0x21, 0xf9, 0x10, 0x96, 0xb8, 0x60,
+	0xb1, 0xa0, 0x1c, 0xdd, 0x28, 0xf4, 0x14, 0x9f, 0xbc, 0xbd, 0x28, 0x85, 0x8e, 0x92, 0x25, 0x75,
+	0xc7, 0xd0, 0x1b, 0x9b, 0xe4, 0xa4, 0x09, 0x60, 0xe8, 0xa5, 0x06, 0xc6, 0x6f, 0x1a, 0x40, 0x12,
+	0xbe, 0x85, 0xe1, 0x91, 0xe8, 0x91, 0x1a, 0xac, 0x26, 0x09, 0xfa, 0xc8, 0x29, 0xeb, 0x21, 0xf3,
+	0xa8, 0x1b, 0x0d, 0x43, 0x21, 0xa1, 0x0b, 0x76, 0x39, 0x55, 0xd5, 0x13, 0x4d, 0x23, 0x51, 0x90,
+	0x11, 0x5c, 0xcf, 0x28, 0x27, 0x51, 0x98, 0xa0, 0xc2, 0xef, 0x23, 0x8d, 0x93, 0x0c, 0x65, 0xb4,
+	0xd2, 0xf6, 0x83, 0x8b, 0xd5, 0xe0, 0x7c, 0x96, 0xf6, 0x35, 0x3c, 0x57, 0x6e, 0xfc, 0xa8, 0xc1,
+	0xe2, 0x64, 0xd9, 0x66, 0x3a, 0x44, 0x25, 0x7c, 0xda, 0x21, 0xe4, 0x2b, 0x28, 0xc9, 0x0b, 0x0a,
+	0x24, 0xcf, 0x34, 0xb5, 0xbb, 0x17, 0xbf, 0x1e, 0x55, 0x1f, 0x1b, 0x46, 0xe3, 0x6f, 0xe3, 0xf7,
+	0x1c, 0xac, 0x37, 0x62, 0x64, 0x02, 0xb3, 0xe6, 0x30, 0x43, 0x11, 0x9f, 0xfc, 0x5f, 0x2d, 0x3f,
+	0x43, 0xe8, 0x1b, 0xd0, 0x87, 0x1c, 0x63, 0xea, 0x87, 0x2f, 0xa3, 0xb8, 0xcf, 0x84, 0x1f, 0x85,
+	0xd5, 0x39, 0xc9, 0xea, 0xfe, 0xc5, 0x58, 0x1d, 0x70, 0x8c, 0xad, 0x53, 0x67, 0x7b, 0x65, 0x38,
+	0x2d, 0x20, 0x9f, 0x00, 0x61, 0x9e, 0xe7, 0x27, 0xdf, 0x2c, 0xa0, 0xb1, 0xa2, 0x55, 0x2d, 0xc8,
+	0x3c, 0xcb, 0xa7, 0x9a, 0x8c, 0xef, 0xc7, 0x50, 0xf6, 0x3d, 0xec, 0x0f, 0x22, 0x81, 0xa1, 0x7b,
+	0x42, 0x45, 0xf4, 0x0a, 0xc3, 0x6a, 0x51, 0x5a, 0xeb, 0x13, 0x8a, 0x6e, 0x22, 0x37, 0xfe, 0xd2,
+	0x60, 0xe3, 0xdc, 0xda, 0xa5, 0xcf, 0xf5, 0x0e, 0x94, 0xc7, 0xcf, 0x15, 0x13, 0xcd, 0x69, 0x09,
+	0xc7, 0xef, 0x58, 0x7a, 0x58, 0x1e, 0xf9, 0x49, 0x83, 0x9b, 0x63, 0xe3, 0x17, 0x43, 0xee, 0x87,
+	0xc8, 0x39, 0x0d, 0xa2, 0x23, 0xdf, 0xa5, 0x2f, 0x99, 0x1f, 0x0c, 0xe3, 0xac, 0x15, 0x77, 0x2e,
+	0xf7, 0xd6, 0x77, 0x52, 0xac, 0x56, 0x02, 0xf5, 0x50, 0x21, 0xd9, 0x9b, 0xa3, 0xb7, 0x68, 0x0d,
+	0x13, 0x2a, 0xe9, 0x08, 0x3a, 0xd3, 0x0f, 0x97, 0xa0, 0x64, 0x1c, 0x43, 0xf5, 0x2c, 0x4c, 0x5a,
+	0x9a, 0x67, 0xa7, 0x23, 0x5a, 0xe1, 0x48, 0x90, 0xd2, 0xf6, 0xbd, 0xcb, 0x91, 0x53, 0xa0, 0x4b,
+	0x53, 0x91, 0x8d, 0x5d, 0x58, 0x6f, 0x62, 0x80, 0x6f, 0xe8, 0xe8, 0xcb, 0x30, 0xf8, 0x27, 0x07,
+	0x95, 0x29, 0x90, 0x64, 0x50, 0x62, 0xf2, 0x7e, 0x39, 0xb9, 0x0b, 0x6b, 0xae, 0xbc, 0x7b, 0x4f,
+	0x4d, 0x8b, 0xe9, 0x01, 0x46, 0x52, 0x5d, 0x62, 0x9b, 0x8d, 0xb1, 0x6d, 0xb8, 0xea, 0xb2, 0xd0,
+	0xc5, 0x60, 0xd6, 0x45, 0x0d, 0xb4, 0xd5, 0x4c, 0x39, 0xe9, 0xf3, 0x05, 0x6c, 0x66, 0xcf, 0x2b,
+	0x46, 0xe6, 0xf9, 0xb3, 0xae, 0x79, 0xe9, 0x7a, 0x3d, 0xb5, 0xb1, 0x95, 0xc9, 0x24, 0xc0, 0x7d,
+	0xa8, 0xb8, 0x3d, 0x74, 0x5f, 0xa1, 0x47, 0xfd, 0x70, 0xda, 0x77, 0x4e, 0xfa, 0xae, 0xa5, 0x6a,
+	0x2b, 0x9c, 0x74, 0xab, 0xc1, 0x2a, 0x3f, 0x87, 0x5c, 0x41, 0xba, 0x94, 0xf9, 0x19, 0x6e, 0x0f,
+	0x60, 0xa3, 0xcf, 0xe2, 0x24, 0x4a, 0x18, 0x51, 0xde, 0x8b, 0x46, 0xd3, 0x7e, 0x45, 0xe9, 0x57,
+	0x51, 0x26, 0xed, 0xc8, 0xe9, 0x45, 0xa3, 0x09, 0x6f, 0xe3, 0xcf, 0x1c, 0x2c, 0x4d, 0xd5, 0x99,
+	0x7c, 0x0b, 0x6b, 0x33, 0xb7, 0x94, 0xec, 0x3b, 0x4c, 0xd7, 0xdd, 0x67, 0xef, 0xd0, 0x25, 0xf2,
+	0xea, 0x6c, 0x32, 0x3a, 0x23, 0x23, 0xaf, 0x61, 0xfd, 0xbc, 0x58, 0x92, 0x01, 0x4f, 0x1f, 0xdd,
+	0xe7, 0xef, 0x1a, 0x51, 0x36, 0x8b, 0x5d, 0x19, 0xbd, 0xa1, 0x8b, 0xce, 0xac, 0xdc, 0xbc, 0x0c,
+	0xf7, 0xfe, 0x2b, 0xf7, 0x8f, 0x1c, 0x6c, 0xbe, 0x6d, 0x04, 0x90, 0xe7, 0x50, 0x70, 0xd9, 0x90,
+	0x67, 0x25, 0xdd, 0x7d, 0xff, 0xa9, 0x52, 0x6b, 0x24, 0x78, 0xb6, 0x82, 0x25, 0x5b, 0x50, 0xf2,
+	0x90, 0xbb, 0xb1, 0x3f, 0x90, 0x53, 0x5d, 0x6d, 0x86, 0x49, 0x91, 0xf1, 0x8b, 0x06, 0x05, 0xe9,
+	0x42, 0xae, 0x42, 0xb9, 0x51, 0x3f, 0x70, 0x4c, 0x7a, 0xd0, 0x76, 0xf6, 0xcd, 0x86, 0xf5, 0xd0,
+	0x32, 0x9b, 0xfa, 0x07, 0x64, 0x03, 0x2a, 0xe6, 0x13, 0xcb, 0xe9, 0x5a, 0xed, 0x47, 0xf4, 0xb0,
+	0x6e, 0x75, 0x5b, 0x96, 0xd3, 0xa5, 0x66, 0xbb, 0x6b, 0x3f, 0xd5, 0x35, 0x52, 0x85, 0xb5, 0x1d,
+	0xb3, 0xd5, 0x39, 0xa4, 0x7b, 0x56, 0x9b, 0xee, 0xd7, 0xed, 0xee, 0x53, 0xea, 0x58, 0xcf, 0x4c,
+	0x3d, 0x97, 0x68, 0xea, 0x3b, 0x9d, 0xc7, 0x26, 0xdd, 0xab, 0x3f, 0x99, 0xd4, 0xe4, 0xc9, 0x2a,
+	0xac, 0xec, 0x99, 0x76, 0x63, 0xb7, 0xde, 0xee, 0xd2, 0x46, 0xab, 0xe3, 0x98, 0x4d, 0x7d, 0x8e,
+	0x94, 0x60, 0xbe, 0xdd, 0x91, 0xf8, 0x7a, 0x81, 0x94, 0x61, 0x69, 0x1c, 0xe9, 0xe1, 0x41, 0xab,
+	0xa5, 0x17, 0x8d, 0x7f, 0x35, 0x58, 0x99, 0x59, 0x33, 0xa4, 0x02, 0xf3, 0x6a, 0x6f, 0x65, 0xa3,
+	0xa3, 0x28, 0xf7, 0x8e, 0xdc, 0x77, 0x47, 0xfe, 0x31, 0x86, 0x34, 0x64, 0x7d, 0xcc, 0xd6, 0xa1,
+	0x94, 0xb4, 0x59, 0x1f, 0x93, 0x75, 0xfa, 0x92, 0xf5, 0xfd, 0xe0, 0x44, 0xe9, 0xf3, 0x6a, 0x9d,
+	0x2a, 0x91, 0x34, 0xd8, 0x83, 0x79, 0xe6, 0x79, 0x31, 0x72, 0x9e, 0xee, 0xc1, 0x0b, 0x0e, 0xc4,
+	0xfd, 0x88, 0x0b, 0x16, 0xd4, 0x95, 0xab, 0x9d, 0x61, 0x90, 0x4d, 0x58, 0x10, 0x18, 0xe0, 0xa0,
+	0x17, 0x85, 0x98, 0x2e, 0xbd, 0x53, 0x01, 0x59, 0x83, 0x02, 0xf6, 0x99, 0x1f, 0xa4, 0x0b, 0x4e,
+	0x1d, 0x8c, 0x5f, 0x35, 0x58, 0x9a, 0x82, 0x23, 0x55, 0x98, 0x97, 0xbf, 0xa0, 0xd2, 0x29, 0xbd,
+	0x60, 0x67, 0x47, 0xb2, 0x0e, 0x57, 0x82, 0xc8, 0x65, 0x81, 0x2f, 0x4e, 0x52, 0xb2, 0xe3, 0x33,
+	0xb9, 0x06, 0xc5, 0x18, 0x8f, 0x92, 0xbb, 0x57, 0x34, 0xd3, 0x53, 0x52, 0x83, 0x81, 0x84, 0xa7,
+	0x6e, 0xe4, 0xa1, 0xa4, 0xb9, 0x60, 0x83, 0x12, 0x35, 0x22, 0x0f, 0xc9, 0x47, 0xb0, 0xcc, 0x45,
+	0x8c, 0x28, 0x68, 0x56, 0x0a, 0x95, 0xf9, 0x92, 0x92, 0xa6, 0x59, 0xdd, 0x61, 0xb0, 0x3c, 0xfd,
+	0x7b, 0x96, 0xdc, 0x84, 0x8d, 0xf1, 0xe5, 0x39, 0xdd, 0x7a, 0xf7, 0xc0, 0x99, 0x69, 0xa8, 0x2b,
+	0x30, 0xd7, 0xd9, 0x37, 0xdb, 0xba, 0x46, 0x08, 0x2c, 0xab, 0x06, 0xa0, 0xd9, 0xdd, 0xe7, 0x88,
+	0x0e, 0x8b, 0xa9, 0xac, 0xd3, 0xdd, 0x35, 0x6d, 0x3d, 0x7f, 0xe7, 0x67, 0x0d, 0xc8, 0xd9, 0x27,
+	0x4d, 0x6e, 0xc1, 0xd6, 0x74, 0x3b, 0xca, 0x68, 0xb3, 0xdd, 0x5b, 0x82, 0xf9, 0xc4, 0xca, 0x6a,
+	0x3f, 0xd2, 0x35, 0xb2, 0x08, 0x57, 0x1a, 0xf5, 0x76, 0xc3, 0x6c, 0x99, 0x4d, 0x3d, 0x97, 0x74,
+	0x99, 0x63, 0xda, 0x8f, 0xad, 0x86, 0x49, 0x6d, 0xb3, 0xde, 0x7c, 0xaa, 0xe7, 0xc9, 0x32, 0x40,
+	0x63, 0xd7, 0x6c, 0x7c, 0x69, 0x36, 0xa9, 0xd5, 0xd6, 0xe7, 0x08, 0x40, 0xd1, 0x31, 0xeb, 0x5d,
+	0xb3, 0xa9, 0x17, 0xd2, 0x0e, 0x75, 0x76, 0x3b, 0x87, 0x7a, 0xf1, 0x45, 0x51, 0xfe, 0xa3, 0xb9,
+	0xf7, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1b, 0x7a, 0x92, 0x6d, 0xe3, 0x0c, 0x00, 0x00,
+}