From 2ce321b9cdc3cd6db21b70ddb2a864dbcce866e6 Mon Sep 17 00:00:00 2001 From: Samuel Cedarbaum Date: Thu, 19 Sep 2024 02:06:35 -0400 Subject: [PATCH] Surface alerts from trip informed entities --- api/public.proto | 37 +- db/queries/alert_queries.sql | 24 +- .../011_alert_trip_informed_entity_update.sql | 11 + docs/src/api/public_resources.md | 1 + internal/gen/api/public.pb.go | 1151 +++++++++-------- internal/gen/db/alert_queries.sql.go | 82 +- internal/gen/db/models.go | 4 + internal/gen/db/querier.go | 1 + internal/public/endpoints/trip.go | 31 + internal/update/realtime/realtime.go | 59 +- internal/update/realtime/realtime_test.go | 142 ++ tests/endtoend/client.py | 11 + tests/endtoend/test_alerts.py | 27 +- tests/endtoend/test_trips.py | 1 + 14 files changed, 988 insertions(+), 594 deletions(-) create mode 100644 db/schema/011_alert_trip_informed_entity_update.sql diff --git a/api/public.proto b/api/public.proto index 5c72f580..f13fc6a8 100644 --- a/api/public.proto +++ b/api/public.proto @@ -2,11 +2,11 @@ The public API is Transiter's main API and is used to query transit data from Transiter. It's a read-only API and designed to be reachable from the internet. - + Transiter's other API is the private [admin API](admin.md) which is used to manage the Transiter deployment. The public API is based on the following resource hierarchy: - + ``` System |- Agency @@ -19,23 +19,23 @@ |- Transfer |- Vehicle ``` - + For each resource there is a protobuf message type, a list endpoint, and a get endpoint. In the HTTP API, the structure of the response is based on the protobuf message type. - + The URLs in the HTTP API are determined by the resource hierarchy; thus: - + - List all systems has URL `/systems`, - Get system with ID `` has URL `/systems/`, - List all routes in the system has URL `/systems//routes`, - Get route has URL `/systems//routes/`, - + and so on. - + The following table summarizes all of the resources and their types. The right-most column describes the _source_ of the resource. The public API is a read-only API so all of the resources come from somewhere else. - + | Resource | List endpoint | Get endpoint | Source | | --------------------- | --------------------------------------------------- | ----------------------------------------------- |----------------------| | [Agency](#agency) | [ListAgencies](public_endpoints.md#list-agencies) | [GetAgency](public_endpoints.md#get-agency) | GTFS static | @@ -48,7 +48,7 @@ | [Transfer](#transfer) | [ListTransfers](public_endpoints.md#list-transfers) | [GetTransfer](public_endpoints.md#get-transfer) | GTFS static | | [Trip](#trip) | [ListTrips](public_endpoints.md#list-trips) | [GetTrip](public_endpoints.md#get-trip) | GTFS realtime | | [Vehicle](#vehicle) | [ListVehicles](public_endpoints.md#list-vehicles) | [GetVehicle](public_endpoints.md#get-vehicle) | GTFS realtime | - + Many resources refer to other resources across the hierarchy. For example, each route has an agency it is attached to. Each stop has a list of service maps, and each service map contains a set of routes. @@ -59,7 +59,7 @@ However they also contain additional information that is considered generally useful. For example, the [Stop.Reference](#stopreference) message contains the stop's name. What counts as "considered generally" is obviously subjective and open to change. - + */ syntax = "proto3"; @@ -274,7 +274,7 @@ message EntrypointReply { // Message containing version information about a Transiter binary. message TransiterDetails { reserved 2; - + // The version of the Transiter binary this instance is running. string version = 1; // URL of the Transiter GitHub repository. @@ -283,7 +283,7 @@ message EntrypointReply { // Message containing information about a specific Transiter CI build. message Build { reserved 7; - + // The GitHub build number. string number = 3; // Time the binary was built, in the form of a human readable string. @@ -377,7 +377,7 @@ message ListStopsRequest { // If true, only return stops whose types are specified in the repeated `type` field. bool filter_by_type = 16; - // Types to filter by if `filter_by_type` is set to true. + // Types to filter by if `filter_by_type` is set to true. // It is an error to populate this field if `filter_by_id` is false. repeated Stop.Type type = 17; @@ -988,6 +988,13 @@ message Trip { // Shape of the trip. optional Shape.Reference shape = 8; + // Active alerts for this trip. + // + // These are determined using the `informed_entity` field in + // the [GTFS realtime alerts + // message](https://gtfs.org/realtime/feed-entities/service-alerts/#service-alerts). + repeated Alert.Reference alerts = 9; + // Reference type for the trip resource. message Reference { // Same as the parent message. @@ -1236,10 +1243,10 @@ message Feed { // Unix milliseconds timestamp of when the last successful update of this feed finished. optional int64 last_successful_update_ms = 5; - + // Unix milliseconds timestamp of when the last skipped update of this feed finished. optional int64 last_skipped_update_ms = 6; - + // Unix milliseconds timestamp of when the last failed update of this feed finished. optional int64 last_failed_update_ms = 7; diff --git a/db/queries/alert_queries.sql b/db/queries/alert_queries.sql index 8b445a6c..286c5c92 100644 --- a/db/queries/alert_queries.sql +++ b/db/queries/alert_queries.sql @@ -27,7 +27,7 @@ INSERT INTO alert_stop (alert_pk, stop_pk) VALUES (sqlc.arg(alert_pk), sqlc.arg( INSERT INTO alert_route (alert_pk, route_pk) VALUES (sqlc.arg(alert_pk), sqlc.arg(route_pk)); -- name: InsertAlertTrip :exec -INSERT INTO alert_trip (alert_pk, trip_pk, scheduled_trip_pk) VALUES (sqlc.arg(alert_pk), sqlc.narg(trip_pk), sqlc.narg(scheduled_trip_pk)); +INSERT INTO alert_trip (alert_pk, trip_pk, scheduled_trip_pk, route_pk, direction_id, start_date, start_time) VALUES (sqlc.arg(alert_pk), sqlc.narg(trip_pk), sqlc.narg(scheduled_trip_pk), sqlc.narg(route_pk), sqlc.narg(direction_id), sqlc.narg(start_date), sqlc.narg(start_time)); -- name: InsertAlertRouteType :exec INSERT INTO alert_route_type (alert_pk, route_type) VALUES (sqlc.arg(alert_pk), sqlc.arg(route_type)); @@ -114,6 +114,26 @@ WHERE stop.pk = ANY(sqlc.arg(stop_pks)::bigint[]) ) ORDER BY alert.id ASC; +-- name: ListActiveAlertsForTrips :many +SELECT trip.pk trip_pk, alert.pk, alert.id, alert.cause, alert.effect, alert_active_period.starts_at, alert_active_period.ends_at +FROM trip + -- TODO (1): Trip start needs to be considered when matching trips to alerts to disambigute trips that run over multiple days. + -- TODO (2): Frequency based trips are not correctly handled here. + INNER JOIN alert_trip ON alert_trip.trip_pk = trip.pk OR + (alert_trip.trip_pk IS NULL AND alert_trip.route_pk = trip.route_pk AND (alert_trip.direction_id IS NULL OR alert_trip.direction_id = trip.direction_id)) + INNER JOIN alert ON alert_trip.alert_pk = alert.pk + INNER JOIN alert_active_period ON alert_active_period.alert_pk = alert.pk +WHERE trip.pk = ANY(sqlc.arg(trip_pks)::bigint[]) + AND ( + alert_active_period.starts_at < sqlc.arg(present_time) + OR alert_active_period.starts_at IS NULL + ) + AND ( + alert_active_period.ends_at > sqlc.arg(present_time) + OR alert_active_period.ends_at IS NULL + ) +ORDER BY alert.id ASC; + -- name: ListAlertsWithActivePeriodsAndAllInformedEntities :many SELECT alert.id, alert.cause, @@ -154,7 +174,7 @@ FROM alert LEFT JOIN alert_stop ON alert.pk = alert_stop.alert_pk LEFT JOIN stop ON alert_stop.stop_pk = stop.pk LEFT JOIN alert_trip ON alert.pk = alert_trip.alert_pk - LEFT JOIN trip ON alert_trip.trip_pk = trip.pk + LEFT JOIN trip ON alert_trip.trip_pk = trip.pk OR (alert_trip.trip_pk IS NULL AND alert_trip.route_pk = trip.route_pk AND (alert_trip.direction_id IS NULL OR alert_trip.direction_id = trip.direction_id)) LEFT JOIN scheduled_trip ON alert_trip.scheduled_trip_pk = scheduled_trip.pk LEFT JOIN alert_route_type ON alert.pk = alert_route_type.alert_pk WHERE alert.system_pk = sqlc.arg(system_pk) diff --git a/db/schema/011_alert_trip_informed_entity_update.sql b/db/schema/011_alert_trip_informed_entity_update.sql new file mode 100644 index 00000000..b1014bbd --- /dev/null +++ b/db/schema/011_alert_trip_informed_entity_update.sql @@ -0,0 +1,11 @@ +ALTER TABLE alert_trip +ADD COLUMN route_pk BIGINT REFERENCES route(pk) ON DELETE SET NULL; + +ALTER TABLE alert_trip +ADD COLUMN direction_id boolean; + +ALTER TABLE alert_trip +ADD COLUMN start_date timestamp with time zone; + +ALTER TABLE alert_trip +ADD COLUMN start_time int; diff --git a/docs/src/api/public_resources.md b/docs/src/api/public_resources.md index cf50627f..328d3312 100644 --- a/docs/src/api/public_resources.md +++ b/docs/src/api/public_resources.md @@ -810,6 +810,7 @@ specification](https://gtfs.org/realtime/reference/#message-tripupdate). | direction_id | bool | Direction ID of the trip. | stop_times | [StopTime](public_resources.md#stoptime) | Stop times of the trip. | shape | [Shape.Reference](public_resources.md#shapereference) | Shape of the trip. +| alerts | [Alert.Reference](public_resources.md#alertreference) | Active alerts for this trip.

These are determined using the `informed_entity` field in the [GTFS realtime alerts message](https://gtfs.org/realtime/feed-entities/service-alerts/#service-alerts). diff --git a/internal/gen/api/public.pb.go b/internal/gen/api/public.pb.go index 93a34c54..2b4737be 100644 --- a/internal/gen/api/public.pb.go +++ b/internal/gen/api/public.pb.go @@ -3626,6 +3626,12 @@ type Trip struct { StopTimes []*StopTime `protobuf:"bytes,7,rep,name=stop_times,json=stopTimes,proto3" json:"stop_times,omitempty"` // Shape of the trip. Shape *Shape_Reference `protobuf:"bytes,8,opt,name=shape,proto3,oneof" json:"shape,omitempty"` + // Active alerts for this trip. + // + // These are determined using the `informed_entity` field in + // the [GTFS realtime alerts + // message](https://gtfs.org/realtime/feed-entities/service-alerts/#service-alerts). + Alerts []*Alert_Reference `protobuf:"bytes,9,rep,name=alerts,proto3" json:"alerts,omitempty"` } func (x *Trip) Reset() { @@ -3716,6 +3722,13 @@ func (x *Trip) GetShape() *Shape_Reference { return nil } +func (x *Trip) GetAlerts() []*Alert_Reference { + if x != nil { + return x.Alerts + } + return nil +} + // The Vehicle resource. // // This resource corresponds to the [vehicle position type in the GTFS static @@ -6412,7 +6425,7 @@ var file_api_public_proto_rawDesc = []byte{ 0x06, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x6e, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x79, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x69, 0x67, 0x6e, - 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x22, 0xe5, 0x04, 0x0a, 0x04, 0x54, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x22, 0x8f, 0x05, 0x0a, 0x04, 0x54, 0x72, 0x69, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, @@ -6432,488 +6445,491 @@ var file_api_public_proto_rawDesc = []byte{ 0x70, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x53, 0x68, 0x61, 0x70, 0x65, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x02, 0x52, 0x05, 0x73, 0x68, 0x61, 0x70, 0x65, - 0x88, 0x01, 0x01, 0x1a, 0x87, 0x02, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x1a, 0x87, 0x02, + 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x35, 0x0a, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x07, 0x76, 0x65, + 0x68, 0x69, 0x63, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63, + 0x6c, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x22, 0xd1, 0x09, 0x0a, + 0x07, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x72, 0x69, 0x70, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x2e, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x04, 0x74, 0x72, 0x69, 0x70, 0x88, + 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, + 0x75, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, + 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6f, 0x64, 0x6f, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x04, 0x52, 0x08, 0x6f, 0x64, 0x6f, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, + 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x04, 0x73, + 0x74, 0x6f, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x07, 0x52, 0x04, 0x73, 0x74, + 0x6f, 0x70, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x08, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x48, 0x09, 0x52, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, + 0x10, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, + 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x12, 0x48, 0x0a, 0x10, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x56, + 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x4f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x0a, 0x52, 0x0f, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, + 0x6e, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x14, + 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0b, 0x52, 0x13, 0x6f, 0x63, + 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x88, 0x01, 0x01, 0x1a, 0x42, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x12, 0x35, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, - 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, - 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x02, 0x18, 0x01, - 0x48, 0x00, 0x52, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x68, 0x61, - 0x70, 0x65, 0x22, 0xd1, 0x09, 0x0a, 0x07, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, - 0x0a, 0x04, 0x74, 0x72, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x54, - 0x72, 0x69, 0x70, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, - 0x04, 0x74, 0x72, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, - 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x08, 0x6c, 0x61, - 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, - 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, 0x09, - 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, - 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, - 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6f, - 0x64, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x04, 0x52, - 0x08, 0x6f, 0x64, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, - 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x05, 0x73, - 0x70, 0x65, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, - 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x28, 0x0a, 0x04, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x48, 0x07, 0x52, 0x04, 0x73, 0x74, 0x6f, 0x70, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x0e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x08, 0x52, 0x0d, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x22, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x09, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, - 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x48, 0x0a, 0x10, 0x6f, 0x63, 0x63, 0x75, - 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x4f, 0x63, 0x63, - 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x0a, 0x52, 0x0f, - 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x36, 0x0a, 0x14, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x0b, 0x52, 0x13, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x42, 0x0a, 0x09, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x43, - 0x0a, 0x0d, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x54, 0x10, 0x00, - 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x01, - 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x49, 0x54, 0x5f, 0x54, - 0x4f, 0x10, 0x02, 0x22, 0x7d, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, - 0x45, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x5f, - 0x53, 0x4d, 0x4f, 0x4f, 0x54, 0x48, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, - 0x4f, 0x50, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x47, 0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x43, - 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x53, - 0x45, 0x56, 0x45, 0x52, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x04, 0x22, 0xaf, 0x01, 0x0a, 0x0f, 0x4f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, - 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x54, 0x53, 0x5f, - 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x46, - 0x45, 0x57, 0x5f, 0x53, 0x45, 0x41, 0x54, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, - 0x4c, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x49, 0x4e, 0x47, - 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, - 0x43, 0x52, 0x55, 0x53, 0x48, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x49, 0x4e, 0x47, - 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, - 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x43, - 0x43, 0x45, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x45, 0x4e, 0x47, 0x45, - 0x52, 0x53, 0x10, 0x06, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x72, 0x69, 0x70, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, - 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6f, 0x64, 0x6f, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, - 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, - 0x05, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6f, 0x63, 0x63, - 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x17, 0x0a, - 0x15, 0x5f, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0xe4, 0x09, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x0a, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x6c, 0x6f, 0x6e, - 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x1d, - 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x25, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x03, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x73, - 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x04, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, - 0x44, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x5f, 0x70, 0x69, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x50, - 0x69, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x47, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, - 0x6f, 0x75, 0x73, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x69, - 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, - 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x44, 0x72, 0x6f, 0x70, 0x4f, 0x66, 0x66, 0x12, 0x1f, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x29, 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x28, 0x0a, 0x06, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x41, 0x6c, 0x65, - 0x72, 0x74, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x11, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x77, 0x61, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x05, 0x52, 0x10, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, - 0x77, 0x61, 0x79, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x52, - 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x73, 0x1a, 0x50, 0x0a, 0x0a, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x70, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x70, 0x73, 0x1a, 0x83, - 0x01, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x5e, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, - 0x75, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4c, 0x4c, 0x4f, - 0x57, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, - 0x4f, 0x57, 0x45, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x5f, - 0x41, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4f, 0x52, - 0x44, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x44, 0x52, 0x49, 0x56, - 0x45, 0x52, 0x10, 0x03, 0x22, 0x9c, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, - 0x0a, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x52, 0x41, 0x49, 0x4c, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x55, 0x42, 0x57, 0x41, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x41, 0x49, - 0x4c, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x42, 0x55, 0x53, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, - 0x46, 0x45, 0x52, 0x52, 0x59, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x41, 0x42, 0x4c, 0x45, - 0x5f, 0x54, 0x52, 0x41, 0x4d, 0x10, 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x52, 0x49, 0x41, - 0x4c, 0x5f, 0x4c, 0x49, 0x46, 0x54, 0x10, 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x55, 0x4e, 0x49, - 0x43, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x52, 0x4f, 0x4c, 0x4c, - 0x45, 0x59, 0x5f, 0x42, 0x55, 0x53, 0x10, 0x0b, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x4f, 0x4e, 0x4f, - 0x52, 0x41, 0x49, 0x4c, 0x10, 0x0c, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x6f, 0x72, - 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x65, 0x73, 0x74, 0x69, - 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x77, 0x61, 0x79, 0x22, 0x9a, 0x04, - 0x0a, 0x04, 0x46, 0x65, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x43, 0x0a, 0x0d, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x43, + 0x4f, 0x4d, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, + 0x4f, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x4e, + 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x49, 0x54, 0x5f, 0x54, 0x4f, 0x10, 0x02, 0x22, 0x7d, 0x0a, + 0x0f, 0x43, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x47, + 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x10, 0x00, 0x12, 0x14, + 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4d, 0x4f, 0x4f, 0x54, 0x48, + 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x4e, 0x44, + 0x5f, 0x47, 0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x45, 0x56, 0x45, 0x52, 0x45, 0x5f, + 0x43, 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x22, 0xaf, 0x01, 0x0a, + 0x0f, 0x4f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4d, + 0x41, 0x4e, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x54, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, + 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x45, 0x57, 0x5f, 0x53, 0x45, 0x41, + 0x54, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x16, + 0x0a, 0x12, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x5f, + 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x52, 0x55, 0x53, 0x48, 0x45, + 0x44, 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x5f, + 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x05, + 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4e, + 0x47, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x45, 0x4e, 0x47, 0x45, 0x52, 0x53, 0x10, 0x06, 0x42, 0x07, + 0x0a, 0x05, 0x5f, 0x74, 0x72, 0x69, 0x70, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, + 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x6f, 0x64, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x5f, + 0x73, 0x70, 0x65, 0x65, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x74, 0x6f, 0x70, + 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6f, 0x63, 0x63, 0x75, + 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x22, 0xe4, 0x09, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x0a, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x20, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x6c, 0x6f, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, + 0x78, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x15, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x09, 0x73, 0x6f, 0x72, + 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, 0x11, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x5f, 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x10, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x50, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x12, + 0x47, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x5f, 0x64, 0x72, + 0x6f, 0x70, 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, + 0x73, 0x44, 0x72, 0x6f, 0x70, 0x4f, 0x66, 0x66, 0x12, 0x1f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x61, 0x67, 0x65, + 0x6e, 0x63, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x41, 0x67, 0x65, 0x6e, + 0x63, 0x79, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x61, 0x67, + 0x65, 0x6e, 0x63, 0x79, 0x12, 0x28, 0x0a, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x18, 0x0f, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x30, + 0x0a, 0x11, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x77, 0x61, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x10, 0x65, 0x73, 0x74, + 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x77, 0x61, 0x79, 0x88, 0x01, 0x01, + 0x12, 0x34, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x73, + 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x4d, 0x61, 0x70, 0x73, 0x1a, 0x50, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x4d, 0x61, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, + 0x64, 0x12, 0x25, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x70, 0x73, 0x1a, 0x83, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x48, 0x00, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x19, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6b, 0x69, 0x70, - 0x70, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x70, - 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, - 0x15, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, - 0x6c, 0x61, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4d, 0x73, 0x88, 0x01, 0x01, 0x1a, 0x6d, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, - 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, - 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x22, 0xa9, 0x04, 0x0a, 0x06, 0x41, - 0x67, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, - 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x08, 0x6c, 0x61, 0x6e, - 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6c, - 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x70, 0x68, - 0x6f, 0x6e, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x70, 0x68, 0x6f, - 0x6e, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x66, 0x61, 0x72, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x07, 0x66, 0x61, 0x72, 0x65, 0x55, - 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x88, 0x01, 0x01, - 0x12, 0x28, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x06, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x41, 0x6c, 0x65, - 0x72, 0x74, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x73, 0x1a, 0x81, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6c, 0x61, 0x6e, - 0x67, 0x75, 0x61, 0x67, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x42, - 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x61, 0x72, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x08, 0x0a, 0x06, - 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0xea, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, + 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x5e, + 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x43, 0x59, + 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x49, 0x4e, 0x41, 0x54, 0x45, + 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x44, 0x52, 0x49, 0x56, 0x45, 0x52, 0x10, 0x03, 0x22, 0x9c, + 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x49, 0x47, 0x48, 0x54, + 0x5f, 0x52, 0x41, 0x49, 0x4c, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x55, 0x42, 0x57, 0x41, + 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x12, 0x07, 0x0a, + 0x03, 0x42, 0x55, 0x53, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x45, 0x52, 0x52, 0x59, 0x10, + 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4d, 0x10, + 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x52, 0x49, 0x41, 0x4c, 0x5f, 0x4c, 0x49, 0x46, 0x54, + 0x10, 0x06, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x55, 0x4e, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x10, + 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x59, 0x5f, 0x42, 0x55, 0x53, + 0x10, 0x0b, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x4f, 0x4e, 0x4f, 0x52, 0x41, 0x49, 0x4c, 0x10, 0x0c, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x64, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x75, + 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x77, 0x61, 0x79, 0x22, 0x9a, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x0c, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, 0x52, - 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x45, - 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x4c, 0x0a, - 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x41, - 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x48, 0x00, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x12, 0x61, - 0x6c, 0x6c, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, 0x10, 0x61, 0x6c, - 0x6c, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x23, - 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x52, 0x06, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, - 0x2e, 0x54, 0x65, 0x78, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x52, 0x03, 0x75, 0x72, - 0x6c, 0x1a, 0x68, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x12, 0x20, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x41, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x06, 0x65, 0x6e, 0x64, 0x73, 0x41, 0x74, 0x88, 0x01, - 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x61, 0x74, 0x42, - 0x0a, 0x0a, 0x08, 0x5f, 0x65, 0x6e, 0x64, 0x73, 0x5f, 0x61, 0x74, 0x1a, 0x36, 0x0a, 0x04, 0x54, - 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x1a, 0xb8, 0x01, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, - 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, - 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x22, 0xd8, - 0x01, 0x0a, 0x05, 0x43, 0x61, 0x75, 0x73, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x41, 0x55, 0x53, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, - 0x54, 0x48, 0x45, 0x52, 0x5f, 0x43, 0x41, 0x55, 0x53, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, - 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x42, 0x4c, 0x45, - 0x4d, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4b, 0x45, 0x10, 0x04, 0x12, - 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x4d, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x43, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x10, 0x06, - 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x4f, 0x4c, 0x49, 0x44, 0x41, 0x59, 0x10, 0x07, 0x12, 0x0b, 0x0a, - 0x07, 0x57, 0x45, 0x41, 0x54, 0x48, 0x45, 0x52, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, - 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x43, - 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, - 0x0f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, - 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x45, 0x44, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x45, 0x4d, - 0x45, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x10, 0x0c, 0x22, 0xdd, 0x01, 0x0a, 0x06, 0x45, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, - 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x44, 0x55, - 0x43, 0x45, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, - 0x12, 0x53, 0x49, 0x47, 0x4e, 0x49, 0x46, 0x49, 0x43, 0x41, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, - 0x41, 0x59, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x54, 0x4f, 0x55, 0x52, 0x10, - 0x04, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x44, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x06, 0x12, - 0x10, 0x0a, 0x0c, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x10, - 0x07, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, - 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x10, 0x0a, - 0x12, 0x17, 0x0a, 0x13, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, - 0x59, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x10, 0x0b, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x22, 0xfe, 0x02, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x12, 0x2c, 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x53, 0x74, 0x6f, 0x70, - 0x12, 0x28, 0x0a, 0x07, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x06, 0x74, 0x6f, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x22, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2f, - 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x69, 0x6e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x22, - 0x47, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x43, 0x4f, 0x4d, - 0x4d, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x49, 0x4d, 0x45, - 0x44, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x53, 0x5f, - 0x54, 0x49, 0x4d, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x4f, - 0x53, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6d, 0x69, 0x6e, - 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4a, 0x04, - 0x08, 0x08, 0x10, 0x09, 0x22, 0xfc, 0x01, 0x0a, 0x05, 0x53, 0x68, 0x61, 0x70, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x29, - 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x53, 0x68, 0x61, 0x70, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x70, 0x65, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0x74, 0x0a, 0x0a, 0x53, 0x68, 0x61, - 0x70, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, - 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, - 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x12, 0x1f, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x88, - 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, - 0x42, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0c, 0x6c, 0x61, + 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, + 0x19, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x01, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, + 0x75, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, + 0x16, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, + 0x13, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x15, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x1a, + 0x6d, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x32, 0xc2, 0x0e, 0x0a, 0x06, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x3d, - 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x09, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x03, 0x12, 0x01, 0x2f, 0x12, 0x47, 0x0a, - 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x13, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x11, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x10, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x12, 0x11, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x07, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, - 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x5f, 0x0a, - 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x14, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, - 0x1d, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x5a, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x11, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x07, - 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, - 0x29, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, - 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x53, 0x0a, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x73, 0x12, 0x11, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, - 0x6f, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x74, 0x6f, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x73, 0x12, - 0x4f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x0f, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x05, 0x2e, 0x53, 0x74, - 0x6f, 0x70, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x57, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x12, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x10, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x06, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, - 0x65, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x69, 0x70, 0x73, 0x12, 0x11, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x72, 0x69, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x69, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x74, 0x72, 0x69, 0x70, 0x73, 0x12, 0x61, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x72, 0x69, - 0x70, 0x12, 0x0f, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x05, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x38, 0x12, 0x36, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x7b, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x72, 0x69, 0x70, 0x73, 0x2f, - 0x7b, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x57, 0x0a, 0x0a, 0x4c, 0x69, 0x73, - 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x12, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, - 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x23, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, - 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, - 0x74, 0x73, 0x12, 0x54, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x10, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x06, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, - 0x12, 0x26, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x7b, 0x61, - 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x63, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x15, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, + 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, + 0x73, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x42, + 0x19, 0x0a, 0x17, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x6d, 0x73, 0x22, 0xa9, 0x04, 0x0a, 0x06, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, + 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, + 0x6f, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x1e, 0x0a, 0x08, 0x66, 0x61, 0x72, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x07, 0x66, 0x61, 0x72, 0x65, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, + 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, + 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x06, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x18, 0x0c, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x1a, 0x81, + 0x01, 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x42, + 0x08, 0x0a, 0x06, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x61, + 0x72, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x22, 0xea, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x05, + 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x41, 0x6c, + 0x65, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x12, 0x25, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x0d, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x52, + 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x4c, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x48, 0x00, 0x52, 0x13, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, + 0x2e, 0x54, 0x65, 0x78, 0x74, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x2d, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x03, + 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x41, 0x6c, 0x65, 0x72, + 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0x68, 0x0a, 0x0c, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, + 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, + 0x07, 0x65, 0x6e, 0x64, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, + 0x52, 0x06, 0x65, 0x6e, 0x64, 0x73, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x5f, 0x61, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x65, 0x6e, + 0x64, 0x73, 0x5f, 0x61, 0x74, 0x1a, 0x36, 0x0a, 0x04, 0x54, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x1a, 0xb8, 0x01, + 0x0a, 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x22, 0x0a, + 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x41, + 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x12, 0x25, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0d, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x22, 0xd8, 0x01, 0x0a, 0x05, 0x43, 0x61, 0x75, + 0x73, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x41, + 0x55, 0x53, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x43, + 0x41, 0x55, 0x53, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, + 0x43, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x42, 0x4c, 0x45, 0x4d, 0x10, 0x03, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x54, 0x52, 0x49, 0x4b, 0x45, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x4d, + 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, + 0x41, 0x43, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x4f, + 0x4c, 0x49, 0x44, 0x41, 0x59, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x45, 0x41, 0x54, 0x48, + 0x45, 0x52, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, + 0x4e, 0x43, 0x45, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x55, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x4f, 0x4c, 0x49, 0x43, + 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, + 0x4d, 0x45, 0x44, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x45, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x4e, 0x43, + 0x59, 0x10, 0x0c, 0x22, 0xdd, 0x01, 0x0a, 0x06, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x12, + 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, + 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, + 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x44, 0x5f, 0x53, 0x45, + 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x49, 0x47, 0x4e, 0x49, + 0x46, 0x49, 0x43, 0x41, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x53, 0x10, 0x03, 0x12, + 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x54, 0x4f, 0x55, 0x52, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x41, + 0x44, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, + 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x54, 0x48, + 0x45, 0x52, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x10, 0x07, 0x12, 0x0e, 0x0a, 0x0a, 0x53, + 0x54, 0x4f, 0x50, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, + 0x4f, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x10, 0x0a, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x43, + 0x43, 0x45, 0x53, 0x53, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x49, 0x53, 0x53, 0x55, + 0x45, 0x10, 0x0b, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xfe, 0x02, + 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x2c, 0x0a, 0x09, + 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x28, 0x0a, 0x07, 0x74, 0x6f, + 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x53, 0x74, + 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x06, 0x74, 0x6f, + 0x53, 0x74, 0x6f, 0x70, 0x12, 0x22, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x22, 0x47, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x49, 0x4d, 0x45, 0x44, 0x10, 0x01, 0x12, 0x11, 0x0a, + 0x0d, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x53, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x02, + 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x4f, 0x53, 0x53, 0x49, 0x42, 0x4c, 0x45, + 0x10, 0x03, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0xfc, + 0x01, 0x0a, 0x05, 0x53, 0x68, 0x61, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x53, 0x68, 0x61, 0x70, 0x65, + 0x2e, 0x53, 0x68, 0x61, 0x70, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x1a, 0x74, 0x0a, 0x0a, 0x53, 0x68, 0x61, 0x70, 0x65, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x08, 0x64, + 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x1a, 0x42, 0x0a, 0x09, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x25, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x32, 0xc2, 0x0e, + 0x0a, 0x06, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x3d, 0x0a, 0x0a, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x09, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x03, 0x12, 0x01, 0x2f, 0x12, 0x47, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x13, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x10, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0a, 0x12, 0x08, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, + 0x12, 0x45, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x11, 0x2e, + 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x07, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x12, 0x14, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x5f, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x61, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x41, + 0x67, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x11, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x07, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x12, 0x29, 0x2f, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x61, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x53, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, + 0x73, 0x12, 0x11, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x63, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x13, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x09, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x34, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x7d, 0x12, 0x53, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x12, - 0x11, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x73, 0x79, + 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x73, 0x12, 0x4f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x6f, 0x70, 0x12, 0x0f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x05, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x22, 0x2c, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x73, + 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x57, 0x0a, 0x0a, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x12, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x23, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, + 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, + 0x10, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x06, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x28, 0x12, 0x26, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x7b, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x65, 0x0a, 0x09, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x72, 0x69, 0x70, 0x73, 0x12, 0x11, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x69, + 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x72, 0x69, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, + 0x7b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x72, 0x69, 0x70, 0x73, + 0x12, 0x61, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x72, 0x69, 0x70, 0x12, 0x0f, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x72, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x05, 0x2e, 0x54, + 0x72, 0x69, 0x70, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x65, - 0x65, 0x64, 0x12, 0x0f, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x05, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x26, 0x12, 0x24, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x73, 0x2f, 0x7b, - 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x5f, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, - 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, - 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x73, 0x79, 0x73, + 0x7d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x72, 0x69, 0x70, 0x73, 0x2f, 0x7b, 0x74, 0x72, 0x69, 0x70, 0x5f, + 0x69, 0x64, 0x7d, 0x12, 0x57, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, + 0x73, 0x12, 0x12, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x65, 0x72, + 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, + 0x1b, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x10, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x06, 0x2e, 0x41, 0x6c, 0x65, + 0x72, 0x74, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x0a, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x12, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x68, - 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x08, 0x2e, 0x56, 0x65, - 0x68, 0x69, 0x63, 0x6c, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x76, 0x65, - 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x57, 0x0a, 0x0a, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x12, 0x12, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, - 0x61, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x23, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, - 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x68, 0x61, 0x70, - 0x65, 0x73, 0x12, 0x54, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x70, 0x65, 0x12, 0x10, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x06, 0x2e, 0x53, 0x68, 0x61, 0x70, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, - 0x12, 0x26, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x2f, 0x7b, 0x73, - 0x68, 0x61, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x66, 0x65, 0x6e, - 0x6e, 0x65, 0x6c, 0x6c, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, - 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x69, + 0x64, 0x7d, 0x12, 0x63, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x73, 0x12, 0x15, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x63, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x13, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x09, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, + 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x53, 0x0a, 0x09, + 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x12, 0x11, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x22, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, + 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x66, 0x65, 0x65, 0x64, + 0x73, 0x12, 0x4f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x12, 0x0f, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x05, 0x2e, + 0x46, 0x65, 0x65, 0x64, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x73, 0x2f, 0x7b, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, + 0x64, 0x7d, 0x12, 0x5f, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, + 0x65, 0x73, 0x12, 0x14, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x25, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x68, 0x69, 0x63, + 0x6c, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, + 0x65, 0x12, 0x12, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x08, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x22, + 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, + 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, + 0x69, 0x64, 0x7d, 0x12, 0x57, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, 0x70, 0x65, + 0x73, 0x12, 0x12, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x68, 0x61, 0x70, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, + 0x1b, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x70, 0x65, 0x12, 0x10, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x68, + 0x61, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x06, 0x2e, 0x53, 0x68, 0x61, + 0x70, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x69, + 0x64, 0x7d, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6a, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x6c, 0x2f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7051,110 +7067,111 @@ var file_api_public_proto_depIdxs = []int32{ 65, // 40: Trip.vehicle:type_name -> Vehicle.Reference 48, // 41: Trip.stop_times:type_name -> StopTime 74, // 42: Trip.shape:type_name -> Shape.Reference - 64, // 43: Vehicle.trip:type_name -> Trip.Reference - 62, // 44: Vehicle.stop:type_name -> Stop.Reference - 4, // 45: Vehicle.current_status:type_name -> Vehicle.CurrentStatus - 5, // 46: Vehicle.congestion_level:type_name -> Vehicle.CongestionLevel - 6, // 47: Vehicle.occupancy_status:type_name -> Vehicle.OccupancyStatus - 45, // 48: Route.resource:type_name -> Resource - 59, // 49: Route.system:type_name -> System.Reference - 7, // 50: Route.continuous_pickup:type_name -> Route.ContinuousPolicy - 7, // 51: Route.continuous_drop_off:type_name -> Route.ContinuousPolicy - 8, // 52: Route.type:type_name -> Route.Type - 69, // 53: Route.agency:type_name -> Agency.Reference - 72, // 54: Route.alerts:type_name -> Alert.Reference - 66, // 55: Route.service_maps:type_name -> Route.ServiceMap - 45, // 56: Feed.resource:type_name -> Resource - 59, // 57: Feed.system:type_name -> System.Reference - 45, // 58: Agency.resource:type_name -> Resource - 59, // 59: Agency.system:type_name -> System.Reference - 67, // 60: Agency.routes:type_name -> Route.Reference - 72, // 61: Agency.alerts:type_name -> Alert.Reference - 45, // 62: Alert.resource:type_name -> Resource - 59, // 63: Alert.system:type_name -> System.Reference - 9, // 64: Alert.cause:type_name -> Alert.Cause - 10, // 65: Alert.effect:type_name -> Alert.Effect - 70, // 66: Alert.current_active_period:type_name -> Alert.ActivePeriod - 70, // 67: Alert.all_active_periods:type_name -> Alert.ActivePeriod - 71, // 68: Alert.header:type_name -> Alert.Text - 71, // 69: Alert.description:type_name -> Alert.Text - 71, // 70: Alert.url:type_name -> Alert.Text - 45, // 71: Transfer.resource:type_name -> Resource - 59, // 72: Transfer.system:type_name -> System.Reference - 62, // 73: Transfer.from_stop:type_name -> Stop.Reference - 62, // 74: Transfer.to_stop:type_name -> Stop.Reference - 11, // 75: Transfer.type:type_name -> Transfer.Type - 73, // 76: Shape.points:type_name -> Shape.ShapePoint - 58, // 77: EntrypointReply.TransiterDetails.build:type_name -> EntrypointReply.TransiterDetails.Build - 45, // 78: System.Reference.resource:type_name -> Resource - 67, // 79: Stop.ServiceMap.routes:type_name -> Route.Reference - 62, // 80: Stop.HeadsignRule.stop:type_name -> Stop.Reference - 45, // 81: Stop.Reference.resource:type_name -> Resource - 59, // 82: Stop.Reference.system:type_name -> System.Reference - 45, // 83: Trip.Reference.resource:type_name -> Resource - 67, // 84: Trip.Reference.route:type_name -> Route.Reference - 62, // 85: Trip.Reference.destination:type_name -> Stop.Reference - 65, // 86: Trip.Reference.vehicle:type_name -> Vehicle.Reference - 45, // 87: Vehicle.Reference.resource:type_name -> Resource - 62, // 88: Route.ServiceMap.stops:type_name -> Stop.Reference - 45, // 89: Route.Reference.resource:type_name -> Resource - 59, // 90: Route.Reference.system:type_name -> System.Reference - 45, // 91: Feed.Reference.resource:type_name -> Resource - 59, // 92: Feed.Reference.system:type_name -> System.Reference - 45, // 93: Agency.Reference.resource:type_name -> Resource - 59, // 94: Agency.Reference.system:type_name -> System.Reference - 45, // 95: Alert.Reference.resource:type_name -> Resource - 59, // 96: Alert.Reference.system:type_name -> System.Reference - 9, // 97: Alert.Reference.cause:type_name -> Alert.Cause - 10, // 98: Alert.Reference.effect:type_name -> Alert.Effect - 45, // 99: Shape.Reference.resource:type_name -> Resource - 12, // 100: Public.Entrypoint:input_type -> EntrypointRequest - 14, // 101: Public.ListSystems:input_type -> ListSystemsRequest - 16, // 102: Public.GetSystem:input_type -> GetSystemRequest - 17, // 103: Public.ListAgencies:input_type -> ListAgenciesRequest - 19, // 104: Public.GetAgency:input_type -> GetAgencyRequest - 20, // 105: Public.ListStops:input_type -> ListStopsRequest - 22, // 106: Public.GetStop:input_type -> GetStopRequest - 23, // 107: Public.ListRoutes:input_type -> ListRoutesRequest - 25, // 108: Public.GetRoute:input_type -> GetRouteRequest - 26, // 109: Public.ListTrips:input_type -> ListTripsRequest - 31, // 110: Public.GetTrip:input_type -> GetTripRequest - 28, // 111: Public.ListAlerts:input_type -> ListAlertsRequest - 30, // 112: Public.GetAlert:input_type -> GetAlertRequest - 35, // 113: Public.ListTransfers:input_type -> ListTransfersRequest - 37, // 114: Public.GetTransfer:input_type -> GetTransferRequest - 32, // 115: Public.ListFeeds:input_type -> ListFeedsRequest - 34, // 116: Public.GetFeed:input_type -> GetFeedRequest - 38, // 117: Public.ListVehicles:input_type -> ListVehiclesRequest - 40, // 118: Public.GetVehicle:input_type -> GetVehicleRequest - 41, // 119: Public.ListShapes:input_type -> ListShapesRequest - 43, // 120: Public.GetShape:input_type -> GetShapeRequest - 13, // 121: Public.Entrypoint:output_type -> EntrypointReply - 15, // 122: Public.ListSystems:output_type -> ListSystemsReply - 44, // 123: Public.GetSystem:output_type -> System - 18, // 124: Public.ListAgencies:output_type -> ListAgenciesReply - 53, // 125: Public.GetAgency:output_type -> Agency - 21, // 126: Public.ListStops:output_type -> ListStopsReply - 47, // 127: Public.GetStop:output_type -> Stop - 24, // 128: Public.ListRoutes:output_type -> ListRoutesReply - 51, // 129: Public.GetRoute:output_type -> Route - 27, // 130: Public.ListTrips:output_type -> ListTripsReply - 49, // 131: Public.GetTrip:output_type -> Trip - 29, // 132: Public.ListAlerts:output_type -> ListAlertsReply - 54, // 133: Public.GetAlert:output_type -> Alert - 36, // 134: Public.ListTransfers:output_type -> ListTransfersReply - 55, // 135: Public.GetTransfer:output_type -> Transfer - 33, // 136: Public.ListFeeds:output_type -> ListFeedsReply - 52, // 137: Public.GetFeed:output_type -> Feed - 39, // 138: Public.ListVehicles:output_type -> ListVehiclesReply - 50, // 139: Public.GetVehicle:output_type -> Vehicle - 42, // 140: Public.ListShapes:output_type -> ListShapesReply - 56, // 141: Public.GetShape:output_type -> Shape - 121, // [121:142] is the sub-list for method output_type - 100, // [100:121] is the sub-list for method input_type - 100, // [100:100] is the sub-list for extension type_name - 100, // [100:100] is the sub-list for extension extendee - 0, // [0:100] is the sub-list for field type_name + 72, // 43: Trip.alerts:type_name -> Alert.Reference + 64, // 44: Vehicle.trip:type_name -> Trip.Reference + 62, // 45: Vehicle.stop:type_name -> Stop.Reference + 4, // 46: Vehicle.current_status:type_name -> Vehicle.CurrentStatus + 5, // 47: Vehicle.congestion_level:type_name -> Vehicle.CongestionLevel + 6, // 48: Vehicle.occupancy_status:type_name -> Vehicle.OccupancyStatus + 45, // 49: Route.resource:type_name -> Resource + 59, // 50: Route.system:type_name -> System.Reference + 7, // 51: Route.continuous_pickup:type_name -> Route.ContinuousPolicy + 7, // 52: Route.continuous_drop_off:type_name -> Route.ContinuousPolicy + 8, // 53: Route.type:type_name -> Route.Type + 69, // 54: Route.agency:type_name -> Agency.Reference + 72, // 55: Route.alerts:type_name -> Alert.Reference + 66, // 56: Route.service_maps:type_name -> Route.ServiceMap + 45, // 57: Feed.resource:type_name -> Resource + 59, // 58: Feed.system:type_name -> System.Reference + 45, // 59: Agency.resource:type_name -> Resource + 59, // 60: Agency.system:type_name -> System.Reference + 67, // 61: Agency.routes:type_name -> Route.Reference + 72, // 62: Agency.alerts:type_name -> Alert.Reference + 45, // 63: Alert.resource:type_name -> Resource + 59, // 64: Alert.system:type_name -> System.Reference + 9, // 65: Alert.cause:type_name -> Alert.Cause + 10, // 66: Alert.effect:type_name -> Alert.Effect + 70, // 67: Alert.current_active_period:type_name -> Alert.ActivePeriod + 70, // 68: Alert.all_active_periods:type_name -> Alert.ActivePeriod + 71, // 69: Alert.header:type_name -> Alert.Text + 71, // 70: Alert.description:type_name -> Alert.Text + 71, // 71: Alert.url:type_name -> Alert.Text + 45, // 72: Transfer.resource:type_name -> Resource + 59, // 73: Transfer.system:type_name -> System.Reference + 62, // 74: Transfer.from_stop:type_name -> Stop.Reference + 62, // 75: Transfer.to_stop:type_name -> Stop.Reference + 11, // 76: Transfer.type:type_name -> Transfer.Type + 73, // 77: Shape.points:type_name -> Shape.ShapePoint + 58, // 78: EntrypointReply.TransiterDetails.build:type_name -> EntrypointReply.TransiterDetails.Build + 45, // 79: System.Reference.resource:type_name -> Resource + 67, // 80: Stop.ServiceMap.routes:type_name -> Route.Reference + 62, // 81: Stop.HeadsignRule.stop:type_name -> Stop.Reference + 45, // 82: Stop.Reference.resource:type_name -> Resource + 59, // 83: Stop.Reference.system:type_name -> System.Reference + 45, // 84: Trip.Reference.resource:type_name -> Resource + 67, // 85: Trip.Reference.route:type_name -> Route.Reference + 62, // 86: Trip.Reference.destination:type_name -> Stop.Reference + 65, // 87: Trip.Reference.vehicle:type_name -> Vehicle.Reference + 45, // 88: Vehicle.Reference.resource:type_name -> Resource + 62, // 89: Route.ServiceMap.stops:type_name -> Stop.Reference + 45, // 90: Route.Reference.resource:type_name -> Resource + 59, // 91: Route.Reference.system:type_name -> System.Reference + 45, // 92: Feed.Reference.resource:type_name -> Resource + 59, // 93: Feed.Reference.system:type_name -> System.Reference + 45, // 94: Agency.Reference.resource:type_name -> Resource + 59, // 95: Agency.Reference.system:type_name -> System.Reference + 45, // 96: Alert.Reference.resource:type_name -> Resource + 59, // 97: Alert.Reference.system:type_name -> System.Reference + 9, // 98: Alert.Reference.cause:type_name -> Alert.Cause + 10, // 99: Alert.Reference.effect:type_name -> Alert.Effect + 45, // 100: Shape.Reference.resource:type_name -> Resource + 12, // 101: Public.Entrypoint:input_type -> EntrypointRequest + 14, // 102: Public.ListSystems:input_type -> ListSystemsRequest + 16, // 103: Public.GetSystem:input_type -> GetSystemRequest + 17, // 104: Public.ListAgencies:input_type -> ListAgenciesRequest + 19, // 105: Public.GetAgency:input_type -> GetAgencyRequest + 20, // 106: Public.ListStops:input_type -> ListStopsRequest + 22, // 107: Public.GetStop:input_type -> GetStopRequest + 23, // 108: Public.ListRoutes:input_type -> ListRoutesRequest + 25, // 109: Public.GetRoute:input_type -> GetRouteRequest + 26, // 110: Public.ListTrips:input_type -> ListTripsRequest + 31, // 111: Public.GetTrip:input_type -> GetTripRequest + 28, // 112: Public.ListAlerts:input_type -> ListAlertsRequest + 30, // 113: Public.GetAlert:input_type -> GetAlertRequest + 35, // 114: Public.ListTransfers:input_type -> ListTransfersRequest + 37, // 115: Public.GetTransfer:input_type -> GetTransferRequest + 32, // 116: Public.ListFeeds:input_type -> ListFeedsRequest + 34, // 117: Public.GetFeed:input_type -> GetFeedRequest + 38, // 118: Public.ListVehicles:input_type -> ListVehiclesRequest + 40, // 119: Public.GetVehicle:input_type -> GetVehicleRequest + 41, // 120: Public.ListShapes:input_type -> ListShapesRequest + 43, // 121: Public.GetShape:input_type -> GetShapeRequest + 13, // 122: Public.Entrypoint:output_type -> EntrypointReply + 15, // 123: Public.ListSystems:output_type -> ListSystemsReply + 44, // 124: Public.GetSystem:output_type -> System + 18, // 125: Public.ListAgencies:output_type -> ListAgenciesReply + 53, // 126: Public.GetAgency:output_type -> Agency + 21, // 127: Public.ListStops:output_type -> ListStopsReply + 47, // 128: Public.GetStop:output_type -> Stop + 24, // 129: Public.ListRoutes:output_type -> ListRoutesReply + 51, // 130: Public.GetRoute:output_type -> Route + 27, // 131: Public.ListTrips:output_type -> ListTripsReply + 49, // 132: Public.GetTrip:output_type -> Trip + 29, // 133: Public.ListAlerts:output_type -> ListAlertsReply + 54, // 134: Public.GetAlert:output_type -> Alert + 36, // 135: Public.ListTransfers:output_type -> ListTransfersReply + 55, // 136: Public.GetTransfer:output_type -> Transfer + 33, // 137: Public.ListFeeds:output_type -> ListFeedsReply + 52, // 138: Public.GetFeed:output_type -> Feed + 39, // 139: Public.ListVehicles:output_type -> ListVehiclesReply + 50, // 140: Public.GetVehicle:output_type -> Vehicle + 42, // 141: Public.ListShapes:output_type -> ListShapesReply + 56, // 142: Public.GetShape:output_type -> Shape + 122, // [122:143] is the sub-list for method output_type + 101, // [101:122] is the sub-list for method input_type + 101, // [101:101] is the sub-list for extension type_name + 101, // [101:101] is the sub-list for extension extendee + 0, // [0:101] is the sub-list for field type_name } func init() { file_api_public_proto_init() } diff --git a/internal/gen/db/alert_queries.sql.go b/internal/gen/db/alert_queries.sql.go index 4d7151ff..a30e2946 100644 --- a/internal/gen/db/alert_queries.sql.go +++ b/internal/gen/db/alert_queries.sql.go @@ -177,17 +177,29 @@ func (q *Queries) InsertAlertStop(ctx context.Context, arg InsertAlertStopParams } const insertAlertTrip = `-- name: InsertAlertTrip :exec -INSERT INTO alert_trip (alert_pk, trip_pk, scheduled_trip_pk) VALUES ($1, $2, $3) +INSERT INTO alert_trip (alert_pk, trip_pk, scheduled_trip_pk, route_pk, direction_id, start_date, start_time) VALUES ($1, $2, $3, $4, $5, $6, $7) ` type InsertAlertTripParams struct { AlertPk int64 TripPk pgtype.Int8 ScheduledTripPk pgtype.Int8 + RoutePk pgtype.Int8 + DirectionID pgtype.Bool + StartDate pgtype.Timestamptz + StartTime pgtype.Int4 } func (q *Queries) InsertAlertTrip(ctx context.Context, arg InsertAlertTripParams) error { - _, err := q.db.Exec(ctx, insertAlertTrip, arg.AlertPk, arg.TripPk, arg.ScheduledTripPk) + _, err := q.db.Exec(ctx, insertAlertTrip, + arg.AlertPk, + arg.TripPk, + arg.ScheduledTripPk, + arg.RoutePk, + arg.DirectionID, + arg.StartDate, + arg.StartTime, + ) return err } @@ -358,6 +370,70 @@ func (q *Queries) ListActiveAlertsForStops(ctx context.Context, arg ListActiveAl return items, nil } +const listActiveAlertsForTrips = `-- name: ListActiveAlertsForTrips :many +SELECT trip.pk trip_pk, alert.pk, alert.id, alert.cause, alert.effect, alert_active_period.starts_at, alert_active_period.ends_at +FROM trip + -- TODO (1): Trip start needs to be considered when matching trips to alerts to disambigute trips that run over multiple days. + -- TODO (2): Frequency based trips are not correctly handled here. + INNER JOIN alert_trip ON alert_trip.trip_pk = trip.pk OR + (alert_trip.trip_pk IS NULL AND alert_trip.route_pk = trip.route_pk AND (alert_trip.direction_id IS NULL OR alert_trip.direction_id = trip.direction_id)) + INNER JOIN alert ON alert_trip.alert_pk = alert.pk + INNER JOIN alert_active_period ON alert_active_period.alert_pk = alert.pk +WHERE trip.pk = ANY($1::bigint[]) + AND ( + alert_active_period.starts_at < $2 + OR alert_active_period.starts_at IS NULL + ) + AND ( + alert_active_period.ends_at > $2 + OR alert_active_period.ends_at IS NULL + ) +ORDER BY alert.id ASC +` + +type ListActiveAlertsForTripsParams struct { + TripPks []int64 + PresentTime pgtype.Timestamptz +} + +type ListActiveAlertsForTripsRow struct { + TripPk int64 + Pk int64 + ID string + Cause string + Effect string + StartsAt pgtype.Timestamptz + EndsAt pgtype.Timestamptz +} + +func (q *Queries) ListActiveAlertsForTrips(ctx context.Context, arg ListActiveAlertsForTripsParams) ([]ListActiveAlertsForTripsRow, error) { + rows, err := q.db.Query(ctx, listActiveAlertsForTrips, arg.TripPks, arg.PresentTime) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListActiveAlertsForTripsRow + for rows.Next() { + var i ListActiveAlertsForTripsRow + if err := rows.Scan( + &i.TripPk, + &i.Pk, + &i.ID, + &i.Cause, + &i.Effect, + &i.StartsAt, + &i.EndsAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const listActivePeriodsForAlerts = `-- name: ListActivePeriodsForAlerts :many SELECT alert.pk, alert_active_period.starts_at, alert_active_period.ends_at FROM alert @@ -546,7 +622,7 @@ FROM alert LEFT JOIN alert_stop ON alert.pk = alert_stop.alert_pk LEFT JOIN stop ON alert_stop.stop_pk = stop.pk LEFT JOIN alert_trip ON alert.pk = alert_trip.alert_pk - LEFT JOIN trip ON alert_trip.trip_pk = trip.pk + LEFT JOIN trip ON alert_trip.trip_pk = trip.pk OR (alert_trip.trip_pk IS NULL AND alert_trip.route_pk = trip.route_pk AND (alert_trip.direction_id IS NULL OR alert_trip.direction_id = trip.direction_id)) LEFT JOIN scheduled_trip ON alert_trip.scheduled_trip_pk = scheduled_trip.pk LEFT JOIN alert_route_type ON alert.pk = alert_route_type.alert_pk WHERE alert.system_pk = $1 diff --git a/internal/gen/db/models.go b/internal/gen/db/models.go index 3cff79f4..bdd7d014 100644 --- a/internal/gen/db/models.go +++ b/internal/gen/db/models.go @@ -67,6 +67,10 @@ type AlertTrip struct { AlertPk int64 TripPk pgtype.Int8 ScheduledTripPk pgtype.Int8 + RoutePk pgtype.Int8 + DirectionID pgtype.Bool + StartDate pgtype.Timestamptz + StartTime pgtype.Int4 } type Feed struct { diff --git a/internal/gen/db/querier.go b/internal/gen/db/querier.go index 4bf5b503..1ff1b099 100644 --- a/internal/gen/db/querier.go +++ b/internal/gen/db/querier.go @@ -75,6 +75,7 @@ type Querier interface { // ListActiveAlertsForRoutes returns preview information about active alerts for the provided routes. ListActiveAlertsForRoutes(ctx context.Context, arg ListActiveAlertsForRoutesParams) ([]ListActiveAlertsForRoutesRow, error) ListActiveAlertsForStops(ctx context.Context, arg ListActiveAlertsForStopsParams) ([]ListActiveAlertsForStopsRow, error) + ListActiveAlertsForTrips(ctx context.Context, arg ListActiveAlertsForTripsParams) ([]ListActiveAlertsForTripsRow, error) ListActivePeriodsForAlerts(ctx context.Context, pks []int64) ([]ListActivePeriodsForAlertsRow, error) ListAgencies(ctx context.Context, systemPk int64) ([]Agency, error) ListAgenciesByPk(ctx context.Context, pk []int64) ([]Agency, error) diff --git a/internal/public/endpoints/trip.go b/internal/public/endpoints/trip.go index afbede39..fba812c6 100644 --- a/internal/public/endpoints/trip.go +++ b/internal/public/endpoints/trip.go @@ -3,6 +3,7 @@ package endpoints import ( "context" "fmt" + "time" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" @@ -69,6 +70,16 @@ func GetTrip(ctx context.Context, r *Context, req *api.GetTripRequest) (*api.Tri } func buildApiTrips(ctx context.Context, r *Context, system *db.System, route *db.Route, trips []db.ListTripsRow) ([]*api.Trip, error) { + var tripPks []int64 + for i := range trips { + tripPks = append(tripPks, trips[i].Pk) + } + + alertPreviews, err := buildTripAlertPreviews(ctx, r, system.ID, tripPks) + if err != nil { + return nil, err + } + var apiTrips []*api.Trip for i := range trips { trip := &trips[i] @@ -82,6 +93,7 @@ func buildApiTrips(ctx context.Context, r *Context, system *db.System, route *db StartedAt: convert.SQLNullTime(trip.StartedAt), Route: r.Reference.Route(route.ID, system.ID, route.Color), Shape: nullShapeReference(r, trip.ShapeID, system.ID), + Alerts: alertPreviews[trip.Pk], } if trip.VehicleID.Valid { reply.Vehicle = r.Reference.Vehicle(trip.VehicleID.String, system.ID) @@ -101,6 +113,25 @@ func buildApiTrips(ctx context.Context, r *Context, system *db.System, route *db return apiTrips, nil } +func buildTripAlertPreviews(ctx context.Context, r *Context, systemID string, tripPks []int64) (map[int64][]*api.Alert_Reference, error) { + alerts, err := r.Querier.ListActiveAlertsForTrips( + ctx, db.ListActiveAlertsForTripsParams{ + TripPks: tripPks, + PresentTime: pgtype.Timestamptz{Valid: true, Time: time.Now()}, + }) + if err != nil { + return nil, err + } + m := map[int64][]*api.Alert_Reference{} + for _, alert := range alerts { + m[alert.TripPk] = append( + m[alert.TripPk], + r.Reference.Alert(alert.ID, systemID, alert.Cause, alert.Effect), + ) + } + return m, nil +} + func nullShapeReference(r *Context, shapeID pgtype.Text, systemID string) *api.Shape_Reference { if !shapeID.Valid { return nil diff --git a/internal/update/realtime/realtime.go b/internal/update/realtime/realtime.go index ac427bba..384ffcf6 100644 --- a/internal/update/realtime/realtime.go +++ b/internal/update/realtime/realtime.go @@ -540,18 +540,53 @@ func insertAlerts(ctx context.Context, updateCtx common.UpdateContext, alerts [] var tripIDs []string var newAlertPks []int64 for _, alert := range alerts { + var informedRoutesFromTripIDs = make(map[string]map[gtfs.DirectionID]bool) + var informedRoutes = make(map[string]bool) for _, informedEntity := range alert.InformedEntities { if informedEntity.AgencyID != nil { agencyReferenced = true } if informedEntity.RouteID != nil { routeIDs = append(routeIDs, *informedEntity.RouteID) + informedRoutes[*informedEntity.RouteID] = true } if informedEntity.StopID != nil { stopIDs = append(stopIDs, *informedEntity.StopID) } - if informedEntity.TripID != nil && informedEntity.TripID.ID != "" { - tripIDs = append(tripIDs, informedEntity.TripID.ID) + if informedEntity.TripID != nil { + if informedEntity.TripID.ID != "" { + tripIDs = append(tripIDs, informedEntity.TripID.ID) + } + if informedEntity.TripID.RouteID != "" { + routeIDs = append(routeIDs, informedEntity.TripID.RouteID) + if informedEntity.TripID.ID == "" { + if informedEntity.TripID.DirectionID == gtfs.DirectionID_Unspecified { + informedRoutesFromTripIDs[informedEntity.TripID.RouteID] = map[gtfs.DirectionID]bool{ + gtfs.DirectionID_False: true, + gtfs.DirectionID_True: true, + } + } else { + if _, ok := informedRoutesFromTripIDs[informedEntity.TripID.RouteID]; !ok { + informedRoutesFromTripIDs[informedEntity.TripID.RouteID] = map[gtfs.DirectionID]bool{} + } + informedRoutesFromTripIDs[informedEntity.TripID.RouteID][informedEntity.TripID.DirectionID] = true + } + } + } + } + } + + for routeID, directions := range informedRoutesFromTripIDs { + if informedRoutes[routeID] { + continue + } + + if directions[gtfs.DirectionID_False] && directions[gtfs.DirectionID_True] { + routeIDCopy := routeID + alert.InformedEntities = append(alert.InformedEntities, gtfs.AlertInformedEntity{ + RouteID: &routeIDCopy, + RouteType: gtfs.RouteType_Unknown, + }) } } } @@ -637,11 +672,29 @@ func insertAlerts(ctx context.Context, updateCtx common.UpdateContext, alerts [] if scheduledTripPk, ok := scheduledTripIDToPk[tripID]; ok { scheduledTripPkOrNil = &scheduledTripPk } - if tripPkOrNil != nil || scheduledTripPkOrNil != nil { + var routePkOrNil *int64 = nil + if informedEntity.TripID.RouteID != "" { + if routePkVal, ok := routeIDToPk[informedEntity.TripID.RouteID]; ok { + routePkOrNil = &routePkVal + } + } + var startDateOrNil *time.Time = nil + if informedEntity.TripID.HasStartDate { + startDateOrNil = &informedEntity.TripID.StartDate + } + var startTimeOrNil *time.Duration = nil + if informedEntity.TripID.HasStartTime { + startTimeOrNil = &informedEntity.TripID.StartTime + } + if tripPkOrNil != nil || scheduledTripPkOrNil != nil || routePkOrNil != nil { err := updateCtx.Querier.InsertAlertTrip(ctx, db.InsertAlertTripParams{ AlertPk: pk, TripPk: convert.NullInt64(tripPkOrNil), ScheduledTripPk: convert.NullInt64(scheduledTripPkOrNil), + RoutePk: convert.NullInt64(routePkOrNil), + DirectionID: convert.DirectionID(informedEntity.TripID.DirectionID), + StartDate: convert.NullTime(startDateOrNil), + StartTime: convert.NullDuration(startTimeOrNil), }) if err != nil { return nil, err diff --git a/internal/update/realtime/realtime_test.go b/internal/update/realtime/realtime_test.go index 7e452c79..527ad32e 100644 --- a/internal/update/realtime/realtime_test.go +++ b/internal/update/realtime/realtime_test.go @@ -1010,6 +1010,148 @@ func TestUpdate(t *testing.T) { wantAlert(systemID, alertID1, wInformedTrips(tripID1), wInformedScheduledTrips(scheduledTripID1)), }, }, + { + name: "alert with informed route via trip entity, no direction id", + updates: []update{ + { + data: >fs.Realtime{ + Trips: []gtfs.Trip{ + *gtfsTrip(tripID1, routeID1, gtfs.DirectionID_True, []gtfs.StopTimeUpdate{}), + }, + Alerts: []gtfs.Alert{ + { + ID: alertID1, + Cause: gtfs.UnknownCause, + Effect: gtfs.UnknownEffect, + InformedEntities: []gtfs.AlertInformedEntity{ + { + TripID: >fs.TripID{ + RouteID: routeID1, + }, + RouteType: gtfs.RouteType_Unknown, + }, + }, + }, + }, + }, + }, + }, + wantTrips: []*Trip{ + wantTrip(tripID1, routeID1, true, nil), + }, + wantAlerts: []*Alert{ + wantAlert(systemID, alertID1, wInformedRoutes(routeID1), wInformedTrips(tripID1)), + }, + }, + { + name: "alert with informed route via trip entity, both direction ids", + updates: []update{ + { + data: >fs.Realtime{ + Trips: []gtfs.Trip{ + *gtfsTrip(tripID1, routeID1, gtfs.DirectionID_True, []gtfs.StopTimeUpdate{}), + }, + Alerts: []gtfs.Alert{ + { + ID: alertID1, + Cause: gtfs.UnknownCause, + Effect: gtfs.UnknownEffect, + InformedEntities: []gtfs.AlertInformedEntity{ + { + TripID: >fs.TripID{ + RouteID: routeID1, + DirectionID: gtfs.DirectionID_False, + }, + RouteType: gtfs.RouteType_Unknown, + }, + { + TripID: >fs.TripID{ + RouteID: routeID1, + DirectionID: gtfs.DirectionID_True, + }, + RouteType: gtfs.RouteType_Unknown, + }, + }, + }, + }, + }, + }, + }, + wantTrips: []*Trip{ + wantTrip(tripID1, routeID1, true, nil), + }, + wantAlerts: []*Alert{ + wantAlert(systemID, alertID1, wInformedRoutes(routeID1), wInformedTrips(tripID1)), + }, + }, + { + name: "alert with informed route via trip entity, single direction id", + updates: []update{ + { + data: >fs.Realtime{ + Trips: []gtfs.Trip{ + *gtfsTrip(tripID1, routeID1, gtfs.DirectionID_True, []gtfs.StopTimeUpdate{}), + }, + Alerts: []gtfs.Alert{ + { + ID: alertID1, + Cause: gtfs.UnknownCause, + Effect: gtfs.UnknownEffect, + InformedEntities: []gtfs.AlertInformedEntity{ + { + TripID: >fs.TripID{ + RouteID: routeID1, + DirectionID: gtfs.DirectionID_True, + }, + RouteType: gtfs.RouteType_Unknown, + }, + }, + }, + }, + }, + }, + }, + wantTrips: []*Trip{ + wantTrip(tripID1, routeID1, true, nil), + }, + wantAlerts: []*Alert{ + wantAlert(systemID, alertID1, wInformedTrips(tripID1)), + }, + }, + { + name: "alert with informed route via trip entity, direction id mismatch", + updates: []update{ + { + data: >fs.Realtime{ + Trips: []gtfs.Trip{ + *gtfsTrip(tripID1, routeID1, gtfs.DirectionID_True, []gtfs.StopTimeUpdate{}), + }, + Alerts: []gtfs.Alert{ + { + ID: alertID1, + Cause: gtfs.UnknownCause, + Effect: gtfs.UnknownEffect, + InformedEntities: []gtfs.AlertInformedEntity{ + { + TripID: >fs.TripID{ + RouteID: routeID1, + DirectionID: gtfs.DirectionID_False, + }, + RouteType: gtfs.RouteType_Unknown, + }, + }, + }, + }, + }, + }, + }, + wantTrips: []*Trip{ + wantTrip(tripID1, routeID1, true, nil), + }, + wantAlerts: []*Alert{ + wantAlert(systemID, alertID1), + }, + }, } { t.Run(tc.name, func(t *testing.T) { querier := dbtesting.NewQuerier(t) diff --git a/tests/endtoend/client.py b/tests/endtoend/client.py index 2b7e0a18..b4ee147a 100644 --- a/tests/endtoend/client.py +++ b/tests/endtoend/client.py @@ -244,6 +244,7 @@ class Trip(ApiType): shape: ShapeReference vehicle: VehicleReference stopTimes: typing.List[StopTime] + alerts: typing.List[AlertReference] @dataclasses.dataclass @@ -298,6 +299,11 @@ class ListRoutesResponse(ApiType): routes: typing.List[Route] +@dataclasses.dataclass +class ListTripsResponse(ApiType): + trips: typing.List[Trip] + + class TransiterClient: def __init__(self, transiter_host): self._transiter_host = transiter_host @@ -393,6 +399,11 @@ def get_trip(self, system_id: str, route_id: str, trip_id: str, params={}) -> Tr Trip, f"systems/{system_id}/routes/{route_id}/trips/{trip_id}", params ) + def list_trips(self, system_id: str, route_id: str, params={}) -> ListTripsResponse: + return self._get_typed( + ListTripsResponse, f"systems/{system_id}/routes/{route_id}/trips", params + ) + def list_vehicles(self, system_id: str, params={}) -> ListVehiclesResponse: return self._get_typed( ListVehiclesResponse, f"systems/{system_id}/vehicles", params diff --git a/tests/endtoend/test_alerts.py b/tests/endtoend/test_alerts.py index b9209d2b..05643f09 100644 --- a/tests/endtoend/test_alerts.py +++ b/tests/endtoend/test_alerts.py @@ -64,6 +64,8 @@ {STOP_ID} """ +TRIP_ID = "trip_id" + def test_list_alerts( system_for_alerts_test, @@ -145,7 +147,24 @@ def test_alert_appears_in_get_stop( assert got_stop.alerts == [ALERT_REFERENCE] -# TODO: get and list trips +def test_alert_appears_in_get_trip( + system_for_alerts_test, + system_id, + transiter_client: client.TransiterClient, +): + _ = system_for_alerts_test + got_trip = transiter_client.get_trip(system_id, ROUTE_ID, TRIP_ID) + assert got_trip.alerts == [ALERT_REFERENCE] + + +def test_alert_appears_in_list_trip( + system_for_alerts_test, + system_id, + transiter_client: client.TransiterClient, +): + _ = system_for_alerts_test + got_list_trips = transiter_client.list_trips(system_id, ROUTE_ID, TRIP_ID) + assert got_list_trips.trips[0].alerts == [ALERT_REFERENCE] @pytest.fixture @@ -161,9 +180,9 @@ def system_for_alerts_test( header=gtfs.FeedHeader(gtfs_realtime_version="2.0", timestamp=int(time.time())), entity=[ gtfs.FeedEntity( - id="trip_id", + id=TRIP_ID, trip_update=gtfs.TripUpdate( - trip=gtfs.TripDescriptor(trip_id="trip_id", route_id="A") + trip=gtfs.TripDescriptor(trip_id=TRIP_ID, route_id=ROUTE_ID), ), ), gtfs.FeedEntity( @@ -199,7 +218,7 @@ def system_for_alerts_test( gtfs.EntitySelector(route_id=ROUTE_ID), gtfs.EntitySelector(stop_id=STOP_ID), gtfs.EntitySelector( - trip=gtfs.TripDescriptor(trip_id="trip_id") + trip=gtfs.TripDescriptor(trip_id=TRIP_ID) ), ], cause=gtfs.Alert.Cause.STRIKE, diff --git a/tests/endtoend/test_trips.py b/tests/endtoend/test_trips.py index f06a33e3..6a59ae39 100644 --- a/tests/endtoend/test_trips.py +++ b/tests/endtoend/test_trips.py @@ -241,6 +241,7 @@ def test_trip_view( shape=None, vehicle=None, stopTimes=want_stop_times, + alerts=[], ) got_trip = transiter_client.get_trip(system_id, ROUTE_ID, TRIP_1_ID)